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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 22:45:00