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 #<id>: LONG @ <px> atr=<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 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-12 09:21:50 +02:00
co-authored by Claude Opus 5
parent b18b594639
commit b2a1e35f5e
2 changed files with 28 additions and 2 deletions
+12
View File
@@ -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. **MT5Data**-Snapshot (Preis/Trend/Konto); `pb_feats` lebt im **Wave**-Snapshot.
Ergebnis: `_atr` immer 0,0 → die Schreibbedingung `_atr > 0` nie erfüllt. 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). **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 **Warum keine Prüfung es fing:** es ist **kein** `NameError` (ruff F821 sieht
nichts), sondern ein falsches dict — syntaktisch einwandfrei. Und das umgebende nichts), sondern ein falsches dict — syntaktisch einwandfrei. Und das umgebende
`except` loggt auf **DEBUG**, der Logger steht auf INFO. Exakt die Fehlerklasse, `except` loggt auf **DEBUG**, der Logger steht auf INFO. Exakt die Fehlerklasse,
+16 -2
View File
@@ -1762,16 +1762,30 @@ class TradingEngine:
_ws = self.wave.snapshot() or {} _ws = self.wave.snapshot() or {}
_atr = float((_ws.get("pb_feats") or {}).get("atr") or 0.0) _atr = float((_ws.get("pb_feats") or {}).get("atr") or 0.0)
_px = float(s.get("bid") 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: 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), 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.timeframe_name or ""),
price=_px, atr=_atr) price=_px, atr=_atr)
log.info(f"rec_outcome #{_rid}: {_sig} @ {_px} atr={_atr}")
if _sig in ("LONG", "SHORT", "WARTEN"): if _sig in ("LONG", "SHORT", "WARTEN"):
# WARTEN re-armt: die naechste Richtung ist eine NEUE Episode. # WARTEN re-armt: die naechste Richtung ist eine NEUE Episode.
self._rec_epi_sig = _sig if _sig != "WARTEN" else None self._rec_epi_sig = _sig if _sig != "WARTEN" else None
except Exception as e: 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 # Verdict-Stimmen-Logging (2026-07-24, Idee 2b): Modul-Votes 1×/min in die
# DB (`verdict_votes`), damit die UNBELEGTEN Stimmen (KI-Copilot, Elliott) # DB (`verdict_votes`), damit die UNBELEGTEN Stimmen (KI-Copilot, Elliott)