Multi-Indicator EMA Strategy

Author: ChaoZhang, Date: 2023-09-28 15:57:34


The Multi-Indicator EMA Strategy is a trend following strategy that incorporates multiple indicators like EMA, MACD, Oscillator, RSI, Stochastic, Bollinger Bands to generate trading signals. By calculating a composite signal based on multiple indicators, it determines if the market is in an uptrend or a downtrend.

Strategy Logic

The strategy first computes the following indicators:

  • EMA: Exponential Moving Average over a certain period.

  • MACD: MACD DIF and DEA lines.

  • Oscillator: Difference between close and open over a period.

  • RSI: Relative Strength Index over a period.

  • Stochastic: Stochastic K and D values with parameters.

  • Bollinger Bands: Upper, middle and lower bands over a period.

Then each indicator is assigned a value based on its current state. For example, Stochastic below 20 is assigned 2, RSI above 80 is assigned -2.

The indicator values are summed up to derive a composite signal trigger. If trigger >= 7, a long signal is generated. If trigger <= -7, a short signal is generated.

By combining signals from multiple indicators, the strategy can more accurately determine the trend direction and generate reliable trading signals.

Advantage Analysis

The key advantage of this multi-indicator strategy is that it combines strengths of multiple indicators for a more comprehensive and accurate assessment, avoiding false signals from individual indicators.

Specifically, the advantages are:

  1. Combining multiple indicators provides more reliable trend determination. Individual indicators may give misleading signals while multiple indicators can verify each other and reduce errors.

  2. Different indicators can identify different stages of a trend based on their characteristics. For example, MACD for trend start, RSI for overbought/oversold status.

  3. Indicators with different parameters can capture features over different timeframes. For example, fast and slow EMA periods.

  4. The weights of each indicator can be customized. More important indicators can be assigned higher weights.

  5. The indicator mix and weights can be optimized through backtesting for better performance.

Risk Analysis

Despite using multiple indicators, some risks exist:

  1. Improper combination of indicators may fail to harness strengths or cause conflicts. Proper understanding of indicator applicability is needed.

  2. Irrational weight distribution may inaccurately represent indicator importance. Weights need iterative testing and tuning.

  3. Single parameter set may cause overfitting. Multi-timeframe validation should be used.

  4. Static indicator weights/parameters cannot adapt to changing market conditions. Dynamic adjustment mechanisms needed.

  5. Indicator signals may lag. Other techniques should be used to determine stop loss timing.

  6. Increased strategy complexity from multiple indicators needs sufficient historical data and greater parameter tuning difficulty.

Improvement Opportunities

Some ways to improve the strategy:

  1. Test more indicator types to find ones sensitive to current market conditions.

  2. Optimize indicator periods to capture trends over different timeframes.

  3. Optimize indicator weights to better represent relative importance.

  4. Add dynamic adjustment to optimize parameters and weights in real-time adapting to changing market conditions.

  5. Incorporate stop loss strategies with rational stop loss points to limit losses.

  6. Add multi-timeframe validation to avoid overfitting to single timeframe.

  7. Employ stepwise and combinatorial optimization to find optimal parameter combinations.

  8. Add machine learning for smarter dynamic indicator weighting.

  9. Optimize entry and exit logic to balance tracking trends and avoiding overtrading.


The Multi-Indicator EMA Strategy harness the combined strengths of EMA, MACD, RSI and more to determine market trend direction and generate trading signals. Compared to single indicator strategies, it offers a more comprehensive market analysis and reduces false signals. With further optimizations like parameter tuning, it can be adapted to complex changing market conditions. Overall, the Multi-Indicator EMA Strategy is a highly effective trend following strategy.

start: 2023-08-28 00:00:00
end: 2023-09-27 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]

// This source code is subject to the terms of the Mozilla Public License 2.0 at
// © ally17

// strategy("ELIA MULTI STRATEGY",overlay=true,initial_capital=1000, default_qty_type=strategy.percent_of_equity, commission_type=strategy.commission.percent, commission_value=0.00, default_qty_value=25)

start = timestamp(input(2021, "start year"), 1, 1, 00, 00)
end = timestamp(input(9999, "end year"), 1, 1, 00, 00)

emalen=input(80, title="Ema Len")
macdfast=input(12, title="Macd Fast Len")
macdslow=input(26, title="Macd Fast Len")
macdsig=input(12, title="Macd Signal Len")
occlen=input(15, title="Occ Len")

rsilen=input(2, title="Rsi Len")
stochklen=input(11, title="Stk K Len")
stochdlen=input(3, title="Stk D Len")
stochlen=input(3, title="Stk Smooth Len")
bblength = input(10, minval=1, title="BB Len")
mult = input(2.0, minval=0.001, maxval=50, title="BB Std Dev")

momlen=input(10, title="Mom Len")

var trigger = 0.0

var emavar = 0.0
var macdvar = 0.0
var occvar = 0.0

var rsivar = 0.0
var stochvar = 0.0
var bbvar = 0.0

var donvar =0.0

ema = ema(close,emalen)

[macdLine, signalLine, histLine] = macd(close, 12, 26, 9) // MACD

occ = ema(close,occlen) - ema(open,occlen)

rsi = rsi(close, rsilen) // RSI

stoch = sma(stoch(close, high, low, stochklen), stochlen) // Stoch

basis = sma(close, bblength)
dev = mult * stdev(close, bblength)
upper = basis + dev
lower = basis - dev

moment = mom(close, momlen) // Momentum

Obv = obv // OBV


emavar := (close>ema)? 3 : -3
macdvar := (macdLine>signalLine)? 3 : -3
occvar := (occ>0)? 3 : -3

rsivar := (rsi<20)? 2 : (rsi>50 and rsi<80)? 1 : (rsi>80)? -2 : (rsi<50 and rsi>20)? -1 : 0
stochvar := (stoch<20)? 2 : (stoch>80)? -2 : 0
bbvar :=  (close<lower)? 2 : (close>upper)? -2 : 0

trigger := emavar+macdvar+occvar+rsivar+stochvar+bbvar

longcondition = trigger>=7
closelong = trigger<3

shortcondition = trigger<=-7
closeshort = trigger >-3

trendcolor = longcondition ? : shortcondition? : (trigger>3 and trigger<7)? #A2E1BF : (trigger<-3 and trigger>-7)? #E19997 : na
bgcolor(trendcolor, transp=80)

if time > start and time < end
    if longcondition
        strategy.entry("LONG", long=strategy.long)

if closelong
    strategy.close("LONG", comment="CLOSE LONG")
if time > start and time < end
    if shortcondition
        strategy.entry("SHORT", long=strategy.short)

if closeshort
    strategy.close("SHORT", comment="CLOSE SHORT")
//plotshape(longcondition,, text="L", size=size.small, style=shape.triangledown)
//plotshape(shortcondition,, "S"(trigger), size=size.small, style=shape.triangledown)
//plotshape(closelong, color=color.purple, text="LC", size=size.small, style=shape.triangledown)
//plotshape(closeshort, color=color.purple, text="SC", size=size.small, style=shape.triangledown)