from pathlib import Path from pydantic_settings import BaseSettings, SettingsConfigDict from app.bars.models import Timeframe TIMEFRAME_WEIGHT = { Timeframe.M1: 1, Timeframe.M2: 1, Timeframe.M5: 1, Timeframe.M15: 2, Timeframe.M30: 3, Timeframe.H1: 4, Timeframe.H4: 8, Timeframe.D1: 16, } MA_WEIGHT_FACTOR = 0.75 class Settings(BaseSettings): model_config = SettingsConfigDict(env_file=".env", extra="ignore") live_source: str = "yahoo" seed_source: str = "yahoo" yahoo_symbol: str = "ES=F" yahoo_poll_seconds: float = 20 seed_1h_range: str = "730d" seed_1m_range: str = "8d" timeframes: str = "1m,2m,5m,15m,30m,1h,4h,1d" base_timeframes: str = "1m,30m,1d" max_bars_per_tf: int = 5000 ma_sets__1d: str = "sma10,sma20,sma50,sma100,sma200" ma_sets__4h: str = "" ma_sets__1h: str = "" daily_anchor_et: str = "18:00" manual_lines_path: Path = Path("./data/manual_lines.json") confluence_min_score: float = 28 alert_cooldown_seconds: int = 900 ntfy_topic: str = "" ntfy_server: str = "https://ntfy.sh" chart_auth_token: str = "" replay_file: Path | None = None @property def enabled_timeframes(self) -> list[Timeframe]: return [Timeframe(value.strip()) for value in self.timeframes.split(",") if value.strip()]