Hypotheses were registered in FX_PLAN.md before each round. Trend, breakout, cross reversion, hour seasonality, month-end USD, carry-cross dip-buy, metals dip-buy and flight-to-safety all fail the bar. The weekend-gap fade looked like the best result of the project on bar data (OOS t 20, 28/28 pairs) and loses on real ticks (EURCHF PF 0.52, AUDNZD PF 0.53): the Sunday-open spread is as wide as the gap. WarriorGapFade is kept as the research artifact that proved it and is flagged DO NOT TRADE. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
6,9 КиБ
Forex & metals — pre-registered search (written 2026-09-22, BEFORE any result was seen)
The prior is hostile. Every earlier study on this project found forex and gold barren for short-horizon rules: lag-1 autocorrelation ≈ 0 and no drift on FX, gold drifts but does not revert, and trend/breakout/volatility styles scored nothing on 13 instruments. A search that tries enough things will "find" a strategy anyway. This file exists so that cannot happen quietly: the candidate list, the parameter grid and the pass bar are fixed here, and every result is reported — including the failures.
Families (each has an economic reason to exist, not just a backtest)
| id | family | rule (long & short unless stated) | variants (the ONLY ones tried) | why it could exist |
|---|---|---|---|---|
| T1 | Time-series momentum | D1: long if close > SMA(L), short if below; flip on cross; stop 3×ATR20 | L ∈ {50, 100, 200} | Documented FX/metals trend premium at 1–12 m horizons (central-bank cycles, slow capital flows). The earlier "trend = nothing" scans were short-horizon. |
| T2 | Channel breakout | D1: enter on N-day high/low, exit on N/2-day opposite, stop 2×ATR20 | N ∈ {20, 55, 100} | Same premium, different trigger; the classic Turtle rule. |
| R1 | Cross mean reversion | H4 & D1: z(20) ≤ −2 long / ≥ +2 short, exit at SMA20 or 10 bars, stop 3×ATR | z ∈ {1.5, 2.0}, TF ∈ {H4, D1} | Crosses of economically-twinned currencies (EURGBP, EURCHF, AUDNZD, AUDCAD, NZDCAD, CADCHF…) have no persistent reason to trend. Majors are expected to FAIL (control). |
| S1 | Gold / FX intraday seasonality | H1: hold long (or short) over a fixed hour window chosen in-sample | window chosen on IS only, must keep sign OOS | Documented gold "overnight vs fix" effect; London/NY fix flows. High trial count (24 hours) — the strictest OOS bar applies. |
| M1 | Month-end USD flow | D1: USD pairs, last 2 trading days vs first 2 of month | long / short USD by the IS sign | Documented month-end rebalancing flows. |
Deliberately NOT searched: carry (swap history is not available, and the tester charges today's swap for all history), pair trades (you want one chart = one symbol), day-of-week effects (the artifact that sank the vol meta-label).
Protocol
- Split: IS = start → 2015-12-31, OOS = 2016-01-01 → 2026-08-31. Variants are picked on IS only; OOS is looked at once per family.
- Costs: the bar's own spread, charged once per round trip. Swap is NOT in the Python screen (the tester adds it); anything holding for weeks is therefore re-checked in the tester before it is called a result.
- Controls: random entry with the same long/short mix and holding time.
- Pass bar — all of:
- OOS expectancy > 0 after spread with t ≥ 2 (trade-level, holding-overlap aware);
- the same variant positive in IS;
- breadth — positive OOS on at least half the instruments in its class, not one lucky symbol;
- beats its control OOS;
- then, in the MT5 tester with real swaps, per chart or combined: ≥ 2 trades/month, equity drawdown ≤ 5 %, ret/DD ≥ 2.
- Trial count is reported with every result, so a t-stat can be read against how many things were tried.
Round 2 — registered 2026-09-22 ~23:30, after round 1 came back empty
Round 1 result: T1, T2, R1, S1 dead; M1 dead for USD pairs; one cell (long gold, first 2 trading days of the month) is strong OOS but average IS and was found by looking at OOS cells — a watchlist candidate, not a result. Round 2 raises the trial count, so its bar is the same and its t-stats must be read against the larger total.
The idea behind round 2: the ONE edge this project has proven is "risk assets revert after a sharp dip, because they carry a premium". Equity indices carry the equity premium. Some FX crosses carry a premium too — the CARRY premium on risk-on crosses (AUDJPY, NZDJPY, CADJPY) — and they move with equities.
| id | rule | variants | reason |
|---|---|---|---|
| X1 | Long-only z-dip on carry-positive risk crosses (the index rule, unchanged: z20 <= -1.5, exit SMA20 / 10 bars, 3xATR) on H4, with and without the vol gate | gate on / off | same drift+reversal mechanism, carry as the drift |
| X2 | Cross-asset: SP500 H4 dip signal (z <= -1.5, gate on) -> long the risk cross on its own chart, same exits | none | equity-led risk-on rebound transmitted to FX |
| X3 | Weekend gap fade, H1: if Monday's first open gaps > k x ATR from Friday's close, fade it toward Friday's close; exit at target, 3xATR stop, or end of Monday | k in {0.5, 1.0} | thin Sunday liquidity gaps revert as liquidity returns |
| X4 | Index rule on metals (long-only z-dip, H4), gate on/off | gate on / off | completeness: records say gold drifts but does not revert |
Risk crosses: AUDJPY, NZDJPY, CADJPY, AUDUSD, NZDUSD, USDJPY (long USDJPY = long carry). Same split, costs, controls and pass bar as round 1. Swap is positive on most of these long legs, so the Python screen (no swap) is conservative for X1/X2.
Round 2 results (for the record)
X1 carry-cross dip-buy: IS LOST (t -4.07 ungated; 2008/2011/2015 carry unwinds), OOS +12.5 bp gated -> regime flip, fails. X2 SP500-dip -> risk FX: +4.6 IS / +5.6 OOS H4 (2021+), no symbol t >= 2, and it fires with the index portfolio (stacks correlated risk) -> fails. X3 weekend gap fade: bar data says OOS +7.1 bp, t 11.8, 29/33 -> REAL TICKS KILL IT (EURCHF 2016-26 real ticks: 51 trades not 234, PF 0.74, -1,173): the Sunday-open spread is as wide as the gap. Bar data cannot price the first minutes of the week. Delayed entry decays to zero within 2 hours. X4 index rule on metals: LOSES IN BOTH HALVES (IS -18.1 bp t -2.45, OOS -16.8 bp t -4.22).
Round 3 — registered after X4, before running
X4 losing consistently in BOTH halves is the one piece of structure round 2 found: after a sharp H4 move, metals continue rather than revert. The mirror of the index rule is a continuation rule. This is post-hoc (motivated by X4), so it gets the full bar and no extra variants.
| id | rule | variants |
|---|---|---|
| C1 | metals H4: z20 <= -1.5 -> SHORT, z20 >= +1.5 -> LONG; exit when close crosses back through SMA20 (the move failed) or after 10 bars; 3xATR stop | gate on / off |
Same split (2016), costs, controls, pass bar. Real-tick check before anything is called a result.
Round 4 — the last one (registered 2026-09-23 ~00:15, before running)
Rounds 1-3: nothing passed; the weekend gap died on real ticks. One untested idea has a real mechanism and fits one-chart-per-symbol: flight to safety. When the index dip signal fires (SP500 H4 z <= -1.5, vol gate on — the live strategy's own trigger), buy the havens on their own charts: XAUUSD, XAGUSD long; USDCHF, USDJPY SHORT (i.e. long CHF/JPY). Exit after 10 H4 bars or 3xATR stop; no MA target (the haven has no "mean" to return to). No variants. H4 2021-26 split at 2024 (SP500 H4 history starts 2021). If this fails the bar, the search stops: further rounds would be fishing.