M5 at real cost: disable XAU_PB, squash partial EMA alignment
Both validated at the measured $0.65 spread on Oanda bars (12mo halves + PF, OOS 2024-06->2025-03, 5yr; full evidence in pair_signals/xauusd.py M5 overrides 4-5): - m5_pullback_enabled False on M5: loss forensics identified XAU_PB as the largest wrong-direction loss source; 12mo PF 1.26 (failing the acceptance bar) -> 1.44, max DD 23.9R -> 13.9R. PB code stays for future regime-gated experiments. - New TechnicalConfig.ema_partial_neutral (default False), True on M5 only: partial 4-EMA ribbon alignment (2-3 of 4 checks) scores NEUTRAL instead of a weak BUY/SELL (-0.008R/84 vs +0.230R/341 fully aligned). Squash mirrored in the backtester's precomputed EMA scorer in this same commit (live==backtest parity). 12mo +97.6R/556 PF 1.48 DD 10.7R halves +47.8/+49.8; 5yr +127.4R PF 1.38; OOS one-trade tie. - Rejected and logged (memory + docstring): hour-19 block (OOS fail), hours-14/15, trail dist 0.75, confirm-TF swaps incl M15+H4 (OOS ordering), divergence/candlestick weight changes, bollinger removal. - Tests 296 -> 302: partial-alignment fixture test, factory-equivalence mirrors, per-TF isolation test, BC-gate fixture force-enables PB. Claude-Session: https://claude.ai/code/session_01H1eKWZsAVapJ1C4winYLqX
This commit is contained in:
@@ -117,6 +117,54 @@ campaign: an M5 hour-22 block (+4.8R on 12mo — the burst-heavy
|
||||
specific); M15 hour-16 unblock (+0.8R/+57 trades 12mo but -18.3R
|
||||
DD +34% on 5yr); every SELL-gate/vol/TP-size relaxation retested
|
||||
negative (see memory notes for the full grid).
|
||||
|
||||
M5 override 4 — XAU_PB disabled (validated 2026-08-04, Oanda bars,
|
||||
$0.65 REAL spread — first campaign validated at measured cost on the
|
||||
live feed, per the 2026-08-04 re-pin baseline): m5_pullback_enabled
|
||||
False on M5. Loss forensics on the Oanda books identified XAU_PB as
|
||||
the largest wrong-direction loss source (12mo: -43.5R of the -156.6R
|
||||
wrong-direction bucket; 5yr: -274.5R). Disabling: 12mo +96.6R/588
|
||||
PF 1.44 max DD 13.9R halves +51.2/+45.4 vs +82.3R/788 PF 1.26 DD
|
||||
23.9R shipped (which FAILS the PF>=1.3 clause at real cost); OOS
|
||||
2024-06-01 -> 2025-03-30 +9.5R PF 1.34; 5yr +123.9R/956 PF 1.35 vs
|
||||
PF 1.16 with PB. PB's 5yr net contribution (+23.6R) was almost
|
||||
entirely the 2022 chop year (+36.1R vs -2.2R without) — a regime
|
||||
earner that has been a drag on trend-regime bars since; its tight
|
||||
stops are also the most cost-punished at $0.65. PB code and the
|
||||
pb_trail_* params STAY for future regime-gated experiments (same
|
||||
pattern as cp_enabled). Rejected in the same campaign (4 candidates
|
||||
total, N logged): hour-19 block (+3.7R 12mo but -3.3R OOS, -1.5R
|
||||
5yr — OOS gate, the classic trap); hours-14/15 block (-6.9R 12mo
|
||||
once PB is removed — their raw negativity WAS the PB losses);
|
||||
trail_dist_r 0.75 (-2.6R 12mo; the 0.88R average give-back is the
|
||||
validated price of riding trends, exits confirmed NOT the loss
|
||||
driver: exit-management accounts for 1-2% of lost R vs 50%
|
||||
wrong-direction / 49% entry-timing).
|
||||
|
||||
M5 override 5 — EMA partial-alignment squash (validated 2026-08-04,
|
||||
Oanda bars, $0.65 real spread): ema_partial_neutral True on M5 —
|
||||
partial 4-EMA ribbon alignment (2-3 of 4 checks) scores NEUTRAL
|
||||
instead of a weak BUY/SELL. Motivated by the indicator audit: partial-
|
||||
alignment trades averaged -0.008R/84 vs +0.230R/341 fully aligned.
|
||||
Replay (knob mirrored in the backtester's precomputed EMA scorer in
|
||||
the same commit — live==backtest parity): 12mo +97.6R/556 PF 1.48
|
||||
DD 10.7R halves +47.8/+49.8 vs control +96.6R/588 PF 1.44 DD 13.9R;
|
||||
5yr +127.4R/912 PF 1.38 DD 12.8R vs +123.9R/956 PF 1.35 DD 13.2R,
|
||||
2022 improves -2.2 -> -1.1; OOS 2024-06-01 -> 2025-03-30 +9.4R
|
||||
PF 1.33 vs +9.5R PF 1.34 — a one-trade tie, documented as such (the
|
||||
OOS window holds up; it neither prefers nor punishes). Net effect:
|
||||
32 fewer marginal trades, every risk-adjusted measure better.
|
||||
Rejected in the same round (trial-logged): confirmation-TF swap
|
||||
M5->[M15,H4] (12mo +104.0R PF 1.51 DD 10.3 but OOS +7.8R PF 1.27
|
||||
vs control +9.5R PF 1.34 and 2022 3x worse — the H4 confirm keeps
|
||||
endorsing stale direction in chop; OOS-ordering rejection, same
|
||||
precedent as trail dist 1.0); confirm [H1,H4] (-31.8R 12mo);
|
||||
triple-confirm [M15,H1,H4] (-4.9R); divergence weight -1/3
|
||||
(-3.8R 12mo); candlestick weight +50% (-3.0R 12mo). The weight
|
||||
vector keeps proving calibrated as a system: divergence/candlestick/
|
||||
bollinger all look mis-weighted in-book and all replay worse when
|
||||
"fixed" (bollinger weight-0: +80.9R PF 1.29 DD 23.8 — its constant
|
||||
oppose vote is a load-bearing quality bar, like ROC).
|
||||
"""
|
||||
|
||||
from typing import Optional, List
|
||||
@@ -152,6 +200,12 @@ def make_config(
|
||||
# BUY-only chart patterns on M5 — see module docstring.
|
||||
config.xau_strategy.cp_enabled = True
|
||||
config.xau_strategy.cp_patterns = ["inv_hs", "double_bottom", "bull_flag"]
|
||||
# XAU_PB pullback entries OFF — largest wrong-direction loss
|
||||
# source at real cost on Oanda bars — see module docstring.
|
||||
config.xau_strategy.m5_pullback_enabled = False
|
||||
# Partial EMA-ribbon alignment scores NEUTRAL on M5 — its
|
||||
# trades carried no edge — see module docstring.
|
||||
config.technical.ema_partial_neutral = True
|
||||
# Wider trailing distance on M5 only — see module docstring.
|
||||
config.signals.trail_arm_r = 0.60
|
||||
config.signals.trail_dist_r = 0.85
|
||||
|
||||
Reference in New Issue
Block a user