From f04ae4d9d904cebe96413da2262b99c2fe0a9ffa Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Wed, 19 Aug 2026 20:07:33 +0200 Subject: [PATCH] Fix: Einsatz je Pfad ueberlebte keinen Neustart (Reihenfolge-Fehler) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User: "Einsatz BRK % / Einsatz M15 % hat keine Auswirkung, die Eingabe bleibt wirkungslos, in den Feldern erscheint 'global'". URSACHE - mein Fehler beim Bau: die Default-Initialisierung (self._margin_brk = 0.0) stand in Zeile 631, `_load_runtime_state()` laeuft aber in Zeile 553. Der geladene Wert wurde also unmittelbar danach mit 0 ueberschrieben. Die Eingabe WIRKTE (POST kam an, Wert stand im Snapshot, wurde auf Platte geschrieben) - sie war nach dem naechsten Neustart weg, und das Feld zeigte wieder den Platzhalter "global". Real am 19.08.: BRK 10 / M15 85 gesetzt, nach dem Deploy beide 0. Behoben: Defaults stehen jetzt VOR dem Laden. Reihenfolge ist immer Default setzen -> runtime_state laedt darueber. ⚠ EIGENER FEHLALARM beim Verifizieren, dokumentiert weil er lehrreich ist: mein Persistenz-Test setzte 55/30, und nach dem Neustart standen 85/10 - ich habe das als "VERLOREN" und sogar als Vertauschung gelesen. Die Logzeitstempel zeigen etwas anderes: um 20:06:04 und 20:06:06 hat der Browser des Users zwei weitere POSTs geschickt (85/30, dann 85/10), waehrend mein Test lief. Persistiert wurde also korrekt der ZULETZT gesetzte Wert. Lehre: bei einer Live-Verifikation gegen ein System, das der Nutzer gleichzeitig bedient, gehoert die Logspur mitgelesen - sonst hält man fremde Eingaben fuer einen Defekt. Co-Authored-By: Claude Opus 5 --- core/engine.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/engine.py b/core/engine.py index bcc726c..5e3ef82 100644 --- a/core/engine.py +++ b/core/engine.py @@ -550,6 +550,14 @@ class TradingEngine: self._runtime_state_path = _os2.path.join( _os2.path.dirname(_os2.path.dirname(_os2.path.abspath(__file__))), "runtime_state.json") + # ⚠⚠ Einsatz je autonomem Pfad MUSS VOR `_load_runtime_state()` stehen. + # Der erste Bau setzte die Defaults DANACH (Z. 631 gegen Z. 553) und + # ueberschrieb damit jeden gespeicherten Wert mit 0 — die Eingabe im + # Dashboard wirkte, war aber nach dem naechsten Neustart weg (real am + # 19.08.: BRK 10 / M15 85 gesetzt, nach dem Deploy beide 0). + # Reihenfolge ist immer: Default setzen -> runtime_state laedt darueber. + self._margin_brk = 0.0 + self._margin_m15 = 0.0 self._load_runtime_state() self._mql5_files_dir = None # \MQL5\Files (lazy, für den Indikator) self._export_trade_marks = self.cfg["trading"].get("export_trade_marks", "false").lower() == "true" @@ -626,10 +634,6 @@ class TradingEngine: self._cb_remember = self._cb_limit_pct or 8.0 except (TypeError, ValueError): self._cb_limit_pct = 0.0 - # Einsatz je autonomem Pfad (0 = globaler `margin_buffer_pct`). - # Wird von `runtime_state.json` ueberschrieben, falls dort gesetzt. - self._margin_brk = 0.0 - self._margin_m15 = 0.0 self._circuit_tripped_date = None # Berlin-Datum, an dem der Breaker griff self._cb_realized = (0.0, 0.0) # (ts, realisierter Tages-P&L) gecacht ~30 s # Gewinn-mitnehmen (Take-Profit) — symmetrisch zum Notfall-Stop: schließt