Tune EUR/USD trade setup: quality-scaled TP and tighter SL

EUR/USD A-grade signals had inverted quality curve (-1.65R) because all
trades got RR≈0.50 and mature_move logic penalized high-score entries.

Fix: add per-pair trade setup params (sl_atr_floor=1.2, min_rr=1.0,
mature_move_threshold=35) and apply quality_scale to both tp_mult and
min_rr so A-grade gets wider TP targets. Also wire EUR config into
backtest via PAIR_PRODUCERS registry.

Result: A-grade now +1.24R (was -1.65R), total EUR/USD +10.06R (was +4.20R).
XAU/USD unchanged at +13.01R.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
harwinder
2026-05-18 12:56:34 -04:00
parent 3146a632d4
commit 74b723ba06
4 changed files with 77 additions and 18 deletions
+17 -7
View File
@@ -859,15 +859,25 @@ class SignalAggregator:
else:
is_buy = report.final_score >= 0
levels = report.primary_analysis.key_levels
min_rr = self.config.signals.min_rr_ratio
mature_move = abs(report.final_score) > 30
tp_mult = 1.0 if mature_move else 1.5
tp_swing_cap = 2.0 if mature_move else 2.5
_is_eur = report.display_name == "EUR/USD" and self.config.eur_strategy.enabled
# Fix 3: Wider SL multiplier for XAU/USD (1.8x vs default 1.5x)
sl_atr_floor = (self.config.xau_strategy.v2_sl_atr_multiplier
if report.display_name == "XAU/USD" else 1.5)
if _is_eur:
eur = self.config.eur_strategy
q_scale = eur.tp_quality_scale.get(report.signal_quality, 1.0)
min_rr = eur.min_rr_ratio * q_scale
mature_move = abs(report.final_score) > eur.mature_move_threshold
base_tp = eur.tp_atr_multiplier if mature_move else eur.tp_atr_multiplier * 1.5
tp_mult = base_tp * q_scale
tp_swing_cap = (2.0 if mature_move else 2.5) * q_scale
sl_atr_floor = eur.sl_atr_floor
else:
min_rr = self.config.signals.min_rr_ratio
mature_move = abs(report.final_score) > 30
tp_mult = 1.0 if mature_move else 1.5
tp_swing_cap = 2.0 if mature_move else 2.5
sl_atr_floor = (self.config.xau_strategy.v2_sl_atr_multiplier
if report.display_name == "XAU/USD" else 1.5)
if is_buy:
swing_lows = sorted(