Warrior_EA/research/FX_PLAN.md
AnimateDread 6192393511 research(fx): forex and metals - thirteen registered families, nothing passed
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>
2026-09-23 13:24:57 -04:00

104 行
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.