Markets › FX · EURUSD, GBPUSD, USDJPY, AUDUSD spot, 1-hour
ADX Indicator Strategy Backtest: ADX + DI on 4 Forex Majors, 22 Years
Wilder's ADX and DI lines as a stand-alone trading strategy on EURUSD, GBPUSD, USDJPY and AUDUSD, 1-hour bars, 2004 to 2026: ADX 20 or 25, costs, swaps, and the same holdings at random times.
Buried · No proven edgeIt saw the trend. It could not tell which way to bet.
Variants tried: 8 · Passed every gate: 0 · Pairs passing (3 of 4 needed): 0 · Holdout opened: yes (already used)
Short answer: not as a stand-alone strategy on the forex majors in our test. Entering when ADX(14) crosses above 20 or 25 in the direction of the stronger DI line and exiting when the DI lines cross back made -1.87 to +1.70 pips a trade before costs on EURUSD, GBPUSD, USDJPY and AUDUSD (1-hour bars, 2004 to 2026), and none of the eight combinations beat random holdings of the same lengths.How much costs took here, compared across all 54 of our tests →Did the same rules work on other markets? The cross-market scoreboard →
00The verdict in three lines
- We tested the ADX indicator strategy with the DI lines on the four forex majors, 1-hour bars, 2004 to 2026: enter when ADX(14) crosses above 20 (or 25) in the direction of the stronger DI line, exit when the DI lines cross back. 1.0 pip a round trip (1.2 on USDJPY).
- It made close to nothing before costs on every pair (-1.87 to +1.70 pips a trade over about 2,100 to 2,400 trades each) and lost after costs on six of the eight combinations.
- No combination beat random holdings of the same lengths at our 95% bar, and no threshold passed on any pair, let alone three of four. Buried.
01What is the ADX indicator?
The Average Directional Index (ADX) and the directional lines +DI and -DI are J. Welles Wilder's (1978), together known as the Directional Movement Index (DMI). ADX measures how strong a trend is, not its direction; the DI lines say which side is pushing harder. The usual reading: ADX above 20 or 25 means a trend, +DI above -DI means up, -DI above +DI means down.
ADX indicator formula and settings (period 14, as Wilder)
- True range = the largest of high minus low, |high - previous close| and |low - previous close|. +DM = today's high minus yesterday's high if that is positive and larger than the fall in the low; -DM the mirror image.
- Each is smoothed the Wilder way over 14 bars (first value the sum of 14, then S - S/14 + today). +DI = 100 × smoothed +DM / smoothed TR; -DI the same with -DM.
- DX = 100 × |+DI - (-DI)| / (+DI + -DI); ADX = the average of the first 14 DX values, then (previous ADX × 13 + DX) / 14.
02The ADX + DI trading strategy we tested
- Buy signal: at the close of a 1-hour bar, ADX crosses above the threshold (it was at or below it one bar earlier) and +DI is above -DI. Sell signal: the same cross with -DI above +DI. Fill at the next minute's open.
- Exit: a long when -DI crosses above +DI, a short when +DI crosses above -DI. No stop, no target, so the test measures the rule itself.
- Re-entry only on a new ADX cross; if the exit bar is itself an entry bar, the position flips at the same price.
- ADX 20 or 25? Both, declared before the test: eight pair-and-threshold combinations, all reported.
03How we tested it
The 1-minute bid histories of an IC Markets MetaTrader 4 demo server for the four pairs, January 2004 to 28 September 2026, built into 1-hour bars on the New York clock as in our earlier forex study; signals from the 500th bar of each pair. Costs: 1.0 pip a round trip (1.2 on USDJPY), with 1.5× and 2.5× shown, and a swap stress of 0.5 pip a night. Gates: our forex bar, a first-period t-statistic of 2.5, and the cross-market rule: a threshold counts only if it passes every gate on at least three of the four pairs. Periods 2004 to 2012, 2013 to 2019, and a holdout from 2020 already used by the forex study. Control: every pair's real holdings moved to random times, same direction and length, 500 times. Engine check: the indicator against a literal recomputation, the trade rules on a hand-made path, and an independent re-implementation that matched every trade of all eight combinations; in the first run the control's own check failed (a position opened by a flip was treated as overlapping the one it replaced) and was fixed before any result was printed (adx_selftest_result.txt). The clock of each file was checked; no week needed correcting.
04Does the ADX strategy work? Results by pair
Net pips after costs, no swap. Gross is before costs.
| Pair and threshold | Trades | Win rate | Gross pips per trade | Net pips per trade | Net total | Profit factor | Median hours held | Verdict |
|---|---|---|---|---|---|---|---|---|
| EURUSD ADX-20 | 2,207 | 34.0% | -0.29 | -1.29 | -2,844 pips | 0.94 | 20 | Buried |
| EURUSD ADX-25 | 2,171 | 33.3% | -0.59 | -1.59 | -3,452 pips | 0.93 | 22 | Buried |
| GBPUSD ADX-20 | 2,221 | 34.3% | -0.92 | -1.92 | -4,259 pips | 0.93 | 21 | Buried |
| GBPUSD ADX-25 | 2,104 | 35.5% | +1.19 | +0.19 | +395 pips | 1.01 | 23 | Buried |
| USDJPY ADX-20 | 2,349 | 34.3% | +1.70 | +0.50 | +1,168 pips | 1.03 | 20 | Buried |
| USDJPY ADX-25 | 2,189 | 35.7% | +1.06 | -0.14 | -303 pips | 0.99 | 22 | Buried |
| AUDUSD ADX-20 | 2,375 | 32.6% | -1.87 | -2.87 | -6,805 pips | 0.84 | 20 | Buried |
| AUDUSD ADX-25 | 2,245 | 34.2% | -1.87 | -2.87 | -6,442 pips | 0.85 | 21 | Buried |
Cumulative net pips by month with ADX 20 (a simple sum). The holdout from 2020 was already used before this test.
By period
| Pair and threshold | 2004 to 2012 (trades) | 2013 to 2019 (trades) | Holdout* 2020 to 2026 (trades) | t, first period | PF, second period |
|---|---|---|---|---|---|
| EURUSD ADX-20 | -737 pips (860) | -1,740 pips (681) | -367 pips (666) | -0.28 | 0.87 |
| EURUSD ADX-25 | -688 pips (863) | -1,700 pips (671) | -1,064 pips (637) | -0.27 | 0.87 |
| GBPUSD ADX-20 | -3,357 pips (892) | +404 pips (652) | -1,307 pips (677) | -1.22 | 1.03 |
| GBPUSD ADX-25 | +1,740 pips (837) | -165 pips (663) | -1,181 pips (604) | 0.60 | 0.99 |
| USDJPY ADX-20 | +540 pips (955) | -76 pips (721) | +705 pips (673) | 0.27 | 0.99 |
| USDJPY ADX-25 | -1,064 pips (870) | +594 pips (674) | +167 pips (645) | -0.56 | 1.05 |
| AUDUSD ADX-20 | +1,093 pips (924) | -4,331 pips (725) | -3,566 pips (726) | 0.58 | 0.66 |
| AUDUSD ADX-25 | -847 pips (872) | -3,217 pips (716) | -2,378 pips (657) | -0.39 | 0.75 |
05ADX 20 or 25?
| Pair | ADX 20: trades | ADX 20: net pips per trade | ADX 20: percentile | ADX 25: trades | ADX 25: net pips per trade | ADX 25: percentile |
|---|---|---|---|---|---|---|
| EURUSD | 2,207 | -1.29 | 42.8 | 2,171 | -1.59 | 36.2 |
| GBPUSD | 2,221 | -1.92 | 30.4 | 2,104 | +0.19 | 71.2 |
| USDJPY | 2,349 | +0.50 | 90.8 | 2,189 | -0.14 | 79.8 |
| AUDUSD | 2,375 | -2.87 | 6.6 | 2,245 | -2.87 | 5.8 |
Neither threshold is better across the pairs: 25 helped on GBPUSD and hurt on USDJPY, and on EURUSD and AUDUSD both lost. A threshold that works on one pair and not on the next is what noise looks like.
06ADX or chance?
| Pair and threshold | Trades | Real net per trade | Random holdings, median | Random, 5th to 95th | Percentile (95 needed) |
|---|---|---|---|---|---|
| EURUSD ADX-20 | 2,207 | -1.29 | -1.05 | -3.39 to +1.40 | 42.8 |
| EURUSD ADX-25 | 2,171 | -1.59 | -1.05 | -3.27 to +1.51 | 36.2 |
| GBPUSD ADX-20 | 2,221 | -1.92 | -0.99 | -3.76 to +2.22 | 30.4 |
| GBPUSD ADX-25 | 2,104 | +0.19 | -0.90 | -3.96 to +2.72 | 71.2 |
| USDJPY ADX-20 | 2,349 | +0.50 | -1.44 | -3.56 to +0.88 | 90.8 |
| USDJPY ADX-25 | 2,189 | -0.14 | -1.30 | -3.69 to +1.06 | 79.8 |
| AUDUSD ADX-20 | 2,375 | -2.87 | -0.99 | -3.07 to +0.81 | 6.6 |
| AUDUSD ADX-25 | 2,245 | -2.87 | -0.98 | -2.96 to +0.99 | 5.8 |
The control keeps every holding's direction and length and moves them to random hours, 500 times. If the ADX and DI signals picked better moments, the real trades would sit near the top. None reached the 95th percentile; on AUDUSD the real trades did worse than almost all random runs.
07Costs, swap, long and short
| Pair and threshold | Gross per trade | Base cost | 1.5× cost | 2.5× cost | Swap stress |
|---|---|---|---|---|---|
| EURUSD ADX-20 | -0.29 | -1.29 | -1.79 | -2.79 | -1.99 |
| EURUSD ADX-25 | -0.59 | -1.59 | -2.09 | -3.09 | -2.35 |
| GBPUSD ADX-20 | -0.92 | -1.92 | -2.42 | -3.42 | -2.63 |
| GBPUSD ADX-25 | +1.19 | +0.19 | -0.31 | -1.31 | -0.61 |
| USDJPY ADX-20 | +1.70 | +0.50 | -0.10 | -1.30 | -0.19 |
| USDJPY ADX-25 | +1.06 | -0.14 | -0.74 | -1.94 | -0.88 |
| AUDUSD ADX-20 | -1.87 | -2.87 | -3.37 | -4.37 | -3.51 |
| AUDUSD ADX-25 | -1.87 | -2.87 | -3.37 | -4.37 | -3.58 |
| Pair and threshold | Longs: trades / gross / net | Shorts: trades / gross / net | Pair, first → last price |
|---|---|---|---|
| EURUSD ADX-20 | 1,124 / -1,851 pips / -2,975 pips | 1,083 / +1,215 pips / +132 pips | 1.2593 → 1.13685 |
| EURUSD ADX-25 | 1,107 / -1,589 pips / -2,696 pips | 1,064 / +308 pips / -756 pips | 1.2593 → 1.13685 |
| GBPUSD ADX-20 | 1,103 / -937 pips / -2,040 pips | 1,118 / -1,101 pips / -2,219 pips | 1.7858 → 1.32572 |
| GBPUSD ADX-25 | 1,022 / -720 pips / -1,742 pips | 1,082 / +3,218 pips / +2,136 pips | 1.7858 → 1.32572 |
| USDJPY ADX-20 | 1,141 / +3,934 pips / +2,565 pips | 1,208 / +53 pips / -1,397 pips | 107.22 → 157.393 |
| USDJPY ADX-25 | 1,061 / +1,433 pips / +159 pips | 1,128 / +891 pips / -462 pips | 107.22 → 157.393 |
| AUDUSD ADX-20 | 1,141 / -1,416 pips / -2,557 pips | 1,234 / -3,014 pips / -4,248 pips | 0.7534 → 0.70195 |
| AUDUSD ADX-25 | 1,091 / -3,660 pips / -4,751 pips | 1,154 / -537 pips / -1,691 pips | 0.7534 → 0.70195 |
Year by year, ADX 20 (net pips)
| Year | EURUSD | GBPUSD | USDJPY | AUDUSD |
|---|---|---|---|---|
| 2004 | -148 | 485 | -101 | 670 |
| 2005 | -605 | -1,000 | -278 | -117 |
| 2006 | -469 | 851 | -187 | 77 |
| 2007 | -65 | -431 | 685 | 287 |
| 2008 | 328 | 233 | 1,191 | -1,411 |
| 2009 | 94 | -1,137 | -216 | -277 |
| 2010 | -384 | -1,800 | 148 | 763 |
| 2011 | 265 | -673 | -636 | 1,281 |
| 2012 | 247 | 116 | -67 | -180 |
| 2013 | -1,138 | 455 | 529 | -889 |
| 2014 | -511 | -1,207 | 698 | -838 |
| 2015 | 87 | 666 | -96 | -678 |
| 2016 | -255 | -119 | -483 | -1,188 |
| 2017 | 44 | -316 | -385 | -448 |
| 2018 | -270 | 3 | 168 | -175 |
| 2019 | 304 | 921 | -507 | -115 |
| 2020 | -322 | -201 | 1,059 | 496 |
| 2021 | -74 | -113 | -308 | -403 |
| 2022 | 183 | 1,000 | 955 | -396 |
| 2023 | -175 | -1,165 | -633 | -1,285 |
| 2024 | -113 | -705 | -454 | -972 |
| 2025 | -113 | -113 | 580 | -637 |
| 2026 (to 28 Sep) | 247 | -10 | -495 | -368 |
08The gates
| Pair and threshold | Trades | 1. PF ≥ 1.2 in validation | 2. ≥ 50 trades in each period | 3. t ≥ 2.5 on development | 4. Above the 95th percentile of the shifted-holding control | 5. Positive without the 10 best trades | 6. Holdout net positive (already used) |
|---|---|---|---|---|---|---|---|
| EURUSD ADX-20 | 2,207 | fail | pass | fail | fail | fail | fail |
| EURUSD ADX-25 | 2,171 | fail | pass | fail | fail | fail | fail |
| GBPUSD ADX-20 | 2,221 | fail | pass | fail | fail | fail | fail |
| GBPUSD ADX-25 | 2,104 | fail | pass | fail | fail | fail | fail |
| USDJPY ADX-20 | 2,349 | fail | pass | fail | fail | fail | pass |
| USDJPY ADX-25 | 2,189 | fail | pass | fail | fail | fail | pass |
| AUDUSD ADX-20 | 2,375 | fail | pass | fail | fail | fail | fail |
| AUDUSD ADX-25 | 2,245 | fail | pass | fail | fail | fail | fail |
Cross-market rule: ADX 20 passed every gate on 0 of 4 pairs, ADX 25 on 0 of 4; 3 of 4 were needed.
The data-gap check
| Pair and threshold | Trades | Open across a suspect gap | Net pips per trade | Verdict |
|---|---|---|---|---|
| EURUSD ADX-20 | 2,207 | 52 | -1.29 → -2.24 | Buried → Buried |
| EURUSD ADX-25 | 2,171 | 61 | -1.59 → -2.43 | Buried → Buried |
| GBPUSD ADX-20 | 2,221 | 65 | -1.92 → -3.46 | Buried → Buried |
| GBPUSD ADX-25 | 2,104 | 68 | +0.19 → -1.24 | Buried → Buried |
| USDJPY ADX-20 | 2,349 | 60 | +0.50 → -1.09 | Buried → Buried |
| USDJPY ADX-25 | 2,189 | 62 | -0.14 → -1.65 | Buried → Buried |
| AUDUSD ADX-20 | 2,375 | 69 | -2.87 → -4.23 | Buried → Buried |
| AUDUSD ADX-25 | 2,245 | 67 | -2.87 → -4.08 | Buried → Buried |
09Verdict by pair and threshold
| Pair and threshold | Cause | Gates failed | Verdict |
|---|---|---|---|
| EURUSD ADX-20 | No proven edge | 1, 3, 4, 5, 6 | Buried |
| EURUSD ADX-25 | No proven edge | 1, 3, 4, 5, 6 | Buried |
| GBPUSD ADX-20 | No proven edge | 1, 3, 4, 5, 6 | Buried |
| GBPUSD ADX-25 | Fragile | 1, 3, 4, 5, 6 | Buried |
| USDJPY ADX-20 | Fragile | 1, 3, 4, 5 | Buried |
| USDJPY ADX-25 | Costs | 1, 3, 4, 5 | Buried |
| AUDUSD ADX-20 | No proven edge | 1, 3, 4, 5, 6 | Buried |
| AUDUSD ADX-25 | No proven edge | 1, 3, 4, 5, 6 | Buried |
Causes follow the protocol's definitions: Costs = positive before costs, negative after; Fragile = positive, not without its ten best trades; No proven edge = otherwise. None of this says the ADX is useless as a description of the market; it says this common way of trading it did not show an edge we could demonstrate.
TWhat this shows, and what to take into your own tests
What the results show
- Entering when the ADX crosses above 20 (or 25) in the direction of the stronger DI line, and leaving when the DI lines cross back, made between -1.87 and +1.70 pips a trade before costs on the four majors from 2004 to 2026: close to nothing.
- None of the eight pair-and-threshold combinations beat the same holdings placed at random times at our 95% bar; the best was USDJPY with ADX 20 (percentile 90.8), the worst AUDUSD, which did worse than random with either threshold.
- Only two of the eight combinations ended above zero after costs, and they disagree: GBPUSD with ADX 25 and USDJPY with ADX 20, not the other threshold on either pair. USDJPY's gain came from long trades while the pair rose from 107 to 157.
What remains unknown
- Other uses of the ADX: as a filter for another entry (for example a breakout or a pullback only when ADX is high), on daily charts, or on stocks and indices. We tested the stand-alone ADX + DI rule on 1-hour forex.
- Other settings than Wilder's 14, and an exit on the ADX turning down. We fixed one rule and two thresholds before running anything.
- Real swaps. They changed sign over these years; our 0.5-pip-a-night stress made every combination worse.
Why it was buried
A trend-strength reading does not say where the price goes next. By the time the ADX crosses 20 the move that pushed it there has happened; the DI direction at that moment was right about a third of the time with small winners and losers on both sides, and the result per trade was within a pip or two of zero before costs, on all four pairs. Supertrend, MACD and Donchian on the same pairs and bars were buried for the same reason.
What you can apply to your own tests
- Treat ADX as a description of the market, not a signal. High ADX means it has been trending; it does not say it will continue.
- If you use it as a filter, test the filter on its own against the unfiltered strategy, with the threshold fixed in advance.
- Check several markets with the same rule. One good pair out of four is what chance looks like.
A note on the numbers: drawdown figures are measured on closed trades unless a table says it includes open losses. Open losses inside a trade are not counted in a closed-trade drawdown, so real account risk is higher, especially for systems with no stop. Backtests are not live trading.
FAQCommon questions
Does the ADX indicator strategy work?
Not in our backtest. On four forex majors over 22 years, the ADX + DI rule made between -1.87 and +1.70 pips a trade before costs, lost after costs on six of eight pair-and-threshold combinations, and passed every gate on none of the four pairs.
Is ADX 20 or 25 better?
Neither, in our test: 25 did better than 20 on GBPUSD and worse on USDJPY, and both lost on EURUSD and AUDUSD. Results that flip from pair to pair are what noise looks like.
What does the ADX indicator measure?
Trend strength, not direction. ADX rises when price moves strongly either way; the +DI and -DI lines show which side is stronger. Wilder used a 14-period setting.
How is the ADX calculated?
From the true range and the directional movements (+DM, -DM), each smoothed over 14 bars with Wilder's method; +DI and -DI are the smoothed movements as a percentage of the smoothed true range, DX is their difference over their sum, and ADX is a 14-bar Wilder average of DX.
How was the ADX strategy tested?
On 22 years of 1-hour bars of four forex majors with rules written and dated before the data was run, costs included on every trade, results split into development, validation and holdout periods, a random-entry control as the benchmark, and every variant reported. Read the protocol.
10Check our arithmetic
adx_spec.md
adx_lib.js · adx_ref.js · adx_selftest.js · adx_run.js · adx_clock.js
control_audit_lib.js · fx_data.js · gh_lib.js · gx_lib.js · hourly_lib.js · ma_lib.js · rsi2_protocol.js
adx_selftest_result.txt · adx_results.txt · adx_summary.json · adx_clock_result.json · EURUSD gaps · GBPUSD gaps · USDJPY gaps · AUDUSD gaps
EURUSD ADX-20 · EURUSD ADX-25 · GBPUSD ADX-20 · GBPUSD ADX-25 · USDJPY ADX-20 · USDJPY ADX-25 · AUDUSD ADX-20 · AUDUSD ADX-25
Code provenance: our own code, written from Wilder's published formulas and the rules in the specification.
11Data notes
Source. A broker's demo history of spot FX, bid prices. Spreads are not in the files, so costs are an assumption, shown at three levels. Swaps are not in the base result. Bars. 1-hour bars on the New York clock; other platforms may cut hours differently, and their ADX values will differ slightly.
12Corrections
22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new cross-market scoreboard, which includes this test. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trend following and mean reversion across all our tests. No result changed.
+More tests and guides
- Forex strategy backtest
- Supertrend indicator backtest
- Inside bar trading strategy
- London breakout strategy
- Trend following vs mean reversion: this test next to the others of its style
- Free prop firm challenge calculator
- What all the backtests found so far
- The backtesting protocol
- How to backtest a trading strategy without fooling yourself
- Backtesting glossary