Provider-Failover bei hartem Fehlschlag + Einsatz-Prozentfeld im Dashboard
1) LLM-Failover (core/agent.py): ein hart gescheiterter Provider wird zeitweise uebersprungen, analyze() nimmt den naechsten aus der Kette. Hart = 401/402/403/ 404 (Key/Guthaben/Modell) -> 30 min, nicht erreichbar -> 5 min. Timeout/429/5xx loesen BEWUSST keinen Wechsel aus (voruebergehend; sonst kostet jede Lastspitze die volle Timeout-Summe aller Anbieter). Neu im Snapshot: agent.provider_dead mit Restminuten - der DeepSeek-Ausfall stand vorher nur im Log und blieb deshalb 18 h unbemerkt. 9 Szenarien getestet. 2) Einsatz-Prozentfeld (web, v=137): margin_buffer_pct hatte bisher keine UI. Neues Feld "Einsatz %" neben "Einsatz EUR", POST /api/marginpct -> engine.set_margin_pct -> config.set_margin_buffer, Snapshot margin_pct, neustart-fest. Der feste EUR-Betrag hat Vorrang; das Prozentfeld wird dann ausgegraut, damit nicht unklar bleibt was gilt. Auf 1-99 % geklemmt. Ende-zu-Ende getestet (50, 150->99, 0 und -5 abgelehnt, 95, persistiert). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
7e9b0196a5
commit
cc4f1a0863
@@ -364,6 +364,26 @@ async def set_manual_margin(body: dict,
|
||||
return {"ok": True, "value": val}
|
||||
|
||||
|
||||
@app.post("/api/marginpct")
|
||||
async def set_margin_pct(body: dict,
|
||||
x_auth_token: str | None = Header(default=None)):
|
||||
"""Einsatz als PROZENT der freien Margin setzen (User-Wunsch 2026-08-05).
|
||||
|
||||
Gegenstück zu `/api/manualmargin` (fester Betrag). ⚠ Ein gesetzter FESTER
|
||||
Betrag hat Vorrang; der Prozentsatz bleibt dann nur noch die Obergrenze.
|
||||
Wird auf 1–99 % geklemmt — 100 % ließe keinen Puffer für Spread/Swap."""
|
||||
_require_auth(x_auth_token)
|
||||
try:
|
||||
v = float(body.get("value") or 0)
|
||||
except (TypeError, ValueError):
|
||||
return {"ok": False, "error": "ungültiger Wert"}
|
||||
if v <= 0:
|
||||
return {"ok": False, "error": "Prozentsatz muss > 0 sein"}
|
||||
val = app.state.engine.set_margin_pct(v)
|
||||
get_logger("server").info(f"[WEB] Einsatz-Prozentsatz: {val:.0f} % der freien Margin")
|
||||
return {"ok": True, "value": val}
|
||||
|
||||
|
||||
@app.post("/api/autosignal")
|
||||
async def toggle_autosignal(x_auth_token: str | None = Header(default=None)):
|
||||
"""Autonomen Entry auf die EMPFEHLUNG an/aus (User-Wunsch 2026-07-30).
|
||||
|
||||
Reference in New Issue
Block a user