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:
co-authored by
Claude Opus 5
parent
3affe51030
commit
30cb77b795
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user