EMA-MACD-SuperTrend-ADX-ATR Multi-Indicator Trading Signal Strategy

Author: ChaoZhang, Date: 2024-03-29 15:41:29



This strategy combines multiple technical indicators, including Exponential Moving Average (EMA), Moving Average Convergence Divergence (MACD), SuperTrend, Average Directional Index (ADX), and Average True Range (ATR), to determine market trends, volatility, and trading signals, aiming to achieve strong returns in cryptocurrency trading. The strategy leverages the strengths of different indicators to balance trend identification, oscillation determination, and risk control, providing reliable trading signals for traders.

Strategy Principle

  1. The crossover of the 12-day and 26-day EMAs is used as a basis for trend determination. When the 12-day EMA crosses above the 26-day EMA, it indicates an uptrend; conversely, it indicates a downtrend.
  2. The MACD indicator is used as an auxiliary judgment. When the MACD histogram is above 0, combined with the EMA bullish signal, a long position is opened. When the MACD histogram is below 0, combined with the EMA bearish signal, a short position is opened.
  3. The ADX indicator is used to determine whether the market is in a trending state. When ADX is above 15, the market is considered to be in a trending phase.
  4. The ATR indicator is used to assess market volatility. When ATR is greater than 0.5 times the 20-day ATR, the market is considered to be in a high volatility state.
  5. The SuperTrend indicator is introduced as a stop-loss condition. When the price falls below the SuperTrend, long positions are closed, and when the price breaks above the SuperTrend, short positions are closed.
  6. When the EMA, MACD, ADX, and ATR conditions are met, positions are opened based on bullish or bearish signals. When the SuperTrend stop-loss condition is triggered, positions are closed.

Strategy Advantages

  1. Multi-indicator combination: The strategy combines multiple technical indicators to analyze the market from various dimensions, including trend, oscillation, and risk control, improving the reliability of trading signals.
  2. Trend identification: By combining EMA and MACD, the strategy can effectively determine the market trend direction, providing a basis for trading decisions.
  3. Risk control: The introduction of ADX and ATR indicators helps assess the trend strength and volatility of the market, controlling trading risks to a certain extent.
  4. Stop-loss mechanism: Using the SuperTrend indicator as a stop-loss condition effectively limits the maximum loss of a single trade, protecting trading capital.
  5. Parameter flexibility: The indicator parameters in the strategy can be flexibly adjusted according to different market conditions and trading instruments to adapt to changing market environments.

Strategy Risks

  1. Parameter optimization: The strategy involves multiple indicators and parameters, such as EMA periods, MACD parameters, and ADX thresholds. The selection of these parameters has a significant impact on the strategy’s performance and requires iterative parameter optimization and debugging.
  2. Market adaptability: The strategy may underperform in certain market conditions, such as range-bound markets or trend reversal points, where the strategy may generate incorrect trading signals.
  3. Slippage and trading costs: In highly volatile markets, the strategy may generate frequent trading signals, leading to higher slippage and trading costs, affecting the strategy’s profitability.
  4. Backtesting limitations: The backtesting results of the strategy may have certain limitations. Actual market conditions may differ from historical data, and the strategy’s performance in live trading may not entirely align with backtesting results.

Strategy Optimization Directions

  1. Dynamic parameter optimization: Dynamically optimize the key parameters in the strategy for different market conditions and trading instruments to improve the strategy’s adaptability and robustness.
  2. Incorporation of market sentiment indicators: In addition to the existing indicators, introduce indicators that reflect market sentiment, such as the Volatility Index (VIX), to quantitatively analyze market sentiment and assist in trading decisions.
  3. Improved stop-loss mechanism: Enhance the flexibility and effectiveness of stop-losses by introducing additional stop-loss methods, such as trailing stops or percentage-based stops, in addition to the SuperTrend stop-loss.
  4. Position sizing optimization: Dynamically adjust position sizes based on factors such as market trend strength and volatility. Increase position sizes when trends are clear and reduce position sizes in range-bound markets to improve capital efficiency.
  5. Multi-timeframe analysis: Combine signals from different timeframes, such as daily and 4-hour charts, to confirm trading signals across multiple timeframes, enhancing signal reliability.


The EMA-MACD-SuperTrend-ADX-ATR Multi-Indicator Trading Signal Strategy is a quantitative trading strategy that integrates multiple technical indicators. By combining indicators such as EMA, MACD, ADX, and ATR, the strategy analyzes the market from various dimensions, including trend, oscillation, and risk control, providing reliable trading signals for traders. The strategy’s strengths lie in its multi-indicator combination, trend identification, risk control, and stop-loss mechanism. However, it also faces risks such as parameter optimization, market adaptability, trading costs, and backtesting limitations. In the future, the strategy can be optimized and improved through dynamic parameter optimization, incorporation of market sentiment indicators, enhancement of the stop-loss mechanism, position sizing optimization, and multi-timeframe analysis to increase its adaptability, robustness, and profitability.

start: 2023-03-23 00:00:00
end: 2024-03-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

strategy("EMA-MACD-SuperTrend-ADX-ATR Strategy", 
     overlay = true,
     initial_capital = 1000,
     default_qty_type = strategy.percent_of_equity,
     default_qty_value = 70)

[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)
//Plot Candlesticks
candlestickscolor = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252))
plotcandle(open, high, low, close, 
     color = candlestickscolor, 
     bordercolor = candlestickscolor)
ema12 = ta.ema(close, 12)
ema26 = ta.ema(close, 26)

//Plot EMA
plot(ema26, color= #EE6969, linewidth = 2)
plot(ema12, color= #B4CBF0, linewidth = 2)

//Average Directional Index (ADX) Calculation
trueRange = ta.rma(ta.tr, 14)
plusDM = ta.rma(math.max(high - high[1], 0), 14)
minusDM = ta.rma(math.max(low[1] - low, 0), 14)
plusDI = 100 * ta.rma(plusDM / trueRange, 14)
minusDI = 100 * ta.rma(minusDM / trueRange, 14)
adxValue = 100  *ta.rma(math.abs(plusDI - minusDI) / (plusDI + minusDI), 14)

//Trend Confirmation (ADX)
trending = adxValue > 15

//Volatility Filter (ATR)
atrValue = ta.atr(14)
volatility = atrValue > 0.5 * ta.atr(20)

atrlength = input.int(10, "ATR Length", step = 1)
factor = input.float(3, "Factor", step = 0.1)
[supertrend, direction] = ta.supertrend(factor, atrlength)
supertrend := barstate.isfirst ? na : supertrend

//Plot SuperTrend
uptrend = plot(direction < 0 ? supertrend : na, 
     "Up Trend", color = color.green, style = plot.style_linebr, linewidth = 1)

downtrend = plot(direction > 0 ? supertrend : na,
     "Down Trend", color = color.red, style = plot.style_linebr, linewidth = 1)
bodymiddle = plot(barstate.isfirst ? na : (open + close)/2, "Body Middle", display = display.none)
fill(bodymiddle, uptrend,   color.new(color.green, 90), fillgaps = false)
fill(bodymiddle, downtrend, color.new(color.red,   90), fillgaps = false)

//Entry Conditions
longCondition = ta.crossover(ema12, ema26) and trending and volatility and hist > 0

shortCondition = ta.crossunder(ema12, ema26)  and trending and volatility and hist < 0

long_SL_Con = ta.crossunder(close, supertrend)

short_SL_Con = ta.crossover(close, supertrend)

//Plot Signal
     title='Buy', text='Buy', 
     location= location.belowbar, 
     style=shape.labelup, size=size.tiny, 
     color=color.green, textcolor=color.new(color.white, 0))

     title='Sell', text='Sell', 
     location= location.abovebar, 
     style=shape.labeldown, size=size.tiny, 
     color=color.red, textcolor=color.new(color.white, 0))

start = timestamp(2020, 1, 1, 0, 0, 0)
end = timestamp(2024, 1, 1, 0, 0, 0)
backtestperiod = time >= start and time <= end

if longCondition and backtestperiod
    strategy.entry("Buy", strategy.long)

if long_SL_Con and backtestperiod

if shortCondition and backtestperiod
    strategy.entry("Sell", strategy.short)

if short_SL_Con and backtestperiod