基于EMA交叉的百分比止盈与追踪止损策略问题
解决EMA交叉策略的平仓逻辑问题
我懂你遇到的问题了——当前代码的核心问题是没区分「完整仓位」和「止盈后剩余仓位」的状态,导致未触发止盈时,追踪止损只能平仓50%而非预期的100%。
要实现你的需求,我们需要用状态变量跟踪是否已经执行过止盈的部分平仓,再根据状态调整平仓逻辑:
修改后的完整代码
//@version=5 strategy("EMA Cross with Partial Take Profit & Trailing Stop", overlay=true) // 状态变量:标记是否已执行过止盈部分平仓 var bool isLongPartialExited = false var bool isShortPartialExited = false // --- 多头仓位处理逻辑 --- if (strategy.position_size > 0) // 未触发止盈时:同时挂50%止盈 + 100%追踪止损 if not isLongPartialExited // 止盈平50%,触发后标记状态 if strategy.exit("XL", qty_percent=50, limit=longExitPrice) isLongPartialExited := true // 追踪止损平100%(仅在未触发止盈时生效) strategy.exit("EL Full", stop=longStopPrice, qty_percent=100) // 已触发止盈后:为剩余50%仓位挂追踪止损 else strategy.exit("EL Partial", stop=longStopPrice, qty_percent=100) // 剩余仓位平仓后重置状态,方便下一次交易 if strategy.position_size == 0 isLongPartialExited := false // --- 空头仓位处理逻辑 --- if (strategy.position_size < 0) if not isShortPartialExited if strategy.exit("XS", qty_percent=50, limit=shortExitPrice) isShortPartialExited := true strategy.exit("ES Full", stop=shortStopPrice, qty_percent=100) else strategy.exit("ES Partial", stop=shortStopPrice, qty_percent=100) if strategy.position_size == 0 isShortPartialExited := false
关键修改说明
- 状态追踪:用
isLongPartialExited和isShortPartialExited两个布尔变量,分别记录多头/空头是否完成了50%的止盈平仓。 - 分状态平仓:
- 仓位完整时:同时挂两个独立的exit——一个负责平50%的止盈,另一个负责平100%的追踪止损,确保未达止盈时能全仓止损。
- 部分平仓后:仅为剩余50%仓位挂追踪止损,平仓完成后重置状态,不影响下一轮交易。
- 独立命名exit:给不同状态的止损指令设置不同名称(比如
EL Full和EL Partial),避免Pine Script的exit指令冲突。
这样就能完全匹配你的需求:
- 触发3%止盈时自动平50%,剩余仓位由追踪止损接管;
- 未达止盈目标时,追踪止损直接平仓100%仓位。
内容的提问来源于stack exchange,提问作者dgtomu




