Pine Script策略实现部分止盈后止损移至入场价(保本)问题
Pine Script v5 半仓止盈后切换保本止损实现方案
原有代码错误点
- 第二个止损订单的
from_entry参数关联错误,不能指向第一个止盈订单ID,需关联原始入场单ID - 缺少部分止盈状态标记,无法动态切换止损规则
- 冗余的
strategy.close调用会和exit订单的止损、止盈逻辑冲突 - 入场价赋值逻辑存在漏洞,空头开仓时入场价不会更新
修正后代码
//@version=5 strategy('Renko', overlay=true, currency=currency.USD, initial_capital=500, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=200, margin_long=1, margin_short=1) // 可调整参数 atrMulti_Loss = input.float(1.5, title="止损ATR倍数") atrMulti_Profit = input.float(3, title="止盈ATR倍数") // 状态变量 entry_atr = float(0.0) entry_price = float(0.0) has_partial_tp = bool(false) // 标记是否已触发50%止盈 // 修正入场价、入场ATR赋值逻辑,覆盖多空两种开仓情况 entry_atr := strategy.position_size == 0 or entry_long or entry_short ? atr : entry_atr[1] entry_price := strategy.position_size == 0 or entry_long or entry_short ? close : entry_price[1] // 开仓后重置部分止盈标记 has_partial_tp := strategy.position_size == 0 ? false : has_partial_tp[1] // 开仓逻辑 if entry_long strategy.entry(id='Long Entry', direction=strategy.long) if entry_short strategy.entry(id='Short Entry', direction=strategy.short) // 计算初始止盈止损点位 nLoss = entry_atr * atrMulti_Loss nProfit = entry_atr * atrMulti_Profit long_profit_level = entry_price + nProfit long_stop_level = entry_price - nLoss // 动态止损:未触发部分止盈用初始止损,触发后用入场价保本 dynamic_long_stop = has_partial_tp ? entry_price : long_stop_level short_profit_level = entry_price - nProfit short_stop_level = entry_price + nLoss dynamic_short_stop = has_partial_tp ? entry_price : short_stop_level // 绘图逻辑 plot(strategy.position_size > 0 ? dynamic_long_stop : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2, title="多头止损") plot(strategy.position_size > 0 ? long_profit_level : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2, title="多头止盈") plot(strategy.position_size < 0 ? dynamic_short_stop : na, color=color.new(color.red, 0), style=plot.style_linebr, linewidth=2, title="空头止损") plot(strategy.position_size < 0 ? short_profit_level : na, color=color.new(color.green, 0), style=plot.style_linebr, linewidth=2, title="空头止盈") // 多头平仓逻辑:50%仓位止盈,同时触发后更新部分止盈标记 strategy.exit('TP/SL Long', from_entry='Long Entry', stop=dynamic_long_stop, limit=long_profit_level, qty_percent=50, when=strategy.position_size > 0) // 部分止盈触发后修改状态标记 has_partial_tp := strategy.position_size > 0 and strategy.exit_count('TP/SL Long') > 0 ? true : has_partial_tp // 剩余50%仓位保本止损 strategy.exit('BE SL Long', from_entry='Long Entry', stop=entry_price, when=has_partial_tp and strategy.position_size > 0) // 空头平仓逻辑 strategy.exit('TP/SL Short', from_entry='Short Entry', stop=dynamic_short_stop, limit=short_profit_level, qty_percent=50, when=strategy.position_size < 0) has_partial_tp := strategy.position_size < 0 and strategy.exit_count('TP/SL Short') > 0 ? true : has_partial_tp strategy.exit('BE SL Short', from_entry='Short Entry', stop=entry_price, when=has_partial_tp and strategy.position_size < 0)
核心改动说明
- 新增
has_partial_tp状态变量,通过strategy.exit_count判断第一次50%止盈是否触发,触发后自动切换止损规则 - 修正了入场价赋值逻辑,覆盖多空两种开仓场景,保证持仓期间入场价不会被错误重置
- 统一平仓逻辑到
strategy.exit调用,删除冗余的strategy.close避免逻辑冲突 - 动态计算止损点位,触发部分止盈前用ATR初始止损,触发后自动切换为入场价保本
内容的提问来源于stack exchange,提问作者djdirtyfunk
相关产品推荐
相关产品推荐

