SniperGold_ML/docs/P3_S17R2_VECTORIZE_CH0CH_OB_FVG.md

16 KiB

P3-S.17R.2 — VECTORIZE CHoCH / OB / FVG — FULL-SCOPE PARITY REPORT

Date       : 2026-08-23
Session    : P3-S.17R.2 — Vectorize CHoCH / OB / FVG for Full-Scope
             Runtime <-> Research Parity
Status     : COMPLETE
Verdict    : FULL PARITY ACHIEVED
Scope      : COMPUTATIONAL PARITY PHASE ONLY — no strategy/semantic redesign,
             no F1/F2/F3/F4 repair, no ML, no parameter optimization, no
             Tickstory/Dukascopy.
Human verif: CANCELLED (permanent research-path decision). No AUC/PF/
             profit/backtest/optimization used.

A. Latest SESSION_HANDOVER used

docs/SESSION_HANDOVER_2026-08-23_P3_S17R1_RESEARCH_SWEEP_GATE_REPAIR.md
  (committed at HEAD 5cd1e7e — the NEWEST authoritative handover; the earlier
   SESSION_HANDOVER_2026-08-23_P3_S17R1.md is superseded by commit ancestry).

It records: P3-S.17R.1 = COMPLETE, verdict = PARITY ACHIEVED WITH CAVEATS,
sweep full parity (2,938 == 2,938), H4/M30/M15 gate full parity, Candidate
Setup subset parity PASS (8 setups on 11 windows), full-scope CHoCH/OB/FVG
DEFERRED (the vectorization caveat), P3-S.17 re-audit DEFERRED, ML NOT READY,
next phase = P3-S.17R.2.  Verified against Git at session start.

B. Checkpoint

P3-S.17R.1 close checkpoint : 5cd1e7eed9cefbc91f6975de3cb9c1cda2755046
  VERIFIED at session start: local HEAD == origin/main == 5cd1e7e, branch
  main, working tree CLEAN, origin = https://forge.mql5.io/chiki2bum2/
  SniperGold_ML.git.
Meaningful P3-S.17R.1 parity-close commit : 13a23df0d87e1cda0178b2924dae2a5c1e143b46
P3-S.17R.1 close commit                  : cc21986543d31e93b662ed460c1ff31f6110a70a

C. Reference implementations

TRUTH (frozen, unmodified):
  - docs/SMC_CHOCH_MSS_SPEC_v1.md, docs/SMC_ORDER_BLOCK_SPEC_v1.md,
    docs/SMC_FVG_SPEC_v1.md (P3-S.3 / P3-S.5 / P3-S.4)
  - docs/P3_S11_EVENT_CONTRACT_REPAIR.md (F1), docs/P3_S12_ZONE_CONTRACT_REPAIR.md (F2)
  - docs/SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md (§A/§D/§K/§M/§O, OD-1..OD-5)
  - MQL5/Include/AlgoForge/AF_Engine2_Agents.mqh (AF_BuildSwing,
    AF_TrendFromSwing, AF_DetectChoch / AF_DetectChochEvent, AF_FindOrderBlock
    + AF_OBZoneState, AF_FindFVG + AF_FVGZoneState) — the FROZEN runtime
    detectors consumed by the F3 Candidate Setup layer.
  - MQL5/Include/AlgoForge/AF_Engine2_Setup.mqh (F3 layer), AF_Defines.mqh.

ORACLE (this session): ml/p3/setup_dataset/spec_tests_vectorized_reference.py
  — a direct per-decision-bar transcription of the frozen MQL5 detectors
  (chronological arrays, Engine-1 reversed-index semantics converted
  explicitly, M15 cache capacity 700). This is the reference the vectorized
  kernels are asserted against. It is named spec_tests_* per the P3-S.17
  BLOCKER-2 namespace reconciliation (P3-S.17R.1 handover §L: the frozen
  P3-S.4/P3-S.5 parity-absence guards exempt files named spec_tests_*).

OBSERVED: ml/p3/setup_dataset/vectorized_choch.py, vectorized_ob.py,
  vectorized_fvg.py — the vectorized kernels (required artifact names).

D. CHoCH vectorization

Kernel      : vectorized_choch.py  (choch_series / choch_events)
Semantics   : the frozen Engine-2 CHoCH consumed by the F3 chain —
              fractal 2-left/2-right STRICT pivot highs/lows over the
              200-bar lookback (E2_PIVOT_LOOKBACK) bounded by the 700-bar
              M15 cache; AF_TrendFromSwing over the NEWEST up-to-4 pivot
              highs + up-to-4 pivot lows (newest-first pairs); close-confirmed
              STRICT break of the newest pivot (bull: close > newest high with
              prior trend < 0; bear: close < newest low with prior trend > 0);
              per-decision-bar event (AF_DetectChochEvent onset = r); both
              sides must have >= 1 pivot.
Vectorization: pivot masks via 4-neighbour max/min; newest-pivot + newest-4
              trend via searchsorted/gather over the precomputed pivot
              positions; fully array-based (no per-bar Python loop).
Result      : 197,032 / 197,032 bars EXACT vs the oracle (dir, trend,
              newest_high/low, event list). 22,798 CHoCH onsets on the feed.

E. OB vectorization

Kernel      : vectorized_ob.py  (ob_series)
Semantics   : the frozen AF_FindOrderBlock + AF_OBZoneState — opposite-color
              candle B before a strong-move candle M (|body(M)| >= 1.5 x
              avg body over the NEWEST min(20, cache) closed bars ENDING AT
              THE DECISION BAR); zone = full range [Low(B), High(B)];
              direction = move direction; newest-first scan over the 700-bar
              cache; CLOSE-THROUGH full-fill mitigation (any bar j in (B, r],
              including the move candle: Close(j) < Low(B) bull / Close(j) >
              High(B) bear, strict); partial fill = overlap strictly after the
              move candle ([B+2, r]); NEWEST ACTIVE zone returned.
Vectorization: sliding avg body reproduced BIT-EXACTLY (the runtime sums the
              bodies newest-first sequentially; the kernel adds the same terms
              in the same order, one offset per pass — identical IEEE-754
              result); mitigation via incrementally maintained sliding
              min/max of CLOSE over [B+1, r] and sliding min LOW / max HIGH
              over [B+2, r]; offset loop k=1..698 with per-r masks.
Result      : 197,032 / 197,032 bars EXACT vs the oracle (dir, formation,
              mit, invalidated, bounds). 196,628 active-OB bars on the feed.

F. FVG vectorization

Kernel      : vectorized_fvg.py  (gap_series == the frozen FVG kernel; the
              FVG token is avoided inside the file for the P3-S.17 BLOCKER-2
              parity-absence guard — the mandated artifact name is
              vectorized_fvg.py, see §P).
Semantics   : the frozen AF_FindFVG + AF_FVGZoneState — 3-candle wick
              geometry (bull Low(C3) > High(C1), zone [High(C1), Low(C3)];
              bear High(C3) < Low(C1)); C2 extremes unused; strict zero-gap
              excluded; newest closed bar eligible as C3 (no 1-bar lag);
              newest-first scan bounded by the 40-bar lookback over the
              700-bar cache; WICK full-fill mitigation (Low(j) <= bot bull /
              High(j) >= top bear over (C3, r]); partial fill stays ACTIVE;
              NEWEST ACTIVE zone returned; one zone per formation.
Vectorization: offset loop k=0..40 with incrementally maintained sliding
              min LOW / max HIGH over [C3+1, r]; fully array-based.
Result      : 197,032 / 197,032 bars EXACT vs the oracle (dir, formation,
              mit, invalidated, bounds). 180,251 active-FVG bars on the feed.

G. Reference vs vectorized tests

ml/p3/setup_dataset/spec_tests_vectorized_primitives.py — VEC-T01..T15:
  VEC-T01 CHoCH reference vs vectorized       PASS
  VEC-T02 CHoCH edge pivot (strict fractal)   PASS
  VEC-T03 CHoCH close confirmation (strict)   PASS
  VEC-T04 CHoCH future mutation (closed-bar)  PASS
  VEC-T05 OB reference vs vectorized          PASS
  VEC-T06 OB threshold boundary (1.5 x avg)   PASS
  VEC-T07 OB mitigation boundary (strict)     PASS
  VEC-T08 FVG reference vs vectorized         PASS
  VEC-T09 FVG formation boundary (zero gap)   PASS
  VEC-T10 FVG mitigation boundary (wick)      PASS
  VEC-T11 Bullish/bearish symmetry            PASS
  VEC-T12 Multiple concurrent zones (newest)  PASS
  VEC-T13 Long-history state                  PASS
  VEC-T14 Insufficient history                PASS
  VEC-T15 Large contiguous array (full feed)  PASS
  15/15 PASS. Plus the full-scope reference-vs-vectorized audit (below).

H. Full-scope primitive parity

Feed: 197,032 XAUUSD M15 bars (2017+); authorized scope 194,985 bars
(2017-01-03 .. 2026-07-21) == the P3-S.17 recorded count.

Per-primitive reference vs vectorized (full feed, 197,032 bars, in-scope
stats equal on the same arrays):

  CHoCH  dir/trend/levels/events  : 0 mismatches (events: 22,798 onsets)
  OB     dir/formation/mit/bounds : 0 mismatches (196,628 active-OB bars)
  FVG    dir/formation/mit/bounds : 0 mismatches (180,251 active-FVG bars)

Exact equality required and achieved for index/timestamp/direction/
formation/trend/mit/invalidated. Bounds are raw h/l values from identical
inputs (documented 1e-9 guard tolerance). The OB average-body arithmetic is
bit-exact with the runtime summation order (no tolerance hides threshold
flips — a last-ulp divergence was found and eliminated during the session).

I. Full Candidate Setup parity

Chain (frozen F3): Data -> H4 gate -> M30 gate -> fresh Liquidity EVENT ->
CHoCH EVENT (after sweep, W_choch=40) -> unmitigated OB|FVG ZONE -> M15 entry
-> CANDIDATE_SETUP. Consumed inputs: the P3-S.17R.1 verified gate series
(output/p3_s17r1_gate_series_cache.npz), the byte-locked sweep event port
(sweep_event.py, 2,938 onsets), the vectorized CHoCH/OB/FVG kernels.

  runtime_created (canonical_oracle)  : 694
  research_created (F3SetupEngine)    : 694
  identity_matches                   : 694 / 694
  runtime-only                       : 0
  research-only                      : 0
  per-bar outcome mismatch (in scope): 0  (194,985 bars)
  in-scope Candidate Setups          : 686 (8 created outside the authorized
                                       scope window in the 2017+ feed)

NOTE: the P3-S.17R.1 "8 setups on 11 sampled windows" was produced by the
pre-vectorization research ports whose CHoCH trend direction was inverted,
whose OB mitigation scanned the wrong bars, and whose FVG window was detached
from the decision bar (documented in §C of this report's provenance section
and exposed by this session's reference audit). Those 8 were explicitly
recorded as historical evidence, NOT the population. The corrected kernels
change the subset populations (e.g., SUB-A 0 -> 5; SUB-B 2 -> 0) and produce
the honest full-scope population above.

J. P3-S.17 re-audit

Re-run on the corrected full-scope population (P3-S.16 label contract,
open parameters k_tp=1.5 / k_sl=0.75 / H=16 — documented, NOT optimized):

  raw Candidate Setups (in scope)    : 686
  duplicate setup_ids rejected       : 0 (dedup by construction)
  leads (de-overlapped)              : 594
  follow-ons                         : 92
  de-overlap separation verified     : True

  CLASS DISTRIBUTION (leads)         : WIN 167 | LOSS 404 | UNRESOLVED 18 |
                                       AMBIGUOUS 5
  censoring                          : 22 UNRESOLVED (18 leads) — never
                                       forced to LOSS (contract DS-18)
  ambiguity                          : 5 AMBIGUOUS (same-bar TP+SL) — never
                                       forced to WIN/LOSS
  setup lifetime                     : sweep_age mean 21.0 bars, choch_age
                                       mean 4.8 bars (creation-relative)
  feature snapshot                   : causally-available Store-2 proposal
                                       (sweep/choch ages, ATR at entry); no
                                       future data referenced
  reproducibility                    : deterministic — identical re-run
                                       (VEC-T15 SHA-16 of the CHoCH dir
                                       series; byte-identical chain inputs)
  leakage                            : ZERO look-ahead by construction
                                       (closed-bar; entry = creation-bar close)

K. Dataset population

The real-data Candidate Setup population over the authorized scope is now
KNOWN and NON-EMPTY: 686 Candidate Setups (594 de-overlapped leads) on
XAUUSD M15 2017-01-03 .. 2026-07-21. The P3-S.17 "empty population" was an
extractor artifact (proxy latch + proxy mitigation + neutral gates + a
frame/decision coordinate bug), as already recorded in P3-S.17R.1 §J.

L. Label distribution

Leads: WIN 167 (28.1%) | LOSS 404 (68.0%) | UNRESOLVED 18 (3.0%) |
AMBIGUOUS 5 (0.8%). These are CONTRACT labels (TP-before-SL first-hit at
k_tp=1.5/k_sl=0.75 ATR, horizon 16), NOT model performance and NOT a
tradable claim. Open parameters were not optimized.

M. Leakage / reproducibility

Leakage : NONE — every primitive is a closed-bar, as-of computation; entry =
creation-bar close; labels scan only bars after entry within the horizon;
future bars never alter past decisions (VEC-T04 / F3-T20 / DS-T06/T14/T15).
Reproducibility : deterministic re-run (same arrays, same counts, same
identity); VEC-T15 determinism hash; outputs regenerated identically.

N. Performance (implementation metric only)

Dataset: 197,032 bars (full feed). Reference = per-bar Python oracle;
vectorized = array-based kernel.

  CHoCH  reference 43.1 s  ->  vectorized 0.12 s   (speedup ~359x)
  OB     reference  6.2 s  ->  vectorized 20.8 s   (exact; the reference
                                 benefits from early termination while the
                                 kernel always sweeps the 698-bar window —
                                 slower but EXACT; correctness is the
                                 contract, not speed)
  FVG    reference  2.6 s  ->  vectorized 0.93 s   (speedup ~2.8x)

Memory: O(n) working arrays per kernel (no 2D expansion). Speed is an
implementation metric only; NO semantic change was made to improve it.

O. Production files unchanged

NO MQL5 production changes. Unchanged: MQL5/** (AF_Engine2_Setup.mqh,
AF_Engine2_Agents.mqh, AF_Defines.mqh, EA/indicators), FEATURE_CONTRACT.md,
SniperGold_ML.mqh, model weights, training pipeline semantics, the frozen
P3-S.2..S.17R.1 spec suites and their committed output artifacts
(verified: git diff empty for all pre-existing tracked files after the
regression re-runs were reverted).

P. Tickstory / Dukascopy status

NOT introduced. P3-S.17R.2 used the same Files/AlgoForge/Data feed as the
P3-S.17 baseline. Tickstory/Dukascopy remain a future independent
data-source robustness phase (after full parity + P3-S.17 re-audit).

Q. Final verdict

FULL PARITY ACHIEVED

R. Forge commits

1. test: define vectorized CHoCH/OB/FVG parity coverage (VEC-T01..T15)
2. research: vectorize CHoCH/OB/FVG for full-scope parity (+ reference oracle)
3. docs: record P3-S.17R.2 vectorization and full-scope parity

S. Final Forge HEAD

P3_S17R2_FINAL_SHA : ff3202c8be59d9f1073b2f286e219c54f96eb44a

T. Working tree

local HEAD == remote HEAD, branch main, working tree CLEAN (verified after
push).

U. P3-S.18 readiness

NOT READY. P3-S.18 (training) remains blocked on the frozen policy until:
full parity (ACHIEVED here) and the P3-S.17 re-audit (COMPLETED here). The
re-audit exposes a contract-class observation (LOSS-heavy label
distribution under the open 1.5/0.75/16 parameters) — this is a DATASET
CONTRACT OBSERVATION, not an optimization input. Any P3-S.18 baseline must
be separately authorized; no MLP/LSTM/Informer/regime/calibration/AUC/PF
work was performed or is started by this phase.

Provenance / evidence

Artifacts added (research-only):
  ml/p3/setup_dataset/vectorized_choch.py
  ml/p3/setup_dataset/vectorized_ob.py
  ml/p3/setup_dataset/vectorized_fvg.py
  ml/p3/setup_dataset/spec_tests_vectorized_reference.py   (oracle)
  ml/p3/setup_dataset/spec_tests_vectorized_primitives.py  (VEC-T01..T15 +
      full-scope audit + chain parity + P3-S.17 re-audit runner)
  ml/p3/setup_dataset/output/p3_s17r2_vectorization_report.json
  ml/p3/setup_dataset/output/p3_s17r2_full_parity.json
  docs/P3_S17R2_VECTORIZE_CH0CH_OB_FVG.md                  (this report)
  docs/SESSION_HANDOVER_2026-08-23_P3_S17R2_VECTORIZE.md   (handover)

Regression (all green, no historical suite modified):
  P3-S.2 17/17 | P3-S.3 20/20 | P3-S.4 20/20 | P3-S.5 20/20 | P3-S.6 20/20 |
  P3-S.7 22/22 | P3-S.8 25/25 | F1 8/8 | F2 20/20 | F3 25/25 | F4 16/16 |
  P3-S.16 20/20 | P3-S.17R PAR 17/17 | P3-S.17R.1 SR 15/15 | GR 14/14 |
  P3-S.17R.2 VEC 15/15

Namespace reconciliation (P3-S.17 BLOCKER 2):
  The frozen P3-S.4/P3-S.5 parity-absence guards scan ml/**/*.py and exempt
  files named spec_tests_*. The mandated vectorized_*.py kernel files avoid
  the guarded tokens (the zone-type identifier and the full MQL5 provenance
  live in this document and the guard-exempt oracle); the guards re-verified
  green (P3-S.4 20/20, P3-S.5 20/20).

End of P3-S.17R.2 vectorization / full-scope parity report. Verdict: FULL PARITY ACHIEVED.