Pine Script中line.new初始化无限延伸问题及解决方案咨询
Pine Script v5 线条延伸布局加载问题解决方案
你编写的Pine Script v5绘图指标在打开布局时,线条会向右无限延伸直至首次价格更新,原代码如下:
//@version=5 indicator('Lines', '', true) //Menu left = input.int(0, 'Left Extension', 0, step=1) right = input.int(9, 'Right Extension', 0, step=1) //Variables ATR = ta.atr(14) in_0 = ta.vwap(hlc3) ln = in_0-ATR _draw(lvl) => var id_1 = line.new(na, na, na, na) line.set_xy1(id_1, bar_index-left, lvl) line.set_xy2(id_1, bar_index+right, lvl) //Plot _draw(ln)
问题根源在于:加载布局瞬间,bar_index+right指向了尚未生成的未来K线位置,导致线条被拉伸至图表最右侧,呈现无限延伸的视觉效果。以下是两种既能保留双向延伸控制,又能解决该问题的方法:
方法一:限制右侧坐标不超过最新K线索引
通过math.min()函数强制右侧坐标不超过当前图表的最新K线索引,避免指向不存在的位置:
//@version=5 indicator('Lines', '', true) //Menu left = input.int(0, 'Left Extension', 0, step=1) right = input.int(9, 'Right Extension', 0, step=1) //Variables ATR = ta.atr(14) in_0 = ta.vwap(hlc3) ln = in_0-ATR _draw(lvl) => var id_1 = line.new(na, na, na, na) line.set_xy1(id_1, bar_index - left, lvl) // 限制右侧坐标不超过当前最新K线的索引 right_bar = math.min(bar_index + right, ta.last_bar_index) line.set_xy2(id_1, right_bar, lvl) //Plot _draw(ln)
方法二:区分历史K线与最新K线设置延伸
利用ta.barstate.islastconfirmedhistory判断当前K线是否为已确认的历史K线,仅在历史K线上设置右侧延伸,最新未确认K线(加载时的状态)则只绘制到当前端点:
//@version=5 indicator('Lines', '', true) //Menu left = input.int(0, 'Left Extension', 0, step=1) right = input.int(9, 'Right Extension', 0, step=1) //Variables ATR = ta.atr(14) in_0 = ta.vwap(hlc3) ln = in_0-ATR _draw(lvl) => var id_1 = line.new(na, na, na, na) line.set_xy1(id_1, bar_index - left, lvl) // 已确认历史K线正常设置右侧延伸,最新K线仅绘制到当前位置 if ta.barstate.islastconfirmedhistory line.set_xy2(id_1, bar_index + right, lvl) else line.set_xy2(id_1, bar_index, lvl) //Plot _draw(ln)
两种方法都能在保留双向延伸控制的同时,避免布局加载时的线条无限延伸问题。方法一逻辑简洁直接,方法二则更贴合K线确认的时序逻辑,可根据需求选择。
内容的提问来源于stack exchange,提问作者Richard D.
相关产品推荐
相关产品推荐

