forked from animatedread/Warrior_EA
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.
|