PineScript函数中使用Label循环避免文本重叠问题
PineScript 循环生成标签文本重叠问题解决办法
你现在的代码里,循环调用calc_fun时,所有标签的x坐标都是bar_index+25,等于把6个标签全堆在同一个位置,肯定重叠。另外函数里的label.delete(label_id25[1])根本没用——循环是在同一根K线里执行的,label_id25[1]是上一根K线的变量,和当前循环生成的标签没关系。
下面给你两种可行的解决思路:
思路1:给每个标签分配不同的位置
利用循环变量x调整标签的x或y坐标,让每个标签错开。比如给x坐标加个倍数偏移,或者给y坐标加个固定差值,避免堆叠。
修改后的代码:
//@version=5 indicator("Label Overlap Fix", overlay=true) sDate = input.time(timestamp("12 22 2022 09:30:00 UTC-5"), title="Select significate High/Low") nb_bars = ta.barssince(time == sDate) nPrice = high[nb_bars] // 调整函数,加入位置偏移参数 calc_fun(nAC, offset) nformula25 = math.pow(math.sqrt(nPrice)+nAC+(0.25),2) // 用offset让每个标签的x坐标错开 label_id25=label.new(bar_index+25+offset, nformula25, text="45* - " + str.tostring(nformula25), style=label.style_none, textcolor=color.white) // 循环调用时传入不同的偏移值 for x = 0 to 5 calc_fun(2*x, x*15) // 每个标签错开15个bar的x位置
思路2:用数组管理标签,更新前清除旧标签
如果需要在新K线生成时替换旧标签,避免标签累积混乱,可以用数组存储所有标签ID,每次循环前清空旧标签。
修改后的代码:
//@version=5 indicator("Label Overlap Fix with Array", overlay=true) sDate = input.time(timestamp("12 22 2022 09:30:00 UTC-5"), title="Select significate High/Low") nb_bars = ta.barssince(time == sDate) nPrice = high[nb_bars] // 全局数组存储标签ID var label_array = array.new_label() // 调整函数,加入数组管理逻辑 calc_fun(nAC, y_offset) nformula25 = math.pow(math.sqrt(nPrice)+nAC+(0.25),2) // 用y_offset让每个标签的y坐标错开 label_id = label.new(bar_index+25, nformula25 + y_offset*2, text="45* - " + str.tostring(nformula25), style=label.style_none, textcolor=color.white) array.push(label_array, label_id) // 每次新K线生成时,先删除之前的所有标签 if barstate.isnew while array.size(label_array) > 0 label.delete(array.pop(label_array)) // 循环调用时传入y轴偏移 for x = 0 to 5 calc_fun(2*x, x)
关键注意点
- 标签重叠的核心原因是位置重复,只要让每个标签的x或y坐标有差异就能解决。
- 用数组管理标签时,必须在
barstate.isnew时机清除旧标签,避免标签越积越多。 - 函数内不要用
label_id[1]这种跨K线的变量引用删除标签,循环是在同一根K线执行的,这种写法不起作用。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

