You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

TradingView/Pine Script指标标签随新K线堆叠问题求助

解决Pine Script 5标签重叠问题

原代码问题分析

  • label.delete(l[1])无法删除旧标签:l是当前循环生成的标签引用,l[1]指向的是上一根K线的同名变量,但旧标签的ID没有被持久化存储,根本找不到要删除的对象。
  • 未清理旧元素:每次新K线出现时,旧的水平线和标签都没有被删除,只会持续新增,最终导致重叠。

修正方案

var关键字声明持久化数组,存储所有标签和水平线的ID。每次在最后一根K线执行时,先删除所有旧的标签和线,再创建新的元素并存入数组。

修正后的代码

//@version=5
indicator("TPO Levels", overlay=true)

//Allows user to hide values
showTPOrth = input(true, "Show TPO RTH")

tpoRTHlevels = array.new_float(5)
array.set(tpoRTHlevels,0,5278)
array.set(tpoRTHlevels,1,5337)
array.set(tpoRTHlevels,2,5378)
array.set(tpoRTHlevels,3,5441)
array.set(tpoRTHlevels,4,5479)

// 用var声明持久化数组,存储标签和线的ID
var array<int> tpoLabels = array.new_int()
var array<int> tpoLines = array.new_int()

if barstate.islast
    if showTPOrth
        // 先删除所有旧标签
        for labelId in tpoLabels
            label.delete(labelId)
        array.clear(tpoLabels)
        
        // 先删除所有旧水平线
        for lineId in tpoLines
            line.delete(lineId)
        array.clear(tpoLines)
        
        // 循环创建新的线和标签
        for k = 0 to array.size(tpoRTHlevels) - 1
            level_2 = array.get(tpoRTHlevels, k)
            
            // 绘制水平线并保存ID
            lineId = line.new(x1=bar_index, y1=level_2, x2=bar_index + 1, y2=level_2, extend=extend.right, color=close > level_2 ? #1bb622 : #cf2020, width=1)
            array.push(tpoLines, lineId)
            
            // 添加标签并保存ID
            labelId = label.new(bar_index + 4, level_2, text=str.tostring(level_2), textcolor=#666666, style=label.style_label_lower_left)
            array.push(tpoLabels, labelId)

关键说明

  • var关键字:让数组在脚本运行期间只初始化一次,不会随K线刷新重置,确保能持久存储旧元素的ID。
  • 先删后建:每次在最后一根K线执行时,先遍历数组删除所有旧的标签和线,再清空数组,最后创建新元素并存入数组,避免重叠。
  • 变量名修正:原代码里的close_price改为close,因为Pine Script 5中没有默认的close_price变量,避免报错。

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

火山引擎 最新活动