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

Pine Script如何保留用户指定数量的标签并删除历史旧标签

Pine Script 限定标签保留数量问题修复

第一版代码核心错误

  • 全局label.all数组的排序规则为最新创建的标签排在数组头部,旧标签排在数组尾部,你直接删除索引为0的元素,等价于刚创建的新标签被立刻删除,就会出现你遇到的“删新留旧”的问题
  • 删除逻辑没有和标签创建逻辑绑定,只要数组长度超过阈值就执行删除,哪怕本次没有生成新标签,也会误删现有正常显示的标签

第二版代码核心错误

  • 初始化自定义标签数组时使用array.new_label(qtyLabelsInput),该方法会生成一个长度为qtyLabelsInput、所有元素均为na的空数组,你每次新增标签后执行array.pop弹出的都是末尾的na值,根本不会删除实际存在的旧标签
  • 后续你注释了drawLabel调用,改用plotchar的show_last参数,该逻辑和自定义标签删除逻辑完全无关,无法实现标签数量控制效果

修复后完整可运行代码

//@version=5
indicator(title='RSI Pivot', precision=0, max_labels_count=500)
qtyLabelsInput = input.int(20, 'Labels to keep', minval=1)
myRSI = ta.rsi(close, 20)
plot(myRSI)

// 自定义标签数组,初始为空数组
var label[] label_array = array.new_label()

drawLabel(_offset, _pivot, _style, _size, _text, _textcolor) =>
    if (_pivot)
        // 新标签插入数组头部
        array.unshift(label_array, label.new(bar_index[_offset], _pivot, style=_style, size=_size, text=_text, textcolor=_textcolor))
        // 数组长度超过阈值时,删除数组尾部的最早标签
        if array.size(label_array) > qtyLabelsInput
            old_label = array.pop(label_array)
            if not na(old_label)
                label.delete(old_label)

leftLenH = input.int(title='Pivot High main', defval=2, minval=1, inline='Pivot High main')
rightLenH = input.int(title='/', defval=2, minval=1, inline='Pivot High main')
leftLenL = input.int(title='Pivot Low main', defval=2, minval=1, inline='Pivot Low main')
rightLenL = input.int(title='/', defval=2, minval=1, inline='Pivot Low main')
ph = ta.pivothigh(myRSI, leftLenH, rightLenH)
pl = ta.pivotlow(myRSI, leftLenL, rightLenL)

drawLabel(rightLenH, ph, label.style_none, size.tiny , "T", color.red)
drawLabel(rightLenL, pl, label.style_none, size.tiny, "B", color.green)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:06:00