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:
co-authored by
Claude Opus 4.8
parent
20a3001e35
commit
c15aa36d46
@@ -704,6 +704,13 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
|
|||||||
Gegen-Signal zeigt das Frontend einen **Bestätigungs-Dialog** („… trotzdem
|
Gegen-Signal zeigt das Frontend einen **Bestätigungs-Dialog** („… trotzdem
|
||||||
eröffnen?") — bestätigen = Trade läuft, Abbrechen = kein Trade. **Kein** hartes
|
eröffnen?") — bestätigen = Trade läuft, Abbrechen = kein Trade. **Kein** hartes
|
||||||
Blockieren (überschreibbar). `engine._open` blockt nicht (loggt nur).
|
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
|
- **„Erst messen, dann umbauen":** Strategie-Änderungen per Backtest belegen, nicht
|
||||||
raten. Gegen-Trend verliert; nicht bei WARTEN handeln. **Stichproben ~28 Tage** —
|
raten. Gegen-Trend verliert; nicht bei WARTEN handeln. **Stichproben ~28 Tage** —
|
||||||
ein Trend-Regime; Befunde später auf mehr/andere History gegenprüfen.
|
ein Trend-Regime; Befunde später auf mehr/andere History gegenprüfen.
|
||||||
|
|||||||
+14
-8
@@ -950,7 +950,8 @@ class TradingEngine:
|
|||||||
if isinstance(self._last_rec, dict):
|
if isinstance(self._last_rec, dict):
|
||||||
self._last_rec["setup"] = f"SQUEEZE_{d}"
|
self._last_rec["setup"] = f"SQUEEZE_{d}"
|
||||||
log.info(f"🚀 AUTO-SQUEEZE-ENTRY: {d} @ Ausbruch {lvl} — eröffne selbständig")
|
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 ""
|
sym = self.data.symbol or ""
|
||||||
tg = self.cfg["telegram"]
|
tg = self.cfg["telegram"]
|
||||||
tg_on = (tg.get("enabled", "false").lower() == "true" and tg.get("bot_token"))
|
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)
|
# TRADE-AKTIONEN (für die Trade-Endpoints in server.py — Schritt 3)
|
||||||
# ══════════════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════════════
|
||||||
def open_long(self) -> str | None:
|
def open_long(self, source: str = "manuell") -> str | None:
|
||||||
return self._open(self.trader.open_long, "LONG")
|
return self._open(self.trader.open_long, "LONG", source)
|
||||||
|
|
||||||
def open_short(self) -> str | None:
|
def open_short(self, source: str = "manuell") -> str | None:
|
||||||
return self._open(self.trader.open_short, "SHORT")
|
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
|
sym = self.data.symbol
|
||||||
if not sym:
|
if not sym:
|
||||||
return "Kein Symbol verbunden"
|
return "Kein Symbol verbunden"
|
||||||
# KEIN harter Block mehr: Handel ohne passende Empfehlung ist erlaubt —
|
# KEIN harter Block mehr: Handel ohne passende Empfehlung ist erlaubt —
|
||||||
# das Frontend warnt + lässt bestätigen (User-Entscheidung). Hier nur
|
# 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")
|
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}) "
|
log.info(f"[ORDER] {want} ohne passende Empfehlung (Signal={sig}) "
|
||||||
f"— vom User bestätigt, wird eröffnet")
|
f"— vom User bestätigt, wird eröffnet")
|
||||||
self.trader.set_open_context(**self._last_rec)
|
self.trader.set_open_context(**self._last_rec)
|
||||||
|
|||||||
Reference in New Issue
Block a user