Pine Script函数内float变量tempHigh无法重新赋值问题咨询
问题根因
- 核心问题为循环索引设计不符合Pine Script历史引用规则:Pine Script中
close[n]的偏移参数n代表从当前执行K线往历史方向回溯的K线根数,n=0对应当前执行K线,n取值越大对应K线越久远。原代码循环i从last_bar_index - num累加到last_bar_index,在脚本逐K线运行阶段,i的取值会远大于当前K线可访问的历史偏移上限,此时close[i]返回na(空值),而na与任何数值做大小比较都返回false,因此if分支永远不会触发,tempHigh始终保持初始赋值的0.0,表现为无法重新赋值。该问题与变量声明、if语句语法无关,属于历史引用参数使用错误导致的分支逻辑不触发。 - 附带逻辑缺陷:用
var声明的价格线仅在脚本首次运行时创建一次,后续就算计算出正确的高点值,也没有更新线的坐标位置,线会一直停留在初始计算的错误值位置。
修复后可运行代码
//@version=5 strategy("Upper Lower Sup", overlay=true) highestClose(num) => float tempHigh = 0.0 // 修正循环逻辑:从当前K线往历史回溯对应根数,偏移量取0到num即可 for i = 0 to num // 增加空值判断,避免na导致比较失效 if not na(close[i]) and close[i] > tempHigh tempHigh := close[i] tempHigh num = input(50, "Bars in the past") float highpoint = highestClose(num) // 初始化空线对象,后续每根K线更新坐标 var higestPriceLine= line.new(na, na, na, na, xloc = xloc.bar_index, extend=extend.none, color=color.red, width=2) line.set_xy1(higestPriceLine, bar_index - num, highpoint) line.set_xy2(higestPriceLine, bar_index + 20, highpoint)
关键注意点
- Pine Script中遍历历史K线时,不要直接将
last_bar_index作为[]引用的偏移参数,last_bar_index是图表最后一根K线的全局索引值,不是历史回溯的合法偏移量,直接传入大概率会取到空值。 - 涉及数值比较的逻辑前建议先判断取值是否为
na,避免空值导致判断逻辑静默失效,这类问题不会抛出语法报错,排查难度较高。 - 用
var声明的绘图对象仅在脚本首次运行时初始化一次,后续数据更新需要调用对应的set_*系列方法修改对象属性,不会自动同步关联变量的最新值。
内容的提问来源于stack exchange,提问作者Black_Bird
相关产品推荐
相关产品推荐

