Trading Bot HQModels & runsTestsResearch

Pre-registration: Donchian H1 breakout (EXTERNAL lineage) + stop-floor hypothesis

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.

Provenance

Frozen rule spec

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.

  1. Channels: 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.
  2. ATR: Wilder-smoothed (α = 1/n) true range over n_atr = 14, shifted 1.
  3. Entry: on an H1 close above hi_entry go long; below lo_entry go short. Fill at the next M1 open (ask for long, bid for short) plus entry slippage.
  4. Stop: stop_distance = max(k_atr × ATR, floor_pips), placed from entry mid. Checked intrabar on M1; stop fills take the stop-slippage haircut.
  5. Exit: H1 close beyond the opposite n_exit channel → exit at next M1 open.
  6. One position at a time; no pyramiding; no time exit; flat at end of data.
  7. Sizing: 1% of a nominal 10k account via stop distance.

Parameter grid (frozen)

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.

The declared hypothesis (this is the point of the run)

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.

Pass criteria (all four, stitched OOS only — same bar as every other run)

  1. OOS net expectancy > +0.05R
  2. Beats the dumb baseline (same breakout events, coin-flip direction)
  3. |OOS max drawdown| ≤ 2 × |baseline max drawdown|
  4. ≥ 100 OOS trades

Expected outcome (honest prior)

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?

Disclosure — implementation smoke tests already run (in-sample only)

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.

Iteration budget

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.


Result (filled 2026-07-21, after run 1)

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.

H1 (stop floor) — CONFIRMED, and more strongly than predicted

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:

Unregistered but important observation (hypothesis for a future test, not a result)

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.