You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pine Script如何控制Plot线条:遇K线截断、未触碰则右延

结论

仅使用plot函数自带参数无法直接实现需求。plot本身只负责逐K线渲染传入的数值序列,没有内置“价格触碰后终止绘制”的状态记忆能力,但不需要额外使用line.new等绘图对象,只需要提前为每条线增加触碰状态标记,将触碰后的传入值设为na,配合plot即可实现目标效果。

核心实现逻辑

为每一条清算线配置独立的布尔状态变量,按以下规则更新:

  • 当新的多/空枢轴信号触发,生成对应方向的新清算线时,将该方向所有线条的「已触碰」标记重置为false
  • 线条存续期间逐K线判断触碰条件:
    • 多头清算线(位于开仓价上方):当K线最高价high大于等于线条价格,判定为被触碰/穿过
    • 空头清算线(位于开仓价下方):当K线最低价low小于等于线条价格,判定为被触碰/穿过
  • 触碰条件一旦触发,对应线条的「已触碰」标记永久保持为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:48:13