2026-08-22 07:46:00 +07:00 | | | # P3-S.0 F7 EVENT LIFECYCLE FORENSIC — LIQUIDITY GRAB STATE/EVENT BUG REPAIR
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | Date : 2026-08-22
|
| | | Session : P3-S.0 — SAFE SEMANTIC BUG REPAIR (f7 DetectLiquidityGrabs)
|
| | | Scope : ONLY the f7 event lifecycle. f10/f11, OB, FVG, CHoCH, timeframe, ML UNCHANGED.
|
| | | Checkpoint : b877fb6 (P3 Golden Dataset Phase 1) — working tree clean at start
|
2026-08-22 07:46:00 +07:00 | | | Provenance : P2 8d330343 | contract C44CC6F2 | model 06df8452 | dataset e85a0861
|
| | | ```
|
| | |
|
| | | ---
|
| | |
|
| | | ## A. ORIGINAL BEHAVIOR
|
| | |
|
| | | `DetectLiquidityGrabs` (f7 sweep_dir) — FEATURE_CONTRACT v1.0:
|
| | |
|
| | | ```text
|
| | | reference : internal swing pivot (fractal len=5)
|
| | | trigger condition: bearish grab: isHigh && high[b]>lvl && close[b]<lvl (buy-side swept -> -1)
|
| | | bullish grab: !isHigh && low[b]<lvl && close[b]>lvl (sell-side swept -> +1)
|
2026-08-22 17:21:46 +07:00 | | | detect window : 8 bars after the pivot (GRAB_WINDOW)
|
2026-08-22 07:46:00 +07:00 | | | state variables : g_swpDir, g_swpBar, g_swpLevel
|
2026-08-22 17:21:46 +07:00 | | | reset : g_swpDir=0; g_swpBar=-1 at the START of every bar (ComputeAll)
|
| | | expiration : NONE
|
| | | emission : g_feat[7] = g_swpDir (raw, no age bound)
|
| | | consumption : f9 (chochOK) uses g_swpBar/g_swpDir; f18 (+15); E_BUY/E_SELL stream
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | Measured behavior (XAUUSD M15, 2017-2026, n=197.032):
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ```text
|
| | | onsets = 2.835
|
2026-08-22 17:21:46 +07:00 | | | active bars = 196.928 (99,95%)
|
2026-08-22 07:46:00 +07:00 | | | repetition ratio = 69,5x
|
2026-08-22 17:21:46 +07:00 | | | state run median = 94 bars
|
| | | state run max = 996 bars
|
| | | NEVER resets to 0 after the first grab
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
| | | ## B. ROOT CAUSE
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | 1. The LEGACY state is "last-grab-ever": every bar, ComputeAll resets g_swpDir=0,
|
| | | then DetectLiquidityGrabs scans ALL internal pivots (700-bar window) and fills
|
| | | g_swpDir = the direction of the MOST RECENT grab ever — including grabs long past
|
| | | (filtered only by the pivot window [t-649, t-50], not by event age).
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | 2. No expiration: g_feat[7] = g_swpDir is emitted without checking
|
| | | (current_bar - g_swpBar). Consequently a single onset yields TRUE for hundreds of bars.
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | 3. Event consumers (f9-confirm stream E_BUY/E_SELL) treat the state as a repeated event
|
| | | -> P3.2.2: retention 1.5%, cluster 46 bars, serial dependence disappears only after de-overlap.
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | NOT a bug in the trigger condition (wick/close-back/8-bar window) — that was NOT changed.
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
| | | ## C. WHY IT IS A BUG
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | Intended semantics (FEATURE_CONTRACT f7): "direction of the LAST liquidity grab (internal pivot)".
|
| | | As an EVENT feature, a single onset must NOT produce TRUE for hundreds of bars.
|
| | | Legacy behavior = persistent state counted as an event -> redundant event stream,
|
| | | not independent (ac1 0.50 in ALL, see P3.2.2), invalid setup units.
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | Standard event lifecycle:
|
2026-08-22 07:46:00 +07:00 | | | NO_SWEEP -> SWEEP_ONSET -> EVENT_CONSUMED/EXPIRED -> NO_SWEEP
|
| | | ```
|
2026-08-22 17:21:46 +07:00 | | |
|
2026-08-22 07:46:00 +07:00 | | | ## D. CORRECTED EVENT LIFECYCLE
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | Expiration derived from semantics ALREADY present in the implementation (not arbitrary):
|
2026-08-22 07:46:00 +07:00 | | | InpSeqWindow = 40 (v4.4/v4.5): "Max bars: sweep -> CHoCH -> entry must chain within".
|
2026-08-22 17:21:46 +07:00 | | | v4.4/v4.5 already use (curBar - g_swpBar) <= InpSeqWindow for the sweepBull/Bear signal gate.
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | f7 fix:
|
| | | f7[r] = g_swpDir[r] if g_swpBar[r] >= 0 AND (r - g_swpBar[r]) <= SEQ_WINDOW (40)
|
| | | 0 if expired (age > 40) / no grab
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | Resulting lifecycle:
|
| | | NO_SWEEP (0) -> SWEEP_ONSET (dir) -> valid up to onset+40 bars -> EXPIRED -> NO_SWEEP (0)
|
| | | A newer event (more recent grab) replaces the old event (existing semantics: b > g_swpBar).
|
| | | An event arriving within the 40-bar window "refreshes" (chain) — not one onset producing
|
| | | hundreds of bars, but several sequential onsets.
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | UNCHANGED:
|
2026-08-22 07:46:00 +07:00 | | | - trigger condition (wick + close-back), GRAB_WINDOW=8, pivot len=5
|
2026-08-22 17:21:46 +07:00 | | | - internal g_swpDir/g_swpBar (used by f9/f18) — remains legacy state
|
| | | - f10/f11, OB, FVG, CHoCH, M15 timeframe, ML
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
| | | ## E. CODE CHANGE
|
| | |
|
| | | ### E.1 EA runtime — `Experts\AlgoForge_Backtest_Baseline.mq5` (root & publish)
|
| | |
|
| | | ```mql5
|
2026-08-22 17:21:46 +07:00 | | | // new (after AF_BT_GRAB_WIN):
|
2026-08-22 07:46:00 +07:00 | | | #define AF_BT_SEQ_WINDOW 40 // InpSeqWindow (v4.4): sweep -> CHoCH -> entry chain window
|
2026-08-22 17:21:46 +07:00 | | | // = event validity/expiry for f7 (P3-S.0 f7 event lifecycle fix)
|
2026-08-22 07:46:00 +07:00 | | |
|
2026-08-22 17:21:46 +07:00 | | | // replace g_feat[7] = g_swpDir; ->
|
| | | // P3-S.0 f7 event lifecycle fix: sweep_dir is active only during the valid event
|
| | | // (onset .. onset+SeqWindow); after expiry -> NO_SWEEP (0). Does not change the
|
| | | // trigger condition/close-back/pivot; internal g_swpDir stays for f9/f18.
|
2026-08-22 07:46:00 +07:00 | | | g_feat[7] =(g_swpBar>=0 && (tc-1-g_swpBar)<=AF_BT_SEQ_WINDOW)? g_swpDir : 0; // sweep_dir
|
| | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | ### E.2 Indicator v4.4 — `SniperGold_SMC_ProPlus_v4_4.mq5`
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ```mql5
|
| | | g_feat[7] =(g_swpBar>=0 && (tc-1-g_swpBar)<=InpSeqWindow)? g_swpDir : 0; // sweep_dir
|
| | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | ### E.3 Indicator v4.5 — `SniperGold_SMC_ProPlus_v4_5.mq5`
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ```mql5
|
| | | g_feat[6]=eqPos; g_feat[7]=((g_swpBar>=0 && (tc-1-g_swpBar)<=InpSeqWindow)? g_swpDir : 0); g_feat[8]=g_chochDir;
|
| | | ```
|
| | |
|
| | | ### E.4 Python machine annotator — `ml/p3/smc_semantic/`
|
| | |
|
| | | ```text
|
| | | smc_semantic_common.py : + SEQ_WINDOW=40 ; + f7_lifecycle(sweep_dir, sweep_bar)
|
2026-08-22 17:21:46 +07:00 | | | machine_annotator.py : v2 uses f7_lifecycle; output machine_annotations_f7_v2.csv
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | Compile: EA 0 errors / v4.4 0 errors / v4.5 0 errors (MetaEditor, build 6093, AVX512).
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ## F. REGRESSION TESTS
|
| | |
|
| | | File: `ml/p3/smc_semantic/test_f7_lifecycle.py` — **15/15 PASS**
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | R1 Single onset : 1 event (not multiple) PASS
|
2026-08-22 07:46:00 +07:00 | | | R1 active bounded : active_bars <= 41 PASS
|
2026-08-22 17:21:46 +07:00 | | | R2 Persistent condition : condition true 450 bars -> 1 event PASS
|
| | | R3 New independent sweep : 2 separate events PASS
|
2026-08-22 07:46:00 +07:00 | | | R4 Invalidated/expired : f7[100]=0 (age>40), f7[10]=1 PASS
|
2026-08-22 17:21:46 +07:00 | | | R5 No-sweep : 0 events PASS
|
| | | R6 f10 unchanged vs cache : 0 mismatch / 4000 bars PASS
|
| | | R6 f11 unchanged vs cache : 0 mismatch / 4000 bars PASS
|
| | | R6 EA source contains fix : AF_BT_SEQ_WINDOW + (tc-1-g_swpBar)<=... PASS
|
| | | R6 v4.4 / v4.5 contain fix : PASS PASS
|
| | | R6 compile : EA/v4.4/v4.5 0 errors 0 warnings (manual) PASS
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
| | | ## G. BEFORE / AFTER HISTORICAL RESULTS
|
| | |
|
| | | ```text
|
| | | METRIC BEFORE AFTER
|
2026-08-22 17:21:46 +07:00 | | | onsets 2.835 2.835 (trigger unchanged)
|
| | | active bars f7 != 0 196.928 90.140
|
| | | % active bars 99,95% 45,75%
|
| | | run median 94 bars 41 bars
|
| | | run max 996 bars 152 bars (dense event chain)
|
| | | max per-onset lifetime ~996 41 <= SEQ_WINDOW+1 (FIX EVIDENCE)
|
| | | events removed (bars) — 106.788
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | Interpretation: a single onset now yields TRUE for at most 41 bars (not hundreds).
|
| | | Run 152 = ~4 consecutive events in a dense cluster (not a single onset).
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ## H. GOLDEN DATASET IMPACT
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | Sampling UNCHANGED (same 60 cases). Annotation rebuild:
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | machine_annotations_f7_v1_LEGACY.csv (before fix — preserved)
|
| | | machine_annotations_f7_v2.csv (after fix — primary)
|
2026-08-22 07:46:00 +07:00 | | | f7_v1_vs_v2_comparison.json
|
| | |
|
| | | summary:
|
| | | n_cases = 60
|
| | | cases_changed = 22
|
| | | cases_unchanged = 38
|
| | | events_removed = 22
|
| | | events_added = 0
|
| | | persistent_state_corrected = 22
|
| | | f10_f11_unchanged = true
|
| | |
|
| | | Detail per stratum:
|
| | | changed : STALE_GRAB 15, EQH_SWEPT 4, EQ_MARGINAL 2, EQL_SWEPT 1
|
| | | unchanged: FRESH_GRAB 15, AGED_GRAB 10, EQ_NEARCROSS 6, EQL_SWEPT 5, EQH_SWEPT 2
|
2026-08-22 17:21:46 +07:00 | | | decision v2: YES 45, NO 15 (all NO = STALE_GRAB — stale state is now NO_SWEEP)
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | Note: some EQH/EQL/MARGINAL cases changed on the f7 FIELD (grab state expired),
|
| | | but machine_decision stays YES via f10/f11 — no semantic information lost.
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ## I. EXPLICITLY UNCHANGED SEMANTICS
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | f10/f11 (DetectEQ) : NOT changed — wick condition, close-back (N/A), ATR tolerance
|
2026-08-22 07:46:00 +07:00 | | | 0.10*ATR(row), EQ pair window [r-649, r-50] — SEMANTIC REVIEW REQUIRED
|
2026-08-22 17:21:46 +07:00 | | | OB / FVG / CHoCH / MSS : NOT changed
|
| | | timeframe : f7 remains M15; no hidden H4/M30/M3 usage
|
2026-08-22 07:46:00 +07:00 | | | ML : SniperGold_ML.mqh, _p26_corrected.mqh, train_model.py,
|
2026-08-22 17:21:46 +07:00 | | | build_features_p2.py, P2.6 baseline — NOT changed
|
| | | AF_DetectSweep (E2) : OUT OF SCOPE (different implementation, not an ML primitive)
|
| | | internal g_swpDir : stays legacy (f9/f18 not changed this session)
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
| | | ## EVIDENCE STATUS
|
| | |
|
| | | ```text
|
2026-08-22 17:21:46 +07:00 | | | BUG = CONFIRMED + FIXED (f7 event lifecycle)
|
| | | SEMANTIC DEFINITION = STILL UNDER REVIEW (f10/f11 rejection, EQ semantics, timeframe)
|
| | | HUMAN ANNOTATION = NOT STARTED (must target the corrected machine spec,
|
| | | machine results NOT shown to annotators)
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | ## ARTIFACTS
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ```text
|
| | | docs/P3_S_F7_EVENT_LIFECYCLE_FORENSIC.md
|
| | | ml/p3/smc_semantic/smc_semantic_common.py (SEQ_WINDOW + f7_lifecycle)
|
| | | ml/p3/smc_semantic/machine_annotator.py (v2)
|
| | | ml/p3/smc_semantic/test_f7_lifecycle.py (R1-R6 + historical)
|
| | | ml/p3/smc_semantic/output/machine_annotations_f7_v2.csv
|
| | | ml/p3/smc_semantic/output/f7_v1_vs_v2_comparison.json
|
| | | ml/p3/smc_semantic/output/machine_annotations_f7_v1_LEGACY.csv (preserved)
|
| | | ml/p3/smc_semantic/output/cases_meta_v1_LEGACY.json (preserved)
|
2026-08-22 17:21:46 +07:00 | | | Experts/AlgoForge_Backtest_Baseline.mq5 (patched, 0 errors)
|
| | | Indicators/Downloads/SniperGold_SMC_ProPlus_v4_4.mq5 (patched, 0 errors)
|
| | | Indicators/Downloads/SniperGold_SMC_ProPlus_v4_5.mq5 (patched, 0 errors)
|
2026-08-22 07:46:00 +07:00 | | | ```
|
| | |
|
2026-08-22 17:21:46 +07:00 | | | ## HASHES BEFORE FIX (preserved)
|
2026-08-22 07:46:00 +07:00 | | |
|
| | | ```text
|
| | | AlgoForge_Backtest_Baseline.mq5 (root) : c3fa65846b31f92abdf286ba1b6286466eda03191f83176e808c8f65b8a6839c
|
| | | SniperGold_ML.mqh : c0d5cae6663f457d2c87750bc8690b47ef4557d0426bfb4183280dc1d1a2f1e5
|
| | | SniperGold_ML_p26_corrected.mqh : 06df8452a112290ecb9bae1a3dbff6df492e084f8b872885d808bb0303ec6a70
|
| | | SniperGold_SMC_ProPlus_v4_4.mq5 : 118ffee68760bbd53048fdfc3382a1697fa6870fb3e6d2fd1a4e22eb8e84c2d0
|
| | | SniperGold_SMC_ProPlus_v4_5.mq5 : 62d25e4f9c63ca189ec366f5c4ddd061839cfdb360a6a5468db8e6db239700b4
|
| | | smc_semantic_common.py : b754abd60593d84a61147d663f673661ae2089f2c0694586ccf7c1cb25f1acf6
|
| | | machine_annotator.py : 7b67b5dcd5ac4c0b57f8bf6fbc36ba7a60631031239ef3059590aed528a60602
|
| | | ```
|