""" Per-pair signal producers. Each pair module exposes: make_config(primary_tf, confirmation_tfs) -> PlatformConfig To add a new pair: create pair_signals/.py with make_config(), then register it in this file. """ from typing import Optional, List, Dict, Callable from config import Timeframe from signal_aggregator import SignalAggregator, SignalReport from providers import BaseDataProvider PAIR_PRODUCERS: Dict[str, Callable] = {} def register_pair(symbol: str, config_factory: Callable): PAIR_PRODUCERS[symbol] = config_factory def produce_signal( symbol: str, primary_tf: Timeframe, data_provider: BaseDataProvider, confirmation_tfs: Optional[List[Timeframe]] = None, log_source: str = "dashboard", ) -> SignalReport: config_factory = PAIR_PRODUCERS.get(symbol) if config_factory is None: raise ValueError( f"No signal producer registered for {symbol}. " f"Available: {list(PAIR_PRODUCERS.keys())}" ) config = config_factory(primary_tf, confirmation_tfs) aggregator = SignalAggregator(config) aggregator.data_provider = data_provider return aggregator.analyze_pair(symbol=symbol, log_source=log_source) from pair_signals import xauusd as _xau_mod from config import XAUUSD register_pair(XAUUSD, _xau_mod.make_config)