Markets › FX · 4 FX majors (spot, broker data)
Six Strategies, Four Currency Pairs
The six strategies we tested on ES, with the same rules, run on EURUSD, GBPUSD, USDJPY and AUDUSD.
Buried · No proven edge96 tries on four pairs. No survivors.
Variants tried: 96 · Passed every gate: 0 · Holdout opened: yes (used before this test)
Short answer: not in this test. We ran six popular strategies on EURUSD, GBPUSD, USDJPY and AUDUSD in 96 variants, net of costs, and 0 passed every gate; 0 held up on at least 3 of the 4 pairs.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
- A second, unrelated market is a robustness test: an edge that holds on several markets is more convincing, although an edge can also exist in one market only, so failing to transfer does not rule that out. The bar used here is this study's bar, not a universal definition of an edge. We took the six strategies already tested on ES, kept every rule and default setting, and ran them on four currency pairs: 24 variants per pair, 96 in total, with the rules, the gates, the costs and a state-matched random control fixed in a dated specification before any result.
- None passed: 0 of 96 cleared every gate, and no variant came near the bar for support, a pass on at least 3 of the 4 pairs. Every one of the 96 failed the development t-statistic gate (the highest was 1.61, 2.5 needed). 65 were positive before costs and 30 after: across 347,256 trades the average gross result was about 0.36 pip, against a cost of about 1 pip. The closest call was EURUSD A, which failed only gate 3.
- Cause of death: No proven edge. Costs turned 35 of the 65 results that were positive before costs into losses, and the other 30 that stayed above zero after costs did not meet all the criteria. Bollinger, whose long side was our best hint on ES, finished above zero in none of its 16 results here.
01What we tested
The six strategies from our ES posts, each with its four variants (long and short or long only, with a simple exit or with a fixed stop and target), at the same default settings and nothing tuned for FX. The rules are those in each ES post and are listed in the specification.
| Strategy | ES post | Variants per pair |
|---|---|---|
| RSI(2) Dip Buyer | RSI(2) Dip Buyer | A, B, A2, B2 |
| Supertrend | Supertrend | ST60-LS, ST60-L, ST60-LS-T, ST60-L-T |
| Donchian Channel Breakout | Donchian Channel Breakout | DC-LS-S, DC-L-S, DC-LS-F, DC-L-F |
| Bollinger Band Reversal | Bollinger Band Reversal | BB-LS-S, BB-L-S, BB-LS-F, BB-L-F |
| RSI Divergence | RSI Divergence | DV-LS-S, DV-L-S, DV-LS-F, DV-L-F |
| MACD Crossover | MACD Crossover | MC-LS-S, MC-L-S, MC-LS-F, MC-L-F |
Differences from the ES versions, all forced by the market: the cost model and units; stops and targets in price units; the Supertrend 5- and 15-minute “trading hours only” versions are not run; and the RSI(2) entry window (10:00 to 16:00 New York) is kept because it is part of that strategy's rules, even though FX trades around the clock. Long-only versions have no natural drift rationale on FX; they are kept so the variants stay identical to the ES tests.
The cross-market rule, fixed in advance: a variant counts as supported across markets only if it passes every gate on at least 3 of the 4 pairs. A pass on one or two pairs is a single-pair result, not support.
02Data and costs
Data: spot FX, 1-minute bid history from an IC Markets MT4 demo server, converted to New York time, 2004 to late September 2026. This is a broker demo download, and early years may contain interpolated bars. It is not futures data. Periods: development 2004 to 2012, validation 2013 to 2019, holdout 2020 to 2026. The holdout is not clean: the 2020 to 2026 FX data was looked at in an earlier test of a different idea.
| Period | Dates |
|---|---|
| Development | 2004-01-01 to 2012-12-31 |
| Validation | 2013-01-01 to 2019-12-31 |
| Holdout (already used) | 2020-01-01 to the end of the data |
Costs: Our IC Markets account is a Standard account (no commission, wider spread). The specification priced costs at the Raw Spread commission plus an assumed spread, about 1.0 pip per round trip in total (1.2 on USDJPY), which is a middle figure for either account type. The half-cost and double-cost results below show how much that choice matters. The MT4 history records no spreads, so the cost is an assumption and the same in every year; spreads in 2004 to 2012 were wider than today's, which flatters the development period.
| Pair | Commission (pips) | Spread assumed (pips) | Cost per round trip (pips) |
|---|---|---|---|
| EURUSD | 0.7 | 0.3 | 1.0 |
| GBPUSD | 0.7 | 0.3 | 1.0 |
| USDJPY | 0.9 | 0.3 | 1.2 |
| AUDUSD | 0.7 | 0.3 | 1.0 |
Engine check: the engine is the ES engine with the costs made a parameter. Before any FX run it reproduced all 24 published ES results trade for trade, and the published ES control percentiles (fx_selftest_result.txt).
03Results: every strategy on every pair
Each cell is the net result in pips after costs, and how many of the six gates that result failed. The full numbers for all 96 results are in the tables below.
RSI(2) Dip Buyer
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| A (long and short) | +1,748 · 1 of 6 failed | -675 · 5 of 6 failed | -101 · 4 of 6 failed | -1,098 · 5 of 6 failed | 1 of 4 | 0 of 4 |
| B (long only) | +513 · 4 of 6 failed | -994 · 5 of 6 failed | +212 · 4 of 6 failed | -721 · 5 of 6 failed | 2 of 4 | 0 of 4 |
| A2 (long and short, stop and target) | -2,266 · 5 of 6 failed | -3,344 · 5 of 6 failed | -6,018 · 5 of 6 failed | -3,127 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| B2 (long only, stop and target) | -317 · 5 of 6 failed | -2,908 · 5 of 6 failed | -3,312 · 5 of 6 failed | -514 · 5 of 6 failed | 0 of 4 | 0 of 4 |
Supertrend
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| ST60-LS (long and short) | +699 · 5 of 6 failed | -335 · 5 of 6 failed | +2,581 · 4 of 6 failed | -298 · 5 of 6 failed | 2 of 4 | 0 of 4 |
| ST60-L (long only) | +819 · 5 of 6 failed | -721 · 5 of 6 failed | +3,902 · 3 of 6 failed | +1,107 · 5 of 6 failed | 3 of 4 | 0 of 4 |
| ST60-LS-T (long and short, stop and target) | +1,539 · 4 of 6 failed | +3,825 · 3 of 6 failed | -2,907 · 4 of 6 failed | -1,707 · 5 of 6 failed | 2 of 4 | 0 of 4 |
| ST60-L-T (long only, stop and target) | +451 · 5 of 6 failed | +1,822 · 3 of 6 failed | -1,694 · 4 of 6 failed | -1,647 · 5 of 6 failed | 2 of 4 | 0 of 4 |
Donchian Channel Breakout
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| DC-LS-S | -8,917 · 5 of 6 failed | -5,677 · 5 of 6 failed | +685 · 4 of 6 failed | -8,958 · 5 of 6 failed | 1 of 4 | 0 of 4 |
| DC-L-S | -2,459 · 5 of 6 failed | -1,797 · 5 of 6 failed | +3,927 · 3 of 6 failed | -4,116 · 5 of 6 failed | 1 of 4 | 0 of 4 |
| DC-LS-F | -1,738 · 5 of 6 failed | +1,425 · 5 of 6 failed | +2,067 · 4 of 6 failed | -10,894 · 5 of 6 failed | 2 of 4 | 0 of 4 |
| DC-L-F | -1,427 · 5 of 6 failed | +1,207 · 5 of 6 failed | +1,643 · 4 of 6 failed | -6,950 · 5 of 6 failed | 2 of 4 | 0 of 4 |
Bollinger Band Reversal
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| BB-LS-S | -3,981 · 4 of 6 failed | -8,397 · 5 of 6 failed | -20,787 · 5 of 6 failed | -6,889 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| BB-L-S | -2,343 · 4 of 6 failed | -2,586 · 5 of 6 failed | -10,386 · 5 of 6 failed | -5,707 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| BB-LS-F | -12,030 · 5 of 6 failed | -12,996 · 5 of 6 failed | -20,852 · 5 of 6 failed | -6,929 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| BB-L-F | -5,947 · 5 of 6 failed | -5,883 · 5 of 6 failed | -11,275 · 5 of 6 failed | -5,124 · 5 of 6 failed | 0 of 4 | 0 of 4 |
RSI Divergence
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| DV-LS-S | -1,081 · 5 of 6 failed | -1,913 · 5 of 6 failed | -2,210 · 5 of 6 failed | +1,268 · 2 of 6 failed | 1 of 4 | 0 of 4 |
| DV-L-S | +633 · 4 of 6 failed | -1,241 · 5 of 6 failed | -1,664 · 5 of 6 failed | +94 · 5 of 6 failed | 2 of 4 | 0 of 4 |
| DV-LS-F | +662 · 5 of 6 failed | -3,162 · 4 of 6 failed | -1,290 · 4 of 6 failed | -1,166 · 5 of 6 failed | 1 of 4 | 0 of 4 |
| DV-L-F | +3,044 · 2 of 6 failed | -2,022 · 4 of 6 failed | +179 · 4 of 6 failed | -443 · 5 of 6 failed | 2 of 4 | 0 of 4 |
MACD Crossover
| Variant | EURUSD | GBPUSD | USDJPY | AUDUSD | Pairs net positive | Pairs passing every gate |
|---|---|---|---|---|---|---|
| MC-LS-S | -8,353 · 5 of 6 failed | -5,708 · 5 of 6 failed | +1,726 · 3 of 6 failed | -2,143 · 4 of 6 failed | 1 of 4 | 0 of 4 |
| MC-L-S | -3,790 · 5 of 6 failed | -3,691 · 5 of 6 failed | +3,558 · 2 of 6 failed | +142 · 4 of 6 failed | 2 of 4 | 0 of 4 |
| MC-LS-F | -1,096 · 5 of 6 failed | -5,624 · 5 of 6 failed | -4,935 · 5 of 6 failed | -3,176 · 5 of 6 failed | 0 of 4 | 0 of 4 |
| MC-L-F | -1,003 · 5 of 6 failed | +175 · 4 of 6 failed | +3,454 · 3 of 6 failed | +1,778 · 5 of 6 failed | 3 of 4 | 0 of 4 |
By strategy
| Strategy | Results (variants × pairs) | Positive before costs | Positive after costs | Above the 95th percentile of the matched control | Passed every gate |
|---|---|---|---|---|---|
| RSI(2) Dip Buyer | 16 | 9 | 3 | 1 | 0 |
| Supertrend | 16 | 16 | 9 | 3 | 0 |
| Donchian Channel Breakout | 16 | 9 | 6 | 0 | 0 |
| Bollinger Band Reversal | 16 | 4 | 0 | 0 | 0 |
| RSI Divergence | 16 | 12 | 6 | 3 | 0 |
| MACD Crossover | 16 | 15 | 6 | 4 | 0 |
The strategies that earned something before costs were Supertrend (16 of 16) and MACD (15 of 16). Bollinger was positive before costs in 4 of 16 and, after costs, in 0: the long-side hint from ES did not travel.
04Did anything work on more than one pair?
This is the robustness test the study was built for: a market-specific edge could still exist, and the question here is whether anything holds across these four pairs. Variant by variant, the number of pairs (out of four) where the result finished above zero before costs, above zero after costs, above zero in the holdout, and where it cleared all six gates.
| Variant | Pairs positive before costs | Pairs positive after costs | Pairs positive in the holdout* | Pairs passing every gate |
|---|---|---|---|---|
| A | 4 | 1 | 2 | 0 |
| B | 3 | 2 | 2 | 0 |
| A2 | 0 | 0 | 0 | 0 |
| B2 | 2 | 0 | 0 | 0 |
| ST60-LS | 4 | 2 | 1 | 0 |
| ST60-L | 4 | 3 | 1 | 0 |
| ST60-LS-T | 4 | 2 | 1 | 0 |
| ST60-L-T | 4 | 2 | 2 | 0 |
| DC-LS-S | 1 | 1 | 1 | 0 |
| DC-L-S | 2 | 1 | 1 | 0 |
| DC-LS-F | 3 | 2 | 1 | 0 |
| DC-L-F | 3 | 2 | 1 | 0 |
| BB-LS-S | 1 | 0 | 1 | 0 |
| BB-L-S | 2 | 0 | 1 | 0 |
| BB-LS-F | 1 | 0 | 0 | 0 |
| BB-L-F | 0 | 0 | 0 | 0 |
| DV-LS-S | 4 | 1 | 0 | 0 |
| DV-L-S | 2 | 2 | 0 | 0 |
| DV-LS-F | 3 | 1 | 2 | 0 |
| DV-L-F | 3 | 2 | 2 | 0 |
| MC-LS-S | 4 | 1 | 1 | 0 |
| MC-L-S | 4 | 2 | 1 | 0 |
| MC-LS-F | 3 | 0 | 0 | 0 |
| MC-L-F | 4 | 3 | 2 | 0 |
* Holdout already used before this test. “Supported across markets” needs a pass on at least 3 of the 4 pairs.
No variant was supported. No variant passed on even one pair. The variants that finished above zero after costs on three pairs were ST60-L (1 of 4 in the holdout) and MC-L-F (2 of 4 in the holdout), and none of them cleared the development t-statistic or the validation profit factor gate on any of the four pairs.
05The gates
| Gate | Failed | Passed |
|---|---|---|
| 1. PF ≥ 1.2 in validation | 93 of 96 | 3 |
| 2. ≥ 50 trades in each period | 0 of 96 | 96 |
| 3. t ≥ 2.5 on development | 96 of 96 | 0 |
| 4. Above the 95th percentile of the matched random control | 85 of 96 | 11 |
| 5. Positive without the 10 best trades | 88 of 96 | 8 |
| 6. Holdout net positive (already used) | 73 of 96 | 23 |
Gate 3 is the wall: no result reached a development t-statistic of 2.5, and none reached 2.0 either. The matched control was cleared by 11 of 96 results (EURUSD A, EURUSD ST60-LS-T, EURUSD DV-L-S, EURUSD DV-L-F, GBPUSD ST60-LS-T, GBPUSD ST60-L-T, USDJPY MC-LS-S, USDJPY MC-L-S, AUDUSD DV-LS-S, AUDUSD MC-LS-S, AUDUSD MC-L-S); at the 95th percentile chance alone would clear about 5. Many of these share a signal across correlated pairs, so they are not 96 independent chances, but a few signals do seem to carry some timing information before costs. They fail on the other gates. Gates failed per result: 1 result failed 1 gate, 3 results failed 2 gates, 6 results failed 3 gates, 20 results failed 4 gates, 66 results failed 5 gates. The only result that failed a single gate was EURUSD A, on the development t-statistic (1.36, with a validation profit factor of 1.21 and a holdout of +44 pips).
06Costs
The 96 results made +125,671 pips before costs and -238,575 pips after, on 347,256 trades. Costs turned 35 of the 65 results that were positive before costs into losses. Because the cost per trade is a constant, the result at another cost follows exactly: net = gross minus trades times cost.
| Pair | Trades | Gross, all 24 | Net, all 24 | Positive before costs | Positive after costs | Positive at half the cost | Positive at double the cost |
|---|---|---|---|---|---|---|---|
| EURUSD | 88,318 | +41,678 | -46,640 | 19 | 9 | 14 | 2 |
| GBPUSD | 88,576 | +27,357 | -61,219 | 13 | 5 | 9 | 0 |
| USDJPY | 84,953 | +38,446 | -63,498 | 17 | 11 | 12 | 2 |
| AUDUSD | 85,409 | +18,191 | -67,218 | 16 | 5 | 9 | 0 |
At half the cost 44 of 96 results would be positive, at double the cost 4. We have not re-run the other gates at other costs, so this shows only the sign of the result. Even at half the cost the total across all 96 results would be -56,452 pips.
07Every result
All 96 results, one table per pair. “vs matched random” is the percentile of the average net per trade among 500 random runs of the control matched on each signal's entry state (95 needed). The trade logs for every pair are zipped next to this page.
EURUSD
| Variant | Net, all | Gross, all | Trades | PF dev | t (dev) | PF val | PF holdout* | vs matched random | Top 10 removed | Gates failed |
|---|---|---|---|---|---|---|---|---|---|---|
| EURUSD A | +1,748 pips | +3,454 | 1,706 | 1.17 | 1.36 | 1.21 | 1.01 | 99.8th | +983 | 1 |
| EURUSD B | +513 pips | +1,337 | 824 | 1.07 | 0.42 | 1.15 | 1.03 | 92.2th | -148 | 4 |
| EURUSD A2 | -2,266 pips | -467 | 1,799 | 0.89 | -1.31 | 1.04 | 0.90 | 75.8th | -3,699 | 5 |
| EURUSD B2 | -317 pips | +553 | 870 | 0.97 | -0.27 | 1.03 | 0.95 | 94.6th | -1,555 | 5 |
| EURUSD ST60-LS | +699 pips | +5,247 | 4,548 | 1.05 | 0.74 | 0.96 | 0.96 | 83.2th | -4,958 | 5 |
| EURUSD ST60-L | +819 pips | +3,064 | 2,245 | 1.07 | 0.74 | 0.92 | 0.99 | 83.6th | -3,823 | 5 |
| EURUSD ST60-LS-T | +1,539 pips | +5,335 | 3,796 | 1.08 | 1.25 | 1.06 | 0.86 | 98.6th | -553 | 4 |
| EURUSD ST60-L-T | +451 pips | +2,364 | 1,913 | 1.08 | 0.92 | 1.03 | 0.85 | 90.2th | -1,203 | 5 |
| EURUSD DC-LS-S | -8,917 pips | -4,536 | 4,381 | 0.96 | -0.65 | 0.85 | 0.89 | 4.2th | -13,828 | 5 |
| EURUSD DC-L-S | -2,459 pips | -117 | 2,342 | 1.02 | 0.23 | 0.83 | 0.94 | 49.4th | -6,600 | 5 |
| EURUSD DC-LS-F | -1,738 pips | +3,857 | 5,595 | 1.03 | 0.50 | 0.98 | 0.91 | 58.4th | -4,468 | 5 |
| EURUSD DC-L-F | -1,427 pips | +1,545 | 2,972 | 1.04 | 0.61 | 0.90 | 0.93 | 55.2th | -3,911 | 5 |
| EURUSD BB-LS-S | -3,981 pips | +1,870 | 5,851 | 0.93 | -1.24 | 0.99 | 1.01 | 17.0th | -5,736 | 4 |
| EURUSD BB-L-S | -2,343 pips | +638 | 2,981 | 0.91 | -1.12 | 0.94 | 1.11 | 54.2th | -3,894 | 4 |
| EURUSD BB-LS-F | -12,030 pips | -3,730 | 8,300 | 0.94 | -1.60 | 0.89 | 0.92 | 14.8th | -14,418 | 5 |
| EURUSD BB-L-F | -5,947 pips | -1,553 | 4,394 | 0.97 | -0.58 | 0.81 | 0.96 | 80.0th | -7,818 | 5 |
| EURUSD DV-LS-S | -1,081 pips | +1,027 | 2,108 | 1.01 | 0.06 | 0.90 | 0.88 | 68.6th | -2,169 | 5 |
| EURUSD DV-L-S | +633 pips | +1,735 | 1,102 | 1.20 | 1.17 | 1.05 | 0.84 | 96.0th | -315 | 4 |
| EURUSD DV-LS-F | +662 pips | +2,719 | 2,057 | 1.04 | 0.50 | 1.03 | 0.95 | 83.2th | -1,192 | 5 |
| EURUSD DV-L-F | +3,044 pips | +4,181 | 1,137 | 1.21 | 1.61 | 1.27 | 0.91 | 98.4th | +1,294 | 2 |
| EURUSD MC-LS-S | -8,353 pips | +3,436 | 11,789 | 1.01 | 0.30 | 0.90 | 0.90 | 74.4th | -12,109 | 5 |
| EURUSD MC-L-S | -3,790 pips | +2,110 | 5,900 | 1.02 | 0.39 | 0.88 | 0.92 | 74.4th | -6,889 | 5 |
| EURUSD MC-LS-F | -1,096 pips | +4,462 | 5,558 | 1.04 | 0.75 | 0.95 | 0.94 | 72.8th | -4,001 | 5 |
| EURUSD MC-L-F | -1,003 pips | +3,147 | 4,150 | 1.04 | 0.61 | 0.96 | 0.92 | 66.0th | -3,516 | 5 |
GBPUSD
| Variant | Net, all | Gross, all | Trades | PF dev | t (dev) | PF val | PF holdout* | vs matched random | Top 10 removed | Gates failed |
|---|---|---|---|---|---|---|---|---|---|---|
| GBPUSD A | -675 pips | +935 | 1,610 | 1.10 | 0.78 | 0.97 | 0.75 | 2.6th | -1,758 | 5 |
| GBPUSD B | -994 pips | -216 | 778 | 0.99 | -0.08 | 0.80 | 0.81 | 1.0th | -1,824 | 5 |
| GBPUSD A2 | -3,344 pips | -1,638 | 1,706 | 0.86 | -1.63 | 1.10 | 0.83 | 23.2th | -5,370 | 5 |
| GBPUSD B2 | -2,908 pips | -2,074 | 834 | 0.83 | -1.44 | 0.92 | 0.82 | 5.2th | -4,484 | 5 |
| GBPUSD ST60-LS | -335 pips | +4,304 | 4,639 | 1.05 | 0.75 | 0.98 | 0.91 | 74.2th | -7,813 | 5 |
| GBPUSD ST60-L | -721 pips | +1,569 | 2,290 | 1.04 | 0.42 | 0.94 | 0.95 | 74.2th | -5,490 | 5 |
| GBPUSD ST60-LS-T | +3,825 pips | +7,700 | 3,875 | 1.10 | 1.49 | 1.01 | 0.98 | 99.6th | +1,268 | 3 |
| GBPUSD ST60-L-T | +1,822 pips | +3,764 | 1,942 | 1.04 | 0.40 | 1.05 | 1.04 | 95.4th | -255 | 3 |
| GBPUSD DC-LS-S | -5,677 pips | -1,314 | 4,363 | 0.99 | -0.18 | 0.98 | 0.87 | 40.2th | -11,291 | 5 |
| GBPUSD DC-L-S | -1,797 pips | +528 | 2,325 | 1.03 | 0.34 | 0.98 | 0.85 | 52.2th | -6,305 | 5 |
| GBPUSD DC-LS-F | +1,425 pips | +7,088 | 5,663 | 1.06 | 1.11 | 1.03 | 0.89 | 74.2th | -2,353 | 5 |
| GBPUSD DC-L-F | +1,207 pips | +4,172 | 2,965 | 1.07 | 0.94 | 1.02 | 0.91 | 81.6th | -2,047 | 5 |
| GBPUSD BB-LS-S | -8,397 pips | -2,524 | 5,873 | 0.94 | -0.97 | 0.91 | 0.96 | 58.4th | -11,098 | 5 |
| GBPUSD BB-L-S | -2,586 pips | +422 | 3,008 | 1.02 | 0.20 | 0.86 | 0.98 | 88.8th | -4,979 | 5 |
| GBPUSD BB-LS-F | -12,996 pips | -4,493 | 8,503 | 0.94 | -1.52 | 0.90 | 0.96 | 76.6th | -15,983 | 5 |
| GBPUSD BB-L-F | -5,883 pips | -1,363 | 4,520 | 0.99 | -0.21 | 0.86 | 0.95 | 88.2th | -8,613 | 5 |
| GBPUSD DV-LS-S | -1,913 pips | +117 | 2,030 | 1.02 | 0.14 | 0.98 | 0.74 | 51.2th | -3,078 | 5 |
| GBPUSD DV-L-S | -1,241 pips | -221 | 1,020 | 1.10 | 0.56 | 0.94 | 0.65 | 50.2th | -2,220 | 5 |
| GBPUSD DV-LS-F | -3,162 pips | -1,181 | 1,981 | 0.87 | -1.64 | 0.97 | 1.07 | 29.4th | -5,539 | 4 |
| GBPUSD DV-L-F | -2,022 pips | -980 | 1,042 | 0.84 | -1.44 | 0.95 | 1.09 | 22.4th | -3,983 | 4 |
| GBPUSD MC-LS-S | -5,708 pips | +6,194 | 11,902 | 1.00 | 0.07 | 0.94 | 0.96 | 83.8th | -10,941 | 5 |
| GBPUSD MC-L-S | -3,691 pips | +2,264 | 5,955 | 0.99 | -0.16 | 0.92 | 0.99 | 84.0th | -7,262 | 5 |
| GBPUSD MC-LS-F | -5,624 pips | -12 | 5,612 | 0.96 | -0.79 | 1.01 | 0.93 | 10.8th | -8,982 | 5 |
| GBPUSD MC-L-F | +175 pips | +4,315 | 4,140 | 1.01 | 0.18 | 0.97 | 1.01 | 76.6th | -3,001 | 4 |
USDJPY
| Variant | Net, all | Gross, all | Trades | PF dev | t (dev) | PF val | PF holdout* | vs matched random | Top 10 removed | Gates failed |
|---|---|---|---|---|---|---|---|---|---|---|
| USDJPY A | -101 pips | +2,011 | 1,760 | 1.07 | 0.54 | 0.87 | 1.03 | 77.2th | -1,084 | 4 |
| USDJPY B | +212 pips | +1,294 | 901 | 1.12 | 0.67 | 0.97 | 1.01 | 69.8th | -333 | 4 |
| USDJPY A2 | -6,018 pips | -3,811 | 1,839 | 0.79 | -2.52 | 0.85 | 0.83 | 4.8th | -7,600 | 5 |
| USDJPY B2 | -3,312 pips | -2,179 | 944 | 0.80 | -1.70 | 0.81 | 0.76 | 4.2th | -4,401 | 5 |
| USDJPY ST60-LS | +2,581 pips | +7,941 | 4,467 | 0.94 | -0.84 | 1.01 | 1.13 | 94.6th | -2,558 | 4 |
| USDJPY ST60-L | +3,902 pips | +6,608 | 2,255 | 0.90 | -1.15 | 1.07 | 1.28 | 94.6th | +269 | 3 |
| USDJPY ST60-LS-T | -2,907 pips | +1,560 | 3,722 | 0.88 | -1.95 | 0.95 | 1.06 | 57.6th | -4,830 | 4 |
| USDJPY ST60-L-T | -1,694 pips | +548 | 1,869 | 0.86 | -1.61 | 0.96 | 1.06 | 37.6th | -3,472 | 4 |
| USDJPY DC-LS-S | +685 pips | +5,555 | 4,059 | 1.02 | 0.27 | 0.94 | 1.05 | 9.2th | -3,080 | 4 |
| USDJPY DC-L-S | +3,927 pips | +6,599 | 2,226 | 1.05 | 0.49 | 1.07 | 1.13 | 65.0th | +681 | 3 |
| USDJPY DC-LS-F | +2,067 pips | +8,734 | 5,556 | 1.00 | -0.03 | 0.97 | 1.07 | 50.2th | -281 | 4 |
| USDJPY DC-L-F | +1,643 pips | +5,246 | 3,002 | 0.95 | -0.67 | 1.05 | 1.09 | 62.0th | -356 | 4 |
| USDJPY BB-LS-S | -20,787 pips | -14,429 | 5,298 | 0.82 | -3.04 | 0.82 | 0.75 | 0.4th | -23,069 | 5 |
| USDJPY BB-L-S | -10,386 pips | -7,170 | 2,680 | 0.80 | -2.34 | 0.87 | 0.74 | 2.2th | -11,768 | 5 |
| USDJPY BB-LS-F | -20,852 pips | -11,312 | 7,950 | 0.86 | -3.43 | 0.87 | 0.84 | 1.4th | -23,124 | 5 |
| USDJPY BB-L-F | -11,275 pips | -6,299 | 4,147 | 0.85 | -2.75 | 0.89 | 0.85 | 10.4th | -13,450 | 5 |
| USDJPY DV-LS-S | -2,210 pips | +84 | 1,911 | 0.86 | -1.16 | 0.92 | 0.92 | 84.8th | -3,554 | 5 |
| USDJPY DV-L-S | -1,664 pips | -573 | 909 | 0.90 | -0.55 | 0.78 | 0.84 | 40.0th | -2,581 | 5 |
| USDJPY DV-LS-F | -1,290 pips | +1,018 | 1,923 | 0.93 | -0.84 | 0.98 | 1.00 | 52.8th | -3,084 | 4 |
| USDJPY DV-L-F | +179 pips | +1,314 | 946 | 1.01 | 0.11 | 1.01 | 1.00 | 65.6th | -1,524 | 4 |
| USDJPY MC-LS-S | +1,726 pips | +15,673 | 11,623 | 0.95 | -1.10 | 1.03 | 1.06 | 99.4th | -2,104 | 3 |
| USDJPY MC-L-S | +3,558 pips | +10,517 | 5,799 | 0.93 | -1.22 | 1.07 | 1.16 | 99.4th | +401 | 2 |
| USDJPY MC-LS-F | -4,935 pips | +1,385 | 5,267 | 0.96 | -0.77 | 0.94 | 0.97 | 0.4th | -7,369 | 5 |
| USDJPY MC-L-F | +3,454 pips | +8,134 | 3,900 | 1.04 | 0.63 | 1.01 | 1.07 | 51.4th | +964 | 3 |
AUDUSD
| Variant | Net, all | Gross, all | Trades | PF dev | t (dev) | PF val | PF holdout* | vs matched random | Top 10 removed | Gates failed |
|---|---|---|---|---|---|---|---|---|---|---|
| AUDUSD A | -1,098 pips | +677 | 1,775 | 1.00 | 0.04 | 0.85 | 0.85 | 19.6th | -1,872 | 5 |
| AUDUSD B | -721 pips | +225 | 946 | 1.03 | 0.17 | 0.75 | 0.83 | 28.8th | -1,310 | 5 |
| AUDUSD A2 | -3,127 pips | -1,240 | 1,887 | 0.96 | -0.45 | 0.87 | 0.81 | 38.8th | -4,542 | 5 |
| AUDUSD B2 | -514 pips | +488 | 1,002 | 1.15 | 1.21 | 0.74 | 0.85 | 84.6th | -1,519 | 5 |
| AUDUSD ST60-LS | -298 pips | +4,183 | 4,481 | 1.08 | 1.13 | 0.95 | 0.89 | 82.2th | -5,444 | 5 |
| AUDUSD ST60-L | +1,107 pips | +3,355 | 2,248 | 1.15 | 1.49 | 0.86 | 0.95 | 82.2th | -2,405 | 5 |
| AUDUSD ST60-LS-T | -1,707 pips | +2,021 | 3,728 | 1.01 | 0.20 | 0.97 | 0.90 | 86.8th | -3,701 | 5 |
| AUDUSD ST60-L-T | -1,647 pips | +227 | 1,874 | 0.98 | -0.24 | 0.97 | 0.87 | 33.2th | -3,099 | 5 |
| AUDUSD DC-LS-S | -8,958 pips | -4,641 | 4,317 | 1.01 | 0.11 | 0.76 | 0.84 | 0.2th | -13,310 | 5 |
| AUDUSD DC-L-S | -4,116 pips | -1,806 | 2,310 | 1.09 | 0.90 | 0.70 | 0.82 | 0.4th | -7,123 | 5 |
| AUDUSD DC-LS-F | -10,894 pips | -5,396 | 5,498 | 0.94 | -1.10 | 0.87 | 0.87 | 0.6th | -13,675 | 5 |
| AUDUSD DC-L-F | -6,950 pips | -4,005 | 2,945 | 0.97 | -0.39 | 0.80 | 0.80 | 0.2th | -8,906 | 5 |
| AUDUSD BB-LS-S | -6,889 pips | -1,458 | 5,431 | 0.83 | -2.82 | 1.07 | 0.95 | 40.0th | -8,362 | 5 |
| AUDUSD BB-L-S | -5,707 pips | -2,997 | 2,710 | 0.84 | -1.88 | 0.97 | 0.82 | 16.0th | -7,052 | 5 |
| AUDUSD BB-LS-F | -6,929 pips | +650 | 7,579 | 0.91 | -2.15 | 1.00 | 0.96 | 74.6th | -9,806 | 5 |
| AUDUSD BB-L-F | -5,124 pips | -1,158 | 3,966 | 0.90 | -1.64 | 0.95 | 0.94 | 77.2th | -7,655 | 5 |
| AUDUSD DV-LS-S | +1,268 pips | +3,298 | 2,030 | 1.08 | 0.60 | 1.20 | 0.96 | 98.2th | +333 | 2 |
| AUDUSD DV-L-S | +94 pips | +1,059 | 965 | 1.02 | 0.12 | 1.09 | 0.91 | 85.6th | -766 | 5 |
| AUDUSD DV-LS-F | -1,166 pips | +820 | 1,986 | 0.96 | -0.42 | 0.99 | 0.94 | 67.2th | -3,108 | 5 |
| AUDUSD DV-L-F | -443 pips | +557 | 1,000 | 1.03 | 0.26 | 0.91 | 0.92 | 36.2th | -2,112 | 5 |
| AUDUSD MC-LS-S | -2,143 pips | +9,571 | 11,714 | 1.05 | 1.02 | 0.94 | 0.93 | 99.0th | -5,526 | 4 |
| AUDUSD MC-L-S | +142 pips | +5,994 | 5,852 | 1.09 | 1.38 | 0.89 | 0.97 | 99.0th | -2,327 | 4 |
| AUDUSD MC-LS-F | -3,176 pips | +2,069 | 5,245 | 1.00 | -0.01 | 0.98 | 0.90 | 49.4th | -5,771 | 5 |
| AUDUSD MC-L-F | +1,778 pips | +5,698 | 3,920 | 1.09 | 1.37 | 0.99 | 0.93 | 62.4th | -569 | 5 |
* Holdout already used before this test. PF = profit factor, in pips. Results are in pips per unit, no compounding. Net after the 10 best trades are removed is in pips.
08Cause of death
| Strategy | Cause | Why |
|---|---|---|
| RSI(2) Dip Buyer | No proven edge | Positive before costs in 9 of 16 results and after costs in 3; 0 passed every gate; the closest was EURUSD A (1 of 6 gates failed). |
| Supertrend | No proven edge | Positive before costs in 16 of 16 results and after costs in 9; 0 passed every gate; the closest was USDJPY ST60-L (3 of 6 gates failed). |
| Donchian Channel Breakout | No proven edge | Positive before costs in 9 of 16 results and after costs in 6; 0 passed every gate; the closest was USDJPY DC-L-S (3 of 6 gates failed). |
| Bollinger Band Reversal | No proven edge | Positive before costs in 4 of 16 results and after costs in 0; 0 passed every gate; the closest was EURUSD BB-L-S (4 of 6 gates failed). |
| RSI Divergence | No proven edge | Positive before costs in 12 of 16 results and after costs in 6; 0 passed every gate; the closest was EURUSD DV-L-F (2 of 6 gates failed). |
| MACD Crossover | No proven edge | Positive before costs in 15 of 16 results and after costs in 6; 0 passed every gate; the closest was USDJPY MC-L-S (2 of 6 gates failed). |
What this test covers, exactly: these six rule sets at their default settings on hourly bars of four major pairs, 2004 to 2026, with a flat cost of about 1 pip per round trip. It says nothing about the same ideas on other timeframes, other pairs, or with carry. What it does show is that the tested configurations did not demonstrate the robustness the protocol requires across these four pairs.
What we did not test: daily bars, 5- and 15-minute bars, cross rates and minor pairs, carry (swap) income, session or news filters, volatility-based position sizing, and a cost that varies by year. We used the ES defaults on purpose: tuning would raise the odds of finding a lucky setting, not a real edge.
What would change our mind: a variant, declared in advance, that clears every gate on at least three of the four pairs, ideally on data we have not looked at, or a forward sample of new trades with a clearly positive result after real costs.
TWhat this shows, and what to take into your own tests
What the results show
- None of the 96 variants passed every gate, and none came near the bar for support (a pass on at least 3 of the 4 pairs).
- All 96 failed the development t-statistic gate: the highest was 1.61 against the 2.5 required.
- 65 of 96 results were positive before costs and 30 after. Across 347,256 trades the average gross result was about +0.36 pip a trade, against a cost of about 1 pip.
What remains unknown
- Other timeframes (daily bars, or 5 and 15 minutes), other pairs and cross rates, none of which we tested.
- Carry (the swap a position held for days earns or pays), which we did not model.
- Real spreads over 2004 to 2012: our flat cost may be too low or too high for individual years. At half the cost, 44 of the 96 results would have been net positive (we have not re-run the other gates at other costs).
- Whether the small gross edge Supertrend and MACD show on most pairs could be kept with far fewer trades.
Why it failed
These strategies trade a lot, about 3,617 trades per variant over 22 years, and the gross result per trade (0.36 pip on average) is smaller than the cost per trade (about 1 pip). Costs turned 35 of the 65 results that were positive before costs into losses. The other 30 stayed above zero after costs, and none of them met all the criteria: all 30 failed the development t-statistic, 27 the validation profit factor, 20 the matched control, 22 the ten-best-trades test and 15 the holdout. Supertrend (positive before costs in 16 of 16 results) and MACD (15 of 16) came closest, with 9 and 6 results above zero after costs; none of these 15 cleared the development t-statistic or reached a validation profit factor of 1.2. The picture also faded over time: of the 96 results, 50 finished above zero in development, 26 in validation and 23 in the holdout.
What you can apply to your own tests
- A second, unrelated market is a good robustness check before you trust a first result. An edge can still be specific to one market, but then it needs other evidence. The Bollinger long side was our best hint on ES; here it finished above zero in none of its 16 results.
- Count your costs in the unit of the edge. With about 1 pip a trade, a strategy has to earn more than a pip gross on average before it earns anything.
- Write the bar for “works on more than one market” before you see the results. Ours was a pass on at least 3 of 4 pairs, and it removed any temptation to promote a lucky pair.
- Split results by period. 50 of 96 results were positive in development against 23 in the holdout, which is what results that fade look 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
Do technical indicators work on forex?
In our backtest of six popular indicator strategies on four major pairs (96 variants), 0 passed every gate. 30 finished above zero after costs, but each of those failed other tests, such as the development t-statistic.
Does a strategy that works on one currency pair work on the others?
We set the bar in advance: a variant counts as supported only if it passes every gate on at least 3 of the 4 pairs. No variant came close, and none passed on even one pair. That bar is this study's, not a universal definition of an edge.
How much do trading costs matter in forex strategies?
We charged about 1 pip per round trip (1.2 on USDJPY). Across 347,256 trades the 96 variants made +125,671 pips before costs and -238,575 pips after. Costs turned 35 of the 65 results that were positive before costs into losses.
How was the forex study tested?
On 22 years of spot FX, 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. The specification was published before any result. Read the protocol.
09Check our arithmetic
clock_audit_compare.txt · clock_audit_map.txt · clock_audit_fix.txt · clock_audit_map.js · clock_audit_fix.js · clock_audit_compare.js
fx_lib.js · fx_run.js · fx_data.js · fx_selftest.js · control_audit_lib.js · hourly_lib.js · rsi2_protocol.js · st_protocol.js
fx_selftest_result.txt · fx_results_all.json · EURUSD · GBPUSD · USDJPY · AUDUSD
Code provenance: our own code, written from the standard definitions of the indicators. No third-party source code is used or published.
10Clock audit (added 9 Oct 2026)
We checked the time stamps of this broker's MetaTrader 4 history against an outside event: the price jump at the US data releases that come out at 08:30 New York (the payrolls, the weekly jobless claims). Week by week, the jump should sit in the minute 08:30 to 08:31. For the currency pairs it sat one hour early in many weeks: on EUR/USD, for example, in 541 of 1,205 weeks, mostly 2004 to 2014, plus a few weeks a year after that when the US and European clocks change on different dates. In 297 of those weeks there was no clear release, so the week took the call of the nearest week that had one; that part is an estimate. We moved the time stamps of those weeks by one hour (prices untouched) and ran the same code again on the same data (clock_audit_compare.txt). The same pattern holds on GBP/USD, USD/JPY and AUD/USD. Two rules of this study depend on the time of day: the RSI(2) entries are allowed only from 10:00 to 16:00 New York, and every position is closed at the Friday bar closing at or after 16:00. So we re-ran all 96 variants with the corrected time stamps.
| Across the 96 results | Clock as published | Corrected clock |
|---|---|---|
| Passed every gate | 0 | 0 |
| Positive before costs | 65 | 65 |
| Positive after costs | 30 | 26 |
| Highest development t-statistic (2.5 needed) | 1.61 | 1.65 |
| Above the 95th percentile of the matched control | 11 | 11 |
| Most gates passed by one result | 5 of 6 (EURUSD A) | 4 of 6 (EURUSD A, EURUSD B, EURUSD DV-L-F, GBPUSD ST60-L-T, USDJPY MC-L-S) |
| Pips before costs / after costs | +125,671 / -238,575 | +112,469 / -252,529 |
What changes. No verdict: 0 of 96 pass with either clock, and none comes near a pass on three of the four pairs. The figures quoted in this post come from the run with the clock as published, and several of them move: 4 results change sign after costs (USDJPY B, USDJPY DC-LS-S, AUDUSD DV-L-S, AUDUSD MC-L-S), and the number of gates passed changes for 6 (EURUSD A (5 → 4), EURUSD B (2 → 4), EURUSD DV-L-S (2 → 1), GBPUSD ST60-L-T (3 → 4), USDJPY ST60-L (3 → 2), AUDUSD DV-LS-S (4 → 3)). The closest call, EURUSD A, passes 4 gates instead of 5 with the corrected clock, because its holdout turns negative. Every variant's figures under both clocks are in clock_audit_compare.txt.
11Corrections
8 Oct 2026, after outside review: (1) the introduction no longer says a real edge must show up on a second market. Transfer to other markets is a robustness check; an edge can be specific to one market, and the 3-of-4-pairs bar is this study's bar, not a universal definition of an edge. (2) The “Why it failed” text no longer says the gross edges of Supertrend and MACD were too small to pay the costs: 9 Supertrend and 6 MACD results finished above zero after costs. It now says costs turned 35 of the 65 results that were positive before costs into losses, and that the 30 that stayed above zero did not meet all the criteria. No result changed. 9 Oct 2026, clock audit: a check against the US data releases at 08:30 New York showed the time stamps of the four currency files one hour early in most weeks of 2004 to 2014 and in some clock-change weeks after that. Two rules of this study depend on the time of day (the RSI(2) entry window and the Friday close), so all 96 variants were re-run with corrected time stamps; the comparison is in the new “Clock audit” section. No verdict changed; several figures quoted in this post moved, and the closest call, EURUSD A, passes 4 gates instead of 5 with the corrected clock. The figures above stay as the record of the published run. 8 Oct 2026, search and navigation: added an answer-first line, a FAQ and links to related tests and guides. No result changed. 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. 22 Oct 2026, navigation: added a link to the new guide comparing versions with and without a stop loss across our tests. No result changed.
+More tests and guides
- RSI 2 strategy backtest
- Supertrend indicator backtest
- Bollinger bands strategy backtest
- Gold opening range breakout backtest
- Did the stop loss help? This test next to the other with-and-without pairs
- 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