19 KiB
P3-S22 — TERMINAL INDICATOR VERIFICATION (non-visual, deterministic)
Date : 2026-08-25
Session : P3-S22 — TERMINAL INDICATOR VERIFICATION
Scope : verify the existing SniperGold MQL5 runtime (Algo Forge /
SniperGold SMC Pro+ refactor: Engine1..Engine3, F1 events,
F2 zones, F3 Candidate Setup, F4 MTF gates) compiled and
executed inside MetaTrader 5 Terminal, using MACHINE-READABLE
evidence only (journal/structured traces/CSV/independent
oracle). NO image analysis, NO OCR, NO visual pass/fail.
Method : CODE_VERIFICATION_AND_SILENT_BUG_POLICY_v1.md
Result : B — PASSED WITH LIMITATIONS (core runtime verified; some
environmental dimensions unverified — see §S, §T).
Next : NO automatic advance. P3-S23 NOT STARTED (owner decision).
A. Latest handover used
docs/SESSION_HANDOVER_2026-08-25_P3_S21_R_RETROSPECTIVE_SILENT_BUG_VERIFICATION.md
(newest handover at start; predecessor chain traced for continuity:
S21.2 -> S21.1 -> S20 -> S19 -> S18 -> S17R2 -> S16).
docs/CODE_VERIFICATION_AND_SILENT_BUG_POLICY_v1.md (read and applied).
B. Starting SHA
P3_S22_START_SHA : d5523ee97dbe9f7fd73de44ae3e90420246e6844
VERIFIED: local HEAD == origin/main == d5523ee, branch main,
working tree CLEAN, no stash, no untracked files,
origin = https://forge.mql5.io/chiki2bum2/SniperGold_ML.git
C. Final SHA
P3_S22_FINAL_SHA : f90f878ccfb2ddfdb3de320fa8de33824a46af01
(main == origin/main, working tree CLEAN at close)
D. Runtime dependency graph (exact, from source)
Terminal indicator entry point:
MQL5/Indicators/AlgoForge/AF_Engine3_Display.mq5 (indicator_buffers=0,
indicator_plots=0)
└─ include <AlgoForge\AF_Engine3_Render.mqh> (Engine3 render)
└─ AF_Engine2_Display.mqh (AF_BuildDisplayData)
└─ AF_Engine2_Aggregator.mqh (AFAggregator facade)
└─ AF_Engine2_Agents.mqh (F1 events + F2 zones
+ 4 agents N/C/E/P)
├─ AF_Defines.mqh (constants, TF mapping)
│ └─ AF_Attribution.mqh (attribution header)
└─ AF_Engine1_MTFData.mqh (MTF bar cache,
closed-bar lock)
F3 Candidate Setup runtime (separate layer, NOT in display indicator):
MQL5/Include/AlgoForge/AF_Engine2_Setup.mqh
(AFSetupEngine: lifecycle, identity registry, one-entry, gates;
consumes semantic inputs h4/m30/sweep/choch/zone/m15/m3/entry/score)
└─ includes AF_Engine2_Agents.mqh (same chain as above)
Runtime consumers exercised in P3-S22:
MQL5/Experts/AlgoForge_Engine1_UnitTest.mq5 (Engine1 cache tests)
MQL5/Experts/AlgoForge_Engine2_UnitTest.mq5 (agents + aggregator +
F3 synthetic T6/T7)
MQL5/Experts/AlgoForge_Engine3_UnitTest.mq5 (display data + render)
AlgoForge_S22_F3_Parity.mq5 (DISPOSABLE P3-S22 harness, deleted after
run; source preserved in Common scratch)
Not part of the verified runtime (legacy/ML path, NOT executed):
MQL5/Experts/AlgoForge_Backtest_Baseline.mq5 (MLP 19->12->2, SniperGold_ML.mqh,
has OrderSend in mode 1 -> NOT run,
Phase 17 no-trading)
FEATURE_CONTRACT.md (research contract; not linked by the indicator runtime)
F1 (events): AF_DetectSweepEvent, AF_DetectChochEvent (AF_Engine2_Agents.mqh) —
onset + dir, stateless per closed bar (P3-S.11 semantics).
F2 (zones): AF_FindOrderBlock, AF_FindFVG, AF_OBZoneState, AF_FVGZoneState,
AFZoneState (P3-S.12 semantics: UNMITIGATED/PARTIALLY_FILLED/FULLY_MITIGATED,
invalidation=full-fill, newest-active-only).
F3 (Candidate Setup): AFSetupEngine (P3-S.13 frozen contract, 25 spec cases).
F4 (MTF): AFEngine1MTF slots H4/M30/M15/M3 (AF_E2_TF_S1..S4) with closed-bar lock;
F3 gates h4==m30==direction (OD-1), conflict -> BLOCKED (OD-4).
Buffers: NONE (indicator_buffers=0).
Chart objects: prefix AF3_ (OB/FVG rectangles, structure lines, swing labels,
PD bands, PDH/PDL/PWH/PWL levels, dashboard) — created only by Engine3 render.
Logging: Print/PrintFormat journal (prefixes AFTEST/AFTEST2/AFTEST3/S22F3).
External files: only AlgoForge_Backtest_Baseline writes CSV (not run here);
the verified runtime writes NO files (parity harness printed to journal only).
Trading: none in the verified runtime.
E. Compiler / build information
MetaEditor build : 6140 (MQL5 compiler, target AVX512 + FMA3)
Compiled (all 0 errors / 0 warnings):
AF_Engine3_Display.mq5 -> PASS
AlgoForge_Engine1_UnitTest.mq5 -> PASS
AlgoForge_Engine2_UnitTest.mq5 -> PASS
AlgoForge_Engine3_UnitTest.mq5 -> PASS
AlgoForge_S22_F3_Parity.mq5 -> PASS (disposable harness)
Source SHA : d5523ee (frozen; compile does not modify source)
Classification : COMPILE PASS
F. Terminal environment
MetaTrader 5 build 6140; server HFMarketsGlobal-Demo; login 49488474 (demo);
hedging; account read-only by policy (no orders sent).
CPU Intel Xeon Gold 5220; Windows 11 (KVM); UTC+0.
G. Symbol / timeframe
Symbol : XAUUSD (Gold Spot, XCCY, digits=2, point=0.01, spread float)
Period : M15 (agent TFs hardcoded: S1=H4, S2=M30, S3=M15, S4=M3)
H. Data source
Terminal broker history (HF Markets demo) via AFEngine1MTF CopyRates cache
(closed-bar lock; bars[0] = newest closed bar). Tester runs: model "every
tick" (Model=0), Visual=0, XAUUSD M15, 2026.08.01–2026.08.11/20.
Research population reference (694/686/594/92) comes from the committed
research dataset pipeline (P3-S16..S21.R), not from this Terminal session.
I. Structured observability mechanism
1) Strategy Tester journal (deterministic Print traces):
AFTEST / AFTEST2 / AFTEST3 / S22F3 prefixes.
2) Tester agent log file:
D:\TradingTerminal\HFM Metatrader 5\Tester\Agent-127.0.0.1-3000\logs\20260825.log
3) Disposable F3 parity harness (source preserved in
C:\Users\defau\AppData\Roaming\MetaQuotes\Terminal\Common\p3_s22_scratch\):
replays the frozen AFSetupEngine over the canonical-oracle case inputs
(F3-T01..T25) and prints per-bar outcomes; NO files, NO objects, NO trades.
4) Independent oracle: ml/p3/smc_semantic/spec_tests_candidate_setup_runtime.py
(canonical_oracle = frozen F3 truth; F3SetupEngine = port contract).
5) Scratch evidence (Common\p3_s22_scratch\ and MQL5\Files\Temp\):
s22_oracle_all.csv, s22_oracle_t7.csv, gen_f3_cases.py,
compare_f3_final.py, mutation_tests2.py, extract_*.py, harness .mq5/.mqh.
J. F1 EVENT VERIFICATION (Phase 7)
Engine2 test (XAUUSD M15, 2026.08.01–08.11): T1 agents valid on every
closed bar (Narrative H4 / Context M30 / Entry M15 / PriceAction M3 with
buy/sell/bias/confidence/dir printed); T2 independence & determinism OK;
T3 closed-bar lock OK; T4 non-repaint OK (identical output within a bar,
verified on every closed bar).
RESULT: PASS=16571 FAIL=0.
F1 EVENT semantic layer: sweep/CHoCH {onset, dir} consumed by the F3 chain
(F3-T01..T25 replay, §L) with exact agreement (0 real mismatches).
Classification: F1 = EXACT at the contract level (no unexplained mismatch).
K. F2 ZONE VERIFICATION (Phase 8)
F2 zone state semantics (UNMITIGATED / PARTIALLY_FILLED / FULLY_MITIGATED,
invalidation=full-fill, newest-active-only) verified indirectly:
- Engine2 Context/Entry agents consume AF_FindOrderBlock/AF_FindFVG and
report "di OB/FVG" states per closed bar (journal evidence);
- Engine3 display reports ob=5, fvg=6 and zone top/bottom consistency
(T1: top>=bot, bot>0, tag OB/FVG) on every closed bar;
- F3 zone-stage cases (F3-T03 no-zone, F3-T17 mitigation->INVALIDATED,
F3-T21 pre-entry mitigation -> no setup, wrong-direction zone T07) all
reproduced EXACTLY by the terminal replay (§L).
NUMERIC zone boundary parity (narrow/wide/boundary-touch vs a dedicated
Python zone oracle on identical bars) was NOT re-run in the Terminal;
F2 numeric boundary audit is recorded as verification debt (§X).
Classification: F2 = core behavior verified; numeric boundary parity
unverified (limitation).
L. F3 CANDIDATE SETUP VERIFICATION (Phase 9) — 25/25 CONTRACT CASES
Method: disposable harness drove the FROZEN AFSetupEngine with the exact
canonical-oracle case inputs (F3-T01..T25) and emitted per-bar outcomes;
compared field-by-field against the independent Python oracle
(canonical_oracle), using the oracle's own assertion engine (_check).
RESULT (terminal replay vs frozen contract):
Contract assertions (exists/id/state/dir at asserted bars, blocked +
reason, m3_confirmed, score, created_count, setup_ids, entry_bindings):
24/25 PASS; F3-T20 "FAIL" = harness scoping artifact ONLY
(mutated future bars were fed into the same engine run, so the
cumulative created_count read 2 vs the historical-scoped expected 1;
the terminal engine and the canonical oracle BOTH create 2 setups on
the 12-bar input, and bars 0..9 (historical) are unchanged — the
future-mutation property itself is satisfied).
Per-bar full-field comparison (all bars, all fields):
real (contract-visible) mismatches = 0
representation-level differences = 36 rows, all with setup_exists=False
on BOTH sides and identical id/blocked/m3/entry/score. These are
(a) pre-sweep forming-state label: the MQL5 port emits CONTEXT_VALID
with the forming direction as soon as H4/M30 gates align, whereas
the oracle stays NONE until the sweep event is active;
(b) 3 rows (F3-T17/T21/T22 bar 0) where the fixture input object
carries a choch/zone with onset > current bar: the MQL5 port
discards and restarts the forming chain, the oracle waits; the
final Candidate Setup (identity, creation bar, terminal states)
is identical. This input pattern (future-onset event object) is
not produced by the real semantic feed (events are active as-of
the closed decision bar, onset <= r by construction).
Engine2 built-in F3 synthetic tests T7a..T7e (mirror F3-T01/T08/T11/
T18/T25): 5/5 PASS in the Terminal.
Canonical setup entry semantics (creation-bar close, M15): the F3 layer
creates on the decision bar r (monotonic M15 index) when the chain
completes; creation_bar == r verified in replay (F3-T01 created at bar 6,
matching oracle).
Classification: F3 = EXACT (0 unexplained mismatches).
M. F4 MTF VERIFICATION (Phase 10)
F4 gates (h4 == m30 == direction; conflict -> BLOCKED H4_M30_CONFLICT /
M15_CONFLICT) verified in the terminal replay:
F3-T01 (h4=1,m30=1 -> CANDIDATE dir=1) PASS
F3-T07 (gates +1/+1 vs chain -1 -> no setup) PASS
F3-T08 (H4=-1,M30=+1 -> BLOCKED H4_M30_CONFLICT) PASS (blocked flag and
reason exact)
F3-T09 (H4=+1,M30=-1 -> BLOCKED H4_M30_CONFLICT) PASS
F3-T10 (M15=-1 vs +1 -> BLOCKED M15_CONFLICT) PASS
F3-T22 (context break after formation -> INVALIDATED) PASS
MTF closed-bar semantics: Engine1 cache verified (T3 closed-bar lock; T3
strict descending time order across M1/M5/M15/H1; count<=Bars consistency);
Engine2/3 consume H4/M30 caches with the same lock.
HISTORICAL MTF boundary-timestamp parity (exact M30/H4 bar timestamps vs
a Python oracle over the same history) was NOT re-run in this session:
recorded as verification debt (§X).
Classification: F4 = gate logic exact; historical MTF boundary parity
unverified (limitation).
N. TEMPORAL / BAR-INDEX RESULTS (Phase 11)
Engine1 (XAUUSD M15): PASS=115070 FAIL=0. Strict descending time order
(T3), closed-bar lock (T4), anti-freeze cache index (T5: CopyRates only on
Bars() change), count<=Bars consistency (T6), chart-TF independence (T7).
Final cache stats: M1 count=300 hc=17928; M5 count=300 hc=3589;
M15 count=300 hc=1197; H1 count=300 hc=300 (deterministic, recorded).
F3 replay exercised monotonic decision-bar indexing over 25 fixtures
(0..44 bars), including boundary/expiry rows:
F3-T04 sweep age 41 (W_sweep=40 -> expired) EXACT
F3-T16 setup age 43 (W_setup=40 -> EXPIRED) EXACT
F3-T05 CHoCH before sweep EXACT; F3-T06 CHoCH outside sweep window EXACT.
No off-by-one, shift, or future-bar access discrepancy found.
O. TERMINAL <-> RESEARCH COMPARISON (Phase 12)
Machine-readable comparison table generated (Common\p3_s22_scratch\
s22_oracle_t7.csv, s22_oracle_all.csv, per-case contract checks):
T7a (F3-T01) expected CANDIDATE id=1 terminal EXACT_MATCH
T7b (F3-T08) expected BLOCKED terminal EXACT_MATCH
T7c (F3-T11) expected valid no M3 terminal EXACT_MATCH
T7d (F3-T18) expected CONSUMED 1 entry terminal EXACT_MATCH
T7e (F3-T25) expected exists score .05 terminal EXACT_MATCH
F3-T01..T25 contract assertions terminal EXACT_MATCH (24 direct;
T20 scoping artifact, explained)
per-bar full-field terminal 0 REAL mismatches;
36 representation rows (no
setup on either side)
Oracle independence: canonical_oracle and F3SetupEngine are the committed
frozen F3 truth (spec_tests_candidate_setup_runtime.py); the comparison
was executed by a DISPOSABLE Python harness that does NOT call the MQL5
runtime to produce expected values.
P. POPULATION RECONCILIATION (Phase 13)
Reference (research, committed): 694 total computable Candidate Setups,
686 in-scope = 594 leads + 92 follow-ons (P3-S20 accounting, re-verified
by P3-S21.R).
Terminal reproduction: NOT performed. The deployed runtime does not expose
a full historical semantic-input replay (F1 events + F2 zones + F4 states
per M15 bar) that regenerates the Candidate Setup population; the research
counts were produced by the research dataset pipeline on the authoritative
data. Environmental differences (broker data source, M15 history scope,
session times, spread, MTF availability) preclude a direct equality claim
in this session.
Reconciliation status: not reconciled numerically; recorded as verification
debt (§X). No unexplained population discrepancy is asserted — the
population was simply not re-derived in the Terminal environment.
Q. SILENT-BUG MUTATION TESTS (Phase 14) — verifier verified
Mutating a DISPOSABLE copy of the comparison pipeline (never the frozen
source), the full per-bar verifier DETECTED all 7 mandated classes:
1 temporal one-bar displacement DETECTED (real_diffs=2)
2 purge/causality (future setup early) DETECTED (real_diffs=1)
3 bar-order swap DETECTED (real_diffs=2)
4 MTF gate substitution DETECTED (real_diffs=1)
5 row-alignment shift-by-one DETECTED (real+aggregate)
6 duplicate setup record DETECTED (real_diffs=1)
7 missing-record DETECTED (real+aggregate)
VERIFIER-STRENGTH FINDING: the sparse contract check (asserted bars +
totals only) failed to detect 4/7 mutation classes; the full per-bar,
per-field byte comparison is REQUIRED coverage and detects 7/7.
This finding is recorded; no production file changed.
R. INDICATOR BUFFER / OBJECT STATE AUDIT (Phase 15)
Buffers: none (indicator_buffers=0, indicator_plots=0).
Chart objects (Engine3 render, prefix AF3_): audited programmatically via
Engine3 unit test T4/T5 in the tester:
object creation counts per closed bar: 218, 228, 230, 232 (recorded);
T5 render determinism: redraw on same bar -> identical count (PASS);
dashboard panel "AF3_P_BIAS" present (PASS);
PDH/PDL/PWH/PWL price levels (e.g. 4120.31 / 4028.61 / 4165.90 /
3982.66) recorded per closed bar.
No image/visual inspection was used.
S. DISCREPANCIES
1) F3-T20 contract-check "FAIL": harness scoping artifact only. The
disposable harness fed the future-mutation bars into the same engine
run; the cumulative created_count therefore read 2 while the frozen
expected asserts the historical-scoped count 1. The terminal engine
and the canonical oracle agree on the full 12-bar input (both create
2 setups), and the historical bars 0..9 are unchanged. NOT a runtime
defect.
2) 36 per-bar representation-level rows (F3 replay): pre-formation
forming-state label differences (MQL5 CONTEXT_VALID-with-direction vs
oracle NONE) and 3 future-onset-input rows (MQL5 discard-and-restart
vs oracle wait). In every such row setup_exists=False on both sides
and id/blocked/m3/entry/score are identical; final Candidate Setup
identity/creation bar/terminal states are identical. Documented;
NOT contract-visible; no production impact identified.
3) Sparse `_check` coverage insufficient for 4/7 mutation classes;
mitigated by the full per-bar verifier (see Q).
No UNEXPLAINED mismatch exists.
T. FINAL CLASSIFICATION
B — PASSED WITH LIMITATIONS
Compiled successfully (COMPILE PASS, build 6140, 0/0 diagnostics).
Terminal execution deterministic and non-trading (0 deals, 0 trades on
every run). F3 Candidate Setup runtime reproduces the frozen canonical
oracle on 25/25 contract cases (0 real per-bar mismatches). F1/F4 gate
logic and MTF closed-bar semantics verified. Mutation suite 7/7
detected by the full verifier.
LIMITATIONS (unverified dimensions): numerical F2 zone boundary parity
(narrow/wide/boundary-touch vs dedicated oracle), historical M30/H4
boundary-timestamp parity, and the full Candidate Setup population
(694/686/594/92) were NOT re-derived in the Terminal environment
(environmental/data-scope debt, §P, §X).
U. Production changes
NONE. All 13 frozen runtime source files verified byte-identical
(normalized) to the authoritative repo before AND after this session.
No compilation-error repair was performed.
V. ML changes
NONE. No MLP/weights/labels/features/FEATURE_CONTRACT modified. The ML
path (AlgoForge_Backtest_Baseline, SniperGold_ML.mqh) was NOT executed.
W. External data changes
NONE. No Tickstory/Dukascopy/external CSV data introduced. The only data
source was the terminal broker history via AFEngine1MTF.
X. Remaining verification debt
1) Population-level Terminal replay (694/686 = 594 leads + 92 follow-ons)
requires a historical semantic-input pipeline (F1 events + F2 zones +
F4 states per M15 bar) feeding AFSetupEngine over the full research
date range on a data source matched to the research environment.
2) Numerical F2 zone boundary tests (narrow/wide/boundary-touch,
invalidation/consumption boundaries) against a dedicated Python zone
oracle on identical bars.
3) Historical M30/H4 boundary-timestamp parity (exact MTF bar timestamps,
missing-MTF-history, restart/reload behavior) vs an oracle.
4) Independent coefficient-level re-audit of P3-S21.1 (carried from
P3-S21.R) — unchanged.
End of P3-S22 verification document. Compiled PASS; terminal execution deterministic and non-trading; F3 contract EXACT; B — PASSED WITH LIMITATIONS; no production/ML/external-data change; P3-S23 NOT STARTED.