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

Pine Script中价格进入箱体时删除数组对应箱体及越界解决

问题根因

数组索引越界由两处逻辑错误直接导致:

  • 循环边界设置错误:Pine Script数组索引从0开始计数,有效索引范围为0 ~ 数组长度-1,原有代码写for i = 0 to array.size(boxTop)会访问到等于数组长度的无效索引,直接触发越界报错。
  • 正序遍历过程中执行删除操作:正序循环时删除索引为i的元素后,数组长度会即时减1,i位置之后的所有元素会整体前移一位,后续循环要么跳过待检查元素,要么访问到已不存在的索引。

除此之外原有逻辑还有三处缺陷:

  • 价格进入箱体的判断条件不完整,仅判断收盘价小于箱顶,未判断收盘价高于箱底,会出现价格未进入箱体就被误删的问题
  • 未存储箱底价格,无法完成准确的进入判断
  • 仅删除数组内的箱体引用,未销毁画布上的箱体对象,会造成不必要的内存占用,箱体也不会从图上消失
修复方案
  1. 新增数组单独存储每个箱体对应的箱底价格,补全价格进入箱体的判断逻辑
  2. 将正序遍历改为倒序遍历,从数组最后一个有效索引向前遍历到0,删除元素时不会影响未遍历元素的索引位置
  3. 修正循环边界,仅访问0到数组长度-1的有效索引
  4. 删除数组元素前先调用box.delete()销毁画布上的箱体对象

修复后的可运行代码:

study("Test Box", overlay = true)

var float[] boxTop = array.new_float()
var float[] boxBottom = array.new_float()
var box[] boxes = array.new_box()

bullish_Engulfing = (open[1] > close[1]) and (open < close) and (open <= close[1]) and (close > open[1]) and (high >= high[1])

if (bullish_Engulfing)
    array.push(boxes, box.new(bar_index[1], high[1], bar_index[1], low[1], color.black, 1, line.style_solid, extend.right, xloc.bar_index, color.new(color.blue, 80)))
    array.push(boxTop, high[1])
    array.push(boxBottom, low[1])


if (array.size(boxTop) != 0)
    // 倒序遍历避免删除元素导致的索引错位
    for i = array.size(boxTop) - 1 to 0
        float box_top_price = array.get(boxTop, i)
        float box_bottom_price = array.get(boxBottom, i)
        float actual_price = close

        // 价格落在箱底和箱顶区间内即为进入箱体
        if actual_price >= box_bottom_price and actual_price <= box_top_price
            box.delete(array.get(boxes, i))
            array.remove(boxTop, i)
            array.remove(boxBottom, i)
            array.remove(boxes, i)

内容的提问来源于stack exchange,提问作者Hein Bezuidenhoudt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 00:01:24