From b2a1e35f5e5c8506ead7dc4babdccfba0f383ddd Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Wed, 12 Aug 2026 09:21:50 +0200 Subject: [PATCH] rec_outcomes: Fix hat nicht gewirkt - jetzt instrumentiert Korrektur meiner Behauptung vom 11.08. Nach dem Neustart um 22:45 gab es bis 09:00 mindestens 10 gerichtete Episoden, und rec_outcomes stand weiter bei 0 Zeilen. Die Praemisse (falsches dict: s.get("pb_feats") auf dem MT5Data- statt dem Wave-Snapshot) ist live belegt - die WIRKUNG des Fixes war es nicht. Ich habe "behoben" geschrieben, ohne sie zu pruefen. Warum es von aussen nicht feststellbar war: der except-Zweig loggte auf DEBUG, der Logger steht auf INFO. Genau die Blindheit, die den Ausfall fuenf Tage getragen hat. Jetzt melden sich BEIDE Zweige sichtbar: - Erfolg: "rec_outcome #: LONG @ atr=" (INFO) - Fehlschlag: "rec_outcome NICHT geschrieben: atr=.. px=.. pb_feats=.." - Exception: WARNING statt DEBUG, mit repr Es feuert nur bei einem echten Richtungswechsel, also selten - kein Laerm. Ursache offen bis zur naechsten Episode. Der Telemetrie-Puls ist der Grund, dass die ausbleibende Wirkung ueberhaupt auffiel. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 12 ++++++++++++ core/engine.py | 18 ++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index be9fa03..17a1806 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6226,6 +6226,18 @@ in 5 Tagen.** `engine._run_analysis` las `s.get("pb_feats")` — `s` ist aber de **MT5Data**-Snapshot (Preis/Trend/Konto); `pb_feats` lebt im **Wave**-Snapshot. Ergebnis: `_atr` immer 0,0 → die Schreibbedingung `_atr > 0` nie erfüllt. ✅ **Live belegt:** `market` hat **kein** `pb_feats`, `wave` hat es (ATR 0,12). +⚠⚠ **KORREKTUR 2026-08-12: der Fix hat NICHT gewirkt.** Nach dem Neustart am +11.08. 22:45 gab es bis 09:00 mindestens **10 gerichtete Episoden** — `rec_outcomes` +stand weiter bei **0 Zeilen**. Die Prämisse (falsches dict) ist belegt, die +**Wirkung war es nicht** — ich habe „behoben" geschrieben, ohne sie zu prüfen. +⚠ Warum es von aussen nicht feststellbar war: der `except`-Zweig loggte auf +**DEBUG**, der Logger steht auf INFO — genau die Blindheit, die den Ausfall fünf +Tage getragen hat. **Jetzt instrumentiert** (2026-08-12): Erfolg UND Fehlschlag +melden sich auf INFO/WARNING, inkl. `atr`/`px`/`pb_feats`-Zustand. Es feuert nur +bei einem echten Richtungswechsel, ist also kein Lärm. Die Ursache ist **offen** +bis zur nächsten Episode. +✅ Der **Telemetrie-Puls** meldet den Zustand seitdem täglich — er ist der Grund, +dass die ausbleibende Wirkung überhaupt auffiel. ⚠ **Warum keine Prüfung es fing:** es ist **kein** `NameError` (ruff F821 sieht nichts), sondern ein falsches dict — syntaktisch einwandfrei. Und das umgebende `except` loggt auf **DEBUG**, der Logger steht auf INFO. Exakt die Fehlerklasse, diff --git a/core/engine.py b/core/engine.py index d7c8225..c3f3ecf 100644 --- a/core/engine.py +++ b/core/engine.py @@ -1762,16 +1762,30 @@ class TradingEngine: _ws = self.wave.snapshot() or {} _atr = float((_ws.get("pb_feats") or {}).get("atr") or 0.0) _px = float(s.get("bid") or 0.0) + # ⚠⚠ DIAGNOSE (2026-08-12): der Fix vom 11.08. hat NICHT gewirkt — + # nach 10 Episoden standen weiter 0 Zeilen. Warum, war von + # aussen nicht feststellbar, weil der Fehlschlag NUR auf DEBUG + # ging und der Logger auf INFO steht. Genau die Blindheit, die + # den Ausfall fuenf Tage getragen hat. Beide Zweige melden + # sich jetzt auf INFO — es feuert nur bei einem echten + # Richtungswechsel, also selten. + if not (_atr > 0 and _px > 0): + log.info(f"rec_outcome NICHT geschrieben: atr={_atr} px={_px} " + f"sig={_sig} (pb_feats={'da' if _ws.get('pb_feats') else 'FEHLT'})") if _atr > 0 and _px > 0 and self.history: - self.history.log_rec_outcome( + _rid = self.history.log_rec_outcome( signal=_sig, conf_pct=int(rec.get("conf_pct") or 0), tf=str(rec.get("tf") or self.wave.timeframe_name or ""), price=_px, atr=_atr) + log.info(f"rec_outcome #{_rid}: {_sig} @ {_px} atr={_atr}") if _sig in ("LONG", "SHORT", "WARTEN"): # WARTEN re-armt: die naechste Richtung ist eine NEUE Episode. self._rec_epi_sig = _sig if _sig != "WARTEN" else None except Exception as e: - log.debug(f"log_rec_outcome: {e}") + # ⚠ war `log.debug` — damit blieb ein Fehlschlag unsichtbar, obwohl + # der Logger auf INFO steht. Die Ausnahme feuert nur bei einem + # Richtungswechsel, also selten; WARNING ist hier kein Lärm. + log.warning(f"log_rec_outcome: {e!r}") # Verdict-Stimmen-Logging (2026-07-24, Idee 2b): Modul-Votes 1×/min in die # DB (`verdict_votes`), damit die UNBELEGTEN Stimmen (KI-Copilot, Elliott)