From 8b086f4f49e8a8addd6d8436e539c2c8d4695571 Mon Sep 17 00:00:00 2001 From: Harwinder Sekhon Date: Fri, 10 Jul 2026 22:14:49 -0400 Subject: [PATCH] =?UTF-8?q?EUR=20M5:=20commit=20best-found=20config=20afte?= =?UTF-8?q?r=20realism=20re-tune=20=E2=80=94=20no=20validated=20edge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 12mo grid campaign (2025-07-08 → 2026-07-08, 1-pip round-trip cost, train/val split at 2026-01-08). Donor config scored -6.7R/34 trades. Findings: transitioning regime -27R/88 wide-open; A-grade entries lose (-26R) while B-grade wins; Fridays -17R; hours 8/12/13/18/19 UTC bleed; score 30-35 band holds the train-half losses; trailing (0.45R arm/0.5R dist) beats static TP1 and gold's 0.6/0.75. Best-found config: -1.06R / 53 trades / PF 0.93 / 62.3% WR — breakeven, FAILS acceptance (positive both halves, PF>=1.3). Per plan, EUR ships functional but stays out of default scan_pairs. Grid results and methodology documented in the module docstring; full numbers in backtest/cache/eurv2_*.csv. --- pair_signals/eurusd.py | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/pair_signals/eurusd.py b/pair_signals/eurusd.py index 0950f79..80cc052 100644 --- a/pair_signals/eurusd.py +++ b/pair_signals/eurusd.py @@ -1,9 +1,24 @@ """EUR/USD signal producer config. -Ported from feature/eurusd-support. All tuned values here are a -pre-realism baseline (tuned before spread charging and next-open fills) -and are re-tuned against the realistic backtester at 1-pip round-trip -cost — see EurUsdStrategyConfig in config.py. +Re-tuned 2026-07-10 against the realistic backtester (1-pip round-trip +cost, next-open fills, raw-path resolution) on 2025-07-08 → 2026-07-08 +M5 with M15/H1 confirmations. RESULT: no configuration passed the +acceptance rule (positive in BOTH train and val halves, PF >= 1.3). + +The M5 defaults below are the best found — roughly breakeven +(-1.1R / 53 trades / PF 0.93 / 62% WR on 12mo) versus the donor +branch's -6.7R. Findings that shaped them: + - transitioning regime bled -27R/88 trades wide-open → blocked + - A-grade entries LOSE (-26R) while B-grade wins — max conviction + fires at move extremes (same pathology as gold M5) + - Fridays (-17R) and hours 8, 12, 13, 18, 19 UTC negative + - score 30-35 band is where the train-half losses live → floor 35 + - trailing exits beat static TP1 (arm 0.45R / dist 0.5R best) + +EUR/USD therefore ships FUNCTIONAL BUT OFF by default: it is not in +PlatformConfig.scan_pairs. Scan it on demand (main.py --pair EURUSD, +or add to scan_pairs) but do not treat M5 signals as having a +validated edge. M15 tuning is a future session. """ from typing import Optional, List @@ -89,11 +104,17 @@ def make_config( config.eur_strategy.sl_atr_floor = 0.7 config.eur_strategy.sl_atr_multiplier = 0.3 config.eur_strategy.min_quality_grades = ["A+", "A", "B"] + # Best-found 2026-07-10 (breakeven, see module docstring): config.eur_strategy.min_entry_score = 35.0 - config.eur_strategy.min_entry_confidence = 50.0 - config.eur_strategy.blocked_vol_regimes = ["high"] - config.eur_strategy.min_indicator_agreement = 6 - config.backtest.blocked_hours_utc = [22, 23, 0, 1, 2, 3, 4, 6, 9, 11, 19, 21] + config.eur_strategy.min_entry_confidence = 45.0 + config.eur_strategy.blocked_vol_regimes = [] + config.eur_strategy.min_indicator_agreement = 0 + config.eur_strategy.allowed_weekdays = [0, 1, 2, 3] # Fridays bled -17R + config.backtest.allowed_weekdays = [0, 1, 2, 3] + config.backtest.blocked_hours_utc = [22, 23, 0, 1, 2, 3, 8, 12, 13, 18, 19] + # Trailing exit beat static TP1; earlier/tighter than gold's 0.6/0.75. + config.signals.trail_arm_r = 0.45 + config.signals.trail_dist_r = 0.5 else: config.technical.regime_weights_override = EUR_REGIME_WEIGHTS