""" strategy/config.py — centrale strategie-configuratie (sinds 21-07-2026). Eén bron voor alle stop/gate/trap-drempels. Vervangt hardcoded waarden in: stop_loss.py, risk_reward.py, risk_engine.py, profit_taker.py, trade_setup.py, order_executor.py (stapsgewijs aangesloten). Wijzigen = hier wijzigen, nooit in de modules zelf. Per-symbool-override: zet een key in SYMBOOL_OVERRIDES. """ FEE_PCT_PER_KANT = 0.05 # USDC-paren, maker == taker (override via .env blijft gelden) FEE_ROUND_TRIP = 2 * FEE_PCT_PER_KANT # ── Stops per trigger-type (besluit 1) ──────────────────────────────── # wick_tf: timeframe waarop wick-percentielen geleerd worden (was: 4H — te grof) STOPS = { "retest": { "wick_percentiel": "p75", "wick_tf": "15m", "buffer_cap_pct": 0.50, "extra_marge_pct": 0.05, "min_stop_pct": 0.30, "max_stop_pct": 1.00, }, "kanaalgrens": { "wick_percentiel": "p75", "wick_tf": "15m", "buffer_cap_pct": 0.50, "extra_marge_pct": 0.05, "min_stop_pct": 0.30, "max_stop_pct": 1.00, }, "breakout": { "wick_percentiel": "p90", "wick_tf": "15m", "buffer_cap_pct": 0.50, "extra_marge_pct": 0.05, "min_stop_pct": 0.50, "max_stop_pct": 1.50, }, } STOP_DEFAULT_TRIGGER = "breakout" # onbekend trigger_type -> veiligste (ruimste) regels # ── Netto R:R-gate (besluit 4) ──────────────────────────────────────── # netto_reward = gewogen bruto trapwinst - FEE_ROUND_TRIP # netto_risk = stop_pct + FEE_ROUND_TRIP NETTO_RR_MIN = 1.5 # ── Trap-fallback en exit-schema (besluiten 3 + 5) ──────────────────── TRAP_FALLBACK_PCT = [0.5, 1.0, 1.5] # t1 < t2 < t3, label wordt "fallback_pct" # GATE_WEGING is een PLANNINGS-aanname voor de netto-R:R-gate — GEEN verkoopschema. # Uitvoering = kracht-gedreven 1-trap (executor._voer_1trap_logica_uit, besluit 21-07): # trap1 zwak -> alles dicht | normaal/sterk -> 0% verkocht, stop naar breakeven, laten lopen. GATE_WEGING = {"t1": 0.40, "t2": 0.60} # ── Pre-Claude poortwachter (risk_engine, blijft bewust los/laag) ───── PRE_GATE_MIN_RR = {"BTC-USDC": 0.7, "ETH-USDC": 0.8, "default": 0.8} SYMBOOL_OVERRIDES: dict = {} # bv. {"ETH-USDC": {"STOPS": {...}}} — nu leeg def stop_regels(trigger_type: str, symbol: str = "") -> dict: """Stop-regels voor dit trigger-type (+ evt. symbool-override).""" basis = dict(STOPS.get(trigger_type or "", STOPS[STOP_DEFAULT_TRIGGER])) ov = SYMBOOL_OVERRIDES.get(symbol, {}).get("STOPS", {}).get(trigger_type, {}) basis.update(ov) return basis def pre_gate_min_rr(symbol: str) -> float: return PRE_GATE_MIN_RR.get(symbol, PRE_GATE_MIN_RR["default"])