You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

关键修改说明

  • 状态追踪:用isLongPartialExitedisShortPartialExited两个布尔变量,分别记录多头/空头是否完成了50%的止盈平仓。
  • 分状态平仓
    • 仓位完整时:同时挂两个独立的exit——一个负责平50%的止盈,另一个负责平100%的追踪止损,确保未达止盈时能全仓止损。
    • 部分平仓后:仅为剩余50%仓位挂追踪止损,平仓完成后重置状态,不影响下一轮交易。
  • 独立命名exit:给不同状态的止损指令设置不同名称(比如EL FullEL Partial),避免Pine Script的exit指令冲突。

这样就能完全匹配你的需求:

  • 触发3%止盈时自动平50%,剩余仓位由追踪止损接管;
  • 未达止盈目标时,追踪止损直接平仓100%仓位。

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

火山引擎 最新活动