循环中数组元素赋值问题:为何变量y与x、z结果不一致?
Pine Script 中 y、x、z 输出不一致的问题解析
在1分钟时间框架下测试代码时,会发现plot(y.get(0))的图形和plot(x.get(0)[5])、plot(z.get(0))不重合——明明y和z的赋值逻辑看起来完全一致,预期三者应该完全相同,但实际只有z的结果符合预期。
问题根源
Pine Script的循环是逐bar执行的,当你在for循环中直接使用x.get(i)[i+5]这种带历史索引[]的操作给数组赋值时,编译器对历史数据的解析逻辑会出现异常。循环内的连续赋值操作会干扰历史引用的时序判断,导致y.set(0, x.get(0)[5])的结果没有被正确存储。
而z的赋值是通过单独的if-else分支完成的,每个分支独立处理历史引用,编译器能正确解析每个x.get(i)[i+5]的时序,因此结果符合预期。
修复方案
避免在for循环中直接对数组使用带历史索引[]的赋值操作,改用以下两种方式:
方式一:改用分支判断赋值
和z的赋值逻辑保持一致,拆分循环内的操作:
//@version=5 indicator("xyz") x=array.new_float(2,na) y=array.new_float(2,na) z=array.new_float(2,na) x.set(0,request.security(syminfo.tickerid,"5",close)) x.set(1,request.security(syminfo.tickerid,"6",close)) // 拆分循环,改用分支给y赋值 y.set(0,x.get(0)[5]) y.set(1,x.get(1)[6]) // 原z的赋值逻辑 if i==0 z.set(i,x.get(i)[i+5]) else if i==1 z.set(i,x.get(i)[i+5]) plot(x.get(0)[5],color=color.red) plot(y.get(0),color=color.green) plot(z.get(0),color=color.blue)
方式二:先存临时变量再赋值
先把历史引用的结果存入临时变量,再给数组赋值,避免循环内的时序干扰:
//@version=5 indicator("xyz") x=array.new_float(2,na) y=array.new_float(2,na) z=array.new_float(2,na) x.set(0,request.security(syminfo.tickerid,"5",close)) x.set(1,request.security(syminfo.tickerid,"6",close)) // 先将历史引用的值存入临时变量 val_0 = x.get(0)[5] val_1 = x.get(1)[6] // 再给y数组赋值 y.set(0, val_0) y.set(1, val_1) // 原z的赋值逻辑 for i=0 to 1 if i==0 z.set(i,x.get(i)[i+5]) else if i==1 z.set(i,x.get(i)[i+5]) plot(x.get(0)[5],color=color.red) plot(y.get(0),color=color.green) plot(z.get(0),color=color.blue)
内容的提问来源于stack exchange,提问作者abuzka
相关产品推荐
相关产品推荐

