diff --git a/backend/routers/cycle.py b/backend/routers/cycle.py index a1a2ff6..fb6678e 100644 --- a/backend/routers/cycle.py +++ b/backend/routers/cycle.py @@ -44,6 +44,9 @@ class CycleConfigRequest(BaseModel): similarity_threshold: Optional[float] = None min_ev_threshold: Optional[float] = None min_score_threshold: Optional[int] = None + trade_budget_eur: Optional[float] = None + preferred_horizon_min: Optional[int] = None + preferred_horizon_max: Optional[int] = None journal_retention_days: Optional[int] = None maturity_threshold_pct: Optional[int] = None weekend_cycle_enabled: Optional[bool] = None @@ -81,6 +84,18 @@ def update_cycle_config(req: CycleConfigRequest): set_config("maturity_threshold_pct", str(req.maturity_threshold_pct)) if req.weekend_cycle_enabled is not None: set_config("weekend_cycle_enabled", "true" if req.weekend_cycle_enabled else "false") + if req.trade_budget_eur is not None: + if not (100 <= req.trade_budget_eur <= 500_000): + raise HTTPException(400, "trade_budget_eur must be between 100 and 500000") + set_config("trade_budget_eur", str(req.trade_budget_eur)) + if req.preferred_horizon_min is not None: + if not (1 <= req.preferred_horizon_min <= 365): + raise HTTPException(400, "preferred_horizon_min must be between 1 and 365") + set_config("preferred_horizon_min", str(req.preferred_horizon_min)) + if req.preferred_horizon_max is not None: + if not (1 <= req.preferred_horizon_max <= 365): + raise HTTPException(400, "preferred_horizon_max must be between 1 and 365") + set_config("preferred_horizon_max", str(req.preferred_horizon_max)) if req.weekend_cycle_times is not None: # Validate format: comma-separated HH:MM values import re diff --git a/backend/services/auto_cycle.py b/backend/services/auto_cycle.py index a445ee1..b071fd2 100644 --- a/backend/services/auto_cycle.py +++ b/backend/services/auto_cycle.py @@ -1956,9 +1956,13 @@ def get_status() -> Dict[str, Any]: min_score = int(get_config("min_score_threshold") or "0") retention_days = int(get_config("journal_retention_days") or "90") maturity_pct = int(get_config("maturity_threshold_pct") or "35") + trade_budget_eur = float(get_config("trade_budget_eur") or "5000") + preferred_horizon_min = int(get_config("preferred_horizon_min") or "30") + preferred_horizon_max = int(get_config("preferred_horizon_max") or "180") except Exception: interval_hours, enabled, sim_threshold, min_ev, min_score = 3.0, False, 0.30, 0.0, 0 retention_days, maturity_pct = 90, 35 + trade_budget_eur, preferred_horizon_min, preferred_horizon_max = 5000.0, 30, 180 recent = get_cycle_runs(limit=1) last = recent[0] if recent else None @@ -1997,6 +2001,9 @@ def get_status() -> Dict[str, Any]: "min_score_threshold": min_score, "journal_retention_days": retention_days, "maturity_threshold_pct": maturity_pct, + "trade_budget_eur": trade_budget_eur, + "preferred_horizon_min": preferred_horizon_min, + "preferred_horizon_max": preferred_horizon_max, "weekend_cycle_enabled": weekend_enabled, "weekend_cycle_times": weekend_cycle_times, "last_cycle": last,