Date registered: 2026-07-21, before any out-of-sample execution
Lineage: external — rules derived from the published record only.
No mentor material informed this spec. It must never be reported as evidence
about the mentor's technique, and his branch must never be reported as evidence
about this one.
phase-3-cost-model/COST-DRAG-FINDING-v1.md.Signals on closed H1 bars (built from M1 mid); fills on the following M1 bars at the correct side of the book, with the engine's slippage and commission.
hi_entry / lo_entry = highest high / lowest low of the prior
n_entry H1 bars (shifted 1 — no look-ahead). hi_exit / lo_exit likewise
over n_exit.n_atr = 14, shifted 1.hi_entry go long; below lo_entry go
short. Fill at the next M1 open (ask for long, bid for short) plus entry slippage.stop_distance = max(k_atr × ATR, floor_pips), placed from entry mid.
Checked intrabar on M1; stop fills take the stop-slippage haircut.n_exit channel → exit at next M1 open.| param | values |
|---|---|
| n_entry | 24, 55, 96 |
| n_exit | 12, 20 |
| k_atr | 2.0, 3.0 |
| floor_pips | 0, 15 |
24 combos. Walk-forward 12-month IS / 3-month OOS rolling (harness default); IS selection = best net expectancy with ≥ 20 IS trades.
H1 — the stop floor improves NET expectancy while reducing GROSS.
Our cost law says drag ≈ cost_pips / stop_pips, so clamping the smallest stops
should cut drag more than it costs in signal. floor_pips = 0 is the control arm;
floor_pips = 15 is the treatment. This is falsifiable and is registered before
the out-of-sample run.
Prediction: across matched (n_entry, n_exit, k_atr) triples, the floored arm has
lower gap_r (drag) than the unfloored arm in ≥ 4 of 6 OOS window comparisons, and
lower gross expectancy in the majority of them.
FAIL. Neely-Weller-Ulrich found this family decayed on FX by the mid-1990s; we are testing 2024-2026 majors. The informative questions are narrower and both worth the run: (a) is gross expectancy positive — i.e. does the pattern carry any signal at all before costs? (b) does the stop-floor hypothesis hold?
Before registering, the implementation was exercised on GBPUSD 2024-01 → 2025-01
(which falls entirely inside the first in-sample window, no OOS exposure):
four parameter sets, then three floor values at n_entry=55/n_exit=20/k_atr=2.0.
Those runs showed negative gross expectancy and drag falling with the floor.
This is disclosed because it informed nothing but the code's correctness and the
decision to grid floor_pips — but a reader deserves to know it happened.
No OOS window has been touched.
Run 1 of 3 on these segments. Any rule or grid change after seeing results is a new pre-registration. No re-runs of this spec.
FAIL, as pre-registered. GBPUSD, stitched OOS 227 trades:
net −0.151R, gross −0.045R, win rate 30.0%, edge vs baseline −0.124R.
Failed criteria 1, 2 and 3; passed criterion 4 (sample size).
Report: reports/review-donchian_external.html · registry lineage external.
The gross number is the headline. Unlike the mentor branch (gross +0.98R, killed by cost), this family is negative before costs on 2024-2026 majors — there is no edge to protect. That is the outcome Neely-Weller-Ulrich (2009) predicted for channel rules on FX, now measured on our own data.
Registered prediction: floored arm shows lower drag in ≥ 4 of 6 comparisons. Measured across all 12 matched (n_entry, n_exit, k_atr) pairs on OOS data:
The arms split cleanly by lookback, reproducing Bajgrowicz & Scaillet's mechanism:
| n_entry | gross expectancy | drag (unfloored) |
|---|---|---|
| 24 (short) | +0.043 to +0.204R | 0.50 – 0.75R |
| 55 (medium) | −0.028 to −0.080R | 0.12 – 0.19R |
| 96 (long) | −0.085 to −0.145R | 0.11 – 0.16R |
The best-gross rules are the shortest-window ones and their edge is destroyed several times over by cost; the cost-surviving long-window rules have no signal. This is exactly "transaction costs are endogenous to selection" measured independently on our own data. It is an observation across parameter arms within one run, not a pre-registered test — a proper test needs its own registration.
Iteration budget: run 1 of 3 consumed. In-sample smoke tests disclosed above.