EMA Strategy with ATR Stop Loss

Author: ChaoZhang, Date: 2023-12-11 16:00:09
Tags:

img

Overview

This strategy uses the EMA golden cross to generate trading signals, that is, a buy signal is generated when the fast EMA line crosses above the slow EMA line, and a sell signal is generated when the fast EMA line crosses below the slow EMA line. It belongs to a typical trend following strategy. At the same time, the strategy uses the ATR indicator to set a dynamic stop loss to control risks while ensuring profits.

Strategy Principle

  1. Define the fast EMA period as 13 and the slow EMA period as 48.
  2. When the fast EMA line crosses above the slow EMA line, a buy signal is generated; when the fast EMA line crosses below the slow EMA line, a sell signal is generated.
  3. Use the ta.crossover and ta.crossunder functions to determine golden cross and death cross of moving averages.
  4. Use the ATR indicator to calculate the dynamic stop loss, which is 1.5 times the ATR away from the close.
  5. Intuitively display trading signals and stop loss levels through color changes, buy/sell marks and stop loss lines.

Advantage Analysis

  1. Signals are generated based on EMA golden cross and death cross, which avoids missing major market trends and returns are considerable.
  2. ATR trailing stop loss ensures adequate trend-following profits while controlling drawdowns, achieving a balanced risk-reward ratio.
  3. Intuitive signal display and stop loss display, easy to operate, suitable for most people.
  4. Few adjustable parameters, easy to grasp and optimize.

Risk Analysis

  1. Flash crashes may trigger the stop loss.
  2. Frequent invalid signals may occur in ranging markets.
  3. Improper parameter settings may result in overly aggressive entry or loose stop loss.
  4. EMA parameters and ATR parameters need proper optimization.

Solutions:

  1. Appropriately loosen the ATR multiplier to leave some buffer from recent highs.
  2. Consider confirmation mechanisms after signal occurs, such as price breaking previous high etc.
  3. Parameter optimization should take into account various market conditions.

Optimization Directions

  1. Test different parameter combinations to find optimum parameters.
  2. Consider adding other indicators for signal filtering, such as volume, volatility indicators etc to improve signal quality.
  3. Adjust EMA parameters according to major trends to better capture main trends.
  4. Consider dynamically adjusting ATR stop loss multiplier to expand stop range during trending markets.
  5. Incorporate machine learning algorithms for adaptive parameter optimization.

Conclusion

The strategy is relatively simple and easy to use. It generates signals based on EMA crossovers, follows the trend, and uses ATR trailing stop loss to effectively control risks. Although there may be some false signals, it has strong capabilities in capturing main trends and returns are relatively stable. It is suitable as a basic quantitative trading strategy. There is also great potential for improvements through parameter optimization and function extensions.


/*backtest
start: 2022-12-04 00:00:00
end: 2023-12-10 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © byee322

/// This strategy uses the EMA to generate buy and sell signals with a 1.5x ATR stop loss
//@version=5
strategy("EMA Strategy with ATR Stop Loss", overlay=true)

// Define the EMA lengths as input parameters
emaLength1 = input(13, "EMA Length 1")
emaLength2 = input(48, "EMA Length 2")

// Define the moving averages
ema1 = ta.ema(close, emaLength1)
ema2 = ta.ema(close, emaLength2)

// Buy signal: EMA 1 crosses above EMA 2
buy = ta.crossover(ema1, ema2)

// Sell signal: EMA 1 crosses below EMA 2
sell = ta.crossunder(ema1, ema2)

// Define the state variable
state = 0
state := buy ? 1 : sell ? -1 : nz(state[1])

// Change the color of the candles
color = state == 1 ? color.green : state == -1 ? color.red : na

// Plot the colored candles
plotcandle(open, high, low, close, color=color)

// Plot the signals on the chart with text labels
plotshape(buy, style=shape.triangleup, color=color.new(color.green, 50), location=location.belowbar, text="Buy")
plotshape(sell, style=shape.triangledown, color=color.new(color.red, 50), location=location.abovebar, text="Sell")

// Calculate the ATR
atrVal = ta.atr(14)

// Calculate the stop loss level for buy
stopLossBuy = buy ? close[1] - 1.5 * atrVal : na

// Calculate the stop loss level for sell
stopLossSell = sell ? close[1] + 1.5 * atrVal : na

// Plot the stop loss level for buy
plot(stopLossBuy,  color=color.new(color.green, 50), linewidth=3)

// Plot the stop loss level for sell
plot(stopLossSell, color=color.new(color.red, 50), linewidth=3)

if buy
    strategy.entry("Enter Long", strategy.long)
else if sell
    strategy.entry("Enter Short", strategy.short)

More