From c15aa36d46754d8ab343a7b67d05aaddcb90dcd4 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Wed, 29 Jul 2026 20:02:11 +0200 Subject: [PATCH] Auto-Squeeze Log-Attribution: autonome vs. manuelle Orders korrekt kennzeichnen - _open(fn, want, source="manuell"); Auto-Squeeze ruft open_long/short (source="auto_squeeze"). Vorher log JEDER Order gegen die Empfehlung "vom User bestaetigt" -- auch autonome Squeeze-Entries. - CLAUDE.md aktualisiert. Geprueft (Auto-Squeeze-Logik gegen Vergangenheitsdaten): - Mechanik-Edge lebt: B4-Monitor 107 Setups/30T oR +0.20 PF 1.33 (Band 0.14-0.23, ontrack); 2-Halbjahre-Backtest Box<=2.5xATR H1 +0.187/PF1.29, H2 +0.374/PF1.56 -- schlaegt ungefilterten Ausbruch in beiden Haelften. - Live 25 Trades -87 EUR: 90% des Verlusts aus 12 Nacht-Trades (-79 EUR, alle PRE-Guard 24.07.); Tag ~breakeven (-8 EUR). Params = validiert. - Post-Guard 0 Nacht-Trades; Rest-Leckage = -3-EUR-Vertipper-Kaskade 27.07. (jetzt durch emergency_min_eur + Wiedereinstiegs-Cooldown behoben). Co-Authored-By: Claude Opus 4.8 --- CLAUDE.md | 7 +++++++ core/engine.py | 22 ++++++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 508ada3..f1547fa 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -704,6 +704,13 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: Gegen-Signal zeigt das Frontend einen **Bestätigungs-Dialog** („… trotzdem eröffnen?") — bestätigen = Trade läuft, Abbrechen = kein Trade. **Kein** hartes Blockieren (überschreibbar). `engine._open` blockt nicht (loggt nur). + ⚠ **Log-Quellen-Attribution (Fix 2026-07-29):** `_open(fn, want, source)` bekommt + jetzt eine `source` (Default `"manuell"`); der Auto-Squeeze ruft `open_long/short + (source="auto_squeeze")`. Vorher schrieb `_open` bei JEDEM Auftrag gegen die + Empfehlung „— vom User bestätigt" — auch bei autonomen Squeeze-Entries (der User + fragte, ob ein Trade auto/manuell war; die Zeile log fälschlich „User"). Jetzt: + autonome Orders → „autonom vom Auto-Squeeze eröffnet", manuelle → wie bisher. Die + `🚀 AUTO-SQUEEZE-ENTRY`-Zeile bleibt die eindeutige Quelle der Wahrheit. - **„Erst messen, dann umbauen":** Strategie-Änderungen per Backtest belegen, nicht raten. Gegen-Trend verliert; nicht bei WARTEN handeln. **Stichproben ~28 Tage** — ein Trend-Regime; Befunde später auf mehr/andere History gegenprüfen. diff --git a/core/engine.py b/core/engine.py index b22dd2f..bd2e394 100644 --- a/core/engine.py +++ b/core/engine.py @@ -950,7 +950,8 @@ class TradingEngine: if isinstance(self._last_rec, dict): self._last_rec["setup"] = f"SQUEEZE_{d}" log.info(f"🚀 AUTO-SQUEEZE-ENTRY: {d} @ Ausbruch {lvl} — eröffne selbständig") - err = self.open_long() if d == "LONG" else self.open_short() + err = (self.open_long(source="auto_squeeze") if d == "LONG" + else self.open_short(source="auto_squeeze")) sym = self.data.symbol or "" tg = self.cfg["telegram"] tg_on = (tg.get("enabled", "false").lower() == "true" and tg.get("bot_token")) @@ -1524,21 +1525,26 @@ class TradingEngine: # ══════════════════════════════════════════════════════════════════════ # TRADE-AKTIONEN (für die Trade-Endpoints in server.py — Schritt 3) # ══════════════════════════════════════════════════════════════════════ - def open_long(self) -> str | None: - return self._open(self.trader.open_long, "LONG") + def open_long(self, source: str = "manuell") -> str | None: + return self._open(self.trader.open_long, "LONG", source) - def open_short(self) -> str | None: - return self._open(self.trader.open_short, "SHORT") + def open_short(self, source: str = "manuell") -> str | None: + return self._open(self.trader.open_short, "SHORT", source) - def _open(self, fn, want: str) -> str | None: + def _open(self, fn, want: str, source: str = "manuell") -> str | None: sym = self.data.symbol if not sym: return "Kein Symbol verbunden" # KEIN harter Block mehr: Handel ohne passende Empfehlung ist erlaubt — # das Frontend warnt + lässt bestätigen (User-Entscheidung). Hier nur - # protokollieren, falls gegen die aktuelle Empfehlung gehandelt wird. + # protokollieren, WER handelt und ob gegen die aktuelle Empfehlung. + # ⚠ `source` korrekt attribuieren: autonome Auto-Squeeze-Orders laufen + # durch denselben Pfad — vorher schrieb er fälschlich „vom User bestätigt". sig = (self.wave.signal() or {}).get("signal", "WARTEN") - if sig != want: + if source == "auto_squeeze": + log.info(f"[ORDER] {want} — autonom vom Auto-Squeeze eröffnet " + f"(Signal={sig})") + elif sig != want: log.info(f"[ORDER] {want} ohne passende Empfehlung (Signal={sig}) " f"— vom User bestätigt, wird eröffnet") self.trader.set_open_context(**self._last_rec)