This strategy combines the Ichimoku Cloud and ADX (Average Directional Index) indicators to identify trend and key support & resistance levels for market entry and exit signals. It aims to capture large price waves during trending markets.
The Ichimoku Cloud contains 3 moving averages of Tenkan Line, Kijun Line and Chikou line. A buy signal is generated when price breaks above the Tenkan Line and Kijun Line; A sell signalis generated when price breaks below the two lines. The key support & resistance levels are identified by the cloud.
The ADX is used to determine the strength of price trend. A higher reading of +DI and -DI suggests a trending market; when the two lines converge, a range-bound market is defined. The strategy only initiates position on an ADX reading above 20 to avoid whipsaws during sideways market.
By combining Ichimoku trend determination and ADX filtering, the strategy is effective in identifying periods of high price volatility.
The strategy effectively combines Ichimoku and ADX to capture trending markets. With further fine-tuning of parameters and rules, better backtest and live performance can be achieved. It is suitable for trend-focused traders.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-10 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title="Ichimoku + ADX", shorttitle="Ichimoku & ADX Backtest", overlay=true) //------------------------------ //------------------------------ // ICHIMOKU //------------------------------ //------------------------------ conversionPeriods = input(9, minval=1, title="Conversion Line Periods"), basePeriods = input(26, minval=1, title="Base Line Periods") laggingSpan2Periods = input(52, minval=1, title="Lagging Span 2 Periods"), displacement = input(26, minval=1, title="Displacement") donchian(len) => avg(lowest(len), highest(len)) Tenkan = donchian(conversionPeriods) Kijun = donchian(basePeriods) SSA = avg(Tenkan, Kijun) SSB = donchian(laggingSpan2Periods) SSAdisp = SSA[displacement] SSBdisp = SSB[displacement] // Plot Ichimoku // -------------------- plot(Tenkan, color=color.red, title="Tenkan") plot(Kijun, color=color.blue, title="Kijun") plot(close, offset = -displacement + 1, color=#459915, title="Chikou") p1 = plot(SSA, offset = displacement - 1, color=color.green, title="Senkou A") p2 = plot(SSB, offset = displacement - 1, color=color.red, title="Senkou B") fill(p1, p2, color = SSA > SSB ? color.green : color.red) //------------------------------ //------------------------------ // ADX //------------------------------ //------------------------------ adxlen = input(14, title="ADX Smoothing") dilen = input(14, title="DI Length") keyLevel = input(23, title="key level for ADX") dirmov(len) => up = change(high) down = -change(low) truerange = rma(tr, len) plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, len) / truerange) minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, len) / truerange) [plus, minus] adx(dilen, adxlen) => [plus, minus] = dirmov(dilen) sum = plus + minus adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), adxlen) [adx, plus, minus] [sig, up, down] = adx(dilen, adxlen) // Plot ADX // -------------------- //plot(sig, color=color.black, title="ADX") //plot(up, color=color.green, title="+DI",linewidth=2, style=plot.style_columns, transp=40) //plot(down, color=color.red, title="-DI",linewidth=2, style=plot.style_columns, transp=40) //plot(keyLevel, color=color.white, title="Key Level") //------------------------------ //------------------------------ // STRATEGY //------------------------------ //------------------------------ // Buy & Sell Signals // -------------------- // ADX ABuy1 = up > keyLevel and up - down >5 and sig > down and sig < keyLevel * 2 ASell1 = down > keyLevel and down - up >5 and sig > up and sig < keyLevel * 2 // ICHIMOKU Bull = close >= max(SSAdisp, SSBdisp) Bear = close <= min(SSAdisp, SSBdisp) // 1. Bull Buy1 = (close >= max(SSAdisp, SSBdisp)) ? 1 : 0 Buy2 = (Tenkan - Kijun >= 0.001) ? 1 : 0 Buy3 = SSA > SSB ? 1 : 0 Buy4 = sig > 20 ? 1 : 0 Buy4a = close - close[displacement] >=0.001 ? 1:0 Buy5 = Buy1 and Buy2 and Buy3 and Buy4 and Buy4a and not(Buy1[1] and Buy2[1] and Buy3[1]) // 1. Bear Sell1 = (close <= min(SSAdisp, SSBdisp)) ? 1 : 0 Sell2 = (Kijun - Tenkan >= 0.001) ? 1 : 0 Sell3 = SSA < SSB ? 1 : 0 Sell4 = sig > 20 ? 1 : 0 Sell4a = close <= close[displacement] Sell5 = Sell1 and Sell2 and Sell3 and Sell4 and Sell4a and not(Sell1[1] and Sell2[1] and Sell3[1]) // CONSOLIDATED buysignal = Buy5 buyexitsignal = crossunder(close,Kijun) sellsignal = Sell5 sellexitsignal = crossover(close,Kijun) longCondition = buysignal shortCondition = sellsignal // Plot Indicators // -------------------- // ----- Buy & Sell //plotshape(longCondition, title = "Buy Signal", text ="BUY", textcolor =#FFFFFF , style=shape.labelup, size = size.tiny, location=location.belowbar, color = #1B8112, transp = 0) //plotshape(shortCondition, title = "Short Signal", text ="SHORT", textcolor =#FFFFFF , style=shape.labeldown, size = size.tiny, location=location.abovebar, color = #000000, transp = 0) // ----- Ichimoku Signals //plotshape(Sell2, title = "Sell Signal", text ="Kumo Twist", textcolor =#FFFFFF , style=shape.labelup, size = size.tiny, location=location.top, color = color.black, transp = 0) //plotshape(Sell3, title = "Sell Signal", text ="TK/KJ", textcolor =#FFFFFF , style=shape.labelup, size = size.tiny, location=location.bottom, color = color.black, transp = 0) //plotshape(Buy4, title = "Buy Signal", text ="Kumo Twist", textcolor =#FFFFFF , style=shape.diamond, size = size.tiny, location=location.belowbar, color = color.blue, transp = 0) //plotshape(Buy3, title = "Buy Signal", text ="TK/KJ", textcolor =#FFFFFF , style=shape.circle, size = size.tiny, location=location.abovebar, color = color.green, transp = 0) //plotshape(Buy4, title = "Buy Signal", text ="TK/KJ", textcolor =#FFFFFF , style=shape.circle, size = size.tiny, location=location.belowbar, color = color.red, transp = 0) //plotshape(buyexitsignal, title = "Buy Exit", style=shape.triangledown, size = size.tiny, location=location.abovebar, color = color.green, transp = 0) //plotshape(sellexitsignal, title = "Buy Exit", style=shape.triangleup, size = size.tiny, location=location.belowbar, color = color.black, transp = 0) //------------------------------ //------------------------------ // EXECUTION //------------------------------ //------------------------------ // Test Range // -------------------- // === INPUT BACKTEST RANGE === FromMonth = input(defval = 2, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2015, title = "From Year", minval = 2017) ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) ToYear = input(defval = 9999, title = "To Year", minval = 2017) // === FUNCTION EXAMPLE === start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window window() => true // create function "within window of time" // Orders // -------------------- if longCondition strategy.entry("Buy", strategy.long, when=window()) if buyexitsignal strategy.close("Buy") if shortCondition strategy.entry("Sell", strategy.short, when=window()) if sellexitsignal strategy.close("Sell")