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.

EURUSD, GBPUSD, USDJPY, AUDUSD · spot FX · 60-minute bars · Protocol v1.0 plus the 8 Oct 2026 rules

Buried · No proven edge

96 tries on four pairs. No survivors.

BornRules, variants and gates frozen 8 Oct 2026 (fx_spec.md), before any FX result
Died8 Oct 2026

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.

StrategyES postVariants per pair
RSI(2) Dip BuyerRSI(2) Dip BuyerA, B, A2, B2
SupertrendSupertrendST60-LS, ST60-L, ST60-LS-T, ST60-L-T
Donchian Channel BreakoutDonchian Channel BreakoutDC-LS-S, DC-L-S, DC-LS-F, DC-L-F
Bollinger Band ReversalBollinger Band ReversalBB-LS-S, BB-L-S, BB-LS-F, BB-L-F
RSI DivergenceRSI DivergenceDV-LS-S, DV-L-S, DV-LS-F, DV-L-F
MACD CrossoverMACD CrossoverMC-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.

PeriodDates
Development2004-01-01 to 2012-12-31
Validation2013-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.

PairCommission (pips)Spread assumed (pips)Cost per round trip (pips)
EURUSD0.70.31.0
GBPUSD0.70.31.0
USDJPY0.90.31.2
AUDUSD0.70.31.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

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs 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 failed1 of 40 of 4
B (long only)+513 · 4 of 6 failed-994 · 5 of 6 failed+212 · 4 of 6 failed-721 · 5 of 6 failed2 of 40 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 failed0 of 40 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 failed0 of 40 of 4

Supertrend

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs 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 failed2 of 40 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 failed3 of 40 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 failed2 of 40 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 failed2 of 40 of 4

Donchian Channel Breakout

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs 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 failed1 of 40 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 failed1 of 40 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 failed2 of 40 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 failed2 of 40 of 4

Bollinger Band Reversal

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs 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 failed0 of 40 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 failed0 of 40 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 failed0 of 40 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 failed0 of 40 of 4

RSI Divergence

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs 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 failed1 of 40 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 failed2 of 40 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 failed1 of 40 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 failed2 of 40 of 4

MACD Crossover

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs 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 failed1 of 40 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 failed2 of 40 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 failed0 of 40 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 failed3 of 40 of 4

By strategy

StrategyResults (variants × pairs)Positive before costsPositive after costsAbove the 95th percentile of the matched controlPassed every gate
RSI(2) Dip Buyer169310
Supertrend1616930
Donchian Channel Breakout169600
Bollinger Band Reversal164000
RSI Divergence1612630
MACD Crossover1615640

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.

VariantPairs positive before costsPairs positive after costsPairs positive in the holdout*Pairs passing every gate
A4120
B3220
A20000
B22000
ST60-LS4210
ST60-L4310
ST60-LS-T4210
ST60-L-T4220
DC-LS-S1110
DC-L-S2110
DC-LS-F3210
DC-L-F3210
BB-LS-S1010
BB-L-S2010
BB-LS-F1000
BB-L-F0000
DV-LS-S4100
DV-L-S2200
DV-LS-F3120
DV-L-F3220
MC-LS-S4110
MC-L-S4210
MC-LS-F3000
MC-L-F4320

* 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

GateFailedPassed
1. PF ≥ 1.2 in validation93 of 963
2. ≥ 50 trades in each period0 of 9696
3. t ≥ 2.5 on development96 of 960
4. Above the 95th percentile of the matched random control85 of 9611
5. Positive without the 10 best trades88 of 968
6. Holdout net positive (already used)73 of 9623

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.

PairTradesGross, all 24Net, all 24Positive before costsPositive after costsPositive at half the costPositive at double the cost
EURUSD88,318+41,678-46,640199142
GBPUSD88,576+27,357-61,21913590
USDJPY84,953+38,446-63,4981711122
AUDUSD85,409+18,191-67,21816590

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

VariantNet, allGross, allTradesPF devt (dev)PF valPF holdout*vs matched randomTop 10 removedGates failed
EURUSD A+1,748 pips+3,4541,7061.171.361.211.0199.8th+9831
EURUSD B+513 pips+1,3378241.070.421.151.0392.2th-1484
EURUSD A2-2,266 pips-4671,7990.89-1.311.040.9075.8th-3,6995
EURUSD B2-317 pips+5538700.97-0.271.030.9594.6th-1,5555
EURUSD ST60-LS+699 pips+5,2474,5481.050.740.960.9683.2th-4,9585
EURUSD ST60-L+819 pips+3,0642,2451.070.740.920.9983.6th-3,8235
EURUSD ST60-LS-T+1,539 pips+5,3353,7961.081.251.060.8698.6th-5534
EURUSD ST60-L-T+451 pips+2,3641,9131.080.921.030.8590.2th-1,2035
EURUSD DC-LS-S-8,917 pips-4,5364,3810.96-0.650.850.894.2th-13,8285
EURUSD DC-L-S-2,459 pips-1172,3421.020.230.830.9449.4th-6,6005
EURUSD DC-LS-F-1,738 pips+3,8575,5951.030.500.980.9158.4th-4,4685
EURUSD DC-L-F-1,427 pips+1,5452,9721.040.610.900.9355.2th-3,9115
EURUSD BB-LS-S-3,981 pips+1,8705,8510.93-1.240.991.0117.0th-5,7364
EURUSD BB-L-S-2,343 pips+6382,9810.91-1.120.941.1154.2th-3,8944
EURUSD BB-LS-F-12,030 pips-3,7308,3000.94-1.600.890.9214.8th-14,4185
EURUSD BB-L-F-5,947 pips-1,5534,3940.97-0.580.810.9680.0th-7,8185
EURUSD DV-LS-S-1,081 pips+1,0272,1081.010.060.900.8868.6th-2,1695
EURUSD DV-L-S+633 pips+1,7351,1021.201.171.050.8496.0th-3154
EURUSD DV-LS-F+662 pips+2,7192,0571.040.501.030.9583.2th-1,1925
EURUSD DV-L-F+3,044 pips+4,1811,1371.211.611.270.9198.4th+1,2942
EURUSD MC-LS-S-8,353 pips+3,43611,7891.010.300.900.9074.4th-12,1095
EURUSD MC-L-S-3,790 pips+2,1105,9001.020.390.880.9274.4th-6,8895
EURUSD MC-LS-F-1,096 pips+4,4625,5581.040.750.950.9472.8th-4,0015
EURUSD MC-L-F-1,003 pips+3,1474,1501.040.610.960.9266.0th-3,5165

GBPUSD

VariantNet, allGross, allTradesPF devt (dev)PF valPF holdout*vs matched randomTop 10 removedGates failed
GBPUSD A-675 pips+9351,6101.100.780.970.752.6th-1,7585
GBPUSD B-994 pips-2167780.99-0.080.800.811.0th-1,8245
GBPUSD A2-3,344 pips-1,6381,7060.86-1.631.100.8323.2th-5,3705
GBPUSD B2-2,908 pips-2,0748340.83-1.440.920.825.2th-4,4845
GBPUSD ST60-LS-335 pips+4,3044,6391.050.750.980.9174.2th-7,8135
GBPUSD ST60-L-721 pips+1,5692,2901.040.420.940.9574.2th-5,4905
GBPUSD ST60-LS-T+3,825 pips+7,7003,8751.101.491.010.9899.6th+1,2683
GBPUSD ST60-L-T+1,822 pips+3,7641,9421.040.401.051.0495.4th-2553
GBPUSD DC-LS-S-5,677 pips-1,3144,3630.99-0.180.980.8740.2th-11,2915
GBPUSD DC-L-S-1,797 pips+5282,3251.030.340.980.8552.2th-6,3055
GBPUSD DC-LS-F+1,425 pips+7,0885,6631.061.111.030.8974.2th-2,3535
GBPUSD DC-L-F+1,207 pips+4,1722,9651.070.941.020.9181.6th-2,0475
GBPUSD BB-LS-S-8,397 pips-2,5245,8730.94-0.970.910.9658.4th-11,0985
GBPUSD BB-L-S-2,586 pips+4223,0081.020.200.860.9888.8th-4,9795
GBPUSD BB-LS-F-12,996 pips-4,4938,5030.94-1.520.900.9676.6th-15,9835
GBPUSD BB-L-F-5,883 pips-1,3634,5200.99-0.210.860.9588.2th-8,6135
GBPUSD DV-LS-S-1,913 pips+1172,0301.020.140.980.7451.2th-3,0785
GBPUSD DV-L-S-1,241 pips-2211,0201.100.560.940.6550.2th-2,2205
GBPUSD DV-LS-F-3,162 pips-1,1811,9810.87-1.640.971.0729.4th-5,5394
GBPUSD DV-L-F-2,022 pips-9801,0420.84-1.440.951.0922.4th-3,9834
GBPUSD MC-LS-S-5,708 pips+6,19411,9021.000.070.940.9683.8th-10,9415
GBPUSD MC-L-S-3,691 pips+2,2645,9550.99-0.160.920.9984.0th-7,2625
GBPUSD MC-LS-F-5,624 pips-125,6120.96-0.791.010.9310.8th-8,9825
GBPUSD MC-L-F+175 pips+4,3154,1401.010.180.971.0176.6th-3,0014

USDJPY

VariantNet, allGross, allTradesPF devt (dev)PF valPF holdout*vs matched randomTop 10 removedGates failed
USDJPY A-101 pips+2,0111,7601.070.540.871.0377.2th-1,0844
USDJPY B+212 pips+1,2949011.120.670.971.0169.8th-3334
USDJPY A2-6,018 pips-3,8111,8390.79-2.520.850.834.8th-7,6005
USDJPY B2-3,312 pips-2,1799440.80-1.700.810.764.2th-4,4015
USDJPY ST60-LS+2,581 pips+7,9414,4670.94-0.841.011.1394.6th-2,5584
USDJPY ST60-L+3,902 pips+6,6082,2550.90-1.151.071.2894.6th+2693
USDJPY ST60-LS-T-2,907 pips+1,5603,7220.88-1.950.951.0657.6th-4,8304
USDJPY ST60-L-T-1,694 pips+5481,8690.86-1.610.961.0637.6th-3,4724
USDJPY DC-LS-S+685 pips+5,5554,0591.020.270.941.059.2th-3,0804
USDJPY DC-L-S+3,927 pips+6,5992,2261.050.491.071.1365.0th+6813
USDJPY DC-LS-F+2,067 pips+8,7345,5561.00-0.030.971.0750.2th-2814
USDJPY DC-L-F+1,643 pips+5,2463,0020.95-0.671.051.0962.0th-3564
USDJPY BB-LS-S-20,787 pips-14,4295,2980.82-3.040.820.750.4th-23,0695
USDJPY BB-L-S-10,386 pips-7,1702,6800.80-2.340.870.742.2th-11,7685
USDJPY BB-LS-F-20,852 pips-11,3127,9500.86-3.430.870.841.4th-23,1245
USDJPY BB-L-F-11,275 pips-6,2994,1470.85-2.750.890.8510.4th-13,4505
USDJPY DV-LS-S-2,210 pips+841,9110.86-1.160.920.9284.8th-3,5545
USDJPY DV-L-S-1,664 pips-5739090.90-0.550.780.8440.0th-2,5815
USDJPY DV-LS-F-1,290 pips+1,0181,9230.93-0.840.981.0052.8th-3,0844
USDJPY DV-L-F+179 pips+1,3149461.010.111.011.0065.6th-1,5244
USDJPY MC-LS-S+1,726 pips+15,67311,6230.95-1.101.031.0699.4th-2,1043
USDJPY MC-L-S+3,558 pips+10,5175,7990.93-1.221.071.1699.4th+4012
USDJPY MC-LS-F-4,935 pips+1,3855,2670.96-0.770.940.970.4th-7,3695
USDJPY MC-L-F+3,454 pips+8,1343,9001.040.631.011.0751.4th+9643

AUDUSD

VariantNet, allGross, allTradesPF devt (dev)PF valPF holdout*vs matched randomTop 10 removedGates failed
AUDUSD A-1,098 pips+6771,7751.000.040.850.8519.6th-1,8725
AUDUSD B-721 pips+2259461.030.170.750.8328.8th-1,3105
AUDUSD A2-3,127 pips-1,2401,8870.96-0.450.870.8138.8th-4,5425
AUDUSD B2-514 pips+4881,0021.151.210.740.8584.6th-1,5195
AUDUSD ST60-LS-298 pips+4,1834,4811.081.130.950.8982.2th-5,4445
AUDUSD ST60-L+1,107 pips+3,3552,2481.151.490.860.9582.2th-2,4055
AUDUSD ST60-LS-T-1,707 pips+2,0213,7281.010.200.970.9086.8th-3,7015
AUDUSD ST60-L-T-1,647 pips+2271,8740.98-0.240.970.8733.2th-3,0995
AUDUSD DC-LS-S-8,958 pips-4,6414,3171.010.110.760.840.2th-13,3105
AUDUSD DC-L-S-4,116 pips-1,8062,3101.090.900.700.820.4th-7,1235
AUDUSD DC-LS-F-10,894 pips-5,3965,4980.94-1.100.870.870.6th-13,6755
AUDUSD DC-L-F-6,950 pips-4,0052,9450.97-0.390.800.800.2th-8,9065
AUDUSD BB-LS-S-6,889 pips-1,4585,4310.83-2.821.070.9540.0th-8,3625
AUDUSD BB-L-S-5,707 pips-2,9972,7100.84-1.880.970.8216.0th-7,0525
AUDUSD BB-LS-F-6,929 pips+6507,5790.91-2.151.000.9674.6th-9,8065
AUDUSD BB-L-F-5,124 pips-1,1583,9660.90-1.640.950.9477.2th-7,6555
AUDUSD DV-LS-S+1,268 pips+3,2982,0301.080.601.200.9698.2th+3332
AUDUSD DV-L-S+94 pips+1,0599651.020.121.090.9185.6th-7665
AUDUSD DV-LS-F-1,166 pips+8201,9860.96-0.420.990.9467.2th-3,1085
AUDUSD DV-L-F-443 pips+5571,0001.030.260.910.9236.2th-2,1125
AUDUSD MC-LS-S-2,143 pips+9,57111,7141.051.020.940.9399.0th-5,5264
AUDUSD MC-L-S+142 pips+5,9945,8521.091.380.890.9799.0th-2,3274
AUDUSD MC-LS-F-3,176 pips+2,0695,2451.00-0.010.980.9049.4th-5,7715
AUDUSD MC-L-F+1,778 pips+5,6983,9201.091.370.990.9362.4th-5695

* 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

StrategyCauseWhy
RSI(2) Dip BuyerNo proven edgePositive 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).
SupertrendNo proven edgePositive 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 BreakoutNo proven edgePositive 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 ReversalNo proven edgePositive 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 DivergenceNo proven edgePositive 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 CrossoverNo proven edgePositive 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 (9 Oct 2026)The 08:30 check, the corrected weeks and the comparison of every variant under both clocks.
clock_audit_compare.txt · clock_audit_map.txt · clock_audit_fix.txt · clock_audit_map.js · clock_audit_fix.js · clock_audit_compare.js
Frozen specificationRules, variants, costs, gates, controls. Dated before any result.
fx_spec.md
CodeEngine, runner, data loader, self-test and helpers. Needs your own MT4 history folder.
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
ResultsSelf-test result, all 96 results as one file, and the console output per pair.
fx_selftest_result.txt · fx_results_all.json · EURUSD · GBPUSD · USDJPY · AUDUSD
Trade logs (zipped CSV)Every trade of every variant, net of costs, in pips.
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 resultsClock as publishedCorrected clock
Passed every gate00
Positive before costs6565
Positive after costs3026
Highest development t-statistic (2.5 needed)1.611.65
Above the 95th percentile of the matched control1111
Most gates passed by one result5 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