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")
问题原因
- 每次触发金叉时都会调用
strategy.exit,且目标订单ID均为"Buy",新的strategy.exit会直接覆盖原有订单的止盈条件。 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
相关产品推荐
相关产品推荐

