From 19ee379f20692825f805827df0c8f80de464e431 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Wed, 12 Aug 2026 20:17:12 +0200 Subject: [PATCH] rec_outcomes: zweiter Bug gefunden und behoben (timeframe_name) Der Log verriet die wahre Ursache: 'WaveRecommender' object has no attribute 'timeframe_name'. rec["tf"] ist leer, also lief der Aufruf immer in diesen Fallback - AttributeError, im except auf DEBUG verschluckt. Der pb_feats-Fix vom 11.08. war damit RICHTIG: er kam an der ersten Sperre vorbei und legte diese zweite frei. Vorher wurde log_rec_outcome nie aufgerufen (atr immer 0), deshalb konnte der zweite Bug gar nicht auftreten. Richtig ist self._wave_tf_label (die Engine haelt das Label). Lehre: nach einem Fix nicht nur pruefen, ob die Tabelle jetzt schreibt, sondern das LOG lesen. Die Zeilen standen seit Stunden da - ich hatte nur auf INFO gefiltert und daraus geschlossen, es gaebe keine. Co-Authored-By: Claude Opus 5 --- core/engine.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/engine.py b/core/engine.py index fa0a0c2..0f93a0d 100644 --- a/core/engine.py +++ b/core/engine.py @@ -1669,9 +1669,18 @@ class TradingEngine: 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: + # ⚠⚠ ZWEITER BUG, gefunden 2026-08-12 im Log: hier stand + # `self.wave.timeframe_name` — das Attribut gibt es NICHT + # (`AttributeError`, im `except` auf DEBUG verschluckt). + # `rec["tf"]` ist leer, also lief es IMMER in den Fallback. + # Der `pb_feats`-Fix vom 11.08. war also richtig — er kam + # an der ersten Sperre vorbei und legte diese zweite frei. + # ⚠ Lehre: nach einem Fix nicht nur „schreibt es jetzt?" + # pruefen, sondern das LOG lesen. Die Zeilen standen seit + # Stunden da; ich hatte nur auf INFO gefiltert. _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 ""), + tf=str(rec.get("tf") or self._wave_tf_label or ""), price=_px, atr=_atr) log.info(f"rec_outcome #{_rid}: {_sig} @ {_px} atr={_atr}") if _sig in ("LONG", "SHORT", "WARTEN"):