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

Pine Script双strategy.exit实现TP与TSL独立显示的问题

Pine Script拆分止盈/追踪止损后止损失效的解决方案

问题原因

  1. 同一仓位下连续调用strategy.exit会生成相互独立的退出挂单,Pine Script不会自动关联这些挂单,导致后续的止损单无法覆盖或更新初始的退出逻辑。
  2. 你的追踪止损价longStop/shortStop仅在开仓时计算一次,没有随K线周期动态更新,无法实现“追踪”效果。

修复方案

改用strategy.order实现止盈限价单,用strategy.exit处理追踪止损(利用其原生的追踪功能),这样既能分开显示两个独立标记,又能保证逻辑正常运行:

//@version=5
strategy("Split TP & TSL Strategy", overlay=true, default_qty_type=strategy.cash, default_qty_value=10000, commission_type=strategy.commission.percent, commission_value=0.1)

// Get inputs
atrLength = input.int(title="ATR Length", defval=21, minval=1)
useStructure = input.bool(title="Use Structure?", defval=true)
lookback = input.int(title="How Far To Look Back For High/Lows", defval=9, minval=1)
atrStopMultiplier = input.float(title="ATR Multiplier", defval=0.85, minval=0.1, step = 0.05)

// Calculate data
atr = ta.atr(atrLength)
lowestLow = ta.lowest(low, lookback)
highestHigh = ta.highest(high, lookback)
longStopBase = (useStructure ? lowestLow : close) - atr * atrStopMultiplier
shortStopBase = (useStructure ? highestHigh : close) + atr * atrStopMultiplier

// Take Profit Settings
longProfitPerc = input.float(title="Long Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01
shortProfitPerc = input.float(title="Short Take Profit (%)", minval=0.0, step=0.1, defval=1) * 0.01

// 开仓示例(替换为你的实际开仓逻辑)
if ta.crossover(ta.sma(close, 5), ta.sma(close, 20))
    strategy.entry("Long", strategy.long)
if ta.crossunder(ta.sma(close, 5), ta.sma(close, 20))
    strategy.entry("Short", strategy.short)

// 处理止盈与追踪止损
if strategy.position_size > 0
    // 止盈:用strategy.order发送限价单
    longExitPrice = strategy.position_avg_price * (1 + longProfitPerc)
    strategy.order("Long TP", strategy.short, qty=strategy.position_size, limit=longExitPrice, alert_message="close BTCUSDT a=usdm")
    
    // 追踪止损:用strategy.exit的trail_offset实现动态追踪
    strategy.exit("Long TSL", stop=longStopBase, trail_offset=atr*atrStopMultiplier, alert_message="close BTCUSDT a=usdm")

if strategy.position_size < 0
    // 止盈:用strategy.order发送限价单
    shortExitPrice = strategy.position_avg_price * (1 - shortProfitPerc)
    strategy.order("Short TP", strategy.long, qty=-strategy.position_size, limit=shortExitPrice, alert_message="close BTCUSDT a=usdm")
    
    // 追踪止损:用strategy.exit的trail_offset实现动态追踪
    strategy.exit("Short TSL", stop=shortStopBase, trail_offset=atr*atrStopMultiplier, alert_message="close BTCUSDT a=usdm")

// 手动绘制标记(可选,增强可视化)
plot(strategy.position_size > 0 ? longExitPrice : na, color=color.green, style=plot.style_circles, title="Long TP Marker")
plot(strategy.position_size > 0 ? strategy.exit_price("Long TSL") : na, color=color.red, style=plot.style_circles, title="Long TSL Marker")
plot(strategy.position_size < 0 ? shortExitPrice : na, color=color.red, style=plot.style_circles, title="Short TP Marker")
plot(strategy.position_size < 0 ? strategy.exit_price("Short TSL") : na, color=color.green, style=plot.style_circles, title="Short TSL Marker")

关键改动说明

  • 用strategy.order单独发送止盈限价单,确保止盈挂单独立存在。
  • 用strategy.exit的trail_offset参数实现原生追踪止损,让止损价随ATR动态调整,避免手动计算的滞后性。
  • 添加了手动绘制标记的代码,确保图表上能清晰看到止盈和追踪止损的位置(也可依赖Pine Script自动生成的订单标记)。
  • 如果你的开仓逻辑有自定义ID,需确保strategy.exit的from_entry参数对应开仓ID(示例中已默认关联)。

内容的提问来源于stack exchange,提问作者xBruV

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:15:44