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

Pine Script数组操作报错求助:array.get()索引1超出范围,数组大小显示异常

问题分析与解决方案

核心问题根源

你遇到的错误本质是脚本在计算历史K线时,数组的实际大小还未达到你试图访问的索引值——仅在最后一根K线(barstate.islast)时数组才积累到14个元素,所以你看到的标签显示数组大小为14,但历史K线的计算过程中数组还没那么多元素,直接访问索引就触发了越界。

另外还有两个潜在问题:

  1. 访问数组索引前未做边界检查,不管数组当前大小就硬取对应位置的元素
  2. 删除线条后未从数组中移除无效的线条引用,后续仍可能尝试访问已删除的线条
  3. line_supres变量在条件块外被引用,若m_sr为false会导致未定义错误

分步修复方案

1. 数组访问前强制做边界检查

每次访问数组元素前,先判断数组当前大小是否大于目标索引,避免越界。比如修改tf_supres2的逻辑:

if (tf_supres2 == false and array.size(line_array) > 1)
    line.set_y1(array.get(line_array, 1), 0)
    line.set_y2(array.get(line_array, 1), 0)

对所有tf_supresX的判断块都加上这个数组大小检查,包括删除线条的逻辑:

if (tf_supres3 == false and array.size(line_array) > 2)
    line_id = array.get(line_array, 2)
    // 先检查线条是否还存在,避免重复删除报错
    if line.exists(line_id)
        line.delete(line_id)
    // 从数组中移除该元素,彻底避免后续访问无效索引
    array.remove(line_array, 2)

2. 修复line_supres的作用域问题

你在if m_sr块外使用了line_supres(line.set_color(line_supres, color.purple)),如果m_sr为false,这个变量是未定义的,会触发隐藏错误。把这段代码移到if m_sr块内部:

if m_sr
    line_supres = line.new(m_time, m_sr, (m_time+1), m_sr, xloc.bar_time, extend.right, color.green)
    array.push(line_array, line_supres)
    // 把颜色设置移到这里,确保只有当线条创建时才执行
    if not barstate.isrealtime
        line.set_color(line_supres, color.purple)

3. 统一线条管理逻辑(可选优化)

如果你的开关数量(tf_supres1到tf_supres15)是固定的,建议用循环来处理,避免重复写15个if块,让代码更简洁易维护:

// 把所有开关存放在数组里
var bool[] tf_switches = array.new_bool(15, true)
// 绑定你的开关变量到数组
tf_switches := array.set(tf_switches, 0, tf_supres1)
tf_switches := array.set(tf_switches, 1, tf_supres2)
// ... 依次绑定tf_supres3到tf_supres15

// 循环处理每个开关
for i = 0 to array.size(tf_switches)-1
    if array.size(line_array) <= i
        break // 数组大小不足,直接跳出循环
    line_id = array.get(line_array, i)
    if not array.get(tf_switches, i)
        if i == 0
            // 对索引0的线条设置坐标为0
            line.set_y1(line_id, 0)
            line.set_y2(line_id, 0)
        else
            // 对其他索引的线条删除并移除数组元素
            if line.exists(line_id)
                line.delete(line_id)
            array.remove(line_array, i)

验证修复效果

修改后,脚本在计算历史K线时会跳过数组大小不足的索引访问,不会触发越界错误;同时线条删除后会从数组中移除,避免后续无效访问。你可以再次测试关闭不同线条的操作,应该不会再出现图表崩溃的情况。

内容的提问来源于stack exchange,提问作者Nick Benton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 18:52:29