如何修改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
相关产品推荐
相关产品推荐

