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:
co-authored by
Claude Opus 5
parent
8d93de9867
commit
3b00820c15
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user