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

EMA交叉策略未触发止盈时,为何切换至二次信号的止盈设置?

EMA交叉策略止盈被重复信号覆盖的修复方案

问题描述

我创建了一个简单的EMA交叉策略,止盈设置为ATR的1.5倍。但出现了一个问题:若首次止盈未触发时再次出现EMA金叉信号,策略会将止盈切换为第二次入场信号对应的1.5倍ATR,而非保留首次的设置。我已移除止损条件用于调试,也在不同时间周期测试过该策略。

原代码如下:

//@version=5
strategy("EMA Bullish Cross with 2 TP Levels", overlay=true)
 
// Input variables
emaFastLength = input.int(10, "EMA Fast Length")
emaSlowLength = input.int(20, "EMA Slow Length")
atrLength = input.int(5, "ATR Length")
tpMultiplier = input.float(1.5, "Take Profit 1 Multiplier")
 
// Calculate EMA and ATR
emaFast = ta.ema(close, emaFastLength)
emaSlow = ta.ema(close, emaSlowLength)
atr = ta.atr(atrLength)
var float persistantATR = na
 
// Determine if there's a bullish EMA cross
Cross = ta.cross(emaFast, emaSlow)
 
// Enter long trade if there's a bullish EMA cross
if (Cross) 
    persistantATR := atr
    strategy.entry("Buy", strategy.long, qty = 100 )
 
    entry_price = strategy.opentrades.entry_price(0)
    strategy.exit("Take Profit", "Buy", qty_percent = 100, limit= entry_price + (persistantATR * tpMultiplier))
 
// debugging
plot(atr, title = "atr")
plot(persistantATR, title = "persistantATR")

问题原因

  1. 每次触发金叉时都会调用strategy.exit,且目标订单ID均为"Buy",新的strategy.exit会直接覆盖原有订单的止盈条件。
  2. persistantATR变量会被每次金叉信号更新,导致止盈计算使用最新的ATR值,而非首次入场时的ATR。

修复方案

方案1:禁止加仓(仅持有一单)

通过判断当前持仓状态,仅当空仓时才执行入场和止盈设置,避免后续信号覆盖原有止盈:

//@version=5
strategy("EMA Bullish Cross with Fixed TP", overlay=true)
 
// Input variables
emaFastLength = input.int(10, "EMA Fast Length")
emaSlowLength = input.int(20, "EMA Slow Length")
atrLength = input.int(5, "ATR Length")
tpMultiplier = input.float(1.5, "Take Profit 1 Multiplier")
 
// Calculate EMA and ATR
emaFast = ta.ema(close, emaFastLength)
emaSlow = ta.ema(close, emaSlowLength)
atr = ta.atr(atrLength)
var float persistantATR = na
 
// Determine if there's a bullish EMA cross
Cross = ta.cross(emaFast, emaSlow)
 
// 仅空仓时入场并设置止盈
if (Cross and strategy.position_size == 0) 
    persistantATR := atr
    strategy.entry("Buy", strategy.long, qty = 100 )
 
    entry_price = strategy.opentrades.entry_price(0)
    strategy.exit("Take Profit", "Buy", qty_percent = 100, limit= entry_price + (persistantATR * tpMultiplier))
 
// debugging
plot(atr, title = "atr")
plot(persistantATR, title = "persistantATR")

关键改动:

  • 增加strategy.position_size == 0判断,确保只有无持仓时才触发入场逻辑
  • 后续金叉信号不会触发新的入场和止盈设置,避免覆盖原有订单的止盈

方案2:允许加仓(每单独立止盈)

如果需要保留每次金叉加仓的逻辑,需为每个订单分配唯一ID,确保每单的止盈独立:

//@version=5
strategy("EMA Bullish Cross with Multiple TP", overlay=true)
 
// Input variables
emaFastLength = input.int(10, "EMA Fast Length")
emaSlowLength = input.int(20, "EMA Slow Length")
atrLength = input.int(5, "ATR Length")
tpMultiplier = input.float(1.5, "Take Profit 1 Multiplier")
 
// Calculate EMA and ATR
emaFast = ta.ema(close, emaFastLength)
emaSlow = ta.ema(close, emaSlowLength)
atr = ta.atr(atrLength)
 
// 生成唯一订单ID
var int tradeId = 0
// Determine if there's a bullish EMA cross
Cross = ta.cross(emaFast, emaSlow)
 
// 每次金叉都加仓,每单设置独立止盈
if (Cross) 
    tradeId += 1
    currentTradeId = "Buy " + str.tostring(tradeId)
    currentATR = atr
    
    strategy.entry(currentTradeId, strategy.long, qty = 100 )
 
    entry_price = strategy.opentrades.entry_price(strategy.opentrades - 1)
    strategy.exit("TP " + currentTradeId, currentTradeId, qty_percent = 100, limit= entry_price + (currentATR * tpMultiplier))
 
// debugging
plot(atr, title = "atr")

关键改动:

  • 使用var int tradeId生成递增的唯一订单ID,每个入场订单拥有独立标识
  • 止盈绑定到对应订单ID,后续信号不会覆盖之前订单的止盈设置
  • 通过strategy.opentrades - 1获取最新入场订单的价格,确保止盈计算正确

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 13:57:44