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:
Axel Hocks
2026-08-20 19:45:05 +02:00
co-authored by Claude Opus 5
parent 437ab56598
commit 0386497a79
5 changed files with 219 additions and 6 deletions
+33 -1
View File
@@ -159,12 +159,44 @@ def _sperrliste_vollstaendig(baum: ast.AST) -> list:
return []
def _brk_bekommt_trailing(baum: ast.AST) -> list:
"""(E) Jeder Pfad, der eine BRK-Position EROEFFNET, muss `trail_brk` anfassen.
⚠⚠ DER GEFAEHRLICHSTE FUND DER SLOT-PRUEFUNG (2026-08-20): `trail_brk.toggle()`
wurde an genau ZWEI Stellen gerufen — beim Rueckbinden nach einem Neustart
(`_rebind_brk`) und ueber den TRAIL-Knopf (`toggle_trail`). 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). Der
Market-Fallback (`_open`) war noch schlechter: er schaltete `self.trail` ein,
also das Trailing der MANUELLEN Position — die BRK-Position blieb ungeschuetzt
UND dem Nutzer wurde auf seinem eigenen Trade das Trailing wieder angemacht.
Eine nur mit dem Broker-SL laufende BRK-Position ist genau die Variante, die
`backtest_brk_slonly.py` verworfen hat (alle zehn KI enthalten die Null,
Trefferquote faellt 40 -> 21 %).
⚠ Von aussen unsichtbar: die Position sieht in jeder Anzeige normal aus, ihr
fehlt nur der Schutz. Deshalb diese statische Regel.
"""
OEFFNER = {"_check_pending_fill": "der Pending-Fill",
"_open": "der Market-Fallback"}
befunde = []
for fn in [n for n in ast.walk(baum) if isinstance(n, ast.FunctionDef)]:
if fn.name not in OEFFNER:
continue
if "trail_brk" not in ast.unparse(fn):
befunde.append(
f"{fn.name}: erwaehnt `trail_brk` NICHT — {OEFFNER[fn.name]} "
f"wuerde eine BRK-Position OHNE Trailing eroeffnen "
f"(nur Broker-SL = gemessen durchgefallen)")
return sorted(befunde)
def pruefe() -> list:
p = WURZEL / "core" / "engine.py"
quelle = p.read_text(encoding="utf-8")
baum = ast.parse(quelle)
return (_init_reihenfolge(baum, quelle) + _slot_trennung(baum)
+ _close_beide(baum) + _sperrliste_vollstaendig(baum))
+ _close_beide(baum) + _sperrliste_vollstaendig(baum)
+ _brk_bekommt_trailing(baum))
if __name__ == "__main__":