Pine Script数组操作报错求助:array.get()索引1超出范围,数组大小显示异常
问题分析与解决方案
核心问题根源
你遇到的错误本质是脚本在计算历史K线时,数组的实际大小还未达到你试图访问的索引值——仅在最后一根K线(barstate.islast)时数组才积累到14个元素,所以你看到的标签显示数组大小为14,但历史K线的计算过程中数组还没那么多元素,直接访问索引就触发了越界。
另外还有两个潜在问题:
- 访问数组索引前未做边界检查,不管数组当前大小就硬取对应位置的元素
- 删除线条后未从数组中移除无效的线条引用,后续仍可能尝试访问已删除的线条
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
相关产品推荐
相关产品推荐

