You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 18:55:12