Einsatz-Prozentsatz je autonomem Pfad (BRK / M15) + Dashboard-Feld
User: "Baue ein Eingabefeld im Dashboard ein in welchem ich das Margin Verhaeltnis von M15 / BRK manuell setzen kann". ⚠⚠ EHRLICHE EINORDNUNG, weil die Umsetzung NICHT ist, wonach es klingt: eine GLEICHZEITIGE Aufteilung (z.B. 40 % manuell / 50 % reserviert fuer BRK) ist heute nicht baubar. Der Bot haelt EINE Position - _check_auto_squeeze feuert "nur FLAT", und Trailing, Notfall-Stop, S/R-Close, Time-Stop und Breaker verwalten je EINE Position (42 Einzel-Positions-Annahmen in engine.py, 25 in trader.py). Mit zwei Positionen auf demselben Symbol haengt der GESAMTE Schutz-Stack an einer davon, die andere liefe ungeschuetzt. Das ist kein Aufwands-, sondern ein Sicherheitsargument. GEBAUT ist deshalb das, was heute wirkt und dieselbe Frage beantwortet: je Pfad ein eigener Einsatz-Prozentsatz. 0 = globaler Wert (bisheriges Verhalten). Quellen-abhaengig verdrahtet wie die SL-Zeitebene seit 05.08.: _open() setzt config.MARGIN_BUFFER fuer die Dauer des einen Aufrufs und stellt ihn im finally-Zweig zurueck. Manuelle Trades bleiben beim globalen Wert (der Mensch ist die gemessen bessere Population, +1,56 gegen -4,71 EUR/Lot). ⚠ Direkt gesetzt statt ueber set_margin_buffer(): das loggt je Trade eine Zeile UND wuerde den globalen Wert dauerhaft ueberschreiben. ⚠⚠ ZWEI ECHTE FEHLER VOM LINTER GEFANGEN, die py_compile durchgewinkt hat: "config" war in engine.py gar nicht importiert (nur Einzelnamen via "from core.config import ..."), und in server.py hiess die Engine "eng" statt "app.state.engine". Beide sassen in Pfaden, die erst beim ERSTEN autonomen Trade bzw. beim ersten Klick gefeuert haetten - also genau die Klasse, fuer die ruff F821 am 07.08. eingebaut wurde. ⚠ Frontend: $streng statt $, weil LEER hier ausdruecklich 0 = "global" bedeutet und nicht "unveraendert"; mit dem Auffang-Element waere .value undefined -> NaN -> null. Der Render ueberschreibt das Feld nicht, solange es den Fokus hat (sonst frisst der 1-s-Snapshot die laufende Eingabe). ⚠ Beim Committen selbst zweimal danebengegriffen, beides dokumentiert weil es Fehlerklassen sind: (a) Backticks in einer Bash-Commit-Nachricht werden als Kommando-Substitution ausgefuehrt und loeschen die eingeklammerten Namen aus dem Text; (b) ein Bash-Pfad (/c/Users/...) an Python uebergeben schlaegt fehl, und "git commit --amend -F <fehlende Datei>" nahm daraufhin eine STALE COMMIT_EDITMSG - die Nachricht eines fremden Commits. Der Code war davon nie betroffen (Arbeitsbaum sauber, Remote synchron), nur die Beschriftung. Ende-zu-Ende geprueft: 50/25 gesetzt -> Snapshot -> persistiert; 150 abgelehnt; 0/0 zurueck. Deploy ueber tools/deploy.py --feld margin_brk, alle 5 Schritte. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
8e7223f6ce
commit
0a465f9258
@@ -412,6 +412,28 @@ async def set_manual_margin(body: dict,
|
||||
return {"ok": True, "value": val}
|
||||
|
||||
|
||||
@app.post("/api/automargin")
|
||||
async def set_auto_margin(body: dict,
|
||||
x_auth_token: str | None = Header(default=None)):
|
||||
"""Einsatz-Prozentsatz JE AUTONOMEM PFAD (User-Wunsch 2026-08-19).
|
||||
|
||||
`{"brk": 50, "m15": 25}` — 0 heisst "globaler Wert" (bisheriges Verhalten).
|
||||
⚠ KEINE gleichzeitige Reservierung: der Bot haelt EINE Position, es kann
|
||||
also nie BRK und M15 nebeneinander geben. Das Feld steuert die GROESSE der
|
||||
jeweiligen Position. Manuelle Trades bleiben beim globalen Prozentsatz."""
|
||||
_require_auth(x_auth_token)
|
||||
try:
|
||||
brk = float(body.get("brk") or 0)
|
||||
m15 = float(body.get("m15") or 0)
|
||||
except (TypeError, ValueError):
|
||||
return {"ok": False, "error": "ungueltiger Wert"}
|
||||
if brk < 0 or m15 < 0 or brk > 99 or m15 > 99:
|
||||
return {"ok": False, "error": "erlaubt sind 0 (=global) bis 99"}
|
||||
r = app.state.engine.set_auto_margin(brk, m15)
|
||||
log.info(f"[WEB] Einsatz je Pfad: BRK {r['brk']:.0f}% · M15 {r['m15']:.0f}%")
|
||||
return {"ok": True, **r}
|
||||
|
||||
|
||||
@app.post("/api/marginpct")
|
||||
async def set_margin_pct(body: dict,
|
||||
x_auth_token: str | None = Header(default=None)):
|
||||
|
||||
Reference in New Issue
Block a user