Pine Script如何控制Plot线条:遇K线截断、未触碰则右延
结论
仅使用plot函数自带参数无法直接实现需求。plot本身只负责逐K线渲染传入的数值序列,没有内置“价格触碰后终止绘制”的状态记忆能力,但不需要额外使用line.new等绘图对象,只需要提前为每条线增加触碰状态标记,将触碰后的传入值设为na,配合plot即可实现目标效果。
核心实现逻辑
为每一条清算线配置独立的布尔状态变量,按以下规则更新:
- 当新的多/空枢轴信号触发,生成对应方向的新清算线时,将该方向所有线条的「已触碰」标记重置为
false - 线条存续期间逐K线判断触碰条件:
- 多头清算线(位于开仓价上方):当K线最高价
high大于等于线条价格,判定为被触碰/穿过 - 空头清算线(位于开仓价下方):当K线最低价
low小于等于线条价格,判定为被触碰/穿过
- 多头清算线(位于开仓价上方):当K线最高价
- 触碰条件一旦触发,对应线条的「已触碰」标记永久保持为
true,后续K线向plot传入na值,线条自动终止延伸 - 未触发触碰标记的线条持续传入价格数值,会一直延伸到图表最右侧
修改后可直接运行的代码
//@version=5 indicator("Liquidation Levels with Touch Stop", overlay=true) lengthGroupTitle = "Настройка уровней" leftLenH = input.int(title="Множитель уровня ликвидации, относительно ТФ", defval=100, minval=1, group=lengthGroupTitle) rightLenH = leftLenH leftLenL = leftLenH rightLenL = leftLenL ph = ta.pivothigh(leftLenH, rightLenH) pl = ta.pivotlow(leftLenL, rightLenL) drawLabel(_offset, _pivot, _style, _color, _textColor) => if not na(_pivot) label.new(bar_index[_offset], _pivot, str.tostring(_pivot, format.mintick), style=_style, color=_color, textcolor=_textColor) pos1 = close + close *0.49 /100 pos2 = close + close *1.47 /100 pos3 = close + close *3.3 /100 pos4 = close - close *0.49 /100 pos5 = close - close *1.47 /100 pos6 = close - close *3.3 /100 c = ta.pivothigh(leftLenH, rightLenH) b = ta.pivotlow(leftLenL, rightLenL) plotshape(c ? pos1: na , "100х Ликвидации Лонг", shape.circle, location.absolute, color.black, 0, "100х Ликвидации", (color.black), size=size.tiny) plotshape(c ? pos2: na , "50х Ликвилации Лонг", shape.circle, location.absolute, color.black, 0, "50х Ликвидации", (color.black), size=size.tiny) plotshape(c ? pos3: na , "25х Ликвидации Лонг", shape.circle, location.absolute, color.black, 0, "25х Ликвидации", (color.black), size=size.tiny) plotshape(b ? pos4: na , "100х Ликвидации Шорт", shape.circle, location.absolute, color.black, 0, "100х Ликвидации", (color.black), size=size.tiny) plotshape(b ? pos5: na , "50х Ликвилации Шорт", shape.circle, location.absolute, color.black, 0, "50х Ликвидации", (color.black), size=size.tiny) plotshape(b ? pos6: na , "25х Ликвидации Шорт", shape.circle, location.absolute, color.black, 0, "25х Ликвидации", (color.black), size=size.tiny) // 方向状态判断 long_short = 0 long_last = c and (nz(long_short[1]) == 0 or nz(long_short[1]) == -1) short_last = b and (nz(long_short[1]) == 0 or nz(long_short[1]) == 1) long_short := long_last ? 1 : short_last ? -1 : long_short[1] // 线条触碰状态变量初始化 var bool long1_touched = false var bool long2_touched = false var bool long3_touched = false var bool short1_touched = false var bool short2_touched = false var bool short3_touched = false // 新信号生成时重置对应方向的触碰状态 if long_last long1_touched := false long2_touched := false long3_touched := false if short_last short1_touched := false short2_touched := false short3_touched := false // 计算清算线价格 longPrice = ta.valuewhen(long_last, close, 0) shortPrice = ta.valuewhen(short_last, close, 0) longStop = longPrice * (1 + (0.49/100)) longStop2 = longPrice * (1 + (1.47/100)) longStop3 = longPrice * (1 + (3.3/100)) ShortStop1 = shortPrice * (1 - (0.49/100)) ShortStop2 = shortPrice * (1 - (1.47/100)) ShortStop3 = shortPrice * (1 - (3.3/100)) // 更新触碰状态 if long_short == 1 long1_touched := long1_touched or high >= longStop long2_touched := long2_touched or high >= longStop2 long3_touched := long3_touched or high >= longStop3 if long_short == -1 short1_touched := short1_touched or low <= ShortStop1 short2_touched := short2_touched or low <= ShortStop2 short3_touched := short3_touched or low <= ShortStop3 // 绘制线条:仅未触碰时输出价格,触碰后输出na终止绘制 plot(long_short == 1 and not long1_touched ? longStop : na , style=plot.style_linebr, color=color.blue, linewidth=1, title="100x Линия Лонг", trackprice=true) plot(long_short == 1 and not long2_touched ? longStop2 :na, style=plot.style_linebr, color=color.black, linewidth=1, title="50x Линия Лонг", trackprice=true) plot(long_short == 1 and not long3_touched ? longStop3 : na, style=plot.style_linebr, color=color.red, linewidth=1, title="25x Линия Лонг", trackprice=true) plot(long_short == -1 and not short1_touched ? ShortStop1 : na, style=plot.style_linebr, color=color.blue, linewidth=1, title="100x Линия Шорт", trackprice=true) plot(long_short == -1 and not short2_touched ? ShortStop2 : na, style=plot.style_linebr, color=color.black, linewidth=1, title="50x Линия Шорт", trackprice=true) plot(long_short == -1 and not short3_touched ? ShortStop3 : na, style=plot.style_linebr, color=color.red, linewidth=1, title="25x Линия Шорт", trackprice=true)
原效果参考

注:原代码中定义了多组未使用的atr变量,修改版中已做冗余清理,同时修正了原代码中空单清算线标记名称重复标注为「Лонг(多头)」的笔误。
内容的提问来源于stack exchange,提问作者Artem Dziubeilo
相关产品推荐
相关产品推荐

