Pine Script生成的Box/Label过饱和(疑似重复堆叠)问题求助
解决方案
核心问题原因
你的代码在Pine Script的每根K线周期都会执行一遍所有box.new()和label.new()语句,导致同一时间戳的图形被重复创建成百上千次。堆叠后透明度叠加(90%透明的盒子叠几十层就几乎完全不透明),标签也因重叠变得模糊。
方法1:仅在最后一根K线创建图形(最简便)
利用barstate.islast条件,让图形只在当前图表的最后一根K线时创建一次,彻底避免重复堆叠。修改后的代码如下:
//@version=5 indicator("Session Boxes", overlay=true) TKO = #e91e63 TKObg = color.new(#e91e63, 90) LDN = #2157f3 LDNbg = color.new(#2157f3, 90) NYC = #ff5d00 NYCbg = color.new(#ff5d00, 90) // 仅在最后一根K线创建所有图形 if barstate.islast box.new(1699578000000, 96.379, 1699599600000, 96.154, bgcolor=TKObg, border_color=TKO, xloc=xloc.bar_time, border_style=line.style_dotted) label.new(1699588800000, 96.379, 'Tokyo', textcolor=TKO, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down) box.new(1699599600000, 96.358, 1699621200000, 96.161, bgcolor=LDNbg, border_color=LDN, xloc=xloc.bar_time, border_style=line.style_dotted) label.new(1699610400000, 96.358, 'London', textcolor=LDN, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down) box.new(1699621200000, 96.327, 1699635600000, 96.037, bgcolor=NYCbg, border_color=NYC, xloc=xloc.bar_time, border_style=line.style_dotted) label.new(1699628400000, 96.327, 'New York', textcolor=NYC, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down) box.new(1699635600000, 96.418, 1699653300000, 96.2, bgcolor=NYCbg, border_color=NYC, xloc=xloc.bar_time, border_style=line.style_dotted) label.new(1699644450000, 96.418, 'New York', textcolor=NYC, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down)
方法2:用变量存储图形对象,避免重复初始化
如果需要图形在所有K线都保持显示(而非仅最后一根),可以用var关键字声明图形变量,确保每个图形只被创建一次:
//@version=5 indicator("Session Boxes", overlay=true) TKO = #e91e63 TKObg = color.new(#e91e63, 90) LDN = #2157f3 LDNbg = color.new(#2157f3, 90) NYC = #ff5d00 NYCbg = color.new(#ff5d00, 90) // 用var声明,仅初始化一次 var box tkoBox = box.new(1699578000000, 96.379, 1699599600000, 96.154, bgcolor=TKObg, border_color=TKO, xloc=xloc.bar_time, border_style=line.style_dotted) var label tkoLabel = label.new(1699588800000, 96.379, 'Tokyo', textcolor=TKO, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down) var box ldnBox = box.new(1699599600000, 96.358, 1699621200000, 96.161, bgcolor=LDNbg, border_color=LDN, xloc=xloc.bar_time, border_style=line.style_dotted) var label ldnLabel = label.new(1699610400000, 96.358, 'London', textcolor=LDN, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down) var box nycBox1 = box.new(1699621200000, 96.327, 1699635600000, 96.037, bgcolor=NYCbg, border_color=NYC, xloc=xloc.bar_time, border_style=line.style_dotted) var label nycLabel1 = label.new(1699628400000, 96.327, 'New York', textcolor=NYC, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down) var box nycBox2 = box.new(1699635600000, 96.418, 1699653300000, 96.2, bgcolor=NYCbg, border_color=NYC, xloc=xloc.bar_time, border_style=line.style_dotted) var label nycLabel2 = label.new(1699644450000, 96.418, 'New York', textcolor=NYC, color=color.new(color.white,100), xloc=xloc.bar_time, size=size.tiny, style=label.style_label_down)
注意事项
- 两种方法都能解决堆叠问题,方法1更适合静态预生成的图形,代码改动最小;方法2适合需要后续动态修改图形属性的场景。
- 确保Python生成脚本输出的代码包含
//@version=5声明,避免版本兼容问题。
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

