Trading Bot HQModels & runsTestsResearch

Pre-registration: Expansion→First-Pullback v2 — cost-honesty fixes (mentor lineage)

Date registered: 2026-07-21, before any test execution. Lineage: mentor. The signal logic is unchanged from the v1 mentor-derived spec. The three changes below are cost/data-hygiene corrections derived from our own measurements (phase-3-cost-model/COST-DRAG-FINDING-v1.md) — instrument physics, not trading signals. Disclosed cross-influence: the stop-floor idea was first tested (and confirmed 12/12) in the external Donchian run; the mechanism (drag = cost/stop) was measured on our own trades. No external entry/exit/signal rule enters this spec.

Supersedes nothing. v1 (2026-07-21-expansion-pullback-dryrun.md) is frozen and its result stands. This is a NEW spec version; the registry will hash it separately.

Program context: rung R1 of phase-2-formalization/MENTOR-CRITIQUE-AND-IMPROVEMENT-v1.0.md.

The three changes (all defect fixes logged in the v1 result, none new)

Everything not listed here is byte-identical to the frozen v1 spec (same M5 construction, baseline, compression precondition, displacement test, body filter, H4 alignment, pullback confirmation, cancels, daily cap, sizing, fills).

  1. Zero-baseline guard. An event additionally requires baseline ≥ 1.0 pip. (v1 defect: a 0-pip 24h median made range ≥ k × baseline trivially true on dead sessions.)
  2. Rollover exclusion, 21:00–23:00 UTC.
  3. Events whose displacement bar ends at UTC hour 21 or 22 are dropped.
  4. A pending entry search is cancelled the moment it reaches an M1 bar whose UTC hour is 21 or 22 (no entries inside the window; cancel wins ambiguity, same convention as v1).
  5. Positions already open are managed normally through the window (fills stay honest against the actual widened book).
  6. Stop-distance floor (gridded, with control arm): stop_distance = max(structural_pullback_distance, floor_pips); the stop is placed at entry_mid − direction × stop_distance. The target remains tgt_mult × stop_distance of the actual (possibly floored) distance. Sizing unchanged (1% of nominal 10k via stop distance).

Coin-flip baseline control gets the identical treatment: same guarded and rollover-excluded event set, and the same floor applied to its 0.5 × D stop.

Parameter grid (frozen) — v1 grid × the floor axis

param values
disp_mult 3, 4, 5
tgt_mult 1.5, 2.5
hold_max (min) 15, 45
h4_align 0, 1
floor_pips 0, 5, 10

72 combos. floor_pips = 0 is the control arm (v1 geometry + hygiene fixes only), so the floor's effect and the hygiene fixes' effect are separable after the fact. Walk-forward 12-month IS / 3-month OOS rolling (harness default); IS selection = best net expectancy with ≥ 20 IS trades. Instruments: GBPUSD (registered headline), EURUSD (secondary), scored independently.

Registered hypotheses (falsifiable, stated before the run)

Pass criteria (all four, stitched OOS only — identical to every prior run)

  1. OOS net expectancy > +0.05R
  2. Beats the coin-flip baseline's net expectancy
  3. |OOS max drawdown| ≤ 2 × |baseline max drawdown|
  4. ≥ 100 OOS trades

Expected outcome (honest prior)

FAIL — most likely on criteria 1 and 4. Even a 10-pip floored stop carries ~0.2R drag on this instrument, and flooring mechanically shrinks gross-per-R while the exclusions shrink the sample (v1 had only 61 OOS trades before removing rollover events). The informative outcomes are the three hypotheses, plus the key program question: does gross expectancy survive the removal of degenerate events? If gross collapses toward zero, the v1 gross was an artifact and the XAUUSD transplant's prior drops sharply. If gross survives and net closes most of the gap to break-even, gold (R2) becomes the project's highest-value test.

Iteration budget

This run consumes run 2 of 3 on the 2024–2026 GBPUSD/EURUSD segments (v1 consumed run 1). One run remains after this. Any rule or grid change after seeing results = new pre-registration. No re-runs of this spec.

Implementation contract (for the build, before results exist)


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

GBPUSD: FAIL — stitched OOS 26 trades, net −0.472R, gross +0.121R, win rate 30.8%, max DD −13.17R. Criteria: net ✗, beats baseline ✗ (−0.472 vs −0.213), drawdown ✓ (13.17 ≤ 2 × 16.85), sample ✗ (26 < 100). EURUSD: FAIL on sample size only — 6 trades, net +0.216R, gross +0.346R; passes criteria 1–3 but six trades is statistical noise and is reported as such. Reports: reports/review-expansion_v2.html, …_eur.html · registry expansion_v2@671d0374, lineage mentor.

Registered hypotheses

The program question: did gross survive the hygiene fixes?

Mostly no. Selected-arm gross fell +0.976R → +0.121R, and across the full 72-arm grid the median OOS gross is ≈ −0.17R with 0 arms clearing +0.05R net. The large v1 gross was substantially an artifact of degenerate baselines and rollover-window events. What remains is a small, cost-crushed positive gross on the walk-forward-selected arms. Consequence for the program: the R2 (XAUUSD) transplant's prior weakens — but the instrument-mismatch argument (his docs claim gold/BTC, where displacement dwarfs fixed costs) is untouched, so R2 remains the decisive test.

Iteration budget: run 2 of 3 consumed on the 2024–2026 segments. One run remains. In-sample smoke tests: none beyond those disclosed in v1.