Optimize EUR/USD to 78.7% WR on 2-year M15 backtest

Three-layer optimization:

1. Entry filters (signal_aggregator.py section 6e):
   - Block ranging regime
   - Only A+/A/B quality grades
   - min_entry_score=38, min_entry_confidence=60
   - Block RSI > 70 for BUY, RSI < 30 for SELL

2. Trade setup (config.py EurUsdStrategyConfig):
   - RR=0.50 with uniform quality scale
   - SL floor 1.2 ATR, TP 1.0 ATR

3. Breakeven trail (backtest/gpu_backtest.py):
   - When MFE reaches 0.3R, move SL to entry + 0.05R buffer
   - Converts 4 of 14 losses to +0.05R small wins
   - Bar-by-bar simulation integrated into simulate_trades()

Results (EUR/USD M15, 2024-05-18 to 2026-05-18):
  47 trades | 78.7% WR | +1.81R | PF 1.18 | MaxDD 3.35R
XAU/USD unchanged: 77.8% WR on 30-day, 68.7% WR on 2-year.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
harwinder
2026-05-18 14:00:59 -04:00
parent 74b723ba06
commit 08d7c9ade1
4 changed files with 191 additions and 42 deletions
+11 -7
View File
@@ -1677,11 +1677,14 @@ def _():
assert 6 not in cfg.allowed_weekdays # No Sunday
assert cfg.min_atr_threshold == 0.0003
assert cfg.sl_atr_floor == 1.2
assert cfg.min_rr_ratio == 1.0
assert cfg.min_rr_ratio == 0.5
assert cfg.mature_move_threshold == 35.0
assert cfg.tp_quality_scale["A+"] == 1.8
assert cfg.tp_quality_scale["A"] == 1.2
assert cfg.tp_quality_scale["A+"] == 1.0
assert cfg.tp_quality_scale["A"] == 1.0
assert cfg.tp_quality_scale["C"] == 1.0
assert "ranging" in cfg.blocked_regimes
assert "A" in cfg.min_quality_grades
assert "C" not in cfg.min_quality_grades
@test("PlatformConfig has eur_strategy field")
@@ -1764,21 +1767,22 @@ def _():
assert "EUR/USD" not in NewsEngine._get_affected_pairs("GBP")
@test("EUR/USD trade setup uses quality-scaled TP and tighter SL")
@test("EUR/USD trade setup uses tighter RR and SL")
def _():
from pair_signals.eurusd import make_config
from signal_aggregator import SignalAggregator
config = make_config(Timeframe.H1)
config.backtest.session_filter = False
config.eur_strategy.blocked_regimes = []
config.eur_strategy.min_quality_grades = []
assert config.eur_strategy.sl_atr_floor == 1.2
assert config.eur_strategy.min_rr_ratio == 1.0
assert config.eur_strategy.tp_quality_scale["A"] == 1.2
assert config.eur_strategy.min_rr_ratio == 0.5
agg = SignalAggregator(config)
df = make_ohlcv(n=300, start_price=1.0800, trend=0.0003, seed=77)
dfs = {Timeframe.H1: df, Timeframe.M15: df, Timeframe.H4: df}
report = agg.analyze_from_dataframes(symbol=EURUSD, dfs=dfs, use_news=False)
if report.trade_setup:
assert report.trade_setup.risk_reward >= 1.0 - 0.01
assert report.trade_setup.risk_reward >= 0.5 - 0.01
# ══════════════════════════════════════════════════════════════════════