249 lines
12 KiB
Markdown
249 lines
12 KiB
Markdown
|
|
# SMC MTF / TRAINING ALIGNMENT — PROJECT SEMANTIC SPECIFICATION v1
|
||
|
|
|
||
|
|
```text
|
||
|
|
Status : ALIGNMENT CONTRACT (not a new runtime architecture)
|
||
|
|
Session : P3-S.14 — F4 MTF / Training Alignment
|
||
|
|
Date : 2026-08-23
|
||
|
|
Scope : Determine and, where safely possible, ALIGN the runtime/training MTF
|
||
|
|
semantics with the frozen canonical SniperGold model H4/M30/M15/M3,
|
||
|
|
WITHOUT changing the Candidate Setup architecture, WITHOUT retraining
|
||
|
|
ML, and WITHOUT changing F1/F2 semantics.
|
||
|
|
Provenance: Forge HEAD 1c0da62407fc905fb96732ec0f6ec5c43d136a8b (P3-S.13)
|
||
|
|
docs/SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md (frozen, P3-S.10)
|
||
|
|
docs/P3_S7_MTF_ALIGNMENT_CONFORMANCE.md (prior MTF audit)
|
||
|
|
docs/SMC_MTF_ALIGNMENT_SPEC_v1.md (P3-S.7 semantic spec)
|
||
|
|
docs/FEATURE_CONTRACT.md (P2 source of truth)
|
||
|
|
docs/P2_SOURCE_OF_TRUTH_REPORT.md (P2.1-P2.5)
|
||
|
|
ml/parity/RUNTIME_TRAINING_PARITY_REPORT.md (SB-06)
|
||
|
|
ml/train_model.py, ml/build_features.py, ml/parity/build_features_p2.py
|
||
|
|
MQL5/Experts/AlgoForge_Backtest_Baseline.mq5
|
||
|
|
Human verification : CANCELLED (historical only)
|
||
|
|
This document is an ALIGNMENT CONTRACT, not a retraining authorization.
|
||
|
|
No production code, no model file, no Feature Contract changed by F4.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## A. OBJECTIVE
|
||
|
|
|
||
|
|
```text
|
||
|
|
Answer the single F4 question:
|
||
|
|
|
||
|
|
Does the existing training/ML feature pipeline (D1/H4/H1 + M15, 19 features)
|
||
|
|
represent the SAME multi-timeframe information and as-of timing semantics as
|
||
|
|
the frozen canonical runtime/setup model H4/M30/M15/M3?
|
||
|
|
|
||
|
|
Establish WHERE the two MTF models differ, WHY, and WHAT must eventually change —
|
||
|
|
as an alignment contract, using source/timeframe/as-of/formula/window/closed-bar/
|
||
|
|
consumer-meaning evidence (NOT model performance).
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## B. THE TWO MTF MODELS (frozen facts)
|
||
|
|
|
||
|
|
```text
|
||
|
|
RUNTIME CANONICAL (SETUP LAYER) [frozen, P3-S.10 canonical contract]
|
||
|
|
H4 = Narrative / Context Gate (STATE, direction-compatible HARD gate)
|
||
|
|
M30 = Context Gate (STATE, direction-compatible HARD gate)
|
||
|
|
M15 = Entry / Chain Carrier (setup layer; events/zones/condition live here)
|
||
|
|
M3 = Price Action / optional Micro Confirmation (no veto)
|
||
|
|
Engine 2 agents run on H4/M30/M15/M3 (AF_E2_TF_S1..S4).
|
||
|
|
Candidate Setup (F3) consumes H4/M30 gates + M15 chain + optional M3.
|
||
|
|
|
||
|
|
TRAINING / ML FEATURE PATH [P2 source-of-truth, FEATURE_CONTRACT f0-f18]
|
||
|
|
M15 = base decision bar (every feature is an M15-bar computation)
|
||
|
|
D1 = f0 htf1_bias (HTF bias)
|
||
|
|
H4 = f1 htf2_bias (HTF bias)
|
||
|
|
H1 = f2 htf3_bias (HTF bias)
|
||
|
|
f3-f18 all computed on M15 bars.
|
||
|
|
NO M30 feature, NO M3 feature. NO D1/H1 in the setup model.
|
||
|
|
|
||
|
|
OVERLAP
|
||
|
|
M15 (base): shared decision layer. Present in both.
|
||
|
|
H4: present in BOTH, but with different ROLE:
|
||
|
|
runtime/setup: H4 is a HARD directional GATE (required, direction-compatible).
|
||
|
|
training/ML: H4 bias is ONE of three HTF bias features (f1), a soft
|
||
|
|
numeric input into an MLP; never a gate.
|
||
|
|
D1, H1: training/ML only (no canonical setup role).
|
||
|
|
M30, M3: runtime/setup only (no training/ML representation).
|
||
|
|
```
|
||
|
|
|
||
|
|
```text
|
||
|
|
CONSEQUENCE (already recorded P3-S.7 D-5 + S-PR):
|
||
|
|
The two MTF models are DIFFERENT. The feature pipeline carries NONE of the
|
||
|
|
M30/M3 semantic content that the canonical Candidate Setup relies on as
|
||
|
|
required gates/confirmation, and carries extra D1/H1 biases the setup layer
|
||
|
|
does not use. The ML features do NOT mathematically represent the full
|
||
|
|
canonical runtime/setup information set.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## C. AS-OF / CLOSED-BAR CONTRACT (both models must satisfy, per decision bar t)
|
||
|
|
|
||
|
|
For a decision at decision-bar time `t` (decision bar = newest CLOSED bar on the
|
||
|
|
base M15 layer; `tc = t + 900s` = the M15 close time):
|
||
|
|
|
||
|
|
```text
|
||
|
|
Runtime canonical (setup layer, Engine 1 closed-bar lock):
|
||
|
|
H4_asof(t) : newest CLOSED H4 bar with close_time <= t
|
||
|
|
M30_asof(t) : newest CLOSED M30 bar with close_time <= t
|
||
|
|
M15_asof(t) : newest CLOSED M15 bar with close_time <= t (= decision bar)
|
||
|
|
M3_asof(t) : newest CLOSED M3 bar with close_time <= t
|
||
|
|
Invariant : HTF/M15/M3 close_time <= t for every consumed value.
|
||
|
|
|
||
|
|
Training / ML feature path (FEATURE_CONTRACT E_ea, corrected P2.5):
|
||
|
|
For HTF in {D1, H4, H1}:
|
||
|
|
E_ea(t) : newest HTF bar whose close_time <= tc
|
||
|
|
= searchsorted(ht, tc - period_sec, side='right') - 1
|
||
|
|
Closed-bar: the 200 newest CLOSED HTF bars ending at E_ea; bias = tf_bias_asof(E_ea).
|
||
|
|
M15 base features: computed on the newest CLOSED M15 bar at tc.
|
||
|
|
```
|
||
|
|
|
||
|
|
```text
|
||
|
|
REQUIRED SEMANTIC PARITY (both sides):
|
||
|
|
- same source timeframe D1/H4/H1 + M15 (ML) vs H4/M30/M15/M3 (setup)
|
||
|
|
- same as-of timestamp as-of <= t / <= tc (closed bar only)
|
||
|
|
- same closed-bar semantics no forming bar, no partial HTF candle
|
||
|
|
- same formula per feature (runtime BTTFBias == training tf_bias_asof)
|
||
|
|
- same window per feature (200-newest-HTF; 700-M15 slice; etc.)
|
||
|
|
- same handling of missing/short history (neutral 0 / "Neutral" wait)
|
||
|
|
```
|
||
|
|
|
||
|
|
```text
|
||
|
|
RUNTIME vs TRAINING AS-OF EQUIVALENCE (verified)
|
||
|
|
Runtime BTTFBias (200 newest CLOSED cache bars) == training tf_bias_asof(E_ea)
|
||
|
|
on the CORRECTED feed → P2.5 parity f0 1/14850, f1 1/14850, f2 0/14850
|
||
|
|
(2 residual exception rows = cache staleness at session-break boundary; TOLERATED).
|
||
|
|
→ D1/H4/H1 bias semantics CAN be aligned exactly (P2.1 fix made them equal).
|
||
|
|
→ M30/M3 lead NO training feature, by construction of the Feature Contract.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## D. FEATURE-LEVEL MTF MAP (f0-f18)
|
||
|
|
|
||
|
|
See the accompanying `docs/P3_S14_MTF_TRAINING_ALIGNMENT.md` §C for the full
|
||
|
|
19-row table. Summary classification:
|
||
|
|
|
||
|
|
```text
|
||
|
|
f0 (D1 bias) : M15 decision + D1 as-of : training/ML only (setup has no D1)
|
||
|
|
f1 (H4 bias) : M15 decision + H4 as-of : BOTH (role differs: gate vs soft feature)
|
||
|
|
f2 (H1 bias) : M15 decision + H1 as-of : training/ML only (setup has no H1)
|
||
|
|
f3-f5 : M15 only (structure/trend) : shared base (M15 in both)
|
||
|
|
f6 : M15 eq position : shared base
|
||
|
|
f7 : M15 sweep (F1 event) : shared base; M15-internal
|
||
|
|
f8-f9 : M15 CHoCH/confirm (F1/event) : shared base; M15-internal
|
||
|
|
f10-f11 : M15 EQH/EQL : shared base
|
||
|
|
f12-f13 : M15 delta : shared base
|
||
|
|
f14-f17 : M15 distance/mom/range : shared base
|
||
|
|
f18 : confluence (derived) : derived from M15 base + f0-f2
|
||
|
|
|
||
|
|
=> NONE of f0-f18 is computed on M30 or M3.
|
||
|
|
=> The runtime H4 gate bias (f1, when adapted) is the ONLY runtime-level input
|
||
|
|
that the current feature set carries for the canonical HTF stack, and it
|
||
|
|
carries NO notion of the H4/M30 "gate with direction compatibility".
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## E. HTF BIAS SEMANTICS — RUNTIME vs TRAINING
|
||
|
|
|
||
|
|
```text
|
||
|
|
RUNTIME (AlgoForge_Backtest_Baseline.mq5 BTTFBias, after P2.1 fix):
|
||
|
|
source : Engine-1 cache slot (D1/H4/H1); closed-bar lock
|
||
|
|
window : the 200 NEWEST closed bars of the cache (bars[199..0])
|
||
|
|
pivot : fractal swing s=3 (+/-3)
|
||
|
|
break : close[i] > up (bull) / < dn (bear); loop excludes the newest bar
|
||
|
|
warm-up : need < 120 -> "Neutral" (0)
|
||
|
|
as-of : the M15 decision bar t; cache holds bars with close_time <= tc
|
||
|
|
|
||
|
|
TRAINING (tf_bias_asof + build_features_p2 bias_series):
|
||
|
|
source : HTF npz arrays (D1/H4/H1)
|
||
|
|
window : tf_bias_asof(k) over [max(0,k-199) .. k] (200 bars ending at E_ea)
|
||
|
|
pivot : fractal swing s=3 (+/-3) [identical]
|
||
|
|
break : close[i] > up / < dn; loop excludes bar k (inert) [identical]
|
||
|
|
warm-up : m < s+2 -> 0 ["Neutral" equivalent]
|
||
|
|
as-of : E_ea = searchsorted(ht, tc - period, 'right') - 1 [P2.1 corrected]
|
||
|
|
|
||
|
|
CLASSIFICATION of the residual differences (P2.1/P2.2/P2.5):
|
||
|
|
- 50-bar cache-lag EA bug (D1 50d / H4 ~8.3d / H1 ~2.1d) : BUG -> FIXED (P2.1)
|
||
|
|
- gap at session-break boundary (Refresh-on-Bars-change) : LEGACY DESIGN
|
||
|
|
Engine 1 rebuild-on-Bars-change cache staleness edge; documented, TOLERATED.
|
||
|
|
- legacy v4.4 "200 newest incl. forming" vs contract "200 newest CLOSED"
|
||
|
|
(E_ea, inert forming bar) : INTENTIONAL DIFFERENCE
|
||
|
|
(contract = non-look-ahead deterministic definition; documented P2.1 §5)
|
||
|
|
No remaining runtime/training HTF-bias BUG after the P2.1 fix for D1/H4/H1.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## F. TRAINING MTF MODEL — PROVENANCE (forensic)
|
||
|
|
|
||
|
|
```text
|
||
|
|
WHY training uses D1/H4/H1 + M15 (no M30/M3):
|
||
|
|
A. LEGACY v4.4 architecture — the original SniperGold SMC Pro+ had exactly
|
||
|
|
three HTF biases (D1/H4/H1) via TFBias()+chart M15. The 19-feature MLP was
|
||
|
|
trained on that feature set (README "baseline MLP 19->12->2 ... not reused
|
||
|
|
in AlgoForge"; FEATURE_CONTRACT §4 provenance P2.1-P2.3). It carries the
|
||
|
|
v4.4 D1/H4/H1 MTF model forward.
|
||
|
|
B. Historical model freeze — the deployed SniperGold_ML.mqh (AUC 0.627/0.621,
|
||
|
|
freeze v20260821_2head) was trained on the OLD v4.4 feature semantics; the
|
||
|
|
P2-corrected feed (build_features_p2) was NOT integrated into train_model.py
|
||
|
|
(P2 §F). The model weights remain a frozen artifact of the D1/H4/H1+M15 feed.
|
||
|
|
C. Documentation drift — the canonical H4/M30/M15/M3 model is a NEWER design
|
||
|
|
(Algo Forge 3-engine refactor, P3-S.7+); the Feature Contract (f0-f18) kept
|
||
|
|
the legacy HTF set. FEATURE_CONTRACT was documented to describe the ML path
|
||
|
|
only, and P3-S.7 S-PR explicitly records the "FEATURE_CONTRACT MTF MISMATCH".
|
||
|
|
This is intentional (two MTF models coexist), not a silent bug.
|
||
|
|
D. NOT a simple bug — the divergence is architectural (legacy ML feed vs newer
|
||
|
|
setup model), documented in P3-S.7 §14 and P3-S.12 §P. It is not an
|
||
|
|
accidental bit-error; it is a deliberate-but-unreconciled historic fork.
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## G. ALIGNMENT OPTIONS (evaluated on SEMANTICS, not AUC)
|
||
|
|
|
||
|
|
```text
|
||
|
|
OPTION A — Align ML directly to H4/M30/M15/M3
|
||
|
|
add M30/M3 inputs + drop D1/H1 -> one canonical MTF everywhere.
|
||
|
|
Cost: new feature set, new training dataset, new model; the frozen 19-feature
|
||
|
|
model becomes non-comparable. Static MLP retrain required (FUTURE phase).
|
||
|
|
|
||
|
|
OPTION B — Keep the ML feature architecture, MAP it explicitly
|
||
|
|
keep d0-f18 (D1/H4/H1 + M15) as the ML feed, and DOCUMENT an explicit mapping
|
||
|
|
between (f1=H4 bias) and the runtime H4 gate, and between the M15 base features
|
||
|
|
and the M15 setup carrier. M30/M3 remain unrepresented in ML (documented gap).
|
||
|
|
Less disruptive; preserves the existing model; does NOT give ML the M30/M3
|
||
|
|
gate content.
|
||
|
|
|
||
|
|
OPTION C — Retire the current static ML architecture
|
||
|
|
only if evidence shows the frozen MLP cannot be meaningfully aligned (e.g., it
|
||
|
|
predates the canonical setup and encodes a divergent v4.4 semantics).
|
||
|
|
Not settled by performance; settled by semantic consistency.
|
||
|
|
|
||
|
|
F4 RECOMMENDATION (see docs/P3_S14_MTF_TRAINING_ALIGNMENT.md §J region):
|
||
|
|
The 19-feature D1/H4/H1+M15 MLP is semantically a DIFFERENT model from the
|
||
|
|
H4/M30/M15/M3 Candidate Setup. It is not "the same information written
|
||
|
|
differently": it is missing M30/M3 entirely. Per the brief, do NOT force H4/
|
||
|
|
M30/M15/M3 into the ML. The honest verdict is LEGACY / NOT COMPARABLE for the
|
||
|
|
static MLP vs the Candidate Setup layer (below), with a documented engineering
|
||
|
|
path (Option B map now; Option A/C as future authorization).
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## H. VERDICT DEFINITIONS (used by the final report)
|
||
|
|
|
||
|
|
```text
|
||
|
|
ALIGNED : same MTF set, same as-of, same formulas.
|
||
|
|
PARTIALLY ALIGNED : same base (M15) + partial HTF overlap (H4), missing M30/M3.
|
||
|
|
MISALIGNED : conflicting MTF sets with no documented reconciliation.
|
||
|
|
LEGACY / NOT COMPARABLE : the two models are different generations/architectures
|
||
|
|
(legacy v4.4 ML feed vs newer candidate-setup model);
|
||
|
|
not "wrong", just not the same object.
|
||
|
|
```
|
||
|
|
|
||
|
|
*End of SMC_MTF_TRAINING_ALIGNMENT_SPEC_v1.*
|