275 lines
14 KiB
Markdown
275 lines
14 KiB
Markdown
# P3-S.6 DISPLACEMENT FORMAL SPECIFICATION & CODE-CONFORMANCE REPORT
|
|
|
|
```text
|
|
Date : 2026-08-22
|
|
Session : P3-S.6 — Formal SMC Specification + Code-Conformance Audit (Displacement)
|
|
Scope : Displacement — Engine 2 Entry agent (AF_DetectDisplacement),
|
|
and its relationships with Order Block "strong move" (AF_E3_MOVE_BODY),
|
|
FVG, CHoCH/MSS, and the E-agent confirmation chain.
|
|
Principle : SPECIFICATION FIRST, CODE AUDIT SECOND
|
|
Status : NO CODE CHANGES (Phase D) — all findings DOCUMENTED
|
|
Artifacts : docs/SMC_DISPLACEMENT_SPEC_v1.md (specification)
|
|
ml/p3/smc_semantic/spec_tests_displacement.py (+ .json) (tests)
|
|
ml/p3/smc_semantic/output/spec_tests_displacement_report.json
|
|
```
|
|
|
|
---
|
|
|
|
## 0. CHECKPOINT & PROVENANCE (session-start verification)
|
|
|
|
```text
|
|
Forge HEAD : 07883f6abf116b656e2cb8adfb41ec47e1fce498 (P3-S.5) VERIFIED
|
|
Branch / remote : main == origin/main (07883f6) VERIFIED
|
|
Working tree : CLEAN at start VERIFIED
|
|
P3-S.5 artifacts : spec/conformance/tests/report/handover INTACT VERIFIED
|
|
HUMAN VERIFICATION : CANCELLED VERIFIED
|
|
```
|
|
|
|
---
|
|
|
|
## A. SOURCE MATERIAL (Phase A — inventory & reconciliation)
|
|
|
|
| # | Source | Location | Role |
|
|
|---|--------|----------|------|
|
|
| 1 | Engine 2 displacement | Include\AlgoForge\AF_Engine2_Agents.mqh:281-291 (AF_DetectDisplacement) | body >= 1.6 x avg body on newest closed bar; direction Close vs Open; no structure |
|
|
| 2 | AF_AvgBody | AF_Engine2_Agents.mqh:120-127 | mean |Close-Open| over last n bars (baseline) |
|
|
| 3 | Engine 2 E agent | AF_Engine2_Agents.mqh:583-663 | disp = AF_DetectDisplacement(20); mDisp; wDisp 0.20 (x1.3); ZONE + CONFIRMATION |
|
|
| 4 | OB "strong move" | AF_Engine2_Agents.mqh:304-305; AF_Engine2_Display.mqh:212; AF_Defines.mqh:60 | |body(M)| >= 1.5 x avg (AF_E3_MOVE_BODY) — same family, lower constant |
|
|
| 5 | DESIGN.md | docs/DESIGN.md:132-133 | C "opposite bar before a strong move"; E "Sweep, CHoCH, displacement, OB/FVG zones; ZONE + CONFIRMATION = setup; strong displacement -> confirmation weight up" |
|
|
| 6 | FEATURE_CONTRACT | docs/FEATURE_CONTRACT.md | NO displacement feature (0 refs) |
|
|
| 7 | EA runtime | Experts\AlgoForge_Backtest_Baseline.mq5 | NO displacement (0 refs) |
|
|
| 8 | Python training | ml/**/*.py | NO displacement (0 refs) |
|
|
| 9 | Legacy v4.3/v4.4/v4.5 | Indicators\Downloads\SniperGold_SMC_ProPlus_v4_3/4_4/4_5.mq5 | NO displacement concept (0 refs) |
|
|
| 10 | P3-S.4/S.5/S.3 specs | docs/SMC_FVG/ORDER_BLOCK/CHOCH_MSS_SPEC_v1.md | displacement declared NOT REQUIRED for FVG/OB/CHoCH |
|
|
| 11 | External | XAUUSD_MTF_Liquidity_OB_Reversal (2).mq5 | external reference only, NOT wired |
|
|
|
|
**Layer separation:**
|
|
|
|
```text
|
|
Intended semantics : displacement = entry confirmation input (E agent);
|
|
"strong displacement -> confirmation weight up" (DESIGN).
|
|
Legacy semantics : NONE — v4.3/v4.4/v4.5 have no displacement concept.
|
|
Current semantics : body >= 1.6 x avg body (newest closed bar), direction by
|
|
Close vs Open, no structure, per-bar attribute.
|
|
Training semantics : N/A — not a training feature.
|
|
Display-only : NONE — displacement is not rendered.
|
|
```
|
|
|
|
---
|
|
|
|
## B. PROJECT SEMANTIC SPECIFICATION (Phase B)
|
|
|
|
Full document: **docs/SMC_DISPLACEMENT_SPEC_v1.md** (PROJECT SEMANTIC SPECIFICATION — not "universal SMC ground truth").
|
|
|
|
Spec decision summary:
|
|
|
|
```text
|
|
S-1 Definition : body >= 1.6 x avg body on the NEWEST CLOSED bar; direction
|
|
by Close vs Open; pure candle attribute.
|
|
S-2 Measurement : |Close-Open| vs average body; range/wicks/ATR/ratio NOT used.
|
|
S-3 Baseline : mean over newest min(20, t+1) bars; candidate included.
|
|
S-4 Direction : +1 Close>Open, -1 Close<Open, 0 otherwise; symmetric.
|
|
S-5 Structural req. : NONE.
|
|
S-6 FVG relationship: NOT REQUIRED (independent).
|
|
S-7 OB relationship : "strong move" (1.5 x) = same family, lower constant (proxy).
|
|
S-8 CHoCH rel. : NOT REQUIRED by CHoCH; independent.
|
|
S-9 Event vs State : CANDLE ATTRIBUTE (per-bar); no persistence; no stale state.
|
|
S-10 Threshold : >= 1.6 x avg (inclusive).
|
|
S-11 Symmetry : symmetric.
|
|
S-12 Timeframe : per-TF independent; canonical = SPECIFICATION AMBIGUOUS.
|
|
S-13 Consumers : E agent confirmation (w 0.20, x1.3); per-bar.
|
|
S-14 Parity : PARITY = N/A BY ABSENCE.
|
|
```
|
|
|
|
---
|
|
|
|
## C. FORMAL DEFINITION (Phase B — extract)
|
|
|
|
```text
|
|
avg_body(t) = (1 / min(20, t+1)) * SUM_{i=t-min(20,t+1)+1 .. t} |Close(i) - Open(i)|
|
|
|
|
Displacement(t) = +1 if |Close(t)-Open(t)| >= 1.6 * avg_body(t) AND Close(t) > Open(t)
|
|
-1 if |Close(t)-Open(t)| >= 1.6 * avg_body(t) AND Close(t) < Open(t)
|
|
0 otherwise.
|
|
|
|
Only the NEWEST closed bar (t) is evaluated. Pure candle attribute, no state.
|
|
```
|
|
|
|
---
|
|
|
|
## D. CURRENT CODE BEHAVIOR (Phase C — code audit)
|
|
|
|
```mql5
|
|
// AF_DetectDisplacement (AF_Engine2_Agents.mqh:281-291)
|
|
int AF_DetectDisplacement(const AFEngine1MTF &e1,int slot,int avgN)
|
|
{
|
|
if(!e1.IsReady(slot)) return 0;
|
|
double avg=AF_AvgBody(e1,slot,avgN); // mean |Close-Open| last min(avgN,count)
|
|
if(avg<=0.0) return 0;
|
|
double body=MathAbs(e1.Close(slot,0)-e1.Open(slot,0)); // NEWEST CLOSED bar
|
|
if(body<1.6*avg) return 0; // strict < -> inclusive >= at equality
|
|
return (e1.Close(slot,0)>e1.Open(slot,0))? 1 : -1;
|
|
}
|
|
// E agent consumption (AF_Engine2_Agents.mqh:606, 627-640, 659-660)
|
|
int disp = AF_DetectDisplacement(e1,slot,AF_E2_LOOKBACK_AVG); // avgN=20
|
|
if(MathAbs(disp)>0) wDisp*=1.3; // "strong displacement -> confirmation weight up"
|
|
mDispBull=(disp>0)?1.0:0.0; mDispBear=(disp<0)?1.0:0.0;
|
|
```
|
|
|
|
Observations:
|
|
- Formula matches S-1/S-2/S-3 exactly (avg includes the candidate bar; window
|
|
min(20,count); no min-bars guard — a short window still applies the rule).
|
|
- No structural check anywhere (S-5 CONFORMING).
|
|
- Per-bar, no state (S-9 CONFORMING — the E agent reads a fresh value each bar).
|
|
- Direction by Close vs Open (S-4 CONFORMING).
|
|
- Threshold 1.6 hardcoded (S-10 CONFORMING); boundary inclusive (>=).
|
|
|
|
---
|
|
|
|
## E. CONFORMANCE MATRIX (Phase C)
|
|
|
|
| # | Requirement | Specification | Code (Function/Line) | Actual Behavior | Verdict |
|
|
|---|-------------|--------------|----------------------|-----------------|---------|
|
|
| E-1 | Definition | body >= 1.6 x avg body, newest closed bar (S-1) | AF_DetectDisplacement:287-288 | exact match | **CONFORMING** |
|
|
| E-2 | Candle measurement | |Close-Open| vs avg body; range/wicks unused (S-2) | AF_DetectDisplacement:287 | body only | **CONFORMING** |
|
|
| E-3 | Baseline/lookback | mean over newest min(20,t+1), candidate included (S-3) | AF_AvgBody:120-127; call avgN=20 | match | **CONFORMING** |
|
|
| E-4 | Direction | +1 Close>Open / -1 Close<Open (S-4) | AF_DetectDisplacement:289 | match | **CONFORMING** |
|
|
| E-5 | Threshold | >= 1.6 x avg (inclusive) (S-10) | AF_DetectDisplacement:288 (strict < returns 0) | inclusive at equality | **CONFORMING** |
|
|
| E-6 | Structural req. | NONE (S-5) | no structure check in the function | match | **CONFORMING** |
|
|
| E-7 | FVG relationship | NOT REQUIRED (S-6) | FVG detector independent (P3-S.4) | no dependency either way | **CONFORMING** |
|
|
| E-8 | OB relationship | strong move = same family, lower constant (S-7) | AF_E3_MOVE_BODY=1.5 (OB) vs 1.6 (disp) | 1.5 vs 1.6 constants; undocumented split | **PARTIALLY CONFORMING** (BUG-P3S6-001) |
|
|
| E-9 | CHoCH relationship | NOT REQUIRED (S-8) | CHoCH close-confirmed, no displacement (P3-S.3) | independent | **CONFORMING** |
|
|
| E-10 | Timing | newest closed bar; close-observable (S-9/S-10) | index 0 under Engine-1 closed-bar lock | no 1-bar lag; no look-ahead | **CONFORMING** |
|
|
| E-11 | Closed-bar / no future | all inputs <= t (S-3) | closed-bar lock; DP-T19 | no future visibility | **CONFORMING** |
|
|
| E-12 | Lifecycle | candle attribute, no persistence (S-9) | per-bar recompute; no state variable | no stale state (DP-T18) | **CONFORMING** |
|
|
| E-13 | Timeframe | per-TF independent; canonical AMBIGUOUS (S-12) | per-slot AF_DetectDisplacement | per-TF; cross-TF role undefined | **SPECIFICATION AMBIGUOUS** (A-1) |
|
|
| E-14 | Consumer behavior | E agent per-bar confirmation (S-13) | AF_Engine2_Agents:606,627-640 | fresh value each bar; no stale consumer | **CONFORMING** |
|
|
| E-15 | Runtime/training parity | PARITY = N/A (S-14) | FEATURE_CONTRACT/EA/Python/v4.x: 0 refs | absent everywhere except Engine 2 | **CONFORMING** (N/A by absence) |
|
|
|
|
---
|
|
|
|
## F. CONFIRMED BUGS (Phase D — DOCUMENT ONLY, no code changes)
|
|
|
|
```text
|
|
BUG-P3S6-001
|
|
SEVERITY : LOW (cross-concept consistency)
|
|
SOURCE : AF_E3_MOVE_BODY=1.5 (AF_Defines.mqh:60, OB strong move) vs the
|
|
hardcoded 1.6 in AF_DetectDisplacement (AF_Engine2_Agents.mqh:288)
|
|
SPEC REQ : S-7/A-2 — the "strong move" family must have ONE documented rule
|
|
ACTUAL CODE : OB "strong move" = body >= 1.5 x avg; Displacement = body >= 1.6 x
|
|
avg; same measurement, same family, different constants; a body
|
|
in [1.5, 1.6) x avg is "strong" for OB but NOT displacement
|
|
IMPACT : a candle can satisfy the OB formation gate while the E-agent
|
|
reports no displacement (and vice versa is impossible);
|
|
DESIGN.md uses "strong move" and "displacement" loosely; the
|
|
threshold split is undocumented
|
|
PROPOSED FIX : unify the constant or document the intentional split (no repair
|
|
this session; consolidated repairs deferred until the audit
|
|
chain completes)
|
|
```
|
|
|
|
No consumer/stale-state bug exists for displacement (E-12/E-14 CONFORMING): the
|
|
f7/CHoCH/FVG/OB consumer bug class does NOT apply — displacement is a per-bar
|
|
candle attribute with no state to go stale (verified DP-T18).
|
|
|
|
---
|
|
|
|
## G. SEMANTIC AMBIGUITIES
|
|
|
|
```text
|
|
G-1 Canonical displacement timeframe (A-1): per-slot computation explicit;
|
|
cross-TF influence rule not defined. Same class as CHoCH G-4 / sweep G-3 /
|
|
FVG A-3 / OB A-4.
|
|
G-2 "Strong move" vs "Displacement" terminology (A-2 / BUG-P3S6-001):
|
|
1.5 vs 1.6 constants for one concept family; not adjudicated.
|
|
```
|
|
|
|
---
|
|
|
|
## H. CROSS-CONCEPT CONSISTENCY (Phase C — diagnostic, per brief §27)
|
|
|
|
| Concept | Requires Displacement? | Produces Displacement? | Uses "strong move"? |
|
|
|---------|------------------------|------------------------|---------------------|
|
|
| FVG (P3-S.4) | No (geometric gap, S-5) | No (may correlate) | No |
|
|
| OB (P3-S.5) | No (own strong-move gate 1.5 x) | No | **Yes (1.5 x avg body)** |
|
|
| CHoCH/MSS (P3-S.3) | No (close-confirmed break, S-6) | No | No |
|
|
| Displacement (P3-S.6) | — | — | = the concept (1.6 x avg body) |
|
|
|
|
```text
|
|
CROSS-CONCEPT INCONSISTENCY (documented, NOT modified this session):
|
|
OB uses "strong move" = 1.5 x avg body (AF_E3_MOVE_BODY);
|
|
Displacement uses 1.6 x avg body (AF_DetectDisplacement).
|
|
Same concept family, different constants -> BUG-P3S6-001.
|
|
No prior specification is changed; the inconsistency is recorded for the
|
|
consolidated repair phase.
|
|
```
|
|
|
|
---
|
|
|
|
## I. RUNTIME/TRAINING PARITY (Phase C — diagnostic, not a retrain)
|
|
|
|
```text
|
|
Displacement is not in FEATURE_CONTRACT (f0-f18), the EA runtime, or Python
|
|
training (verified: 0 references each; legacy v4.x also has none).
|
|
-> PARITY = N/A BY ABSENCE (S-14). No mismatch exists; absence is documented.
|
|
```
|
|
|
|
---
|
|
|
|
## J. VERDICT
|
|
|
|
```text
|
|
CONFORMING
|
|
|
|
Definition (E-1) : CONFORMING
|
|
Measurement (E-2) : CONFORMING
|
|
Baseline/lookback (E-3) : CONFORMING
|
|
Threshold (E-5) : CONFORMING
|
|
Timing (E-10, E-11) : CONFORMING
|
|
Lifecycle (E-12) : CONFORMING (candle attribute, no stale state)
|
|
Structure relationship (E-6) : CONFORMING (none required)
|
|
FVG relationship (E-7) : CONFORMING (independent)
|
|
OB relationship (E-8) : PARTIALLY CONFORMING (BUG-P3S6-001)
|
|
CHoCH relationship (E-9) : CONFORMING (independent)
|
|
Consumer behavior (E-14) : CONFORMING (per-bar, no stale consumer)
|
|
Timeframe (E-13) : SPECIFICATION AMBIGUOUS (A-1)
|
|
Runtime/training parity (E-15) : CONFORMING (N/A by absence)
|
|
|
|
The displacement primitive itself is CONFORMING: AF_DetectDisplacement matches
|
|
the project specification exactly (body >= 1.6 x avg body, newest closed bar,
|
|
direction by Close/Open, no structure, per-bar attribute, no look-ahead). The
|
|
only finding is a cross-concept threshold inconsistency (OB "strong move" 1.5 vs
|
|
displacement 1.6) and the usual canonical-timeframe ambiguity. The f7/CHoCH/FVG/
|
|
OB stale-consumer bug class does NOT apply to displacement.
|
|
|
|
Verdict = conformance to the PROJECT SEMANTIC SPECIFICATION, NOT profitability/edge.
|
|
```
|
|
|
|
---
|
|
|
|
## K. NEXT GATE
|
|
|
|
```text
|
|
After the Displacement verdict (CONFORMING):
|
|
MTF Alignment -> Candidate Setup.
|
|
DO NOT return to ML; DO NOT create new event labels; DO NOT perform consolidated
|
|
repairs yet (BUG-P3S6-001 and the P3-S.2..P3-S.5 documented findings stay open
|
|
until the semantic audit chain completes).
|
|
```
|
|
|
|
---
|
|
|
|
## L. CHECKPOINT & PROVENANCE (P3-S.6)
|
|
|
|
```text
|
|
Forge HEAD (session start) : 07883f6 (P3-S.5) — VERIFIED
|
|
P3-S.5 spec (immutable) : docs/SMC_ORDER_BLOCK_SPEC_v1.md
|
|
P3-S.4 spec (immutable) : docs/SMC_FVG_SPEC_v1.md
|
|
P3-S.3 spec (immutable) : docs/SMC_CHOCH_MSS_SPEC_v1.md
|
|
FEATURE_CONTRACT : C44CC6F2... (P2-era) / 7b908b12... (committed)
|
|
symbol/tf : XAUUSD / M15 (2017-01-01 .. 2026-08-20)
|
|
Human verification : CANCELLED
|
|
No production change : AF_DetectDisplacement / AF_AvgBody / AF_FindOrderBlock /
|
|
E agent / Engine 2 / Engine 3 / f7-f18 / FVG / OB /
|
|
CHoCH / ML : NOT touched
|
|
```
|