Trading Bot HQModels & runsTestsResearch

Declared scan: level-reaction event study (R7 → Edge Lab)

Date declared: 2026-07-23, before any computation. Split: Research only (BTCUSD 2017-08-17 → 2022-12-31). Layer 3 — no fills, no stops, no costs. Engine: Edge Lab (tradingbot.edgelab, acceptance-verified today) over level features from the R7 engine (levels.py, frozen constants, 128-green suite). Evidence basis: R7 spec §"What comes after" item 1; Osler (2003) for the through-level acceleration variant; mentor's fade-at-level teaching for the touch variants. Lineage if anything survives: touch variants mentor, break variants hybrid (round-number component + Osler citation in the level book).

Level features (computed once, research split, M5 grid — definitions frozen)

At each M5 bar close t (causal, LevelBook built from all M1 < t): sup_dist_atr = (bar low − nearest live level strictly below prior close) / ATR14(M5); res_dist_atr = (nearest live level strictly above prior close − bar high) / ATR14(M5); plus the matched level's kind and score. Implementation may add a batch API to levels.py for speed only with an equivalence test proving identity with at() on sampled timestamps — definitions may not change.

Event conditions (all constants declared here)

Tolerance = 0.25 ATR14(M5) (the R7 touch tolerance — reused, not re-chosen). "Fresh" means the previous M5 bar did NOT satisfy the same proximity condition (dedup within touches; one event per approach).

  1. TOUCH_SUPPORT (signed +1, bounce): fresh bar with low within tolerance of a live level below, close above that level.
  2. TOUCH_RESIST (signed −1, bounce): mirror above.
  3. BREAK_UP (signed +1, continuation): bar opens below a live level and closes above it by > tolerance.
  4. BREAK_DOWN (signed −1, continuation): mirror.

Horizons: 15, 30, 60, 240 minutes. Forward move close-to-close in ATR units and bp, signed by the hypothesis direction. Universe: valid M5 bars with ATR14 > 0 and complete forward window. Nulls: full battery, engine defaults (1000/1000/1000 draws), block bootstrap by ISO week.

Hypothesis accounting

4 conditions × 4 horizons = 16 hypotheses, logged to the experiment ledger (cumulative 41 → 57 of 2,000). No depth-2 combinations in this scan; zone-score or kind conditioning would be a separate declared scan only if v1 warrants it.

Pre-declared reading

This is a scan, not a finding. Anything interesting must pass the §5 bar (amended A1) before it is more than a logged effect — including the ex-ante cost arithmetic now mandated by the prereg TEMPLATE (fade-at-level implies tight stops; the drag law is waiting). Honest prior: touch-bounce effects are the most-mined pattern class in retail literature and mostly die under nulls; the break/acceleration variant has the real citation (Osler's order-book mechanics) and the displacement finding's shape suggests BTC rewards continuation over mean reversion. Expected outcome: breaks > touches.

Results (filled 2026-07-23, single ledger-logged run; 16 hypotheses, cumulative 57/2000)

NULL RESULT — no condition produces an exploitable reaction. Full table in results/level-reaction-btcusd.json; feature parquet + equivalence test (200/200 vs the slow oracle) in the bot repo; 148 tests green.

Condition n Signed mean ATR at 15m / 30m / 1h / 4h
touch_support (bounce +) 75,661 −0.010 / −0.011 / −0.006 / +0.011
touch_resist (bounce −) 76,617 −0.018 / −0.017 / −0.031 / −0.101
break_up (continue +) 47,598 −0.037 / −0.048 / −0.036 / +0.034
break_down (continue −) 46,892 −0.034 / −0.046 / −0.052 / −0.131

Consequence for the mentor branch: fade-at-level does not mechanize on BTC under the R7 definitions. Mechanized mentor-derived claims are now 0-for-4 (entry conditions, direction logic, stop-structure fit, level reaction). The R7 engine itself remains sound, tested infrastructure (its features flow into the store and, later, the gate's structured state). Successor scans (zone-score conditioning, other instruments) are separate declarations; nothing here licenses them automatically.