From e39054af02b03c1684a38935a1a8fe1baf6f8120 Mon Sep 17 00:00:00 2001 From: harry Date: Mon, 4 May 2026 04:08:10 +0000 Subject: [PATCH] Add config.py --- config.py | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 config.py diff --git a/config.py b/config.py new file mode 100644 index 0000000..de464f5 --- /dev/null +++ b/config.py @@ -0,0 +1,194 @@ +""" +Forex Signal Intelligence Platform - Configuration +=================================================== +Central configuration for all signal analysis parameters. +Tuned by market regime and validated against historical performance. +""" + +from dataclasses import dataclass, field +from enum import Enum +from typing import Dict, List + + +class Timeframe(Enum): + M1 = "1min" + M5 = "5min" + M15 = "15min" + M30 = "30min" + H1 = "1h" + H4 = "4h" + D1 = "1d" + W1 = "1wk" + + +class SignalStrength(Enum): + STRONG_BUY = 2 + BUY = 1 + NEUTRAL = 0 + SELL = -1 + STRONG_SELL = -2 + + +class MarketSession(Enum): + SYDNEY = "sydney" + TOKYO = "tokyo" + LONDON = "london" + NEW_YORK = "new_york" + OVERLAP_LONDON_NY = "london_ny_overlap" + + +# ── Major Forex Pairs ────────────────────────────────────────────── +MAJOR_PAIRS = [ + "EURUSD=X", "GBPUSD=X", "USDJPY=X", "USDCHF=X", + "AUDUSD=X", "USDCAD=X", "NZDUSD=X", +] + +CROSS_PAIRS = [ + "EURGBP=X", "EURJPY=X", "GBPJPY=X", "AUDJPY=X", + "EURCHF=X", "CADJPY=X", +] + +# Yahoo Finance symbol mapping for display +SYMBOL_DISPLAY = { + "EURUSD=X": "EUR/USD", "GBPUSD=X": "GBP/USD", + "USDJPY=X": "USD/JPY", "USDCHF=X": "USD/CHF", + "AUDUSD=X": "AUD/USD", "USDCAD=X": "USD/CAD", + "NZDUSD=X": "NZD/USD", "EURGBP=X": "EUR/GBP", + "EURJPY=X": "EUR/JPY", "GBPJPY=X": "GBP/JPY", + "AUDJPY=X": "AUD/JPY", "EURCHF=X": "EUR/CHF", + "CADJPY=X": "CAD/JPY", +} + + +@dataclass +class TechnicalConfig: + """Technical indicator parameters - carefully tuned for Forex.""" + # EMA periods (fast/medium/slow for trend detection) + ema_fast: int = 9 + ema_medium: int = 21 + ema_slow: int = 50 + ema_trend: int = 200 + + # RSI + rsi_period: int = 14 + rsi_overbought: float = 70.0 + rsi_oversold: float = 30.0 + rsi_neutral_upper: float = 60.0 + rsi_neutral_lower: float = 40.0 + + # MACD (12, 26, 9 is standard but we validate) + macd_fast: int = 12 + macd_slow: int = 26 + macd_signal: int = 9 + + # Bollinger Bands + bb_period: int = 20 + bb_std: float = 2.0 + + # ATR for volatility measurement + atr_period: int = 14 + + # Stochastic + stoch_k: int = 14 + stoch_d: int = 3 + stoch_overbought: float = 80.0 + stoch_oversold: float = 20.0 + + # ADX for trend strength + adx_period: int = 14 + adx_strong_trend: float = 25.0 + adx_very_strong: float = 50.0 + + # Ichimoku + ichimoku_tenkan: int = 9 + ichimoku_kijun: int = 26 + ichimoku_senkou_b: int = 52 + + # Volume profile + volume_ma_period: int = 20 + + # Pivot points lookback + pivot_lookback: int = 1 + + +@dataclass +class SignalConfig: + """Signal scoring and filtering parameters.""" + # Minimum confidence to emit a signal (0-100) + min_confidence: float = 55.0 + + # Weight allocation for composite score + weights: Dict[str, float] = field(default_factory=lambda: { + "trend": 0.25, # EMA alignment, ADX + "momentum": 0.20, # RSI, Stochastic, MACD + "volatility": 0.15, # BB position, ATR regime + "price_action": 0.15, # Candlestick patterns, S/R + "multi_timeframe": 0.15,# Higher TF confirmation + "sentiment": 0.10, # News/calendar events + }) + + # Multi-timeframe confirmation requirements + mtf_agreement_threshold: int = 2 # out of 3 timeframes must agree + + # Divergence detection sensitivity + divergence_lookback: int = 14 + divergence_min_swing: float = 0.001 # minimum price swing for valid divergence + + # Signal cooldown (prevent over-signalling same direction) + cooldown_bars: int = 5 + + # Risk management defaults + default_risk_pct: float = 1.0 # risk 1% per trade + default_rr_ratio: float = 2.0 # 1:2 risk-reward minimum + + +@dataclass +class NewsConfig: + """Economic calendar and sentiment configuration.""" + # High-impact event currencies + tracked_currencies: List[str] = field(default_factory=lambda: [ + "USD", "EUR", "GBP", "JPY", "CHF", "AUD", "CAD", "NZD" + ]) + + # Event impact levels to monitor + min_impact: str = "medium" # "low", "medium", "high" + + # Pre-event buffer (minutes before high-impact event = no new signals) + pre_event_buffer_minutes: int = 30 + + # Post-event volatility window (minutes after event = cautious signals) + post_event_buffer_minutes: int = 15 + + # News sentiment sources + rss_feeds: List[str] = field(default_factory=lambda: [ + "https://www.forexlive.com/feed/", + "https://www.fxstreet.com/rss", + ]) + + +@dataclass +class PlatformConfig: + """Overall platform configuration.""" + technical: TechnicalConfig = field(default_factory=TechnicalConfig) + signals: SignalConfig = field(default_factory=SignalConfig) + news: NewsConfig = field(default_factory=NewsConfig) + + # Default pairs to monitor + watch_pairs: List[str] = field(default_factory=lambda: MAJOR_PAIRS) + + # Analysis timeframes (primary + confirmation) + primary_timeframe: Timeframe = Timeframe.H1 + confirmation_timeframes: List[Timeframe] = field( + default_factory=lambda: [Timeframe.M15, Timeframe.H4] + ) + + # Data source + data_lookback_days: int = 60 # enough for 200 EMA on H1 + + # Dashboard refresh interval (seconds) + refresh_interval: int = 300 # 5 minutes + + # Logging + log_level: str = "INFO" + log_signals_to_file: bool = True + signal_log_path: str = "signals.log" \ No newline at end of file