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

Pine Script策略SL未触发,如何设置保本+追踪止损?

策略止损与止盈触发冲突问题

我花了好几个小时调试策略逻辑,需求是:

  • 触发第一止盈目标后,启用保本止损
  • 触发第二止盈目标后,启动自动追踪止损

目前已经成功画出slLevel线,但价格触碰时止损并未执行。试了两种代码变体,要么止盈正常触发但止损失效,要么止损能工作但止盈出问题。

代码版本1(止盈正常,止损失效)

shortSL := if strategy.position_size == -3
    slFromEntry
else if strategy.position_size == -2
    strategy.position_avg_price - stopOffset
else if strategy.position_size == -1
    shortStopPrice
else
    shortStopPrice

if (shortCondition and strategy.position_size >= 0)
    slFromEntry :=  shortSL
    strategy.entry('Short1', strategy.short, qty=3, stop=shortEntryPrice) //, when = shortCondition and strategy.position_size >= 0)
    strategy.exit('TP1', 'Short1', qty=1, comment_profit="TP1", limit=tp1Short)
    strategy.exit('TP2', 'Short1', qty=1, comment_profit="TP2", limit=tp2Short)
    strategy.exit('TP3', 'Short1', qty=1, comment_profit="TP3", limit=tp3Short)
strategy.exit('SL', 'Short1', qty=3, comment_loss="SL", stop=shortSL)

代码版本2(止损可工作,止盈失效)

shortSL := if strategy.position_size == -3
    slFromEntry
else if strategy.position_size == -2
    strategy.position_avg_price - stopOffset
else if strategy.position_size == -1
    shortStopPrice
else
    shortStopPrice

if (shortCondition and strategy.position_size >= 0)
    slFromEntry :=  shortSL
    strategy.entry('Short1', strategy.short, qty=3, stop=shortEntryPrice) //, when = shortCondition and strategy.position_size >= 0)
    strategy.exit('TP1', 'Short1', qty=1, comment_profit="TP1", comment_loss="SL",limit=tp1Short, stop=shortSL)
    strategy.exit('TP2', 'Short1', qty=1, comment_profit="TP2", comment_loss="SL",limit=tp2Short, stop=shortSL)
    strategy.exit('TP3', 'Short1', qty=1, comment_profit="TP3", comment_loss="SL",limit=tp3Short, stop=shortSL)
strategy.exit('SLS1', 'Short1', qty=3, comment_loss="SL", stop=shortSL)

问题根源

在Pine Script中,多个strategy.exit绑定到同一个持仓时,会存在优先级和覆盖问题:

  1. 版本1中,单独的strategy.exit('SL')试图覆盖3手的止损,但三个止盈exit指令没有关联止损,导致当持仓减少(比如平1手后),全局的SL指令的qty=3与当前持仓数量不匹配,无法触发止损。
  2. 版本2中,每个止盈exit都绑定了止损,这会导致多个止损指令互相冲突,Pine Script只会优先执行第一个匹配的exit,反而阻止了止盈的正常触发。

修复方案

核心思路是用单个动态调整的strategy.exit来管理所有止盈和止损逻辑,根据持仓数量动态更新止损价格,避免多指令冲突:

// 初始化止损价格变量,用var避免每次Bar重置
var float shortSL = na

// 根据持仓状态动态更新止损价格
if strategy.position_size != 0
    shortSL := switch strategy.position_size
        -3 => slFromEntry          // 初始3手:用初始止损
        -2 => strategy.position_avg_price - stopOffset  // 平1手后:保本止损
        -1 => shortStopPrice       // 平2手后:追踪止损

// 开仓逻辑
if (shortCondition and strategy.position_size >= 0)
    strategy.entry('Short1', strategy.short, qty=3, stop=shortEntryPrice)
    // 绑定三个止盈,不单独设置止损
    strategy.exit('TP1', 'Short1', qty=1, comment_profit="TP1", limit=tp1Short)
    strategy.exit('TP2', 'Short1', qty=1, comment_profit="TP2", limit=tp2Short)
    strategy.exit('TP3', 'Short1', qty=1, comment_profit="TP3", limit=tp3Short)

// 动态止损:只保留一个全局止损指令,qty设为当前持仓量
if strategy.position_size < 0
    strategy.exit('DynamicSL', 'Short1', qty=abs(strategy.position_size), comment_loss="SL", stop=shortSL)

关键改进点

  • 用var声明shortSL,确保变量值在Bar之间持续保留
  • 通过switch简化持仓状态判断逻辑,代码更清晰
  • 全局止损指令的qty设为当前持仓的绝对值,确保与剩余持仓数量匹配
  • 止盈指令只负责平对应仓位,不绑定止损,避免多指令冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 17:17:27