英文:
How to properly save values into an array when using for loop
问题
我试图在每次循环迭代中将`cumDistance`推入`cumDistances`数组中,但我遇到了问题。
    var inTrade = false
    var entry = 0.
    var exit = 0.
    distance = 0.
    
    entryCon = ta.crossover(ta.rsi(close, 10), 20) and not inTrade
    exitCon = ta.crossunder(ta.rsi(close, 10), 80) and inTrade
    
    cumDistances = array.new_float()
    for i=1 to 5
        if entryCon[1]
            entry := close[1]
            inTrade := true
    
        if exitCon[1]
            exit := close[1]
            inTrade := false
            distance := exit - entry*i
    
        cumDistance = ta.cum(distance)
        array.push(cumDistances, cumDistance)
在`cumDistances`数组中,我得到的值都是相同的:
 1. -43.41588
 2. -43.41588
 3. -43.41588
 4. -43.41588
 5. -43.41588
。
    if entryCon[1]
        entry := close[1]
        inTrade := true
    
    if exitCon[1]
        exit := close[1]
        inTrade := false
        distance := exit - entry*i //将 i 改为 1,2,3,4,5
    
    cumDistance = ta.cum(distance)
如果我运行没有for循环的代码(就像上面的代码),这是我得到的`cumDistance`值,对应它们的迭代:
 1. 0.02016
 2. -10.83885
 3. -21.69786
 4. -32.55687
 5. -43.41588
看起来`cumDistances`数组只保存了for循环的最后一次迭代的`cumDistance`值到所有数组索引中。
我该如何修复这个问题?
**编辑:**
回应 elod008:
    cumDistances = array.new_float()
    for i=1 to 5
        var distances = array.new_float()
        if entryCon[1]
            entry := close[1]
            inTrade := true
    
        if exitCon[1]
            exit := close[1]
            inTrade := false
            distance := exit - entry*i
            array.push(distances, distance)
    
        cumDistance = array.sum(distances)
        array.push(cumDistances, cumDistance)
        //array.clear(distances) <---- 将此放在这里,我会得到 NaN,NaN,NaN,NaN,Nan 作为结果
    
    plot(array.size(cumDistances), "索引号", display=display.data_window)
    
    table1 = table.new(position.top_right, 10, 10)
    table.cell(table1, 0, 0, str.tostring(array.get(cumDistances, 0)) + ", "
                             + str.tostring(array.get(cumDistances, 1)) + ", "
                             + str.tostring(array.get(cumDistances, 2)) + ", "
                             + str.tostring(array.get(cumDistances, 3)) + ", "
                             + str.tostring(array.get(cumDistances, 4)))
英文:
I'm trying to push cumDistance into cumDistances array for every iteration of the for loop but I am having trouble.
var inTrade = false
var entry = 0.
var exit = 0.
distance = 0.
entryCon = ta.crossover(ta.rsi(close, 10), 20) and not inTrade
exitCon = ta.crossunder(ta.rsi(close, 10), 80) and inTrade
cumDistances = array.new_float()
for i=1 to 5
    if entryCon[1]
        entry := close[1]
        inTrade := true
    if exitCon[1]
        exit := close[1]
        inTrade := false
        distance := exit - entry*i
    cumDistance = ta.cum(distance)
    array.push(cumDistances, cumDistance)
The values inside the cumDistances array that I get are all the same:
- -43.41588
 - -43.41588
 - -43.41588
 - -43.41588
 - -43.41588
 
.
if entryCon[1]
    entry := close[1]
    inTrade := true
if exitCon[1]
    exit := close[1]
    inTrade := false
    distance := exit - entry*i //changed i to 1,2,3,4,5
cumDistance = ta.cum(distance)
If I run the code without for loops(like the code just above), these are the values of cumDistance I get for their respective iteration.
- 0.02016
 - -10.83885
 - -21.69786
 - -32.55687
 - -43.41588
 
It seems that the array cumDistances only saves the value of cumDistance  for the last iteration of the for loop to all index of the array.
How do I fix this?
EDIT:
Response to elod008:
cumDistances = array.new_float()
for i=1 to 5
    var distances = array.new_float()
    if entryCon[1]
        entry := close[1]
        inTrade := true
    if exitCon[1]
        exit := close[1]
        inTrade := false
        distance := exit - entry*i
        array.push(distances, distance)
    cumDistance = array.sum(distances)
    array.push(cumDistances, cumDistance)
    //array.clear(distances) <---- placing this here, I will get NaN,NaN,NaN,NaN,Nan as result
plot(array.size(cumDistances), "no. of index", display=display.data_window)
table1 = table.new(position.top_right, 10, 10)
table.cell(table1, 0, 0, str.tostring(array.get(cumDistances, 0)) + ", "
                         + str.tostring(array.get(cumDistances, 1)) + ", "
                         + str.tostring(array.get(cumDistances, 2)) + ", "
                         + str.tostring(array.get(cumDistances, 3)) + ", "
                         + str.tostring(array.get(cumDistances, 4)))
答案1
得分: 1
我运行了你的代码。计算中似乎没有错误。你遇到的问题是 ta.cum() 在一个浮点数系列上工作,对你来说它按照预期计算了绝对总和。<br><br>然而,如果在一些迭代中条件不满足将新值添加到数组中,ta.cum() 将接收 distance 默认的 0.0,这不符合你的期望。于是你的数组会受到内置函数改变的累积距离系列的影响。<br><br>
在这种情况下,我不建议使用 ta.cum()。我更愿意收集并在 var 变量/对象/矩阵中根据你的需要汇总相关结果。
英文:
I ran your code. There seems to be no error in the calculation. What you're experiencing is that ta.cum() works on a series float and sums for you the absolute total as it is supposed to.<br><br>However if your conditional that adds new values to the array is false in some iterations, ta.cum() receives n times the default 0.0 of distance, what does not meet your expectations. Your array gets pushed the series cumDistance altered by the built-in function then.<br><br>
I would not recommend using ta.cum() in this case. I'd rather collect and sum up the relevant results in a var variable/object/matrix etc. depending on your needs.
答案2
得分: 0
你将entry和exit都声明为close[1],这意味着你只是进行相同的计算五次,并将其推送到数组中(也是五次)。我假设你想循环遍历过去的最后5个柱子;在这种情况下,你需要将close[1]更改为close[i],这样在每次循环迭代中,它会请求过去更远的close值。
英文:
You declare both entry and exit as close[1], which means that you just do the same calculation five times and push it into array (also five times). I assume you want to cycle over the last 5 bars; in this case, you need to change close[1] to close[i] so that on each loop iteration, it requests the close value farther into the past.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论