英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论