
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.
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.
/*backtest
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"}]
*/
//@version=5
strategy("EMA-MACD-SuperTrend-ADX-ATR Strategy",
overlay = true,
initial_capital = 1000,
default_qty_type = strategy.percent_of_equity,
default_qty_value = 70)
//MACD
[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)
//EMA
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)
//SuperTrend
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
plotshape(longCondition,
title='Buy', text='Buy',
location= location.belowbar,
style=shape.labelup, size=size.tiny,
color=color.green, textcolor=color.new(color.white, 0))
plotshape(shortCondition,
title='Sell', text='Sell',
location= location.abovebar,
style=shape.labeldown, size=size.tiny,
color=color.red, textcolor=color.new(color.white, 0))
//Backtest
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
strategy.close("Buy")
if shortCondition and backtestperiod
strategy.entry("Sell", strategy.short)
if short_SL_Con and backtestperiod
strategy.close("Sell")