Loesung fuer Fall 7 gemessen: ruhende Stop-Order am Level statt Market

Anstoss aus der Web-Recherche ("don't chase breakouts with market orders;
place orders just beyond the breakout level"). Variante E in
backtest_squeeze_entry.py: PENDING BUY_STOP/SELL_STOP, die schon liegt
waehrend der Squeeze armed ist, und vom Ausbruch selbst ausgeloest wird -
anders als die Limit-Order wartet sie NICHT auf einen Ruecklauf.

Ergebnis (80k M5, 2 Halbjahre, sequentiell, kanonischer Exit, Echtkosten):
  Level +0,05 xATR  -> OeR +0,397 / +0,553  PF 2,28 / 3,06
  Level +0,10 xATR  -> OeR +0,355 / +0,509
  Level +0,20 xATR  -> OeR +0,244 / +0,426  PF 1,62 / 2,25
gegen Market/Live -0,158 / -0,006. Selbst mit dem ~9-fachen Median-Spread
als unterstellter Fill-Slippage bleibt es beidhaelftig klar positiv.

Kernpunkt: nicht der Median-Abstand toetet den Edge, sondern der SCHWANZ
(live Median +0,306 xATR, Mittel +0,741, Max +4,339). Eine Stop-Order
deckelt den Einstiegspreis konstruktiv, die Market-Order auf dem 5-s-Poll
nicht. Die Extremfaelle stammen aus blockiert-dann-freigegebenen Ausbruechen.

NICHT gebaut - die Guards (Nacht/News/Cooldown/flat) wirken heute als
Laufzeit-Checks und muessten mit einer ruhenden Order ueber Platzieren/
Stornieren durchgesetzt werden; dazu MT5-Mindestabstand und Storno beim
Klaeren des Squeeze.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 08:49:49 +02:00
co-authored by Claude Opus 5
parent 8d93de9867
commit 3b00820c15
2 changed files with 68 additions and 0 deletions
+38
View File
@@ -97,6 +97,28 @@ def lauf_limit(K, H, L, C, lo, hi, warte: int, puffer: float = 0.0):
return rs, verpasst
def lauf_stop(K, H, L, C, lo, hi, slip: float):
"""Variante E — ruhende STOP-Order am Ausbruchs-Level.
Sie liegt bereits, während der Squeeze `armed` ist, und wird vom Ausbruch selbst
ausgelöst → Fill am Level + `slip`×ATR (Auslösung erfolgt zum Markt, etwas
Slippage bleibt). Kein Warten auf einen Rücklauf wie bei der Limit-Order, also
auch KEINE verpassten Ausbrüche."""
rs = []
frei_ab = lo
for k in K:
i = k["i"]
if not (lo <= i < hi) or i < frei_ab:
continue
d, atr = k["d"], k["atr"]
entry = k["lvl"] + d * slip * atr
r, xb = simulate(entry, d, atr, H, L, C, i + 1, LIVE,
timestop=True, use_tp=True, ret_bar=True)
rs.append(r - k["kosten"])
frei_ab = xb + 1
return rs, 0
def zeile(lbl, k1, k2, extra=""):
def f(k):
if not k:
@@ -162,6 +184,22 @@ def main():
erg[lbl] = (kennzahlen(r1), kennzahlen(r2))
zeile(lbl, *erg[lbl], extra=f"verpasst {v1}/{v2}")
# ── Variante E: RUHENDE STOP-ORDER am Level ──────────────────────────
# Aus der Web-Recherche (2026-08-05): „don't chase breakouts with market orders;
# place orders just beyond the breakout level." Genau das ist hier der Hebel —
# eine PENDING BUY_STOP/SELL_STOP, die schon liegt, WÄHREND der Squeeze `armed`
# ist, füllt am Level statt 0,31×ATR später. Anders als die Limit-Order (D)
# wartet sie NICHT auf einen Rücklauf: sie wird vom Ausbruch selbst ausgelöst.
# ⚠ Eine ausgelöste Stop-Order füllt zum Markt → etwas Slippage bleibt. Deshalb
# mit mehreren realistischen Aufschlägen gerechnet, nicht mit dem Idealpreis.
print(" " + "-" * 100)
for slip in (0.00, 0.05, 0.10, 0.20):
lbl = f"E Stop-Order Level +{slip:.2f}"
r1, _ = lauf_stop(K, H, L, C, 0, mid, slip)
r2, _ = lauf_stop(K, H, L, C, mid, N, slip)
erg[lbl] = (kennzahlen(r1), kennzahlen(r2))
zeile(lbl, *erg[lbl], extra="(= Variante A)" if slip == 0 else "")
a1, a2 = erg["A Einstieg AM LEVEL"]
b1, b2 = erg["B Einstieg am Bar-Close"]
print()