Slot-Pruefung 5. Durchgang: drei Luecken, eine davon gravierend
Diesmal systematisch statt punktuell: alle Methoden von TradingEngine per AST
klassifiziert, welche Slot-Objekte sie beruehren. 36 Funktionen fassen einen
Slot an, 20 davon NUR Slot 1.
⚠⚠⚠ LUECKE 1 (gravierend): EINE FRISCH GEFUELLTE BRK-POSITION HATTE KEIN
TRAILING. trail_brk.toggle() wurde an genau ZWEI Stellen gerufen - _rebind_brk
(nach Neustart) und toggle_trail (der Knopf). Der frische Pending-Fill kam in
keiner davon vor, und das ist der haeufigste Weg, auf dem eine BRK-Position
entsteht (7 von 8 Trades seit dem Pending-Umbau). Sie lief damit nur mit dem
Broker-SL - exakt die Variante, die backtest_brk_slonly.py verworfen hat (alle
zehn KI enthalten die Null, Trefferquote 40 -> 21 %).
Von aussen unsichtbar: die Position sieht in jeder Anzeige normal aus, ihr
fehlt nur der Schutz. Ironie: _rebind_brk loggt "Trailing wiederhergestellt" -
wiederhergestellt wurde etwas, das fuer einen frischen Fill nie an war.
⚠⚠ LUECKE 2: der Market-Fallback schaltete das FALSCHE Trailing ein. _open rief
pauschal self.trail.toggle(). Zwei Schaeden auf einmal: die BRK-Position bleibt
ungeschuetzt UND auf der manuellen Position wird das Trailing wieder
eingeschaltet, auch wenn der Nutzer es dort bewusst abgeschaltet hatte (nach
einer SL-Handeingabe). Sein handgesetzter Stop waere weitergezogen worden.
Noch nicht eingetreten, weil alle acht Fallback-Versuche des 20.08. schon an
der Order scheiterten.
⚠⚠ LUECKE 3: ein geschlossener BRK-Trade loeste KEINE Telegram-Meldung aus.
_close_notify_pending wird in _check_auto_close armiert, das self.trader liest.
Wiegt schwer, weil seit dem 19.08. NUR NOCH "Trade geschlossen" durch den
Telegram-Filter kommt - der autonome Pfad haette vollstaendig still gehandelt.
Behoben in _check_brk_close_cooldown, das den BRK-Flat-Uebergang ohnehin kennt.
Dazu die Reichweiten-Warnung korrigiert: sie sagte "Broker-SL, Trailing und
Circuit-Breaker greifen weiter" - das Trailing tat es eben NICHT.
ABGESICHERT auf zwei Ebenen, beide mutationsgeprueft:
tests/test_pending_fill.py +2: der Fill MUSS trail_brk einschalten und DARF
das Trailing von Slot 1 nicht anfassen. Mutation -> Test faellt.
Pipeline-Stufe E, Regel E: jeder Pfad, der eine BRK-Position eroeffnet
(_check_pending_fill, _open), MUSS trail_brk erwaehnen. Mutation -> Exit 1.
Die Test-Fixture bekam dafuer erstmals BEIDE Trailing-Attrappen - ohne die war
der gefaehrlichste Slot-Fehler ueberhaupt nicht pruefbar.
GEPRUEFT UND SAUBER: Circuit-Breaker, close(), _check_open_notify, _price_loop,
_write_levels_file, snapshot, die Fill-Bindung, die _pos_loop-Reihenfolge.
BEWUSST NICHT GEAENDERT (Slot-1-only, aber alle Features AUS): _check_auto_close,
_check_sr_close, _check_adverse15, _check_flip_close, _check_auto_m15, set_sltp,
_check_close_alert. _check_slot_reichweite meldet es, sobald eines eingeschaltet
wird. Zweislot-faehig waere ein Umbau der Notfall-Zustandsmaschine - offen.
⚠⚠ ZWEI CONFIG-WERTE SIND AUF 0 ZURUECKGEDRIFTET (nur berichtet):
close_notify_min_eur dokumentiert 50 -> ist 0 (Telegram ganz still)
auto_emergency_margin_pct dokumentiert 8 -> ist 0
Bei close_notify_min_eur = 0 nuetzt auch Luecke 3 nichts - die Vormerkung haengt
an _close_notify_min > 0. Der Bot meldet derzeit gar keinen Trade-Abschluss.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
437ab56598
commit
0386497a79
+43
-5
@@ -1031,6 +1031,16 @@ class TradingEngine:
|
||||
self._brk_letzte = None
|
||||
self._pos_close_ts = time.time()
|
||||
self._pos_close_dir = "LONG" if vorher[1] == 0 else "SHORT"
|
||||
# ⚠⚠ AUCH die Close-Benachrichtigung vormerken (Fix 2026-08-20).
|
||||
# `_check_auto_close` armiert sie aus `self.trader.snapshot()`,
|
||||
# sieht den BRK-Slot also nicht — ein geschlossener BRK-Trade
|
||||
# loeste KEINE Telegram-Meldung aus. Das wiegt schwer, weil seit
|
||||
# dem 19.08. NUR NOCH "Trade geschlossen" durch den
|
||||
# Telegram-Filter kommt: der autonome Pfad haette also voellig
|
||||
# still gehandelt — genau der Zustand, den der Befund vom 11.08.
|
||||
# ("alle neun Ausloeser waren aus") beseitigen sollte.
|
||||
if self._close_notify_min > 0:
|
||||
self._close_notify_pending = [vorher[0], 0]
|
||||
log.info("BRK-Slot geschlossen (T=%s) — Wiedereinstiegs-Sperre "
|
||||
"%s armiert.", vorher[0], self._pos_close_dir)
|
||||
except Exception as e:
|
||||
@@ -1150,8 +1160,9 @@ class TradingEngine:
|
||||
if getattr(self, "_reichweite_gemeldet", None) != tk:
|
||||
self._reichweite_gemeldet = tk
|
||||
log.warning("⚠ REICHWEITE: %s aktiv, gilt aber NUR für Slot 1 — "
|
||||
"die BRK-Position T=%s läuft ohne (Broker-SL, "
|
||||
"Trailing und Circuit-Breaker greifen weiter).",
|
||||
"die BRK-Position T=%s läuft ohne. Es greifen: "
|
||||
"Broker-SL, Circuit-Breaker und — seit dem Fix vom "
|
||||
"20.08. — das eigene Trailing (`trail_brk`).",
|
||||
", ".join(offen), tk)
|
||||
return offen
|
||||
except Exception as e:
|
||||
@@ -1636,6 +1647,21 @@ class TradingEngine:
|
||||
# Dieselbe Buchfuehrung wie beim Market-Pfad, damit B4/B5 zaehlen
|
||||
self._bot_open_ticket = tk
|
||||
self._bot_open_source = "auto_squeeze"
|
||||
# ⚠⚠ TRAILING EINSCHALTEN — ohne das lief der HAEUFIGSTE BRK-Pfad
|
||||
# voellig ungeschuetzt (Fix 2026-08-20). `trail_brk.toggle()` wurde
|
||||
# bis dahin an genau ZWEI Stellen gerufen: beim Rueckbinden nach
|
||||
# einem Neustart und ueber den TRAIL-Knopf. Der frische Fill — und
|
||||
# das sind 7 von 8 BRK-Trades, seit der Pending-Umbau laeuft —
|
||||
# kam in keiner davon vor. Eine so gefuellte Position hatte nur
|
||||
# den Broker-SL, also exakt die Variante, die
|
||||
# `backtest_brk_slonly.py` verworfen hat.
|
||||
# ⚠ Ironie am Rande: `_rebind_brk` loggt "Trailing des BRK-Slots
|
||||
# wiederhergestellt" — wiederhergestellt wurde etwas, das fuer
|
||||
# einen frischen Fill nie an war.
|
||||
if not self.trail_brk.enabled and self.data.symbol:
|
||||
self.trail_brk.set_setup(setup)
|
||||
self.trail_brk.toggle(self.data.symbol)
|
||||
log.info(f"Trailing des BRK-Slots aktiviert (T={tk})")
|
||||
self._squeeze_entry_count += 1
|
||||
log.info(f"🎯 PENDING-FILL ({quelle}): {d} @ {ps.get('entry_price')} "
|
||||
f"— Position {tk} als {setup} getaggt"
|
||||
@@ -2995,9 +3021,21 @@ class TradingEngine:
|
||||
except Exception:
|
||||
pass
|
||||
# Trailing automatisch aktivieren (wie _after_trade im Widget)
|
||||
if not self.trail.enabled:
|
||||
self.trail.set_setup(self._last_rec.get("setup"))
|
||||
self.trail.toggle(sym)
|
||||
# ⚠⚠ DAS TRAILING DES *SLOTS*, nicht pauschal `self.trail` (Fix 2026-08-20).
|
||||
# Vorher lief hier IMMER Slot 1 — mit zwei Schaeden auf einmal:
|
||||
# (a) die BRK-Position bekam KEIN Trailing und lief damit in die
|
||||
# gemessen DURCHGEFALLENE SL-only-Variante
|
||||
# (`backtest_brk_slonly.py`: alle zehn KI enthalten die Null,
|
||||
# Trefferquote faellt 40 -> 21 %);
|
||||
# (b) schlimmer noch: ein BRK-Entry schaltete das Trailing auf der
|
||||
# MANUELLEN Position wieder EIN — auch wenn der Nutzer es dort
|
||||
# gerade bewusst abgeschaltet hatte (etwa nach einer SL-Handeingabe,
|
||||
# die `deactivate()` ausloest). Sein Stop waere danach vom Trailing
|
||||
# weitergezogen worden.
|
||||
_tr = self.trail_brk if source == "auto_squeeze" else self.trail
|
||||
if not _tr.enabled:
|
||||
_tr.set_setup(self._last_rec.get("setup"))
|
||||
_tr.toggle(sym)
|
||||
return None
|
||||
|
||||
def close(self, slot: str | None = None) -> str | None:
|
||||
|
||||
Reference in New Issue
Block a user