该策略是一个结合了移动平均线趋势跟踪和动态止损的交易系统。它使用MACD(移动平均收敛发散指标)来捕捉价格动量,运用EMA(指数移动平均线)进行趋势确认,并利用ATR(真实波幅指标)来设置动态止损位置。这种多维度的分析方法既能及时把握市场机会,又能有效控制风险。
策略的核心逻辑包含三个维度: 1. 通过MACD指标的金叉(快线上穿慢线)寻找做多机会,死叉(快线下穿慢线)寻找平仓时机。 2. 使用20周期EMA作为趋势过滤器,只有当价格位于EMA之上时才允许做多,这样可以避免在下跌趋势中开仓。 3. 基于ATR动态设置止损位置,止损位可以随市场波动性自适应调整。当启用移动止损时,止损位会随着价格上涨而上移,从而锁定已有利润。
该策略通过结合趋势跟踪、动量分析和动态风险控制,构建了一个完整的交易系统。它的主要特点是在保持策略稳健性的同时,实现了对市场机会的有效捕捉和对交易风险的动态控制。虽然存在一些固有风险,但通过合理的参数设置和持续优化,该策略具有良好的实战应用价值。
/*backtest
start: 2024-09-25 00:00:00
end: 2025-02-19 08:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("MACD + ATR Dynamic Stop-Loss Strategy", overlay=true)
// Input parameters
macdFastLength = input.int(12, title="MACD Fast Length")
macdSlowLength = input.int(26, title="MACD Slow Length")
macdSignalSmoothing = input.int(9, title="MACD Signal Smoothing")
atrLength = input.int(14, title="ATR Length")
stopLossMultiplier = input.float(1.0, title="Stop-Loss ATR Multiplier")
useTrailingStop = input.bool(true, title="Use Trailing Stop")
trailATRMultiplier = input.float(2.0, title="Trailing Stop ATR Multiplier")
emaLength = input.int(20, title="EMA Length")
// Calculate MACD
[macdLine, signalLine, _] = ta.macd(close, macdFastLength, macdSlowLength, macdSignalSmoothing)
// Calculate ATR
atr = ta.atr(atrLength)
// Calculate 20-period EMA
ema20 = ta.ema(close, emaLength)
// Entry Conditions
buyCondition = ta.crossover(macdLine, signalLine) and close > ema20
sellCondition = ta.crossunder(macdLine, signalLine)
// Plot Buy and Sell Signals
plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=sellCondition, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")
// Dynamic Stop-Loss and Trailing Stop Logic
var float stopLossLevel = na
var float trailingStopLevel = na
if (buyCondition)
stopLossLevel := close - atr * stopLossMultiplier
trailingStopLevel := close - atr * trailATRMultiplier
if (strategy.position_size > 0)
if (useTrailingStop)
trailingStopLevel := math.max(trailingStopLevel, close - atr * trailATRMultiplier)
stopLossLevel := trailingStopLevel
strategy.exit("Trailing Stop", stop=stopLossLevel)
// Execute Trades
if (buyCondition)
strategy.entry("Long", strategy.long)
if (sellCondition)
strategy.close("Long")
// Plot Stop-Loss Level
plot(stopLossLevel, title="Stop-Loss Level", color=color.red, linewidth=1, style=plot.style_linebr)