Ruhende Orders: aufraeumen statt liegenlassen (User-Vorgabe)
User: "was sind ruhende orders. Loesche die wenn der trade nicht eroeffnet werden kann." Anlass: MT5 zeichnete SL/TP-Linien, obwohl keine Position lief. Das waren die liegenden Stop-Orders des Breakout-Traders - MT5 stellt jede Pending-Order samt mitgeschicktem SL selbst dar. Der Bot exportiert NIE SL/TP ins Chart (0 Treffer im .mq5, keine SL-Zeile in der CSV). Kein Anzeigefehler. ZWEI ECHTE VERWAISUNGS-PFADE GEFUNDEN. _manage_squeeze_pending stieg VOR dem Aufraeum-Block aus, wenn squeeze_pending_entry=false oder kein Symbol da war. Die Orders sind ORDER_TIME_GTC - sie verfallen NICHT. Eine so verwaiste Order haengt beim Broker, wird von niemandem mehr bewertet und kann Stunden spaeter fuellen: ohne Dedup, ohne Guard-Pruefung und (bis heute) ohne Trailing. Neu engine._pendings_abraeumen(sym, grund) - beide Pfade raeumen jetzt ab. DIE EIGENTLICHE VORGABE: ein halbes Setup wird aufgeloest. Scheitert eine Seite mit Lot-Fehler (freie Margin reicht nicht fuers Mindestlot), wird auch die Gegenseite storniert - der gemessene Squeeze ist ein Ausbruch in BEIDE Richtungen; laege nur eine Seite, handelte der Bot ihn nur noch in eine. Ausdruecklich NICHT bei "Kurs hat das Level bereits passiert": das ist voruebergehend und betrifft nur die eine Seite. Der Lot-Fehler betrifft das KONTO und damit beide. Erkannt ueber die Konstante mt5_utils.LOT_ZU_KLEIN, nicht ueber ein deutsches Wort im Fliesstext - eine Erkennung, die an einer Formulierung haengt, hoert still auf zu funktionieren und faellt dabei auf die stille Seite. ⚠⚠ DIE LOG-DROSSEL WAR AM SELBEN TAG ZUM ZWEITEN MAL AUSGEHEBELT - durch meine eigene Verbesserung. Vormittags lag der Merker in EINER Variable fuer beide Seiten (behoben). Dann bekam die Meldung ueber lot_grund ihre Zahlen, und die freie Margin aendert sich mit jedem Tick: der Text war jedes Mal neu, der Vergleich traf immer zu, wieder 2 Zeilen pro Sekunde. Gedrosselt wird jetzt auf die URSACHE, nicht auf ihre Formulierung (_err_key: alle Zahlen -> #). Gemessen: 7 Zeilen in 90 s statt ~180, und die verbliebenen sind echte Wechsel zwischen den beiden Ursachen. Lehre: eine Drossel, die einen TEXT vergleicht, ist so stabil wie der Text. Live verifiziert: 0 liegende Orders, keine verwaisten Reste, Startup-Schonfrist raeumt korrekt ab, Orders kommen danach zurueck sobald die Margin reicht. Pipeline gruen (A-G), 97 Tests, deployt mit --feld squeeze_block. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
3fb9c3fd2e
commit
fd2ca46dc0
+14
-5
@@ -117,6 +117,15 @@ def calc_lots(sym: str, price: float, otype: int,
|
||||
return min(lots, si.volume_max)
|
||||
|
||||
|
||||
# ⚠⚠ MASCHINENLESBARER Marker fuer "Einsatz reicht nicht fuer das Mindestlot".
|
||||
# Der Aufrufer (`_manage_squeeze_pending`) raeumt daraufhin das halbe Setup ab.
|
||||
# Bewusst eine KONSTANTE und kein Wort im Fliesstext: eine Erkennung, die an
|
||||
# einer deutschen Formulierung haengt, hoert still auf zu funktionieren, sobald
|
||||
# jemand den Satz umschreibt — und faellt dabei auf die stille Seite (kein
|
||||
# Abraeumen), nicht auf die laute.
|
||||
LOT_ZU_KLEIN = "MINDESTLOT"
|
||||
|
||||
|
||||
def lot_grund(sym: str, price: float, otype: int,
|
||||
buffer_pct: float | None = None) -> str:
|
||||
"""Warum liefert `calc_lots` 0? — als lesbarer Satz statt „Lot-Fehler".
|
||||
@@ -137,14 +146,14 @@ def lot_grund(sym: str, price: float, otype: int,
|
||||
return "Lot-Fehler (Margin je Lot nicht berechenbar)"
|
||||
_man = get_manual_margin()
|
||||
if _man > 0:
|
||||
return (f"Einsatz {_man:.2f} EUR reicht nicht fuer das Mindestlot "
|
||||
f"{si.volume_min} (braucht {si.volume_min * mpl:.2f} EUR)")
|
||||
return (f"[{LOT_ZU_KLEIN}] Einsatz {_man:.2f} EUR reicht nicht fuer das "
|
||||
f"Mindestlot {si.volume_min} (braucht {si.volume_min * mpl:.2f} EUR)")
|
||||
buf = (max(0.01, min(0.99, buffer_pct / 100.0))
|
||||
if buffer_pct and buffer_pct > 0 else get_margin_buffer())
|
||||
verf = acc.margin_free * buf
|
||||
return (f"Einsatz {buf * 100:.0f} % von {acc.margin_free:.2f} EUR freier "
|
||||
f"Margin = {verf:.2f} EUR, Mindestlot {si.volume_min} braucht aber "
|
||||
f"{si.volume_min * mpl:.2f} EUR")
|
||||
return (f"[{LOT_ZU_KLEIN}] Einsatz {buf * 100:.0f} % von {acc.margin_free:.2f} "
|
||||
f"EUR freier Margin = {verf:.2f} EUR, Mindestlot {si.volume_min} "
|
||||
f"braucht aber {si.volume_min * mpl:.2f} EUR")
|
||||
|
||||
|
||||
def calc_lots_risk(sym: str, price: float, otype: int,
|
||||
|
||||
Reference in New Issue
Block a user