295 lines
13 KiB
Markdown
295 lines
13 KiB
Markdown
|
|
# SESSION HANDOVER — SNIPERGOLD_ML P3-S.5: ORDER BLOCK SPEC + CONFORMANCE
|
||
|
|
|
||
|
|
```text
|
||
|
|
Date : 2026-08-22 (session close)
|
||
|
|
Status : P3-S.5 COMPLETE — spec + conformance audit done; synthetic tests 20/20;
|
||
|
|
NOT yet committed (handover prepared before commit+push)
|
||
|
|
Forge : https://forge.mql5.io/chiki2bum2/SniperGold_ML
|
||
|
|
Checkpoint : P3-S.4 176880f8f3f17afb7e922a48ed953daa22c1515f (VERIFIED clean at start)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. SESSION OBJECTIVE
|
||
|
|
|
||
|
|
```text
|
||
|
|
Formal Specification + Code-Conformance Audit for Order Block (OB).
|
||
|
|
|
||
|
|
Question answered:
|
||
|
|
Does the SniperGold code claiming to detect Order Blocks really implement the
|
||
|
|
OB definition established by the PROJECT SEMANTIC SPECIFICATION?
|
||
|
|
|
||
|
|
Questions NOT answered:
|
||
|
|
- Does OB generate profit?
|
||
|
|
- Does OB improve AUC / PF?
|
||
|
|
- Is the universal SMC OB definition correct for every trader?
|
||
|
|
```
|
||
|
|
|
||
|
|
Principle: SPEC FIRST, CODE AUDIT SECOND. Human verification = CANCELLED.
|
||
|
|
No production code changes (Phase D). No ML / AUC / PF / backtest optimization.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. SOURCE MATERIAL (15 sources, reconciled)
|
||
|
|
|
||
|
|
```text
|
||
|
|
1 DESIGN.md (Algo Forge) docs/DESIGN.md:132-133,206 (intent: OB =
|
||
|
|
"opposite bar before a strong move")
|
||
|
|
2 Engine 2 detector Include\AlgoForge\AF_Engine2_Agents.mqh:293-322
|
||
|
|
(AF_FindOrderBlock)
|
||
|
|
3 AF_AvgBody AF_Engine2_Agents.mqh:120-127
|
||
|
|
4 Engine 2 C agent AF_Engine2_Agents.mqh:492-575 (weight 0.30)
|
||
|
|
5 Engine 2 E agent AF_Engine2_Agents.mqh:583-663 (ZONE+CONFIRM)
|
||
|
|
6 Engine 3 display collector Include\AlgoForge\AF_Engine2_Display.mqh:199-250
|
||
|
|
(AF_CollectOBs)
|
||
|
|
7 AF_Defines.mqh AF_Defines.mqh:57,59,60 (OB 5/0.15 ATR/1.5)
|
||
|
|
8 Engine 3 render/indicator AF_Engine3_Render.mqh; AF_Engine3_Display.mq5
|
||
|
|
9 v4.3/v4.4 indicator Indicators\Downloads\SniperGold_SMC_ProPlus_v4_3/4_4.mq5
|
||
|
|
(LEGACY structure-break OB: ProcessStructure
|
||
|
|
RecordOB, FindEntryOB, Sweep->CHoCH->OB)
|
||
|
|
10 v4.5 indicator SniperGold_SMC_ProPlus_v4_5.mq5 (chart OB
|
||
|
|
identical; + MTF OB per-TF RecordOB_mtf)
|
||
|
|
11 FEATURE_CONTRACT docs/FEATURE_CONTRACT.md — NO OB feature
|
||
|
|
12 EA runtime Experts\AlgoForge_Backtest_Baseline.mq5 — NO OB
|
||
|
|
13 Python training ml/**/*.py — NO OB (0 refs)
|
||
|
|
14 P3 docs P3_2_2 / P3_2_LABEL_FORENSIC: "breaker" = FUTURE
|
||
|
|
concept only
|
||
|
|
15 External SMC Order Block Detector.mq5 /
|
||
|
|
XAUUSD_MTF_Liquidity_OB_Reversal (2).mq5:
|
||
|
|
external references, NOT wired to the project
|
||
|
|
|
||
|
|
Three semantic layers separated:
|
||
|
|
INTENDED : OB = opposite bar before a strong move (DESIGN.md); C agent context
|
||
|
|
zone; E agent entry zone (ZONE + CONFIRMATION = setup); display
|
||
|
|
zones with MIT filter + dedupe + min size 0.15xATR.
|
||
|
|
LEGACY : v4.3/v4.4/v4.5: OB = opposite candle BEFORE A STRUCTURE BREAK
|
||
|
|
(BOS/CHoCH on swing len=50 / internal len=5); last or highest-volume
|
||
|
|
opposite candle; full range; min 0.15xATR; close-through mitigation;
|
||
|
|
internal + swing OBs; entry chain.
|
||
|
|
CURRENT : Algo Forge: opposite bar before strong move (1.5 x avg body); zone =
|
||
|
|
full range; Engine 2 = newest-only, NO min size, NO mitigation;
|
||
|
|
display = newest N unmitigated, 0.15xATR min, close-through mit,
|
||
|
|
0.5xATR dedupe.
|
||
|
|
TRAINING : N/A (no OB feature). DISPLAY-ONLY: Engine 3 / v4.4 / v4.5 MTF OB.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. SPECIFICATION (docs/SMC_ORDER_BLOCK_SPEC_v1.md)
|
||
|
|
|
||
|
|
```text
|
||
|
|
FORMATION : canonical current = opposite-color candle B immediately before
|
||
|
|
strong-move candle M (|body(M)| >= 1.5 x avg body, avg over the
|
||
|
|
last 20 closed bars). LEGACY second definition = opposite candle
|
||
|
|
before a STRUCTURE BREAK (BOS/CHoCH) — recorded as A-2.
|
||
|
|
CANDLE : B = full opposite candle (Close vs Open); doji excluded; zone =
|
||
|
|
FULL RANGE [Low(B), High(B)].
|
||
|
|
BOUNDARIES : top = High(B), bot = Low(B); no padding; min size none in the
|
||
|
|
definition (0.15 ATR consumer filters, A-1).
|
||
|
|
DIRECTION : +1 bullish (bearish B + bullish M), -1 bearish, 0 none;
|
||
|
|
direction = move direction.
|
||
|
|
PRECONDITION : NONE (canonical); BOS/CHoCH/displacement/liquidity NOT required.
|
||
|
|
TIMING : observable at M close (B+1 <= t); newest pair (t-1, t); NO 1-bar
|
||
|
|
lag; timestamp = B open; closed-bar lock; no future.
|
||
|
|
LIFECYCLE : ZONE + FORMATION EVENT; one zone per pair; no event stream;
|
||
|
|
no age expiry; one zone stays ONE zone (T09).
|
||
|
|
MITIGATION : close-through full fill (Close < Low(B) bull / > High(B) bear);
|
||
|
|
partial/wick NOT mitigation.
|
||
|
|
INVALIDATION : NOT MODELED.
|
||
|
|
OVERLAP : separate zones per pair; display dedupe 0.5 x ATR (A-3).
|
||
|
|
BREAKER : NOT IMPLEMENTED (0 code matches; future concept only).
|
||
|
|
TIMEFRAME : Engine 2 per-TF (H4/M30/M15/M3); canonical = AMBIGUOUS (A-4).
|
||
|
|
CONSUMERS : C (context, w 0.30), E (entry zone), legacy entry gate
|
||
|
|
(all-unmitigated within tap), display; NO ML feature.
|
||
|
|
PARITY : PARITY = N/A BY ABSENCE (OB not in f0-f18 / EA / Python).
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. CONFORMANCE (docs/P3_S5_ORDER_BLOCK_CONFORMANCE.md)
|
||
|
|
|
||
|
|
```text
|
||
|
|
Formation (E-1, E-2, E-4, E-6, E-7) : CONFORMING (current definition)
|
||
|
|
Zone boundaries (E-3) : CONFORMING (+ AMBIGUOUS A-1 min size)
|
||
|
|
Structural precondition (E-5) : CONFORMING (current = none);
|
||
|
|
legacy BOS/CHoCH rule = A-2
|
||
|
|
Lifecycle (E-8) : CONFORMING (zone; no event duplication)
|
||
|
|
Mitigation (E-9) : NON-CONFORMING (Engine 2, BUG-P3S5-001)
|
||
|
|
Invalidation (E-10) : CONFORMING (not modeled)
|
||
|
|
Overlap (E-11) : PARTIALLY CONFORMING (A-3)
|
||
|
|
Breaker (E-12) : NOT IMPLEMENTED (no claim)
|
||
|
|
Timeframe (E-13) : SPECIFICATION AMBIGUOUS (A-4)
|
||
|
|
Consumer semantics (E-14) : PARTIALLY CONFORMING (BUG-P3S5-001, A-5)
|
||
|
|
Runtime/training parity (E-15) : CONFORMING (N/A by absence)
|
||
|
|
|
||
|
|
VERDICT : PARTIALLY CONFORMING
|
||
|
|
(conformance to the project spec; NOT profitability/edge)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. SYNTHETIC TESTS
|
||
|
|
|
||
|
|
```text
|
||
|
|
Runner : ml/p3/smc_semantic/spec_tests_order_block.py
|
||
|
|
Cases : ml/p3/smc_semantic/spec_test_cases_order_block.json (20 cases)
|
||
|
|
Report : ml/p3/smc_semantic/output/spec_tests_order_block_report.json
|
||
|
|
|
||
|
|
Result : 20/20 PASS
|
||
|
|
OB-T01..T20 (all required). spec_oracle (truth, from SPEC S-1..S-15) ==
|
||
|
|
expected in all cases; symmetry property (S-4) asserted on EVERY case.
|
||
|
|
code_port (Engine-2 AF_FindOrderBlock port, observation) MATCHES spec in
|
||
|
|
T01-T05/T07-T10/T13-T15/T17-T19; DIVERGES in:
|
||
|
|
T06/T11/T12/T16: spec newest-unmitigated = none (mitigated) vs code returns
|
||
|
|
the zone -> synthetic evidence for BUG-P3S5-001.
|
||
|
|
Expected derived from SPEC, NOT from production code.
|
||
|
|
Parity scan (T20): FEATURE_CONTRACT.md = 0 order-block refs; ml/**/*.py = 0
|
||
|
|
(excluding the spec test files) -> PARITY = N/A BY ABSENCE.
|
||
|
|
NO AUC/PF/backtest/human annotation/ML on the test path.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. CONFIRMED BUGS (document-only; NOT fixed in P3-S.5)
|
||
|
|
|
||
|
|
```text
|
||
|
|
BUG-P3S5-001 [MEDIUM] CONFIRMED, NOT FIXED
|
||
|
|
Engine-2 AF_FindOrderBlock (AF_Engine2_Agents.mqh:293-322) has NO mitigation
|
||
|
|
filter and NO age/freshness bound: the Context (weight 0.30) and Entry (zone
|
||
|
|
tap) agents can consume a FULLY-FILLED OB as a current zone, and the newest OB
|
||
|
|
can be hundreds of bars old. It also returns ONLY the newest zone (older
|
||
|
|
unmitigated OBs invisible), diverging from the legacy entry rule
|
||
|
|
(FindEntryOB: all unmitigated within tap). Same bug class as BUG-P3S4-001
|
||
|
|
(FVG side). NOT the f7/f9/f18 duplication class — OB is a zone, not an event
|
||
|
|
stream (verified OB-T09).
|
||
|
|
Fix: apply the close-through mitigation filter (S-9) to AF_FindOrderBlock (or
|
||
|
|
filter mitigated zones in the agents) and add a zone-age bound if freshness is
|
||
|
|
required; document the zone-selection rule.
|
||
|
|
|
||
|
|
BUG-P3S5-002 [LOW] DOCUMENTED
|
||
|
|
Two OB definitions in one project: Algo Forge "opposite bar before strong move
|
||
|
|
(1.5 x avg body)" vs legacy v4.3/v4.4/v4.5 "opposite candle before STRUCTURE
|
||
|
|
BREAK (BOS/CHoCH)" (+ legacy volume-weighted mode InpVolumeOB/InpOBStyle).
|
||
|
|
The two rules can select DIFFERENT candles for the same price sequence.
|
||
|
|
Fix: document the current rule as canonical; mark the legacy rule as historical.
|
||
|
|
|
||
|
|
BUG-P3S5-003 [INFO] DOCUMENTED
|
||
|
|
Minimum zone size filters diverge: Engine-2 none / display 0.15 ATR / legacy
|
||
|
|
0.15 ATR (A-1). No canonical value; not optimized here.
|
||
|
|
|
||
|
|
BUG-P3S5-004 [INFO] DOCUMENTED
|
||
|
|
Display dedupe (0.5 x ATR) vs Engine-2 newest-only vs legacy keep-all (A-3):
|
||
|
|
three zone-selection policies. Not adjudicated.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. SEMANTIC AMBIGUITIES
|
||
|
|
|
||
|
|
```text
|
||
|
|
1. Minimum zone size (A-1) : none / 0.15 ATR / 0.15 ATR; no canonical value.
|
||
|
|
2. Two OB definitions (A-2) : strong-move (current) vs structure-break (legacy).
|
||
|
|
3. Overlap / dedupe (A-3) : display 0.5 ATR dedupe vs keep-all.
|
||
|
|
4. Canonical timeframe (A-4) : Engine-2 M15 slot explicit; HTF OB as M15
|
||
|
|
context / M3 execution not defined (same class as
|
||
|
|
CHoCH G-4 / sweep G-3 / FVG A-3).
|
||
|
|
5. Consumer zone scope (A-5) : Engine-2 newest-ANY (no mit/age) vs legacy
|
||
|
|
all-unmitigated within tap.
|
||
|
|
6. Volume-weighted OB (A-6) : legacy-only (InpVolumeOB / OB_HIGHEST_VOLUME);
|
||
|
|
current = last candle only.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 8. PREVIOUS BUG-CLASS CHECK (per brief §27)
|
||
|
|
|
||
|
|
```text
|
||
|
|
The f7/CHoCH/FVG cross-layer pattern (detector correct -> zone/state correct ->
|
||
|
|
consumer incorrect) was explicitly checked for OB:
|
||
|
|
|
||
|
|
detector : AF_FindOrderBlock — correct for FORMATION (S-1..S-6) OK
|
||
|
|
zone/state : zone list — correct (one zone per pair, no duplication) OK
|
||
|
|
consumer : C/E agents consume the newest-ANY zone WITHOUT the
|
||
|
|
mitigation filter that display/legacy apply FAIL
|
||
|
|
|
||
|
|
-> The cross-layer gap EXISTS for OB (BUG-P3S5-001: mitigation/age not applied
|
||
|
|
by the Engine-2 detector/consumers). It is the SAME class as BUG-P3S4-001
|
||
|
|
(FVG) — a mitigation-lifecycle gap, NOT the f7/f9/f18 stale-event
|
||
|
|
duplication (proven: OB-T09 zone_count=1 after 19 bars).
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 9. NO PRODUCTION CHANGE
|
||
|
|
|
||
|
|
```text
|
||
|
|
No production code was modified.
|
||
|
|
AF_FindOrderBlock / AF_CollectOBs / v4.3 / v4.4 / v4.5 / Engine 2 / Engine 3 /
|
||
|
|
f7 / f8 / f9 / f10 / f11 / f18 / FVG / CHoCH / Displacement / ML / EA :
|
||
|
|
NOT touched.
|
||
|
|
|
||
|
|
Only P3-S.5 research artifacts added (spec, conformance, tests, report, handover).
|
||
|
|
P3-S.4 / P3-S.3 / P3-S.2 artifacts (immutable) UNCHANGED
|
||
|
|
(git status: only new files, 0 modified).
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 10. HUMAN VERIFICATION STATUS
|
||
|
|
|
||
|
|
```text
|
||
|
|
HUMAN VERIFICATION = CANCELLED
|
||
|
|
Human annotation is NOT part of the OB validation path.
|
||
|
|
The human_package/ remains a historical artifact only.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 11. NEXT GATE
|
||
|
|
|
||
|
|
```text
|
||
|
|
After the Order Block verdict (PARTIALLY CONFORMING):
|
||
|
|
Displacement -> MTF Alignment -> Candidate Setup.
|
||
|
|
DO NOT return to ML; DO NOT build a meta-label; DO NOT create new event labels;
|
||
|
|
DO NOT fix production bugs before the audit chain completes (BUG-P3S5-00x stay
|
||
|
|
documented until the semantic audit chain is finished).
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 12. CHECKPOINT & PROVENANCE (P3-S.5)
|
||
|
|
|
||
|
|
```text
|
||
|
|
Forge HEAD (session start) : 176880f (P3-S.4) — VERIFIED
|
||
|
|
P3-S.4 spec (immutable) : docs/SMC_FVG_SPEC_v1.md
|
||
|
|
P3-S.3 spec (immutable) : docs/SMC_CHOCH_MSS_SPEC_v1.md
|
||
|
|
P3-S.2 spec (immutable) : docs/SMC_LIQUIDITY_SWEEP_SPEC_v1.md
|
||
|
|
FEATURE_CONTRACT : C44CC6F2... (P2-era) / 7b908b12... (committed)
|
||
|
|
symbol/tf : XAUUSD / M15 (2017-01-01 .. 2026-08-20)
|
||
|
|
Human verification : CANCELLED
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 13. P3-S.5 ARTIFACTS
|
||
|
|
|
||
|
|
```text
|
||
|
|
docs/SMC_ORDER_BLOCK_SPEC_v1.md
|
||
|
|
docs/P3_S5_ORDER_BLOCK_CONFORMANCE.md
|
||
|
|
ml/p3/smc_semantic/spec_tests_order_block.py
|
||
|
|
ml/p3/smc_semantic/spec_test_cases_order_block.json
|
||
|
|
ml/p3/smc_semantic/output/spec_tests_order_block_report.json
|
||
|
|
docs/SESSION_HANDOVER_2026-08-22_P3_S5_ORDER_BLOCK.md (this document)
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 14. COMMIT & PUSH STATUS
|
||
|
|
|
||
|
|
```text
|
||
|
|
NOT YET COMMITTED at handover write time.
|
||
|
|
Planned commit message:
|
||
|
|
research: P3-S.5 Order Block formal spec + conformance audit (PARTIALLY CONFORMING)
|
||
|
|
Follow with: git push origin main; verify rev-parse HEAD == ls-remote origin HEAD;
|
||
|
|
working tree CLEAN.
|
||
|
|
```
|