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:
co-authored by
Claude Opus 5
parent
3124fe5b4f
commit
20cd04caa7
+23
-9
@@ -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):
|
||||
|
||||
@@ -72,7 +72,6 @@ def build_trade_open_message(
|
||||
entry_ts: int | None = None,
|
||||
) -> str:
|
||||
"""Formatiert die Telegram-Nachricht für einen Trade-Einstieg."""
|
||||
import datetime
|
||||
dir_str = "LONG" if (direction or "").upper() in ("BUY", "LONG") else "SHORT"
|
||||
emoji = "\U0001f7e2" if dir_str == "LONG" else "\U0001f534"
|
||||
setup_str = _SETUP_LABELS.get(setup or "", setup or "—")
|
||||
@@ -101,7 +100,6 @@ def build_trade_close_message(
|
||||
symbol: str | None = None,
|
||||
) -> str:
|
||||
"""Formatiert die Telegram-Nachricht für einen Trade-Abschluss."""
|
||||
import datetime
|
||||
pnl_net = pnl + (commission or 0.0)
|
||||
win = pnl_net >= 0
|
||||
sign = "+" if win else ""
|
||||
|
||||
Reference in New Issue
Block a user