xauusd M15: halve the RSI regime multiplier in every regime (M15 override 5, rule-1 validated)
Owner-approved 2026-09-09 after the pre-registered weight test (backtest/research/weight_test_2026-09-09.md). M15-only technical.regime_weights_override = the shipped table with rsi x 0.5 (0.5 trending family / 0.75 ranging / 0.5 transitioning), derived in the factory and pinned literally by the Module 9 equivalence test; a Module 33 test locks that M5/H1/H4 carry no override. Evidence, 2-year Oanda window 2024-09-05..2026-09-05 at $0.65: 793/+117.62R PF 1.41 -> 931/+146.14R PF 1.43 (fixed halves +27.9/+0.6R vs control); OOS 2024-06-01..2025-03-30 300/+40.59R PF 1.38 -> 355/+60.67R PF 1.49; 3-year +151.90R -> +186.61R (max DD 15.5 -> 19.3R, 2026 -4R). Parity: the factory run with no --set flag reproduces the validated candidate books byte-for- byte (2-yr MD5 d185f099..., OOS 6f8f24b4...). M15 canonical book re-pinned to backtest/oanda_m15_2yr_065_20260909.csv. Docs carry a one-line note. Claude-Session: https://claude.ai/code/session_01Nc9Ninzyi18QkWezrxeBvB
This commit is contained in:
+60
@@ -2078,6 +2078,35 @@ def _():
|
||||
inline_cfg.xau_strategy.sell_blocked_hours_utc = [15, 17]
|
||||
inline_cfg.signals.trail_arm_r = 0.70
|
||||
inline_cfg.signals.trail_dist_r = 0.75
|
||||
# M15 override 5 (2026-09-09): RSI x 0.5 in every regime —
|
||||
# LITERAL so a silent default-table change fails loudly here.
|
||||
inline_cfg.technical.regime_weights_override = {
|
||||
"trending_up": {
|
||||
"ema_trend": 2.0, "rsi": 0.5, "macd": 2.0,
|
||||
"bollinger": 0.5, "keltner": 1.5, "roc": 1.5,
|
||||
"candlestick": 0.8, "divergence": 1.0, "adx": 0.8,
|
||||
},
|
||||
"trending_down": {
|
||||
"ema_trend": 2.0, "rsi": 0.5, "macd": 2.0,
|
||||
"bollinger": 0.5, "keltner": 1.5, "roc": 1.5,
|
||||
"candlestick": 0.8, "divergence": 1.0, "adx": 0.8,
|
||||
},
|
||||
"trending": {
|
||||
"ema_trend": 2.0, "rsi": 0.5, "macd": 2.0,
|
||||
"bollinger": 0.5, "keltner": 1.5, "roc": 1.5,
|
||||
"candlestick": 0.8, "divergence": 1.0, "adx": 0.8,
|
||||
},
|
||||
"ranging": {
|
||||
"ema_trend": 0.3, "rsi": 0.75, "macd": 1.5,
|
||||
"bollinger": 1.5, "keltner": 2.0, "roc": 0.5,
|
||||
"candlestick": 1.0, "divergence": 2.5, "adx": 0.5,
|
||||
},
|
||||
"transitioning": {
|
||||
"ema_trend": 1.5, "rsi": 0.5, "macd": 2.5,
|
||||
"bollinger": 1.0, "keltner": 2.5, "roc": 2.0,
|
||||
"candlestick": 1.0, "divergence": 2.0, "adx": 1.0,
|
||||
},
|
||||
}
|
||||
if tf == Timeframe.M5:
|
||||
# Documented per-TF overrides (see xauusd.py docstring):
|
||||
# hour 9 UTC blocked, hour 21 UNBLOCKED (2026-07-30
|
||||
@@ -11861,6 +11890,37 @@ def _():
|
||||
"the GPU engine must inherit the live composite, never shadow it"
|
||||
|
||||
|
||||
@test("replay record follow-up: M15 factory halves RSI in every regime, other TFs carry no override")
|
||||
def _():
|
||||
# M15 override 5 (validated 2026-09-09): the M15 factory ships a
|
||||
# regime_weights_override that is the shipped table with the RSI
|
||||
# multiplier halved everywhere and every other cell untouched.
|
||||
import engine as _eng
|
||||
from pair_signals import PAIR_PRODUCERS
|
||||
default = _eng.regime_weight_table(TechnicalConfig())
|
||||
m15 = PAIR_PRODUCERS[XAUUSD](Timeframe.M15, [Timeframe.M5, Timeframe.H1])
|
||||
override = m15.technical.regime_weights_override
|
||||
assert set(override) == set(default), \
|
||||
f"M15 override must cover exactly the shipped regimes: {sorted(override)}"
|
||||
for regime, weights in default.items():
|
||||
got = override[regime]
|
||||
assert set(got) == set(weights), \
|
||||
f"{regime}: indicator set changed: {sorted(got)}"
|
||||
for name, mult in weights.items():
|
||||
want = mult * 0.5 if name == "rsi" else mult
|
||||
assert got[name] == want, \
|
||||
f"{regime}.{name}: {got[name]} != {want} (default {mult})"
|
||||
# The engine really runs with it (regime_weight_table prefers the override).
|
||||
assert _eng.regime_weight_table(m15.technical) == override
|
||||
# ...and it is M15-only — same per-TF pattern as every other override.
|
||||
for tf, ctfs in [(Timeframe.M5, [Timeframe.M15, Timeframe.H1]),
|
||||
(Timeframe.H1, [Timeframe.M15, Timeframe.H4]),
|
||||
(Timeframe.H4, [Timeframe.H1, Timeframe.D1])]:
|
||||
cfg = PAIR_PRODUCERS[XAUUSD](tf, ctfs)
|
||||
assert cfg.technical.regime_weights_override == {}, \
|
||||
f"{tf} must carry no regime weight override"
|
||||
|
||||
|
||||
# ══════════════════════════════════════════════════════════════════════
|
||||
# SUMMARY
|
||||
# ══════════════════════════════════════════════════════════════════════
|
||||
|
||||
Reference in New Issue
Block a user