Feste Einsatz-Margin (UI-Feld) + lokale Sprachausgabe via Piper
EINSATZ-FELD (User-Wunsch): Laufzeitwert MANUAL_MARGIN in core/config.py (set/get_manual_margin, Muster wie set_margin_buffer). 0 = automatisch wie bisher (margin_buffer_pct % der freien Margin), > 0 = Position wird auf genau diesen Margin-Einsatz gerechnet. - calc_lots setzt es um und DECKELT auf freie Margin x Buffer; ein zu hoher Wunschwert wird begrenzt und geloggt statt an den Broker durchgereicht. Reicht der Betrag nicht fuers Mindestlot -> 0.0 + Warnung, Trade sauber abgelehnt. - Vorrang vor dem Risiko-Modus in trader._send_locked: eine ausdrueckliche Groessenvorgabe schlaegt die Rechenregel. - Wirkt auf ALLE neuen Positionen, auch die autonomen. - UI-Feld "Einsatz" in der ORDER-Leiste (nicht in der Trade-Leiste: die ist nur bei offener Position sichtbar, der Einsatz muss vorher einstellbar sein), bernstein umrandet solange gesetzt. Enter blurrt nur, change sendet einmal. - POST /api/manualmargin, Snapshot manual_margin, neustart-fest ueber runtime_state.json. Ende-zu-Ende getestet (250 -> Snapshot -> 0 -> persistiert). - Lot-Logik isoliert geprueft: 200 EUR -> 0,58 Lots; 5000 EUR -> gedeckelt. SPRACHAUSGABE: Piper lokal (tools/speak.py). Windows-TTS funktioniert zwar, aber es ist KEINE deutsche Stimme installiert - weder SAPI5 noch OneCore (nur David/Zira/Mark, en-US); deutscher Text kaeme mit englischer Aussprache. Add-WindowsCapability scheitert ohne Adminrechte. Piper gewaehlt: laeuft lokal (passt zum Rest - WireGuard-only, Secrets in der ini, keine Cloud), kostet nichts, aus PowerShell/Python aufrufbar. Stimme thorsten-medium (de_DE), Real-Time-Faktor 0,08 (4,3 s Audio in 0,36 s). Das ZIP entpackt eine Ebene tiefer als erwartet (tools/piper/piper/piper.exe) - speak.py SUCHT Binary und Modell statt Pfade fest zu verdrahten. Der erste Entwurf scheiterte daran; der Fail-safe meldete die Pfade sauber statt stumm zu bleiben. Drei Modi getestet (Argument, Pipe, --wav). tools/piper/ ist gitignored (Binaries + 60-MB-Modell), speak.py versioniert. v=136. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
33b6b8f629
commit
6af4c868bc
@@ -58,6 +58,32 @@ def get_margin_buffer() -> float:
|
||||
return MARGIN_BUFFER
|
||||
|
||||
|
||||
# ── Manuell vorgegebene Einsatz-Margin (User-Wunsch 2026-08-04) ───────────────
|
||||
# 0 = AUS → automatische Größe wie bisher (MARGIN_BUFFER % der freien Margin bzw.
|
||||
# risiko-basiert bei RISK_PER_TRADE > 0). > 0 = die Position wird auf GENAU diesen
|
||||
# Margin-Einsatz in Kontowährung gerechnet.
|
||||
# ⚠ Die freie Margin bleibt IMMER die Obergrenze — ein zu hoher Wunschwert wird
|
||||
# gedeckelt, nicht durchgereicht (sonst Broker-Reject mit kryptischem retcode).
|
||||
MANUAL_MARGIN = 0.0
|
||||
|
||||
|
||||
def set_manual_margin(eur: float) -> float:
|
||||
"""Feste Einsatz-Margin in Kontowährung setzen. 0 = automatisch."""
|
||||
global MANUAL_MARGIN
|
||||
try:
|
||||
MANUAL_MARGIN = max(0.0, float(eur or 0))
|
||||
except (TypeError, ValueError):
|
||||
MANUAL_MARGIN = 0.0
|
||||
log.info(f"Einsatz-Margin: "
|
||||
+ (f"{MANUAL_MARGIN:.2f} (manuell)" if MANUAL_MARGIN > 0
|
||||
else "automatisch"))
|
||||
return MANUAL_MARGIN
|
||||
|
||||
|
||||
def get_manual_margin() -> float:
|
||||
return MANUAL_MARGIN
|
||||
|
||||
|
||||
def set_risk_per_trade(pct: float) -> float:
|
||||
"""Setzt das Risiko pro Trade zur Laufzeit (% der Equity). 0 = aus (Fallback
|
||||
margin-basiert). Sinnvoll 0,5–3 %."""
|
||||
|
||||
Reference in New Issue
Block a user