""" Configuration — loaded once at import time. Values come from config.json (strategy params) and .env (secrets). """ import json import os from pathlib import Path from dotenv import load_dotenv load_dotenv() _root = Path(__file__).parent.parent with open(_root / "config.json") as f: _cfg = json.load(f) # ── strategy ────────────────────────────────────────────────────────────────── SYMBOLS: list[str] = _cfg["symbols"] TIMEFRAME: str = _cfg["timeframe"] # "M15" LOOKBACK: int = _cfg["lookback_candles"] # bars for indicator warmup RSI_PERIOD: int = _cfg["rsi_period"] ATR_PERIOD: int = _cfg["atr_period"] OS_LEVEL: float = _cfg["os_level"] OB_LEVEL: float = _cfg["ob_level"] SL_ATR: float = _cfg["sl_atr"] TP_ATR: float = _cfg["tp_atr"] TREND_FAST: int = _cfg["trend_fast"] TREND_SLOW: int = _cfg["trend_slow"] SESSION_START: int = _cfg["session_start"] SESSION_END: int = _cfg["session_end"] # ── risk ────────────────────────────────────────────────────────────────────── RISK_PER_TRADE: float = _cfg["risk_per_trade"] # fraction, e.g. 0.01 MAX_POSITIONS: int = _cfg["max_positions"] MIN_SL_PIPS: float = _cfg["min_sl_pips"] MAX_DAILY_LOSS: float = _cfg["max_daily_loss"] # fraction of balance # ── mode ────────────────────────────────────────────────────────────────────── PAPER_TRADING: bool = _cfg.get("paper_trading", True) PAPER_INITIAL_BALANCE: float = _cfg.get("paper_initial_balance", 10_000.0) REFRESH_INTERVAL: int = _cfg.get("refresh_interval_seconds", 15) # ── broker secrets (from .env) ──────────────────────────────────────────────── MT5_LOGIN: int = int(os.environ.get("MT5_LOGIN") or "0") MT5_PASSWORD: str = os.environ.get("MT5_PASSWORD", "") MT5_SERVER: str = os.environ.get("MT5_SERVER", "") # ── telegram secrets ────────────────────────────────────────────────────────── TELEGRAM_BOT_TOKEN: str = os.environ.get("TELEGRAM_BOT_TOKEN", "") TELEGRAM_CHAT_ID: str = os.environ.get("TELEGRAM_CHAT_ID", "")