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 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-29 20:02:11 +02:00
co-authored by Claude Opus 4.8
parent 20a3001e35
commit c15aa36d46
2 changed files with 21 additions and 8 deletions
+14 -8
View File
@@ -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)