
This strategy is a trend following trading system based on multiple Exponential Moving Averages (EMA) and Average True Range (ATR). It confirms trend direction through multiple EMA alignments, seeks pullback opportunities in uptrends, and uses ATR for dynamic stop-loss and profit targets. This approach ensures trend following stability while dynamically adapting to market volatility.
The core logic includes the following key elements: 1. Trend Identification: Uses 20, 50, 100, and 200-day EMAs, confirming an uptrend when shorter EMAs are above longer ones in bullish alignment. 2. Entry Conditions: After trend confirmation, enters when price pulls back to near the 21-day EMA (between 21 and 50 EMAs). 3. Risk Management: Sets dynamic stop-loss and profit targets based on ATR - stop-loss at 1.5 times ATR below entry, profit target at 3.5 times ATR above entry. 4. Position Management: Employs single position approach, avoiding multiple entries while holding positions.
This is a well-structured and logically rigorous trend following strategy. The combination of multiple EMA trend confirmation, pullback entries, and ATR-based dynamic risk management ensures both robustness and adaptability. While inherent risks exist, the suggested optimizations can further enhance strategy stability and profitability. This strategy is particularly suitable for tracking medium to long-term trends and is a solid choice for traders seeking consistent returns in trending markets.
/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy("EMA Crossover and ATR Target Strategy", overlay=true)
// Input parameters
emaShortLength = 20
emaMidLength1 = 50
emaMidLength2 = 100
emaLongLength = 200
atrLength = 14
// Calculate EMAs
ema20 = ta.ema(close, emaShortLength)
ema50 = ta.ema(close, emaMidLength1)
ema100 = ta.ema(close, emaMidLength2)
ema200 = ta.ema(close, emaLongLength)
ema21 = ta.ema(close, 21)
// Calculate ATR
atr = ta.atr(atrLength)
// Conditions for the strategy
emaCondition = ema20 > ema50 and ema50 > ema100 and ema100 > ema200
pullbackCondition = close <= ema21 and close >= ema50 //and close >= ema21 * 0.99 // Near 21 EMA (within 1%)
// Initialize variables for stop loss and take profitss
var float stopLossLevel = na
var float takeProfitLevel = na
// Check conditions on each bar close
if (bar_index > 0) // Ensures there is data to check
if emaCondition and pullbackCondition and strategy.position_size == 0 // Only buy if no open position
stopLossLevel := close - (1.5 * atr) // Set stop loss based on ATR at buy price
takeProfitLevel := close + (3.5 * atr) // Set take profit based on ATR at buy price
strategy.entry("Buy", strategy.long)
// Set stop loss and take profit for the active trade
if strategy.position_size > 0
strategy.exit("Take Profit", from_entry="Buy", limit=takeProfitLevel, stop=stopLossLevel)
// Plot EMAs for visualizationn
plot(ema20, color=color.blue, title="20 EMA")
plot(ema50, color=color.red, title="50 EMA")
plot(ema100, color=color.green, title="100 EMA")
plot(ema200, color=color.orange, title="200 EMA")
plot(ema21, color=color.purple, title="21 EMA")