forked from animatedread/Warrior_EA
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>
104 lines
6.9 KiB
Markdown
104 lines
6.9 KiB
Markdown
# 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:
|
|
1. OOS expectancy > 0 after spread with t ≥ 2 (trade-level, holding-overlap aware);
|
|
2. the same variant positive in IS;
|
|
3. **breadth** — positive OOS on at least half the instruments in its class, not
|
|
one lucky symbol;
|
|
4. beats its control OOS;
|
|
5. 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.
|