forked from chiki2bum2/SniperGold_ML
439 lines
No EOL
19 KiB
Markdown
439 lines
No EOL
19 KiB
Markdown
# P3-S18A LABEL CONTRACT REVIEW — SETUP-OUTCOME SEMANTIC AUDIT
|
|
|
|
```text
|
|
Date : 2026-08-23
|
|
Session : P3-S.18A — OPTION A: LABEL CONTRACT REVIEW
|
|
Status : COMPLETE
|
|
Verdict : PRIMARY LABEL CONTRACT = APPROVED AS V1
|
|
(with documented, additive v2 enrichment recommendations —
|
|
NOT semantic corrections of a defect)
|
|
Scope : RESEARCH / CONTRACT REVIEW ONLY. No ML training, no AUC/PF,
|
|
no parameter optimization, no production/MQL5/Candidate Setup/
|
|
FEATURE_CONTRACT changes, no Tickstory/Dukascopy.
|
|
Human verif: REMAINS CANCELLED (historical only). No performance experiment.
|
|
Contract : docs/P3_S16_LABEL_CONTRACT.md (v1, immutable)
|
|
Baseline : P3-S.17R.2 close ae81f15b18f3e8952e183353357ba02281b6f9e6
|
|
VERIFIED (local == origin/main, branch main, working tree CLEAN).
|
|
```
|
|
|
|
---
|
|
|
|
## A. Latest SESSION_HANDOVER used
|
|
|
|
```text
|
|
docs/SESSION_HANDOVER_2026-08-23_P3_S17R2_VECTORIZE.md
|
|
(committed at HEAD ae81f15 — the NEWEST authoritative handover by commit
|
|
ancestry; read completely before any work.)
|
|
|
|
It records: P3-S.17R.2 = COMPLETE, verdict = FULL PARITY ACHIEVED,
|
|
CHoCH/OB/FVG vectorized == frozen reference (197,032/197,032 each),
|
|
Candidate Setup runtime==research 694==694 (identity 694/694, runtime-only 0,
|
|
research-only 0, per-bar mismatch 0), in-scope population 686 (594 leads /
|
|
92 follow-ons / 0 duplicates), P3-S.17 re-audit completed, label distribution
|
|
WIN 167 / LOSS 404 / UNRESOLVED 18 / AMBIGUOUS 5 (leads), production unchanged,
|
|
ML NOT TOUCHED, P3-S.18 NOT STARTED, next = NEW DECISION SESSION (OPTION A/B/C).
|
|
Verified against Git at session start (local HEAD == remote HEAD == ae81f15,
|
|
branch main, working tree CLEAN).
|
|
```
|
|
|
|
## B. Checkpoint
|
|
|
|
```text
|
|
Starting checkpoint (verified): ae81f15b18f3e8952e183353357ba02281b6f9e6
|
|
local HEAD == origin/main == ae81f15
|
|
branch = main
|
|
working tree = CLEAN
|
|
origin = https://forge.mql5.io/chiki2bum2/SniperGold_ML.git
|
|
P3-S.17R.2 parity-close : ff3202c8be59d9f1073b2f286e219c54f96eb44a
|
|
```
|
|
|
|
## C. Verified Candidate Setup population
|
|
|
|
```text
|
|
Full runtime/research computable population : 694
|
|
P3-S.17 authorized in-scope population : 686
|
|
De-overlap (lead-per-episode, horizon 16) : 594 leads / 92 follow-ons
|
|
Duplicate setup_ids rejected : 0
|
|
De-overlap separation verified : TRUE
|
|
|
|
LEAD LABEL DISTRIBUTION (open params k_tp=1.5, k_sl=0.75, H=16):
|
|
WIN : 167 (28.1%)
|
|
LOSS : 404 (68.0%)
|
|
UNRESOLVED : 18 (3.0%)
|
|
AMBIGUOUS : 5 (0.8%)
|
|
|
|
ALL (before de-overlap): WIN 190 / LOSS 469 / UNRESOLVED 22 / AMBIGUOUS 5.
|
|
```
|
|
|
|
## D. Current label contract (under review)
|
|
|
|
```text
|
|
P3_S16_LABEL_CONTRACT v1 (immutable):
|
|
UNIT : ONE Candidate Setup (identity + lifecycle, F3-frozen).
|
|
ENTRY : CLOSE of the CANDIDATE_SETUP creation bar (M15).
|
|
PRICE : creation-bar close (mid reference; spread/slippage out of scope).
|
|
ATR : rolling 14-bar M15 ATR ending at the entry bar (reference at
|
|
entry, causally available).
|
|
TP : entry + direction * k_tp * ATR (k_tp = 1.5 candidate)
|
|
SL : entry - direction * k_sl * ATR (k_sl = 0.75 candidate)
|
|
HORIZON : H = 16 M15 bars (robustness H = 8; lifetime-based, not tuned).
|
|
CLASSES : WIN (TP before SL) / LOSS (SL before TP) /
|
|
UNRESOLVED (neither within H or insufficient data or gap —
|
|
true censoring, never forced to LOSS) /
|
|
AMBIGUOUS (same-bar TP+SL — no OHLC-ordering assumption).
|
|
DE-OVERLAP : setup-level lead-per-episode (follow-ons reported, excluded
|
|
from the primary independent set).
|
|
```
|
|
|
|
## E. Entry semantics review
|
|
|
|
```text
|
|
Question : does entry = CLOSE of the creation bar represent "the moment the
|
|
setup becomes actionable"?
|
|
|
|
Findings:
|
|
- The chain COMPLETES at creation_bar (CANDIDATE_SETUP); direction fixed;
|
|
the M15 entry condition is already satisfied by construction at that bar.
|
|
- The first causally-available executable point after completion is the
|
|
creation-bar close (P3.2 §6 A: |A-B| ~ 0.008 ATR vs next-bar open — not
|
|
material). This is a CLOSED-bar, no-look-ahead choice.
|
|
- M3 is OPTIONAL and occurs AFTER creation; it does not define entry and
|
|
cannot precede entry without breaking its optional/no-veto semantics
|
|
(canonical §F/OD-4). No semantic contradiction: M3_CONFIRMED upgrades the
|
|
same setup AFTER entry; entry is unchanged.
|
|
|
|
VERDICT : ENTRY SEMANTICS = SEMANTICALLY APPROPRIATE.
|
|
```
|
|
|
|
## F. TP/SL review
|
|
|
|
```text
|
|
Question : does TP = +k_tp*ATR, SL = -k_sl*ATR measure setup VALIDATION
|
|
(did the expected outcome occur before the invalidation boundary)
|
|
rather than mere price excursion?
|
|
|
|
Findings:
|
|
- TP/SL are anchored at ATR(entry) in the setup direction — the level whose
|
|
first hit decides WIN/LOSS — i.e., an outcome-resolver with a 2:1 semantic
|
|
ratio candidate (1.5/0.75), not a drift measure (L1 is severed, P3.2 B).
|
|
- The constants are OPEN parameters recorded by contract §D, explicitly
|
|
NOT AUC/PF/profit/win-rate selected.
|
|
- The LOSS-heavy (68.0%) distribution under these open parameters is a
|
|
contract/data observation, not a defect and not an optimization input
|
|
(§18 of the brief prohibits changing TP/SL because the WIN rate looks low).
|
|
|
|
VERDICT : TP/SL SEMANTICS = SEMANTICALLY APPROPRIATE (constants remain OPEN).
|
|
```
|
|
|
|
## G. Horizon review
|
|
|
|
```text
|
|
Question : does H=16 mean "setup remains valid for 16 bars" or merely "the
|
|
label observes price for 16 bars"? Are these conflated?
|
|
|
|
Findings:
|
|
- P3.2/P3.2.2 lifetime evidence: outcomes mostly occur within 1-8 M15 bars;
|
|
~90% <= 8; >98% <= 16. H=16 is the LABEL OBSERVATION WINDOW, chosen on
|
|
lifetime evidence, NOT a runtime validity claim.
|
|
- The runtime Candidate Setup validity (W_setup placeholder 40) is a
|
|
SEPARATE, still-OPEN parameter and is NOT the label horizon. The label
|
|
contract does not claim the setup "remains valid for 16 bars" — it
|
|
observes the price path for 16 bars after entry to resolve TP/SL.
|
|
- Censoring at H=16 is low (3.0% of leads UNRESOLVED), consistent with
|
|
P3.2.2 (§G).
|
|
|
|
VERDICT : HORIZON = SEMANTICALLY APPROPRIATE (label window; distinct from
|
|
runtime validity; not conflated). H stays OPEN at 16 (robustness 8).
|
|
```
|
|
|
|
## H. WIN/LOSS review
|
|
|
|
```text
|
|
Question : is binary TP-before-SL sufficient as the PRIMARY label?
|
|
|
|
Findings:
|
|
- P3.2 scorecard: L3 (TP-before-SL) is the ONLY family meeting the
|
|
meta-labeling requirements (causal, SMC-aligned, event/setup-specific,
|
|
low ambiguity 1-3%, low censoring at H16+, binary, economically
|
|
interpretable).
|
|
- A setup can reach meaningful favorable excursion without TP, remain
|
|
structurally valid, become invalidated/consumed, or time out — all of
|
|
these are captured as LOSS (SL first), UNRESOLVED (censored), or are
|
|
secondary diagnostics; they do NOT need extra primary classes at v1.
|
|
- L2 (MFE/MAE) and L4 (time-to-outcome) remain DESCRIPTIVE complements,
|
|
not primary classification targets (§16).
|
|
|
|
VERDICT : WIN/LOSS = SEMANTICALLY APPROPRIATE AS THE PRIMARY LABEL.
|
|
```
|
|
|
|
## I. UNRESOLVED review
|
|
|
|
```text
|
|
Question : are the UNRESOLVED sub-cases equivalent, and should the primary
|
|
target preserve one class or a granular reason code?
|
|
|
|
Findings:
|
|
- Diagnostic on the real population: ALL 22 UNRESOLVED (all-population)
|
|
carry reason "timeout" — zero "insufficient_future_data" in the
|
|
authorized scope (the 686 in-scope setups all have 16 future bars
|
|
available within the feed). The implementation already distinguishes
|
|
internally (timeout vs insufficient_future_data vs gap) even though the
|
|
primary field is a single UNRESOLVED class.
|
|
- These sub-cases are NOT numerically merged into a single semantic at v1;
|
|
the reason is preserved in the resolver and can be surfaced as a
|
|
secondary code.
|
|
|
|
VERDICT : UNRESOLVED = SEMANTICALLY APPROPRIATE as a single primary class,
|
|
with an internal reason (recommended: expose as a secondary field
|
|
in v2 — additive, not a defect correction).
|
|
```
|
|
|
|
## J. AMBIGUOUS review
|
|
|
|
```text
|
|
Question : is same-bar TP+SL = AMBIGUOUS correct, and should tick-level
|
|
chronology stay out of the primary contract?
|
|
|
|
Findings:
|
|
- From OHLC, a same-bar TP AND SL cannot be causally ordered (which touched
|
|
first is undecidable without tick chronology). Classifying AMBIGUOUS
|
|
deterministically (never WIN/LOSS) is the honest contract (§F).
|
|
- Tick-level/lower-timeframe reconstruction remains a SEPARATE, authorized
|
|
future revision; Tickstory/Dukascopy is NOT introduced (§26).
|
|
- Real population: 5 AMBIGUOUS leads (0.8%) — low, intrinsic class.
|
|
|
|
VERDICT : AMBIGUOUS = SEMANTICALLY APPROPRIATE as an intrinsic label class.
|
|
```
|
|
|
|
## K. De-overlap review
|
|
|
|
```text
|
|
Question : is lead-setup-per-episode exclusion conceptually appropriate?
|
|
|
|
Findings:
|
|
- Follow-on setups share the previous setup's outcome window (creation
|
|
within [prev.entry, prev.entry+H]) -> NOT independent samples. Keeping
|
|
the first of each episode (lead) and reporting the rest is the P3.2.2
|
|
setup-level adaptation; verified separation > H (TRUE).
|
|
- 594 leads / 92 follow-ons / 0 duplicates; serial-dependence evidence from
|
|
P3.2.2 (§J: ac1 0.5 -> ~0 after de-overlap on the old event units).
|
|
- Same-zone reuse / repeated direction / overlapping lifecycles are
|
|
recognized as possible future refinements (episode weighting) but are not
|
|
a v1 defect: the rule guarantees independent training observations.
|
|
|
|
VERDICT : DE-OVERLAP = CORRECT (neither too aggressive nor too weak for v1;
|
|
possible episode-level refinements recorded for future design).
|
|
```
|
|
|
|
## L. Lifecycle vs label lifetime
|
|
|
|
```text
|
|
Question : can a setup expire/invalidate/consume before TP/SL, and should
|
|
that affect the label?
|
|
|
|
Findings (runtime truth — canonical §F, P3.2.2 §I):
|
|
- A setup CAN be lifecycle-terminated (EXPIRED after W_setup, INVALIDATED
|
|
by zone mitigation / contrary CHoCH / context break, CONSUMED by entry)
|
|
INDEPENDENTLY of TP/SL.
|
|
- P3.2.2 §I: on the setup/event lifetime, SL (price) is the DE-FACTO
|
|
invalidator — opposite-structure invalidation is much slower
|
|
(median ~22-24 bars) than the outcome (1-3 bars). So TP/SL-first remains
|
|
the authoritative primary resolution.
|
|
- FINDING (implementation gap, not a contract defect): the current dataset
|
|
rows carry label_invalidated_early=False uniformly. The F3 registry keeps
|
|
creation-time snapshots (state=CANDIDATE_SETUP, m3_bar=None), so the
|
|
canonical terminal state (EXPIRED/INVALIDATED/CONSUMED), its cause and
|
|
timing, and M3 confirmation are NOT yet wired into the population rows.
|
|
This is a SECONDARY-diagnostic wiring gap — it does not change the
|
|
primary label, but it means lifecycle information is currently NOT
|
|
preserved in rows for future design.
|
|
|
|
VERDICT : PRIMARY LABEL UNAFFECTED (price-first-hit authoritative).
|
|
SECONARY LIFECYCLE WIRING = REVIEW REQUIRED -> recommended v2
|
|
enrichment (terminal cause + timing + M3 presence as secondary
|
|
fields). This is additive and evidence-based, NOT a correction of
|
|
the primary TP-before-SL semantics.
|
|
```
|
|
|
|
## M. Label family recommendation
|
|
|
|
```text
|
|
Preserve, in future rows (information preservation — §16/§19):
|
|
PRIMARY L3 : TP-before-SL (WIN/LOSS/UNRESOLVED/AMBIGUOUS) — keep as the
|
|
classification target.
|
|
SECONDARY (descriptive, NOT classification targets):
|
|
- L4 time-to-TP / time-to-SL (survival-compatible),
|
|
- L2 MFE/MAE descriptors,
|
|
- invalidation cause + timing (EXPIRED / INVALIDATED / CONSUMED),
|
|
- UNRESOLVED reason code (timeout / insufficient_future_data / gap).
|
|
|
|
Design intent: never destroy useful outcome information in the dataset even
|
|
when only L3 is used for training. Recommended v2 = single file v2 with the
|
|
secondary fields added; v1 remains immutable (§23).
|
|
```
|
|
|
|
## N. Feature/label separation (leakage audit)
|
|
|
|
```text
|
|
Audited against the contract and the implementation:
|
|
- entry = creation-bar close -> features are causally available at entry;
|
|
- labels scan ONLY bars AFTER entry within H (first-hit);
|
|
- no feature references post-entry movement, future mitigation, future
|
|
CHoCH, future zone state, or MFE/MAE;
|
|
- the immutable identity (Store 1) never encodes the outcome; the label
|
|
(Store 3) never enters the feature store (Store 2);
|
|
- closed-bar/as-of lock verified by DS-T06/T14/T15 + VEC-T04.
|
|
|
|
VERDICT : FEATURE/LABEL SEPARATION = PASS (no leakage).
|
|
```
|
|
|
|
## O. Label distribution observations (diagnostic only)
|
|
|
|
```text
|
|
From the verified 686 in-scope population (leads = 594), descriptive only,
|
|
NO parameter or filter change derived from these:
|
|
|
|
ALL : WIN 190 | LOSS 469 | UNRESOLVED 22 | AMBIGUOUS 5
|
|
LEAD : WIN 167 | LOSS 404 | UNRESOLVED 18 | AMBIGUOUS 5
|
|
|
|
Direction (leads) : -1 (short): WIN 90 / LOSS 198 / U 7 / A 4 (n=299)
|
|
+1 (long) : WIN 77 / LOSS 206 / U 11 / A 1 (n=295)
|
|
Zone type (leads) : OB: n=594 (ALL leads are OB — no FVG-based lead in the
|
|
in-scope population under the current chain inputs;
|
|
FVG remains a valid alternative per contract §C, and
|
|
the OB-only outcome is a population composition
|
|
observation, not a defect)
|
|
Year (leads) : 2017:4, 2018:50, 2019:64, 2020:70, 2021:82, 2022:75,
|
|
2023:68, 2024:67, 2025:83, 2026:31 — LOSS-heavy in
|
|
every year.
|
|
H4/M30 gates : equal to setup direction by construction (hard gates);
|
|
no independent gate-vs-direction split exists in this
|
|
population.
|
|
Time-to-event (leads): median TP hit = 3 bars, median SL hit = 2 bars
|
|
(bars after entry) — SL resolves faster, consistent
|
|
with P3.2.2 §G (SL ~2:1 faster than TP).
|
|
UNRESOLVED reason : all in-scope UNRESOLVED = timeout (no insufficient-
|
|
data case inside the authorized window).
|
|
|
|
These are diagnostics; NO conclusion about strategy profitability/model
|
|
validity shall be drawn from them (§6, §10, §18).
|
|
```
|
|
|
|
## P. Final contract decision
|
|
|
|
```text
|
|
DECISION : APPROVED AS V1
|
|
|
|
The primary P3-S.16 setup-outcome label contract is SEMANTICALLY
|
|
APPROPRIATE for the verified Candidate Setup population:
|
|
entry (creation-bar close) : APPROPRIATE
|
|
TP/SL (ATR-anchored, 2:1 candidate): APPROPRIATE (constants OPEN)
|
|
horizon (H=16 label window) : APPROPRIATE (distinct from runtime W)
|
|
WIN/LOSS primary : APPROPRIATE (meta-labeling-suitable)
|
|
UNRESOLVED single class : APPROPRIATE (reason preserved)
|
|
AMBIGUOUS intrinsic class : APPROPRIATE
|
|
de-overlap lead-per-episode : CORRECT
|
|
feature/label separation : PASS (no leakage)
|
|
|
|
Rationale for NOT revising:
|
|
- The LOSS-heavy distribution (68%) is a CONTRACT/DATA observation under
|
|
OPEN parameters; revising because the WIN rate looks low is explicitly
|
|
prohibited (§18) and would be hidden optimization.
|
|
- The only gap found (secondary lifecycle wiring: invalidation cause,
|
|
terminal state, M3 presence, UNRESOLVED reason, L2/L4 descriptors not
|
|
yet surfaced in rows) is ADDITIVE and does not invalidate the primary
|
|
TP-before-SL semantics; it is RECOMMENDED as v2 enrichment, not required
|
|
as a correction.
|
|
|
|
Recommended (non-blocking, separately-authorizable):
|
|
P3-S18B = implement P3_S16_LABEL_CONTRACT_v2 (add secondary fields:
|
|
invalidation cause/timing, terminal state, M3 presence, UNRESOLVED reason,
|
|
time-to-event, MFE/MAE) while keeping v1 immutable and the primary L3
|
|
target unchanged.
|
|
```
|
|
|
|
## Q. Versioning
|
|
|
|
```text
|
|
P3_S16_LABEL_CONTRACT v1 : REMAINS IMMUTABLE (this review does NOT edit it).
|
|
P3_S16_SETUP_DATASET_CONTRACT v1 : REMAINS IMMUTABLE.
|
|
If the recommended enrichment is authorized -> create
|
|
docs/P3_S16_LABEL_CONTRACT_v2.md (and/or dataset contract v2)
|
|
as NEW files in a separate phase (P3-S18B). No silent rewrite.
|
|
```
|
|
|
|
## R. Production files unchanged
|
|
|
|
```text
|
|
NO MQL5 CHANGES. Unchanged: MQL5/** production files, AF_Engine2_Setup.mqh,
|
|
AF_Engine2_Agents.mqh, AF_Defines.mqh, F1/F2/F3/F4 runtime semantics,
|
|
FEATURE_CONTRACT.md, SniperGold_ML.mqh, model weights, legacy v4.x
|
|
semantics, the frozen P3-S.16 v1 contract, and every historical spec suite.
|
|
```
|
|
|
|
## S. ML status
|
|
|
|
```text
|
|
NOT TOUCHED. No MLP / LSTM / Informer / regime / calibration / retraining /
|
|
model comparison / AUC / PF / profit / win-rate selection performed or
|
|
started by this review. Legacy MLP remains FROZEN LEGACY / REFERENCE.
|
|
```
|
|
|
|
## T. Forge commits
|
|
|
|
```text
|
|
1. research: review P3-S18A setup-outcome label contract (OPTION A)
|
|
(script + label-distribution CSV + review JSON) [P3_S18A_FINAL_SHA head]
|
|
2. docs: record P3-S18A label contract review (this document)
|
|
```
|
|
|
|
## U. Final Forge HEAD
|
|
|
|
```text
|
|
P3_S18A_FINAL_SHA : <recorded after the docs commit and push (see provenance)>
|
|
```
|
|
|
|
## V. Working tree
|
|
|
|
```text
|
|
local HEAD == remote HEAD, branch main, working tree CLEAN (verified after
|
|
push). Regression suites re-run green during the session: P3-S16 20/20,
|
|
VEC 15/15, full-scope reference==vectorized zero mismatch, chain parity
|
|
694==694 — no historical suite modified or weakened.
|
|
```
|
|
|
|
## W. P3-S.18 readiness
|
|
|
|
```text
|
|
P3-S.18 (setup-level baseline ML) is NOT started by this session. With the
|
|
label contract APPROVED AS V1, P3-S.18 may be authorized SEPARATELY by the
|
|
owner (baseline hierarchy: linear/logistic -> simple tree -> small MLP; no
|
|
LSTM/Informer/regime first). If the owner prefers the v2 secondary-field
|
|
enrichment first, that is P3-S18B (separate authorization). Both require an
|
|
explicit owner decision; parity/review does NOT auto-select either.
|
|
```
|
|
|
|
---
|
|
|
|
## Provenance / evidence
|
|
|
|
```text
|
|
Script : ml/p3/setup_dataset/spec_tests_s18a_label_review.py
|
|
(reuses the byte-locked R.2 chain — identical inputs, gate
|
|
cache, sweep port, vectorized kernels; writes NEW artifacts)
|
|
Outputs : ml/p3/setup_dataset/output/p3_s18a_label_distribution.csv
|
|
ml/p3/setup_dataset/output/p3_s18a_label_review.json
|
|
Reference : docs/P3_S16_LABEL_CONTRACT.md, P3_S16_SETUP_DATASET_CONTRACT_v1.md,
|
|
P3_2_LABEL_FORENSIC.md, P3_2_2_DEOVERLAP_SURVIVAL.md,
|
|
SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md,
|
|
P3_S17R2_VECTORIZE_CH0CH_OB_FVG.md
|
|
Regression : P3-S16 20/20 (re-run), VEC 15/15 (re-run, FULL PARITY ACHIEVED),
|
|
note: re-running the committed output JSONs rewrote only
|
|
generated_utc/elapsed fields — those committed artifacts were
|
|
restored byte-identical (no historical suite weakened).
|
|
```
|
|
|
|
*End of P3-S18A label contract review. Decision: APPROVED AS V1 (primary
|
|
semantics appropriate for the verified Candidate Setup population), with
|
|
recommended additive v2 secondary-field enrichment pending separate owner
|
|
authorization. No ML, no optimization, no production change.* |