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

如何删除Pine Script中超过max_bars_back(500根K线)限制的盒子或线条对象

Pine Script 超max_bars_back限制的box绘图对象删除方案

核心原理

你遇到的问题本质是Pine Script默认不允许直接引用超过max_bars_back阈值的历史K线对应变量,只要你不通过bar索引去回溯历史盒子ID,而是直接从持久化存储的活跃对象数组中读取属性,就不会触发这个限制。

具体实现步骤

  1. 声明持久化的活跃盒子数组
    用var关键字声明数组存储所有未失效的盒子ID,数组会在脚本全运行周期持久化,不会随K线刷新重置:
var array<box> activeBoxes = array.new_box()
  1. 每根K线先执行失效盒子清理逻辑
    在创建新盒子、判断价格穿越逻辑之前,先倒序遍历活跃数组,同时处理两类需要删除的盒子:
// 倒序遍历避免删除元素后索引错位
for i = array.size(activeBoxes) - 1 to 0 by -1
    currentBox = array.get(activeBoxes, i)
    if not na(currentBox)
        // 直接从盒子对象读取属性,不绑定历史bar变量,不会触发max_bars_back限制
        boxLeftBar = box.get_left(currentBox)
        boxTop = box.get_top(currentBox)
        boxBottom = box.get_bottom(currentBox)
        // 删除条件:创建时间超过500根K线 / 被价格穿越
        if (bar_index - boxLeftBar > 500) or (close > boxTop or close < boxBottom)
            box.delete(currentBox)
            array.remove(activeBoxes, i)
  1. 新创建的盒子统一存入数组
    原有创建盒子的逻辑后,新增把盒子ID推入数组的逻辑即可:
if 你的盒子创建触发条件
    // 示例:创建从当前bar开始、宽度20根K线的盒子
    newBox = box.new(left=bar_index, top=high, right=bar_index + 20, bottom=low, color=color.new(color.blue, 70))
    array.push(activeBoxes, newBox)

注意事项

  • 不需要调整max_bars_back参数的默认值,设置过大会增加脚本计算负担
  • 倒序遍历是必须操作,正序遍历删除元素会导致索引错位,漏掉部分盒子的判断
  • 及时清理失效盒子可以避免触发Pine Script单脚本最多同时存在1000个绘图对象的上限

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 11:54:03