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

如何修改Pine Script实现新信号触发时清除旧止损止盈绘图

Pine Script 修改方案:新信号触发时自动清除旧止损/止盈线

问题核心

原代码中每次均线交叉触发交易信号时,旧的止损(SL)和止盈(TP)线条会持续保留在图表上,导致画面杂乱。需要实现每次新信号触发时,自动清除之前所有旧线条,仅显示当前信号对应的SL/TP线。

修改思路

原代码用valuewhen获取所有历史信号的入场价格,导致旧信号的SL/TP线一直显示。我们需要让SL/TP线只绑定最近一次有效信号,具体调整点:

  • 用barssince跟踪最近一次信号的触发间隔,只在信号触发后的K线上绘制对应线条,新信号触发后,旧信号的线条自动变为na(不显示)
  • 优化入场价格的获取逻辑,确保只取最近一次信号的价格,而非历史所有信号
  • 调整线条绘制的条件,仅当当前处于最近一次信号的持仓状态时,才绘制对应的SL/TP线

修改后的完整代码

//@version=4
study("Fixed Percent Stop Loss & Take Profit % - Clean Version", overlay=true)

// 均线信号逻辑
eg1 = ema(close, 5)
eg2 = ema(close, 32)

long = crossover(eg1, eg2)
short = crossunder(eg1, eg2)

// 绘制入场信号标记
plotshape(long, style=shape.labelup, location=location.belowbar, color=color.green, size=size.tiny, title="多单入场", text="LONG", textcolor=color.white)
plotshape(short, style=shape.labeldown, location=location.abovebar, color=color.red, size=size.tiny, title="空单入场", text="SHORT", textcolor=color.white)

// 止损/止盈百分比设置
stopPer = input(3, title='止损百分比(%)', type=input.float) / 100
takePer = input(9, title='止盈百分比(%)', type=input.float) / 100

// 跟踪当前持仓状态与最近一次信号
current_pos = 0
// 只有在无持仓或反向持仓时,新信号才生效
long_entry = long and (nz(current_pos[1]) == 0 or nz(current_pos[1]) == -1)
short_entry = short and (nz(current_pos[1]) == 0 or nz(current_pos[1]) == 1)
current_pos := long_entry ? 1 : short_entry ? -1 : current_pos[1]

// 获取最近一次有效信号的入场价格
latest_long_price = valuewhen(long_entry, close, 0)
latest_short_price = valuewhen(short_entry, close, 0)

// 计算当前信号对应的止损/止盈价格
long_stop = latest_long_price * (1 - stopPer)
short_stop = latest_short_price * (1 + stopPer)
long_take = latest_long_price * (1 + takePer)
short_take = latest_short_price * (1 - takePer)

// 绘制止损/止盈线:仅显示当前持仓信号的线条,旧信号线条自动隐藏
plot(current_pos == 1 ? long_stop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="多单止损")
plot(current_pos == -1 ? short_stop : na, style=plot.style_linebr, color=color.red, linewidth=1, title="空单止损")
plot(current_pos == 1 ? long_take : na, style=plot.style_linebr, color=color.green, linewidth=1, title="多单止盈")
plot(current_pos == -1 ? short_take : na, style=plot.style_linebr, color=color.green, linewidth=1, title="空单止盈")

// 过滤信号触发当天的止损/止盈检测(避免当日入场即触发)
bars_since_long = barssince(long_entry)
valid_long_check = bars_since_long >= 1
bars_since_short = barssince(short_entry)
valid_short_check = bars_since_short >= 1

// 止损触发检测
long_sl_hit = current_pos == 1 and valid_long_check and low < long_stop
plotshape(long_sl_hit, style=shape.labelup, location=location.belowbar, color=color.gray, size=size.tiny, title="多单止损触发", text=" 多单止损", textcolor=color.white)
short_sl_hit = current_pos == -1 and valid_short_check and high > short_stop
plotshape(short_sl_hit, style=shape.labeldown, location=location.abovebar, color=color.gray, size=size.tiny, title="空单止损触发", text=" 空单止损", textcolor=color.white)

// 止盈触发检测
long_tp_hit = current_pos == 1 and valid_long_check and high > long_take
plotshape(long_tp_hit, style=shape.labeldown, location=location.abovebar, color=color.purple, size=size.tiny, title="多单止盈触发", text="多单止盈", textcolor=color.white)
short_tp_hit = current_pos == -1 and valid_short_check and low < short_take
plotshape(short_tp_hit, style=shape.labelup, location=location.belowbar, color=color.purple, size=size.tiny, title="空单止盈触发", text="空单止盈", textcolor=color.white)

// 触发止损/止盈后重置持仓状态
current_pos := (current_pos == 1 and valid_long_check and (long_sl_hit or long_tp_hit)) ? 0 : 
              (current_pos == -1 and valid_short_check and (short_sl_hit or short_tp_hit)) ? 0 : 
              current_pos

内容的提问来源于stack exchange,提问作者Nahuel Patricio Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 03:45:46