Trading Bot HQModels & runsTestsResearch

Pre-registration: Expansion→First-Pullback (mentor-derived) dry run

Date registered: 2026-07-21 (before any test execution) Source of rules: mentor journals in course/resources/mentor-files/: - Micro-impulse Scalping (Feb 5 2026) — Type A trades, "catch the first pullback of the real move", one-micro-pullback filter - NINJA Turtle Style Trading (Feb 5 2026) — asymmetric R:R, volatility-expansion focus, tight structural stops - Meta Adaptation (Feb 23 2026) — compression precedes expansion; strategy valid only in its regime - Timeframe Displacement (Mar 23 2026) — displacement events, directional vs non-directional chaos (body/range filter), entry on retracement after displacement is evident - Tsujiri call notes — H4 bias alignment, ~3 trades/day cap, pre-set entries, tight pre-placed stops

Status framing: This is a Stage-0-style HARNESS dry run of a formalized mentor concept. It is NOT a Phase 2 formalization (Phase 0 gates still open) and its outcome authorizes no capital.

Known instrument mismatch (declared up front)

The mentor's documents are written around BTC and Gold ("high intraday volatility, frequent volatility expansion phases"). Our on-disk data is EURUSD + GBPUSD M1 (2024-01-01 → 2026-07-14). FX majors have materially fewer and smaller expansion events and tighter compression. A FAIL here therefore does NOT falsify the mentor's technique on his instruments; a PASS would be evidence the mechanics generalize. Fetching XAUUSD/BTCUSD Dukascopy data for a follow-up run is a separate, separately-pre-registered test.

Frozen rule spec (deterministic, no discretion)

All structure prices are MID; all fills are on the correct side of the book per the engine honesty contract (long entries at ASK, long exits at BID; slippage on stop-type fills; pessimistic stop-before-target inside one M1 bar).

  1. M5 bars resampled from M1 mid. range = high − low, body = |close − open|.
  2. Baseline volatility = rolling median of M5 range over the prior 288 M5 bars (~24h), shifted one bar (no lookahead). Undefined (min 100 bars) ⇒ no events.
  3. Compression precondition: mean M5 range of the previous 12 bars (shifted) ≤ baseline.
  4. Displacement event (TDE proxy / "directional chaos"): an M5 bar with range ≥ disp_mult × baseline AND body ≥ 0.6 × range, with the compression precondition true. Direction = sign(close − open).
  5. H4-flow alignment (Type A filter, gridded on/off): event direction must match sign(M5 close now − M5 close 288 bars ago). h4_align ∈ {0, 1}.
  6. First-pullback confirmation: after the displacement bar closes at C with range D:
  7. wait for a retrace against the event direction of ≥ 0.25 × D (measured from C on M1 mid extremes);
  8. cancel the event if the retrace reaches ≥ 1.00 × D before entry (false expansion collapsed);
  9. after a qualifying retrace, enter on resumption through C in the event direction;
  10. cancel if no entry within 60 M1 bars of the event close.
  11. Stop: the structural pullback extreme (mid). Target: tgt_mult × stop-distance from entry (asymmetry ≥ 1.5). Time exit: hold_max minutes after entry.
  12. Caps: max 3 entries per UTC day (mentor's stated cadence); one position at a time; an event arriving while in-position is skipped.
  13. Sizing: 1% of a nominal 10k account per trade via stop distance (engine standard).

Parameter grid (frozen)

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

24 combos. Walk-forward: 12-month IS / 3-month OOS, rolling 3 months (harness default). IS selection = best net expectancy with ≥ 20 IS trades.

Baseline (dumb control)

Same displacement events, coin-flip direction (seeded per day+event), no pullback wait: enter at the first M1 bar after the event, stop distance = 0.5 × D, target = tgt_mult × stop distance, same hold_max and daily cap. Tests whether the directional + pullback logic adds anything beyond "volatility just happened".

Pass criteria (all four, OOS stitched only — identical to prior dry runs)

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

Instruments

Primary: GBPUSD. Secondary: EURUSD. Each pair is scored independently; the registered headline result is GBPUSD (more expansion-prone of the two).

Expected outcome (honest prior)

FAIL, most likely on criterion 1. M1/M5 scalping on FX majors pays the spread on a stop distance of a few pips; the two prior dry runs showed cost drag of ~0.04–0.07R killing thin gross edges, and this spec's stops are tighter than London Breakout's. The informative outcomes are (a) whether gross expectancy is positive (mechanics have signal before costs), and (b) whether it beats the coin-flip baseline (direction/pullback logic contains information).

Iteration budget

3 runs per data segment, counted by the harness watermark. This registration covers run 1. Any rule or grid change after seeing results = new pre-registration.


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

GBPUSD: FAIL — OOS 61 trades, gross +0.9761R, net −2.4968R, WFE 1.187. Failed: net expectancy, beats-baseline, sample size. Passed: drawdown-vs-baseline. EURUSD: FAIL — OOS 37 trades, gross +0.2964R, net −0.9177R, WFE 0.703. Failed: net expectancy, sample size. Passed: beats-baseline (−0.92 vs −1.62), drawdown.

Reports: reports/dryrun-2026-07-21-expansion_pullback.md, …_eur.md. MLflow runs: 1d6d2344…, a3154fe9….

As pre-registered: FAIL on criterion 1 was the stated prior; cost drag is the killer. Informative findings: (a) gross positivity is mostly geometry, not direction — the coin-flip baseline grosses nearly the same (+0.93R GBPUSD); (b) EURUSD's pullback logic beat the coin flip net and halved drawdown — weak signal the confirmation filter helps; (c) two spec defects identified: rollover-window events (8-pip spread vs sub-pip stops produced −7R/−13R single trades) and no stop-distance floor relative to spread.

Iteration budget: run 1 of 3 consumed on the 2024–2026 segments. A pre-run smoke (2024-H1 GBPUSD, IS-period only, no OOS exposure) preceded the registered run and is disclosed here. The rollover-exclusion + stop-floor variant and any XAUUSD run require a NEW pre-registration. No re-runs of this spec.

Defect found after the run (2026-07-21) — NOT fixed in this spec

The decision-log work surfaced a third defect, alongside the rollover-window and stop-floor issues already recorded:

Zero-baseline degeneracy. The event test is range ≥ disp_mult × baseline where baseline is the 24h rolling median M5 range. On dead sessions (holidays, thin Sunday opens) that median can be exactly zero, which makes the test trivially true — any bar with a one-sided body qualifies as a "displacement". Some recorded events are therefore not displacements at all.

Left unfixed on purpose: the guard changes the frozen rule, and this pre-registration's result is already recorded. The fix (require baseline > 0, and likely a floor of a few pips) belongs to the cost-aware v2 spec together with the rollover exclusion and the stop-distance floor — one new pre-registration, all three defects, one re-run. The review page flags affected trades inline so the contamination is visible rather than silent.