Big-candle gate (default-OFF) + M5 relaxation campaign + --set tooling
Gate 6h (big-candle entry gate): blocks all XAU entries (core, XAU_PB, XAU_CP) when the primary TF's last 24h contains a bar with range >= K x prior-bar ATR. Ships default-OFF: validation rejected every threshold (K 3-6 on M5/M15 12mo) — removed trades were net-POSITIVE at every cell; M5 quiet-window trades are the only losing bucket. Config knobs big_candle_atr_multiple/lookback_hours, --big-candle backtest flag, Module 17 tests. M5 relaxation SHIPPED (validated 2026-07-30, Oanda bars, $0.30 spread): m5_min_abs_score 30->25, m5_min_confirmation_score 10->5, hour-21 UTC unblocked M5-only. Beats control in ALL 6 calendar years of the 5yr replay (+230.9R/2319 PF 1.26 DD 21.3 vs +168.0R/2048 PF 1.21 DD 27.0), 12mo +107.4R PF 1.36 vs +84.6R PF 1.33, OOS +26.1R vs +17.2R, $0.70 spread +86.9R vs +66.4R. M15: every relaxation retested negative — config unchanged. Declined-but-open: M5 hour-22 block, M15 hour-16 unblock (both fail 5yr/OOS). Evidence in the factory docstring. Tooling: generic --set PATH=JSON research override in gpu_backtest (typo-proof, logged); diagnose_filters filter_tags refreshed for gates 6d-6i with a staleness-guard test (Module 18); research scripts hour_analysis/burst_profile/book_diff. Suite: 268 tests. Claude-Session: https://claude.ai/code/session_014jqHpmNYmwYMowF6bPZyeD
This commit is contained in:
+23
-4
@@ -99,6 +99,24 @@ in 5/7 calendar years including winning years (2022 -9.2R). Blocking:
|
||||
12mo book is unchanged (+139.0R vs +139.3R). M15-and-up keep hour 9:
|
||||
it is POSITIVE there (M15 6yr +1.7R, M15 OOS +8.6R), so the block is
|
||||
M5-only, same per-timeframe pattern as the M15 overrides.
|
||||
|
||||
M5 override 2 — relaxation campaign (validated 2026-07-30, Oanda
|
||||
bars, $0.30 spread, trailing exits): UNBLOCK hour 21 UTC on M5 only,
|
||||
combined with the config.py M5 gate relaxations (m5_min_abs_score
|
||||
30->25, m5_min_confirmation_score 10->5). The combined config beat
|
||||
the pre-relaxation control in ALL 6 calendar years of the 5yr replay
|
||||
2021-07-30 -> 2026-07-30 (+230.9R/2319 PF 1.26 DD 21.3 vs
|
||||
+168.0R/2048 PF 1.21 DD 27.0), on 12mo (+107.4R PF 1.36, halves
|
||||
+68.6/+38.8 vs +84.6R PF 1.33), on OOS 2024-06-01 -> 2025-03-30
|
||||
(+26.1R vs +17.2R), and at $0.70 spread (+86.9R vs +66.4R). Hour-21
|
||||
trades alone: +28.0R/22, positive every year — overturning the old
|
||||
block per the full-evidence rule. Hour 21 stays BLOCKED on M15+
|
||||
(12mo M15 unblock tested -0.3R). Declined-but-open from the same
|
||||
campaign: an M5 hour-22 block (+4.8R on 12mo — the burst-heavy
|
||||
"institutional" hour — but -3.2R on 5yr and -1.1R on OOS: regime-
|
||||
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).
|
||||
"""
|
||||
|
||||
from typing import Optional, List
|
||||
@@ -126,10 +144,11 @@ def make_config(
|
||||
confirmation_tfs or _CONFIRMATIONS.get(primary_tf, [Timeframe.M15, Timeframe.H4])
|
||||
)
|
||||
if primary_tf == Timeframe.M5:
|
||||
# Block hour 9 UTC on M5 only — see module docstring.
|
||||
config.xau_strategy.blocked_hours_utc = (
|
||||
config.xau_strategy.blocked_hours_utc + [9]
|
||||
)
|
||||
# Block hour 9 UTC on M5 only; UNBLOCK hour 21 on M5 only
|
||||
# (positive every year of the 5yr replay) — see docstring.
|
||||
config.xau_strategy.blocked_hours_utc = [
|
||||
h for h in config.xau_strategy.blocked_hours_utc if h != 21
|
||||
] + [9]
|
||||
# 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"]
|
||||
|
||||
Reference in New Issue
Block a user