Pending-Fill: Bot-Trades wurden nicht als solche gebucht
Auftrag "überprüfe die heutigen autotrades": die DB meldete für den 06.08. null Bot-Trades, das Log vier gefüllte SQZ-STOP-Orders. Beides stimmte. Ein Pending-Fill läuft nicht über engine._open — die Position wird von trader._refresh_locked per magic-match adoptiert, und dieser Pfad loggt nur Ticket/Symbol/Richtung/Lots/Preis. Es fehlten setup, sl_at_entry und alle 16 ctx_*-Spalten. Damit war genau die Messpipeline, die den Pending-Umbau vom 05.08. kontrollieren soll, blind für ihn (B4-Monitor, squeeze_b5, squeeze_entry_gap zählten null) — Deployment-Drift Fall 8, erste Variante, bei der nicht die Strategie driftet, sondern ihre Beobachtbarkeit. - history.tag_bot_trade(): UPDATE nur wenn setup IS NULL, stiller Fail-open - engine._pending_tickets: Ticket -> Quelle, beim Platzieren/Stornieren gepflegt - engine._check_pending_fill() im _pos_loop vor dem Pending-Manager; Zuordnung über Positions-Nr == Order-Nr (an allen 4 Fills verifiziert), setzt zusätzlich _bot_open_ticket/_source und die Entry-Zähler 6 Szenarien getestet, darunter die zwei gefährlichen: fremde Position wird nicht getaggt, derselbe Fill zählt bei Folge-Ticks nur einmal. Die 4 Trades des 06.08. nachgetragen (Backup .bak-2026-08-06). ctx_*/sl_at_entry bewusst NICHT nachgetragen: rekonstruiert wären sie später von gemessenen Werten nicht unterscheidbar. Dabei gefunden, dokumentiert, NICHT behoben: der Signal-Pfad setzt/storniert dieselbe Order 4x in 76 s bei identischem Level, weil block_reason zwischen entry_room und breakout_pending pendelt (Drift Fall 9). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
730219fce8
commit
3c1442109d
@@ -576,6 +576,32 @@ class HistoryLogger:
|
||||
return (int(since.timestamp()), now)
|
||||
return (0, now)
|
||||
|
||||
def tag_bot_trade(self, ticket: int, setup: str) -> bool:
|
||||
"""Setup einer bereits geloggten Position NACHTRAGEN. → True bei Erfolg.
|
||||
|
||||
⚠ WARUM DAS NOETIG IST: eine gefuellte PENDING-Order laeuft nicht durch
|
||||
`engine._open`, sondern wird vom Positions-Abgleich als „magic-match"
|
||||
adoptiert und mit `log_trade_open(...)` OHNE Setup geschrieben. Am 06.08.
|
||||
fuellten drei `SQZ-STOP`-Orders und landeten dadurch als `setup=NULL` in der
|
||||
DB — ununterscheidbar von manuellen Trades. Folge: B4-Monitor und die
|
||||
Reminder `squeeze_b5` / `squeeze_entry_gap` zaehlten 0, obwohl der Bot
|
||||
gehandelt hatte. Genau die Messpipeline, die den Pending-Umbau
|
||||
kontrollieren soll, war blind fuer ihn.
|
||||
Nur setzen, wenn noch KEIN Setup steht — ein manuell/regulaer getaggter
|
||||
Trade darf nicht ueberschrieben werden."""
|
||||
try:
|
||||
with self._connect() as conn:
|
||||
cur = conn.execute(
|
||||
"UPDATE trades SET setup=? WHERE ticket=? AND setup IS NULL",
|
||||
(setup, int(ticket)))
|
||||
return cur.rowcount > 0
|
||||
except Exception:
|
||||
# ⚠ `core/history.py` fuehrt bewusst keinen Logger (Konvention der
|
||||
# Datei: stilles Abfangen). Ein fehlgeschlagenes Nachtragen ist
|
||||
# unkritisch — der Trade steht in der DB, nur ohne Setup-Tag; der
|
||||
# Aufrufer sieht das am Rueckgabewert.
|
||||
return False
|
||||
|
||||
def stats_overview(self, period: str = "all") -> dict:
|
||||
"""Liefert ein Dict mit den Hauptkennzahlen für den gewählten Zeitraum."""
|
||||
since, until = self._range_to_ts(period)
|
||||
|
||||
Reference in New Issue
Block a user