Breakout-Karte vorbereitet (inaktiv bis Neustart) + Bewertung der Margin-Idee

User-Idee: 40 % Margin manuell, 50 % fuer Breakout reservieren, neue Karte.

Bewertung: (1) 40 % ist der groesste gemessene Hebel (MaxDD 82,8 %) und ein
Schalter ohne Neustart. (2) Reserve ist technisch moeglich (Konto ist
RETAIL_HEDGING), aber _check_auto_squeeze feuert 'nur FLAT' und engine.py hat 17
Einzel-Positions-Annahmen -- Kern-Umbau, kein Parameter. Zudem steht die
Zuteilung gegen die Messung: autonom -4,71 EUR/Lot gegen Mensch +1,56 EUR/Lot.
Live-Befund macht (1) dringlich: freie Margin -6,21 EUR, Margin-Level 99,3 %.
Es gibt derzeit nichts zu reservieren.

Gebaut (inaktiv): history.fetch_squeeze_since, engine._squeeze_b5_cached
(120 s gecacht), Snapshot-Feld squeeze_b5, Karte #card-brk. Eigenes Fenster ab
01.08. -- squeeze_monitor.live rechnet ueber alle 42 Trades, B5 zaehlt 11. Die
Karte zeigt beide Zahlen, weil der Monitor 'ontrack' aus der MECHANIK meldet,
waehrend live Verhaeltnis 0,14 / PF 0,39 steht.

Live aendert sich nichts: Karte ist hidden, renderBrk blendet sie aus solange
squeeze_b5 fehlt. Aktiv nach dem naechsten Neustart (wartet auf den Trade).

BEINAHE-SCHADEN: ein UnicodeEncodeError liess web/app.js mit 0 Bytes zurueck.
node --check bestand trotzdem -- eine leere Datei ist gueltiges JS. Gefangen hat
es erst der Groessenvergleich. Neue Regel: erst .tmp schreiben, Groesse pruefen,
dann os.replace.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-19 13:32:48 +02:00
co-authored by Claude Opus 5
parent 3affe51030
commit 30cb77b795
8 changed files with 8490 additions and 2 deletions
+46
View File
@@ -3248,6 +3248,48 @@ class TradingEngine:
self._align_ts = now
return getattr(self, "_align_cache", None)
def _squeeze_b5_cached(self) -> dict | None:
"""B5-Stand des Auto-Squeeze fuer die Breakout-Karte (2026-08-19).
WARUM EIN EIGENES FELD und nicht `squeeze_monitor.live`: der Monitor
rechnet ueber ALLE SQUEEZE_*-Trades (n=42). Die B5-Abbruchregel zaehlt
aber ausdruecklich **ab dem 01.08.** (n=11). Beide Zahlen im selben Bild
zu zeigen, ohne sie zu trennen, waere genau die Sorte stille
Fenster-Verwechslung, an der `pbreak_accuracy_v2` und die
Verdict-Faelligkeit schon aufgelaufen sind.
Der Monitor meldet zudem `verdict: ontrack` aus der **Mechanik**
(Regel neu gerechnet, OeR +0,163 / PF 1,24) waehrend die LIVE-Bilanz
im selben Moment bei Verhaeltnis 0,14 / PF 0,39 steht. Genau diese
Luecke ist der B4-Befund; die Karte muss beide Zahlen nebeneinander
zeigen, sonst liest sich 'ontrack' wie eine Entwarnung.
DB-Query ~120 s gecacht (Muster wie `_alignment_cached`)."""
now = time.time()
if now - getattr(self, "_b5_ts", 0.0) > 120:
self._b5_cache = None
try:
ab = int(datetime(2026, 8, 1, tzinfo=_BERLIN).timestamp())
rows = self.history.fetch_squeeze_since(ab)
g = [x for x in rows if x > 0]
v = [x for x in rows if x <= 0]
og = (sum(g) / len(g)) if g else 0.0
ov = abs(sum(v) / len(v)) if v else 0.0
self._b5_cache = {
"n": len(rows), "ziel": 20,
"wins": len(g), "losses": len(v),
"avg_win": round(og, 2), "avg_loss": round(-ov, 2),
# die beiden Groessen, an denen die Regel haengt
"ratio": round(og / ov, 2) if ov else None,
"pf": round(sum(g) / abs(sum(v)), 2) if v and sum(v) else None,
"sum_eur": round(sum(rows), 2),
"latte": 1.0,
}
except Exception as e:
log.debug(f"squeeze_b5: {e}")
self._b5_ts = now
return getattr(self, "_b5_cache", None)
def _hl_ctx_refresh(self):
"""Holt den HL-Kontext im Hintergrund (s. Aufrufstelle im Trend-Loop)."""
try:
@@ -4231,6 +4273,10 @@ class TradingEngine:
# kostet ungenutzt nichts (sie laeuft nur beim Aufruf).
"hl_ctx": getattr(self, "_hl_ctx", None),
"rec_track": self._rec_track_cached(),
# B5-Stand des Auto-Squeeze fuer die Breakout-Karte (2026-08-19).
# ⚠ Eigenes Fenster (ab 01.08.) — NICHT dasselbe wie
# `squeeze_monitor.live` (alle Trades). s. `_squeeze_b5_cached`.
"squeeze_b5": self._squeeze_b5_cached(),
# Kennzahlen der MANUELLEN Trades für die gleichnamige Karte
# (2026-08-04). Rein deskriptiv; ~120 s gecacht, damit der heiße
# Snapshot-Pfad nicht je Abruf die DB aggregiert.