PineScript数组仅返回NaN值求助:20SMA反弹价差数组构建失败
解决PineScript数组全为NaN的问题
问题根源
你的代码存在两个核心问题:
- 初始化数组时用
array.new_float(100)创建了一个包含100个默认NaN元素的数组,即便后续添加有效数值,数组里大部分位置还是初始的NaN,打印时自然显示大量NaN。 - 每次触发条件时先
push再shift,相当于把新元素加到末尾后立刻移除第一个元素,数组始终保留100个元素,但只有最后一个是新添加的有效数值,其余99个都是初始NaN。
修复后的代码
//@version=5 indicator("20SMA反弹差值数组", overlay=true) sma_20 = ta.sma(close, 20) // 过滤掉SMA还未生成的前20周期(避免NaN干扰) sma_20_valid = not na(sma_20) sma_20_touch_band = sma_20_valid and open > sma_20 and low <= sma_20 sma_20_dif = ((low - sma_20) / sma_20) // 创建空数组,而非预填充100个NaN sma_20_array = array.new_float() if sma_20_touch_band array.push(sma_20_array, sma_20_dif) // 仅当数组长度超过100时,移除最旧的元素(保持最多100条记录) if array.size(sma_20_array) > 100 array.shift(sma_20_array) // 打印数组(仅在最后一根K线执行,避免重复打印) if barstate.islast label.new(bar_index, high, str.tostring(array.to_string(sma_20_array)), color=color.white, textcolor=color.black)
关键改动说明
- 空数组初始化:用
array.new_float()替代array.new_float(100),数组初始为空,只有满足条件时才添加有效数值,不会存在默认NaN。 - 过滤无效SMA周期:新增
sma_20_valid变量,确保仅在20周期SMA生成后才判断反弹条件,避免前20周期的NaN混入计算。 - 按需截断数组:仅当数组长度超过100时才执行
shift,确保数组内的元素都是满足条件的有效差值,而非大量初始NaN。 - 优化打印逻辑:仅在最后一根K线打印数组,避免每根K线重复输出。
内容的提问来源于stack exchange,提问作者James Cabourne
相关产品推荐
相关产品推荐

