from dotenv import load_dotenv import os load_dotenv() class Settings: alpaca_key = os.getenv("ALPACA_API_KEY", "") alpaca_secret = os.getenv("ALPACA_API_SECRET", "") alpaca_base = os.getenv("ALPACA_BASE_URL", "https://paper-api.alpaca.markets") paper_mode = os.getenv("PAPER_MODE", "true").lower() == "true" # Capital/risk profile starting_capital_usd = float(os.getenv("STARTING_CAPITAL_USD", "100")) max_order_usd = float(os.getenv("MAX_ORDER_USD", "5")) max_daily_notional = float(os.getenv("MAX_DAILY_NOTIONAL", "40")) max_open_positions = int(os.getenv("MAX_OPEN_POSITIONS", "8")) min_confidence = float(os.getenv("MIN_CONFIDENCE", "0.60")) # Approx fee model for small-size optimization fee_per_trade_usd = float(os.getenv("FEE_PER_TRADE_USD", "0.00")) slippage_bps = float(os.getenv("SLIPPAGE_BPS", "5")) # Scheduling trade_interval_hours = int(os.getenv("TRADE_INTERVAL_HOURS", "2")) curate_interval_minutes = int(os.getenv("CURATE_INTERVAL_MINUTES", "30")) timezone = os.getenv("TIMEZONE", "America/Los_Angeles") # LLM stack (small for curation, larger for final decision) ollama_url = os.getenv("OLLAMA_URL", "http://10.30.20.110:11434") ollama_curator_model = os.getenv("OLLAMA_CURATOR_MODEL", "gemma3:latest") ollama_decision_model = os.getenv("OLLAMA_DECISION_MODEL", "agent-oss:latest") # Data sources searx_url = os.getenv("SEARX_URL", "http://10.30.20.35:6969/search") scraper_api = os.getenv("SCRAPER_API_URL", "http://10.30.20.115:24125") # App db_path = os.getenv("DB_PATH", "sqlite:///./bot.db") host = os.getenv("APP_HOST", "0.0.0.0") port = int(os.getenv("APP_PORT", "8089")) symbols = [s.strip().upper() for s in os.getenv("SYMBOLS", "SPY,QQQ").split(",") if s.strip()] settings = Settings()