SniperGold_ML/docs/P3_S16_SETUP_DATASET_IMPLEMENTATION.md

7.1 KiB

P3-S.16 SETUP-LEVEL DATASET & LABEL CONTRACT — IMPLEMENTATION RECORD

Date       : 2026-08-23
Session    : P3-S.16 — Setup-Level Dataset / Label Contract Implementation.
Status     : IMPLEMENTED (research-only) — deterministic contract + label
             computation + setup-event extraction + tests. NO training.
Baseline   : P3-S.15 checkpoint acb5f2b56d4e8ba6563076a1ee2687cb2c53f421
             VERIFIED (local == origin/main, branch main, working tree CLEAN).
Scope      : RESEARCH-ONLY. NO production runtime change, NO FEATURE_CONTRACT
             change, NO model retrain/export/deploy, NO legacy change.
Human verif: REMAINS CANCELLED (historical only). No AUC/PF/backtest/opt used.

A. OBJECTIVE (restated)

How do we turn ONE verified Candidate Setup into ONE reproducible training observation with a causally valid setup-outcome label, WITHOUT reintroducing the overlap, redundancy, and look-ahead problems of the old bar-level ML pipeline?

P3-S.16 answers this by:

  1. fixing the contract (observation unit = ONE Candidate Setup; entry = close of the creation bar; label = setup-outcome TP-before-SL),
  2. implementing a deterministic, research-only dataset/label generator,
  3. validating it with a test-first suite against the contract as ORACLE, and
  4. recording reproducibility / split / provenance requirements for the future (authorized) training phase.

B. DELIVERABLES

docs/P3_S16_SETUP_DATASET_CONTRACT_v1.md         (contract — observation unit,
                                                  identity, entry, separation,
                                                  de-overlap, feature discipline)
docs/P3_S16_LABEL_CONTRACT.md                     (TPS before-SL outcome contract:
                                                  WIN/LOSS/UNRESOLVED/AMBIGUOUS,
                                                  TP/SL, horizon, first-hit,
                                                  censoring, ambiguity, gap)
ml/p3/setup_dataset/setup_dataset_contract.py      (implementation PORT)
ml/p3/setup_dataset/spec_tests_setup_dataset.py    (test-first; ORACLE = contract)
ml/p3/setup_dataset/output/p3_s16_dataset_report.json (test report: 20/20 PASS)
docs/P3_S16_SETUP_DATASET_IMPLEMENTATION.md        (this record)
docs/SESSION_HANDOVER_<DATE>_P3_S16_SETUP_DATASET.md (handover)

C. IMPLEMENTATION SUMMARY

setup_dataset_contract.py provides:
  - entry_timestamp_of(setup, times) : close of the CANDIDATE_SETUP creation
    bar (contract §D; M3 optional does NOT shift entry).
  - entry_price_of / atr_at_entry     : reference price + ATR at entry.
  - resolve_outcome(...)              : TP-before-SL first-hit resolver with
    WIN/LOSS/UNRESOLVED/AMBIGUOUS and same-bar ambiguity (conservative).
  - build_observation(...)            : ONE setup -> ONE row, with identity_ /
    feature_ / label_ namespaces separated (contract §B/§C).
  - deoverlap_setups / build_dataset  : setup-level lead-setup-per-episode
    de-overlap + duplicate setup_id rejection.
All constants (k_tp/k_sl=1.5/0.75, H=16, robustness H=8) are OPEN parameters
recorded by the contract; none selected by AUC.

D. KEY CONTRACT DECISIONS RECORDED (see the contract docs for full text)

D1 OBSERVATION UNIT : ONE CANDIDATE_SETUP (identity + lifecycle). Bar unit is
      invalid (P3.2.2 §K).
D2 ENTRY TIMESTAMP  : close of the CANDIDATE_SETUP creation bar (M15). Chosen
      on causality, NOT profitability. M3 is optional/post-creation and does
      NOT move entry.
D3 LABEL TARGET     : setup-outcome (TP-before-SL), SEVERED from the legacy
      L1 24-bar direction-drift label. Never UNRESOLVED->LOSS; never
      AMBIGUOUS->WIN/LOSS.
D4 TP/SL            : TP=+k_tp*ATR(entry), SL=-k_sl*ATR(entry); reference ATR
      at entry (causally available); asymmetric 1.5/0.75 candidate (2:1 R:R)
      with 1.0/1.0 symmetry as OPEN robustness.
D5 HORIZON          : primary H=16 M15 bars (semantic: >98% of lifetimes,
      low censoring); robustness H=8; timeout -> UNRESOLVED (censored).
D6 AMBIGUITY        : same-bar TP+SL -> AMBIGUOUS (no OHLC-ordering assumption).
D7 CENSORING        : UNRESOLVED only at timeout / insufficient data / gap;
      never forced to LOSS.
D8 DE-OVERLAP       : setup-level lead-setup-per-episode (analogous P3.2.2 §B
      adapted to setups); independent observations, not metric fishing.
D9 SAMPLING         : every valid Candidate Setup is an observation (natural
      population preserved; no random undersampling).

E. TESTS (test-first; ORACLE = frozen contract)

spec_tests_setup_dataset.py — DS-T01..T16 (brief §27) + DS-17..20:
  DS-T01 one setup -> one observation; DS-T02 same setup stays one;
  DS-T03 two independent setups -> two; DS-T04 duplicate setup_id rejected;
  DS-T05 entry deterministic; DS-T06 future bars cannot alter snapshot;
  DS-T07 TP-before-SL -> WIN; DS-T08 SL-before-TP -> LOSS;
  DS-T09 timeout -> UNRESOLVED; DS-T10 same-bar TP/SL -> AMBIGUOUS;
  DS-T11 insufficient data -> UNRESOLVED; DS-T12 overlapping follow-on;
  DS-T13 independent setup handling; DS-T14 no look-ahead in features;
  DS-T15 closed-bar/as-of correctness; DS-T16 bullish/bearish symmetry;
  DS-17 M3 doesn't move entry; DS-18 UNRESOLVED not forced to LOSS;
  DS-19 AMBIGUOUS not forced; DS-20 implementation port == spec oracle.
RESULT: 20/20 PASS.

F. REGRESSION (§30) — verified PASS after P3-S.16

P3-S.2 17/17 (re-run) · P3-S.7 22/22 (re-run) · P3-S.8 25/25 (re-run) ·
F1 8/8 (re-run) · F2 20/20 (re-run) · F3 25/25 (re-run) · F4 16/16 (re-run).
No historical suite was modified; none weakened by the new research module.

G. EXPLICITLY UNCHANGED / PRODUCTION PROTECTION (§31)

Candidate Setup runtime, F1, F2, F4 runtime MTF, FEATURE_CONTRACT.md,
SniperGold_ML.mqh, production .mq5/.mqh, legacy model: NONE changed.
No model trained/exported/deployed. The new code is research-only under
ml/p3/setup_dataset/.

H. FUTURE SPLIT / REPRODUCIBILITY (defined, not executed — §23/§24)

Temporal split by entry_timestamp; purge gap == outcome horizon; no overlap
between label windows; no future info. Split percentages = OPEN parameters.
Every future run records source-hash, setup-dataset-hash, contract version,
feature version, label version, seed if used, generation timestamp.

I. VERDICT

CONTRACT COMPLETE WITH OPEN PARAMETERS.
Semantics fully settled: observation unit, identity separation, entry timestamp,
TP/SL semantics, horizon basis, WIN/LOSS/UNRESOLVED/AMBIGUOUS, de-overlap,
sampling, feature timing discipline, provenance, split/reproducibility.
OPEN NUMERIC PARAMETERS (not selected by AUC/PF): k_tp/k_sl (default 1.5/0.75),
horizon (primary 16, robustness 8), split percentages, purge-gap numeric,
W_m3 (frozen F3 placeholder). These do not block the contract.

J. NEXT GATE

P3-S.17 = DATASET AUDIT / LABEL VALIDATION (per P3-S.16 §34/§37). No retraining.
The legacy MLP remains frozen as reference. Setups treated as deterministic
training observations; the outcome label is causally valid and reproducible.

End of P3-S.16 setup dataset & label contract implementation record.