Strategy vault / Mean reversion
Quantitative Trading Strategy Based on Ichimoku and ADX Indicators
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…

Overview
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.
Strategy Mechanism
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.
Advantages
- Combination of signals provides more reliable confirmation
- ADX filter avoids incorrect trades during non-trending periods
- Good backtest performance with high risk-return profile
Risk Analysis
- Better suited for trending stocks; less frequent signals in range bound market
- Ichimoku has inherent lag and may miss quick reversal patterns
- Imperfect determination of non-trending environment by ADX
Optimization Scope
- Test different parameter combinations like Tenkan, Kijun periods
- Combine other indicators, e.g. MACD, KD etc., for further enhancement
- Examine different ADX filtering logics and threshold values
Summary
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.
Parameters
| Name | Default | What it controls |
|---|---|---|
| v_input_1 | 9 | Conversion Line Periods |
| v_input_2 | 26 | Base Line Periods |
| v_input_3 | 52 | Lagging Span 2 Periods |
| v_input_4 | 26 | Displacement |
| v_input_5 | 14 | ADX Smoothing |
| v_input_6 | 14 | DI Length |
| v_input_7 | 23 | key level for ADX |
| v_input_8 | 2 | From Month |
| v_input_9 | true | From Day |
| v_input_10 | 2015 | From Year |
| v_input_11 | true | To Month |
| v_input_12 | true | To Day |
| v_input_13 | 9999 | To Year |
Source Pine Script
/*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")
Published by ChaoZhang on the FMZ strategy square · last modified 2024-01-23. Collected in the Quant Trading Vault. Unvalidated research: re-test with your own data and costs before trusting it.
Build this with AgenKit
A spec is not a trading system. Paste this into your coding agent and AgenKit runs a specialist team — architecture, test-first build, risk gates, review — with paper trading on by default.
/agenkit build a production-grade trading bot with a backtest engine, risk controls and paper trading by default from strategies/Quantitative-Trading-Strategy-Based-on-Ichimoku-and-ADX-Indicators.md- npx agenkit install engineering-kit in your project
- Paste the command into your agent and approve each phase
- Get tests, backtest, risk controls and a paper-trading switch
Understand it first
Before you run this, read the lesson behind the idea and how to backtest it honestly. Specs like this one are the survivors of an unknown number of trials; deflate their results accordingly.
Related specs
- Random Oscillation StrategyPine Script · Mean reversion · 1d
- Multi Indicator Options Trading StrategyPine Script · Mean reversion · 1d
- Multi Indicator Scoring Trading StrategyPine Script · Mean reversion · 1d
- Ichimoku Kinko Hyo Mean Reversion StrategyPine Script · Mean reversion · 1d
- Ichimoku and MACD Trend Reversal Trading StrategyPine Script · Mean reversion · 1d
- Byron Serpent Cloud Quant StrategyPine Script · Mean reversion · 1h