Review-Durchlauf: Telemetrie-Epochen, doppeltes Verdict, Doku-Korrektur

Erster vollstaendiger Durchlauf von docs/review-prompt.md. KEINE
Strategie-Aenderung - alles Telemetrie, Doku und toter Code.

1) analyze_divergence.py kannte keine Epochen und war damit selbst
   driftanfaellig. D0 mischte Vorhersagen des alten und des am 31.07.
   nachtrainierten P(break)-Modells und meldete dessen Fehlkalibrierung als
   aktuellen Alarm (das neue Modell hat n=0, Markt seit Fr zu). B las die
   Prae-Migrations-NULLs von block_reason als blinden Fleck. C druckte bei
   0 Zeilen ein "OK", obwohl es fehlende Daten waren. Neu: _EPOCHS + _clamp().

2) Konsens-Pfeil AR;K: der MQL5-Export rechnete im ~5-s-Takt ein komplettes
   zweites _verdict(), obwohl der Indikator die Zeile seit v1.33 per Default
   verwirft. Neu [trading] export_consensus_arrow (Default false).
   Verifiziert ueber die exportierte CSV: AR;K weg, AR;L und AR;S bleiben.

3) /api/autosqueeze loggt jetzt die Herkunft ([WEB] ...) wie /api/autosignal.
   Vorher war ein Zustandswechsel nicht als Nutzeraktion belegbar.

4) CLAUDE.md: die Reversal-Kennzahl "OR +0,185 / PF 1,35 / 70 %" stand
   unkorrigiert an der Fundstelle, die Widerlegung 2000 Zeilen weiter im
   Legacy-Recheck. Korrektur an die Fundstelle geholt.

5) core/notify.py: zwei tote "import datetime" entfernt (beide Funktionen
   nutzen _time), funktional nachgetestet.

Geprueft und sauber: 0 fehlende Frontend-IDs von 86, nur 2 Config-Schluessel
ohne Leser (beide dokumentiert dormant), Snapshot-Median 13 ms und alle
DB-Abfragen <13 ms -> keine Performance-Massnahme, 124 Datei- und 83
Funktionsreferenzen in CLAUDE.md stimmen.

Zwischenverdacht zurueckgezogen: "block_reason erklaert nur 33 % der WARTEN"
war ein Migrations-Artefakt; seit 01.08. 100 % Abdeckung.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-02 23:29:58 +02:00
co-authored by Claude Opus 5
parent 3124fe5b4f
commit 20cd04caa7
5 changed files with 149 additions and 18 deletions
+23 -9
View File
@@ -385,6 +385,10 @@ class TradingEngine:
self._export_mql5 = self.cfg["trading"].get("export_mql5_levels", "true").lower() == "true"
# Kegel im MT5-Chart: per Default AUS, seit die Pfeile ihn ersetzen (2026-07-31).
self._export_cone = self.cfg["trading"].get("export_cone", "false").lower() == "true"
# Konsens-Pfeil (AR;K) — Default AUS, spiegelt `InpShowConsensus=false` im
# Indikator. Bei `true` wird je Export ein zweites `_verdict()` gerechnet.
self._export_consensus_arrow = self.cfg["trading"].get(
"export_consensus_arrow", "false").lower() == "true"
self._draw_last = {"r": None, "s": None} # letzte gezeichnete S/R (Hysterese)
try: # WHT-Quellensteuer (Broker behält % je GEWINN ein) → Netto-Anzeige
self._wht_pct = max(0.0, float(self.cfg["trading"].get("wht_pct", "0") or 0))
@@ -2368,15 +2372,25 @@ class TradingEngine:
f"{round(float(_sq['level']) + _sd * 2.0 * _atr5, 3)};"
f"Squeeze {_sq['dir']}")
# (K) Konsens — Länge proportional zum Bias-Betrag (max 2×ATR)
_vd = self._verdict(self.data.snapshot(), self.wave.signal(),
self.wave.snapshot(), None,
self.agent.snapshot(), self.elliott.snapshot(),
self.patterns.snapshot())
_b = float(_vd.get("bias") or 0.0)
if abs(_b) >= 0.2:
lines.append(f"AR;K;{round(_bid, 3)};"
f"{round(_bid + (1 if _b > 0 else -1) * min(abs(_b), 1.0) * 2.0 * _atr5, 3)};"
f"Konsens {_b:+.2f}")
# ⚠ NUR berechnen, wenn der Pfeil auch gezeichnet wird
# (Review 2026-08-02): Der Indikator verwirft `AR;K` seit v1.33
# per Default (`InpShowConsensus=false` → `continue`), der Bot
# rechnete dafür aber im ~5-s-Export-Takt ein KOMPLETTES zweites
# `_verdict()` — Arbeit für eine Linie, die niemand zeichnet, plus
# das Risiko, dass dieses zweite Verdict vom Verdict im Snapshot
# abweicht. Der Schalter spiegelt jetzt den Indikator-Default;
# wer `InpShowConsensus=true` setzt, setzt hier `export_consensus
# _arrow=true` dazu.
if self._export_consensus_arrow:
_vd = self._verdict(self.data.snapshot(), self.wave.signal(),
self.wave.snapshot(), None,
self.agent.snapshot(), self.elliott.snapshot(),
self.patterns.snapshot())
_b = float(_vd.get("bias") or 0.0)
if abs(_b) >= 0.2:
lines.append(f"AR;K;{round(_bid, 3)};"
f"{round(_bid + (1 if _b > 0 else -1) * min(abs(_b), 1.0) * 2.0 * _atr5, 3)};"
f"Konsens {_b:+.2f}")
except Exception:
pass
# ── HYPERLIQUID-ERSATZKURS bei geschlossenem Markt (User 2026-08-01):