Pine Script中价格进入箱体时删除数组对应箱体及越界解决
问题根因
数组索引越界由两处逻辑错误直接导致:
- 循环边界设置错误:Pine Script数组索引从0开始计数,有效索引范围为
0 ~ 数组长度-1,原有代码写for i = 0 to array.size(boxTop)会访问到等于数组长度的无效索引,直接触发越界报错。 - 正序遍历过程中执行删除操作:正序循环时删除索引为i的元素后,数组长度会即时减1,i位置之后的所有元素会整体前移一位,后续循环要么跳过待检查元素,要么访问到已不存在的索引。
除此之外原有逻辑还有三处缺陷:
- 价格进入箱体的判断条件不完整,仅判断收盘价小于箱顶,未判断收盘价高于箱底,会出现价格未进入箱体就被误删的问题
- 未存储箱底价格,无法完成准确的进入判断
- 仅删除数组内的箱体引用,未销毁画布上的箱体对象,会造成不必要的内存占用,箱体也不会从图上消失
修复方案
- 新增数组单独存储每个箱体对应的箱底价格,补全价格进入箱体的判断逻辑
- 将正序遍历改为倒序遍历,从数组最后一个有效索引向前遍历到0,删除元素时不会影响未遍历元素的索引位置
- 修正循环边界,仅访问0到数组长度-1的有效索引
- 删除数组元素前先调用
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
相关产品推荐
相关产品推荐

