From 9c72e90ce2e39091721879979533abd0028298df Mon Sep 17 00:00:00 2001 From: Harwinder Sekhon Date: Sat, 11 Jul 2026 09:02:24 -0400 Subject: [PATCH] EUR M15/H1 investigation: document no-validated-edge verdict MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Five independent tests at 1-pip cost (M15 wide-open both windows, transitioning-slice OOS, mean-reversion trade sims, forward-return screens on M15+M5, H1 both windows) — nothing clears cost in both 2024-25 and 2025-26. Root cause: spread is ~10% of M15 ATR on EUR. EUR stays out of scan_pairs; open avenues documented in docstring. --- pair_signals/eurusd.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/pair_signals/eurusd.py b/pair_signals/eurusd.py index 80cc052..0bb5d9b 100644 --- a/pair_signals/eurusd.py +++ b/pair_signals/eurusd.py @@ -15,10 +15,31 @@ branch's -6.7R. Findings that shaped them: - 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) +M15 + H1 investigated 2026-07-11, verdict NO VALIDATED EDGE either +(all at 1-pip round-trip cost, real fills): + - M15 wide-open (all gates off): -2.5R/270 trades 2025-26; + -54.8R/308 trades on 2024-25 out-of-sample. PF 0.61-0.98. + - Best in-sample slice (transitioning-regime-only: +15.4R, PF 1.59, + positive both halves, month-spread) FAILED 2024-25 OOS at PF 0.55. + Within-year train/val splits are not sufficient for EUR — always + re-test on the 2024 window before believing a config. + - Raw-parquet forward-return screens (M15 and M5, ~14 entry + conditions x 4-5 horizons: momentum, mean-reversion, breakout, + streak, session families): nothing clears +1 pip in both years. + - H1 wide-open: +9.8R PF 1.32 in 2025-26 (both halves positive) but + -5.7R PF 0.82 on 2024-25. Positive from Jan 2025 onward; H2-2024 + regime negative. Closest to workable, still unvalidated. + +Root cause is cost-to-volatility: EUR M15 ATR ~= 10 pips, so the 1-pip +spread taxes every trade ~10% of ATR (M5 worse). The XAU signal engine +survives because gold's ATR/spread ratio is several times larger. + 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. +or add to scan_pairs) but treat all EUR M5/M15 signals as informational +only. Open avenues needing new data/infra: calendar-anchored entries +(requires a historical Forex Factory archive), limit-entry cost +reduction (needs tick data to model fills honestly), H4/D1 swing. """ from typing import Optional, List