forked from chiki2bum2/SniperGold_ML
374 lines
14 KiB
Markdown
374 lines
14 KiB
Markdown
# P3-S.13 CANDIDATE SETUP LAYER — SNIPERGOLD_ML (F3)
| |||
| |||
```text
| |||
Date : 2026-08-22
| |||
Session : P3-S.13 — F3 CANDIDATE SETUP LAYER (third implementation phase
| |||
of the frozen canonical architecture, P3-S.10).
| |||
Status : IMPLEMENTED — test-first, contract enforced, consumer audit done,
| |||
regression green, compilation 0/0, Forge pushed.
| |||
Baseline : P3_S12_CLOSE_SHA e8efab9e950d5f851d354061a7e862a95e20f018
| |||
Contract : docs/SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md (frozen)
| |||
Adjudication: docs/P3_S10_OWNER_ADJUDICATION.md (OD-1..OD-5)
| |||
F1 report : docs/P3_S11_EVENT_CONTRACT_REPAIR.md
| |||
F2 report : docs/P3_S12_ZONE_CONTRACT_REPAIR.md
| |||
Test report: ml/p3/smc_semantic/output/p3_s13_candidate_setup_report.json
| |||
Human verification : CANCELLED. No AUC/PF/profit/backtest/optimization used.
| |||
```
| |||
| |||
---
| |||
| |||
## A. Frozen Architecture (implemented)
| |||
| |||
```text
| |||
H4 context gate (direction-compatible)
| |||
-> M30 context gate (direction-compatible)
| |||
-> fresh Liquidity EVENT (M15, W_sweep = 40)
| |||
-> CHoCH/MSS EVENT after the sweep (M15, W_choch = 40, same direction)
| |||
-> unmitigated OB OR FVG ZONE (M15, direction-compatible)
| |||
-> M15 entry condition
| |||
-> CANDIDATE_SETUP (direction = chain direction)
| |||
-> [optional M3 confirmation -> M3_CONFIRMED]
| |||
```
| |||
| |||
Primitive roles (frozen §C): H4 = CONTEXT STATE (gate), M30 = CONTEXT STATE
| |||
(gate), Liquidity Sweep = EVENT (required, W_sweep=40), CHoCH/MSS =
| |||
STRUCTURAL EVENT (required, W_choch=40, after sweep, inside the sweep chain),
| |||
OB = ZONE (alternative), FVG = ZONE (alternative), Displacement = OPTIONAL
| |||
ATTRIBUTE (per-bar, no persistent state), M15 = ENTRY CONDITION / CHAIN
| |||
CARRIER (required), M3 = OPTIONAL MICRO CONFIRMATION (no veto).
| |||
| |||
Semantic separation (frozen §A/§J): STATE != EVENT != ZONE != CONDITION !=
| |||
CANDIDATE_SETUP != SIGNAL != TRADE. A directional signal may exist without a
| |||
setup; a Candidate Setup requires the complete canonical chain.
| |||
| |||
---
| |||
| |||
## B. Implementation Scope
| |||
| |||
```text
| |||
IN SCOPE : Candidate Setup entity, identity, lifecycle state machine,
| |||
H4/M30 gates, event-chain consumption (F1), zone consumption (F2),
| |||
M15 entry condition validation, optional M3 confirmation,
| |||
one-setup-one-identity, one-entry rule, score separation,
| |||
deterministic dedup, regression + compilation.
| |||
OUT OF SCOPE (NOT modified): F4 MTF/training alignment, F5 display
| |||
redesign, ML/training pipeline, FEATURE_CONTRACT, legacy v4.x
| |||
restoration, primitive detection formulas (sweep/CHoCH/FVG/OB/
| |||
displacement unchanged), the flat aggregator's arithmetic.
| |||
```
| |||
| |||
---
| |||
| |||
## C. Candidate Setup Object
| |||
| |||
```text
| |||
AFCandidateSetup (AF_Engine2_Setup.mqh, frozen §E):
| |||
| |||
setup_id : monotonic integer, assigned at CANDIDATE_SETUP
| |||
direction : +1 bullish / -1 bearish (chain direction)
| |||
state : lifecycle enum (frozen §F)
| |||
sweep_onset, sweep_dir : originating Liquidity EVENT reference
| |||
choch_onset, choch_dir : structure EVENT reference
| |||
zone_type : OB | FVG
| |||
zone_formation : zone formation bar (causal identity)
| |||
zone_dir : zone direction
| |||
zone_mit_at_creation : F2 mitigation state when the chain consumed it
| |||
creation_bar : M15 bar when the chain completed
| |||
m3_bar : M3 confirmation bar (-1 = none)
| |||
reason : provenance / lifecycle reason
| |||
entry_bound : one-entry bookkeeping (frozen §H)
| |||
| |||
NO execution fields (lot/SL/TP/ticket) — those are outside F3 (frozen §A,
| |||
CS-31). The scoring layer may attach score/confidence/ranking AFTER setup
| |||
existence (frozen §I) but never creates one.
| |||
```
| |||
| |||
---
| |||
| |||
## D. State Machine
| |||
| |||
```text
| |||
NONE -> CONTEXT_VALID -> LIQUIDITY_TRIGGERED -> STRUCTURE_CONFIRMED ->
| |||
ZONE_READY -> ENTRY_ARMED -> CANDIDATE_SETUP -> [M3_CONFIRMED]
| |||
-> EXPIRED | INVALIDATED | CONSUMED
| |||
| |||
Rules (frozen §F):
| |||
- strict stage order; no skipping;
| |||
- a lapsed stage BEFORE CANDIDATE_SETUP discards the forming setup;
| |||
- CANDIDATE_SETUP / M3_CONFIRMED are the ACTIVE formation states;
| |||
- EXPIRED / INVALIDATED / CONSUMED are terminal and NON-REVERSIBLE
| |||
(no reactivation);
| |||
- at most one entry signal per setup (CONSUMED);
| |||
- M3_CONFIRMED is optional; a contrary/absent M3 does NOT invalidate.
| |||
```
| |||
| |||
---
| |||
| |||
## E. H4/M30 Gate
| |||
| |||
```text
| |||
OD-1: H4 and M30 are HARD direction-compatible gates for the setup layer.
| |||
- H4_state(asof) and M30_state(asof) must each be non-zero and equal to
| |||
the chain direction.
| |||
- H4 <-> M30 conflict (opposite signs) -> BLOCKED (no chain).
| |||
- A neutral (0) state fails the gate -> no chain.
| |||
- M15 chain conflict with H4/M30 -> BLOCKED (OD-4).
| |||
The flat vote remains a scoring/signal layer (signal != setup, §J); the
| |||
gates apply to the SETUP LAYER ONLY (OD-1 override recorded).
| |||
```
| |||
| |||
---
| |||
| |||
## F. Event Chain
| |||
| |||
```text
| |||
Consumed via the F1 EVENT contract (P3-S.11):
| |||
sweep : fresh event only — age <= W_sweep (40 M15 bars);
| |||
onset <= decision bar <= onset + W_sweep.
| |||
CHoCH : fresh event — age <= W_choch (40);
| |||
AFTER the sweep (choch onset >= sweep onset);
| |||
inside the sweep validity chain (choch onset - sweep onset <= 40);
| |||
same direction as the sweep.
| |||
No raw historical detector state is read; the F3 layer consumes F1 events
| |||
(AF_DetectSweepEvent / AF_DetectChochEvent materialize the onset that the
| |||
stateless detectors already compute; geometry unchanged).
| |||
```
| |||
| |||
---
| |||
| |||
## G. Zone Consumption
| |||
| |||
```text
| |||
Consumed via the F2 ZONE contract (P3-S.12):
| |||
Candidate Setup may use ACTIVE + UNMITIGATED OB (AF_SETUP_ZONE_OB) OR
| |||
ACTIVE + UNMITIGATED FVG (AF_SETUP_ZONE_FVG) — direction-compatible.
| |||
Fully mitigated / invalidated zones are NOT consumable (AFZoneState
| |||
mit_state + invalidated; F2 semantics reused).
| |||
Zone mitigation mid-chain invalidates the setup (frozen §F).
| |||
F3 does NOT reimplement FVG/OB mitigation — it consumes AFZoneState.
| |||
```
| |||
| |||
---
| |||
| |||
## H. M15 Entry Condition
| |||
| |||
```text
| |||
The canonical M15 entry semantics are the project's own E-rule (Definition A,
| |||
SMC_CANDIDATE_SETUP_SPEC_v1 CS-1), retained as the M15 entry-condition
| |||
predicate inside the chain (P3-S.9 D.1):
| |||
m15_cond(d) = zone membership AND confirmation conjunction (sweep OR
| |||
choch direction-compatible) AND premium/discount filter (not in premium
| |||
for buy / not in discount for sell); displacement may boost.
| |||
In the canonical chain the confirmation legs are already validated as stages
| |||
(§F); the M15 entry condition is the final direction-compatible CONDITION.
| |||
It is consumed as a semantic input (m15) by the F3 layer — the layer
| |||
validates it, it does not recompute the E-rule arithmetic. The M15 layer
| |||
acts as ENTRY CONDITION / CHAIN CARRIER, NOT as a second scoring system.
| |||
```
| |||
| |||
---
| |||
| |||
## I. M3 Confirmation
| |||
| |||
```text
| |||
Optional (frozen §F/§N, OD-4):
| |||
- M3 direction-compatible within W_m3 of creation -> M3_CONFIRMED.
| |||
- M3 contrary or absent -> M3_CONFIRMED = FALSE.
| |||
- The Candidate Setup REMAINS VALID (M3 is not a gate).
| |||
- A contrary M3 reduces only the micro-score (never the setup existence).
| |||
W_m3 = OPEN NUMERIC PARAMETER; placeholder test boundary 2 M15 decision
| |||
bars (~10 M3 bars at the 5:1 M3:M15 ratio), documented, NOT optimized.
| |||
```
| |||
| |||
---
| |||
| |||
## J. Identity / Deduplication
| |||
| |||
```text
| |||
Frozen §E/§G:
| |||
uniqueness = (direction, sweep onset, choch onset, zone formation ts,
| |||
creation ts). CAUSAL identity — every component is a dated
| |||
chain element; no random id; no per-bar regeneration.
| |||
ONE CAUSAL SETUP = ONE SETUP IDENTITY. While the same chain remains
| |||
active, the same setup_id persists across bars (F3-T14/T23/T24).
| |||
A new setup exists only when a NEW chain completes (new sweep onset /
| |||
new CHoCH / new zone reference), producing a distinct identity.
| |||
Dedup BY CONSTRUCTION: the engine's identity registry rejects a second
| |||
setup with the same chain key (F3-T23/T24).
| |||
```
| |||
| |||
---
| |||
| |||
## K. Score Separation
| |||
| |||
```text
| |||
Frozen §I/§J: SCORE != SETUP EXISTENCE.
| |||
- The flat aggregator (weighted vote) remains a SCORING/RANKING layer.
| |||
- A score can never create a Candidate Setup (F3-T13).
| |||
- A Candidate Setup can exist with ANY score, including a low one
| |||
(F3-T25).
| |||
- The aggregated vote may still produce a DIRECTIONAL SIGNAL without a
| |||
setup (F3-T12) — that is a bias, not an entry instruction.
| |||
- Entry signals (actionable) may only be emitted when bound to a valid
| |||
CANDIDATE_SETUP (frozen §J.2).
| |||
Consumer audit: AFAggOut carries NO setup field; AF_Engine2_Aggregator /
| |||
AF_Engine2_Display / AF_Engine3_Render have zero references to the F3 layer.
| |||
```
| |||
| |||
---
| |||
| |||
## L. Tests
| |||
| |||
```text
| |||
New suite: ml/p3/smc_semantic/spec_tests_candidate_setup_runtime.py
| |||
F3-T01..T25 (all 25 required by the brief §15):
| |||
| |||
F3-T01 Valid complete setup (OB) -> ONE CANDIDATE_SETUP
| |||
F3-T02 FVG alternative -> ONE CANDIDATE_SETUP
| |||
F3-T03 No zone -> NO CANDIDATE_SETUP
| |||
F3-T04 Stale sweep (age 41 > 40) -> NO CANDIDATE_SETUP
| |||
F3-T05 CHoCH before sweep -> NO CANDIDATE_SETUP
| |||
F3-T06 CHoCH outside sweep window -> NO CANDIDATE_SETUP
| |||
F3-T07 Wrong direction (chain vs context) -> NO CANDIDATE_SETUP
| |||
F3-T08 H4 conflict -> BLOCKED
| |||
F3-T09 M30 conflict -> BLOCKED
| |||
F3-T10 M15 conflict -> BLOCKED
| |||
F3-T11 M3 opposite -> setup valid, M3=FALSE
| |||
F3-T12 H4-only signal -> signal exists, setup NONE
| |||
F3-T13 High score without setup -> score exists, setup NONE
| |||
F3-T14 Identity stability -> same setup_id across bars
| |||
F3-T15 One entry per setup -> max one entry binding
| |||
F3-T16 Setup expiration (W_setup=40) -> EXPIRED
| |||
F3-T17 Setup invalidation (zone mitigated)-> INVALIDATED
| |||
F3-T18 Setup consumption -> CONSUMED, no 2nd entry
| |||
F3-T19 Two independent setups -> two distinct setup_ids
| |||
F3-T20 Future mutation -> historical setup unchanged
| |||
F3-T21 Zone mitigation before M15 entry -> NO CANDIDATE_SETUP
| |||
F3-T22 Context change after formation -> INVALIDATED (canonical §F)
| |||
F3-T23 Repeated raw state -> one event chain, one setup
| |||
F3-T24 Duplicate formation prevention -> no duplicate setup
| |||
F3-T25 Candidate vs score -> setup EXISTS with low score
| |||
| |||
Discipline: canonical oracle vs expected ASSERT; repaired port (the MQL5
| |||
setup engine) vs oracle ASSERT; legacy port (PRE-F3, P3-S.8 facts) REPORT;
| |||
invariance (future mutation) ASSERT. Report:
| |||
ml/p3/smc_semantic/output/p3_s13_candidate_setup_report.json.
| |||
```
| |||
| |||
---
| |||
| |||
## M. Regression
| |||
| |||
```text
| |||
P3-S.2 Liquidity Sweep 17/17 PASS
| |||
P3-S.3 CHoCH/MSS 20/20 PASS
| |||
P3-S.4 FVG 20/20 PASS
| |||
P3-S.5 Order Block 20/20 PASS
| |||
P3-S.6 Displacement 20/20 PASS
| |||
P3-S.7 MTF Alignment 22/22 PASS
| |||
P3-S.8 Candidate Setup 25/25 PASS
| |||
F1 Event Contract 8/8 PASS
| |||
F2 Zone Contract 20/20 PASS
| |||
F3 Candidate Setup 25/25 PASS
| |||
No suite weakened; no oracle changed. P3-S.4/S.5 still assert the SPEC
| |||
oracle (immutable) and REPORT the legacy code port as historical evidence;
| |||
the repaired Engine-2 behavior is asserted by the F2/F3 suites.
| |||
```
| |||
| |||
---
| |||
| |||
## N. Compilation
| |||
| |||
```text
| |||
MetaEditor build 6140, target AVX512 + FMA3:
| |||
MQL5\Experts\AlgoForge_Engine2_UnitTest.mq5 -> 0 errors, 0 warnings
| |||
MQL5\Indicators\AlgoForge\AF_Engine3_Display.mq5 -> 0 errors, 0 warnings
| |||
MQL5\Experts\AlgoForge_Engine3_UnitTest.mq5 -> 0 errors, 0 warnings
| |||
Engine-2 unit test (Strategy Tester, XAUUSD M15, every tick):
| |||
PASS=35891 FAIL=0 — includes T7a..T7e synthetic setup-layer checks.
| |||
Repo and terminal copies of the modified headers are byte-identical (fc /b).
| |||
```
| |||
| |||
---
| |||
| |||
## O. Explicitly Unchanged Areas
| |||
| |||
```text
| |||
F4 MTF / Training : H4/M30/M15/M3 model, as-of logic, conflict policy,
| |||
hierarchy, train_model.py, build_features.py,
| |||
FEATURE_CONTRACT — untouched.
| |||
F5 Display : render logic untouched (no F5 redesign in F3).
| |||
ML : model, LSTM, regime, meta-label — untouched.
| |||
Legacy v4.3/v4.4/v4.5 : historical evidence only; NOT restored.
| |||
Primitive detection : AF_DetectSweep / AF_DetectChoch / AF_FindFVG /
| |||
AF_FindOrderBlock / AF_DetectDisplacement geometry
| |||
UNCHANGED (F1/F2 repairs retained).
| |||
Flat aggregator : AFAggregator arithmetic unchanged (scoring layer).
| |||
EA (AlgoForge_Backtest_Baseline.mq5) : untouched (its F1 event contract is
| |||
consumed conceptually; no EA edit in F3).
| |||
```
| |||
| |||
---
| |||
| |||
## P. Remaining F4/F5 work
| |||
| |||
```text
| |||
F4 (next gate, P3-S.14): H4/M30/M15/M3 canonical alignment,
| |||
runtime/training MTF mismatch, D1/H4/H1/M15 legacy training path,
| |||
FEATURE_CONTRACT implications. The F3 layer consumes semantic inputs;
| |||
the MTF wiring (Engine-1 slots -> semantic inputs) and any runtime
| |||
integration belong to F4. If F4 discovers the current MTF layer cannot
| |||
provide the required data, that is documented as an F4 blocker — NOT
| |||
modified inside F3.
| |||
F5: display the setup entity (id, stages, lifecycle) instead of the bare
| |||
vote signal in the "TRADE SETUP" panel — deferred, NOT started.
| |||
Phase VI: setup dataset rebuild for training — after F3/F4 validation.
| |||
```
| |||
| |||
---
| |||
| |||
## Q. Forge Commit(s)
| |||
| |||
```text
| |||
1. test: define F3 candidate setup regression coverage
| |||
- ml/p3/smc_semantic/spec_tests_candidate_setup_runtime.py
| |||
- ml/p3/smc_semantic/output/p3_s13_candidate_setup_report.json
| |||
2. feat: implement canonical candidate setup layer
| |||
- MQL5/Include/AlgoForge/AF_Engine2_Setup.mqh (new — F3 layer)
| |||
- MQL5/Include/AlgoForge/AF_Defines.mqh (W_setup/W_m3)
| |||
- MQL5/Include/AlgoForge/AF_Engine2_Agents.mqh (F1 event helpers)
| |||
- MQL5/Experts/AlgoForge_Engine2_UnitTest.mq5 (T7 setup checks)
| |||
3. docs: record P3-S.13 candidate setup implementation
| |||
- docs/P3_S13_CANDIDATE_SETUP_REPAIR.md (this report)
| |||
```
| |||
| |||
---
| |||
| |||
## R. Final Forge HEAD
| |||
| |||
```text
| |||
P3_S13_FINAL_SHA = (recorded after push; see session handover).
| |||
```
| |||
| |||
---
| |||
| |||
## S. Working Tree
| |||
| |||
```text
| |||
local HEAD == remote HEAD, working tree CLEAN (verified after push).
| |||
```
| |||
| |||
---
| |||
| |||
## T. P3-S.14 Readiness
| |||
| |||
```text
| |||
The canonical Candidate Setup entity now exists: one causal chain = one
| |||
setup_id, deterministic lifecycle, H4/M30 gates enforced, fresh sweep +
| |||
CHoCH-after-sweep + unmitigated OB|FVG + M15 entry required, M3 optional,
| |||
score separated from setup existence, future data cannot alter past setup.
| |||
Next gate: P3-S.14 = F4 MTF / Training Alignment. NOT started in this
| |||
session.
| |||
```
| |||
| |||
*End of P3-S.13 F3 candidate setup layer record. No F4/F5/ML change.*
|