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
@@ -1478,6 +1478,36 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
|
|||||||
**Nichts abgeschaltet** — Autonomie-Schalter sind User-Entscheidungen.
|
**Nichts abgeschaltet** — Autonomie-Schalter sind User-Entscheidungen.
|
||||||
⚠ Grenzen: die Live-Stichprobe ist n=34 mit genäherter ATR-Zuordnung; A und B sind
|
⚠ Grenzen: die Live-Stichprobe ist n=34 mit genäherter ATR-Zuordnung; A und B sind
|
||||||
zwei Modell-Enden, der Live-Betrieb liegt dazwischen (näher an B).
|
zwei Modell-Enden, der Live-Betrieb liegt dazwischen (näher an B).
|
||||||
|
✅✅ **LÖSUNG GEFUNDEN — RUHENDE STOP-ORDER STATT MARKET (Variante E, gemessen
|
||||||
|
2026-08-05; Anstoß aus der Web-Recherche: „don't chase breakouts with market orders;
|
||||||
|
place orders just beyond the breakout level").** Eine PENDING `BUY_STOP`/`SELL_STOP`
|
||||||
|
liegt bereits am Ausbruchs-Level, WÄHREND der Squeeze `armed` ist (das Level ist da
|
||||||
|
schon bekannt = Box-Grenze), und wird vom Ausbruch selbst ausgelöst — anders als die
|
||||||
|
Limit-Order (D) wartet sie NICHT auf einen Rücklauf, verpasst also nichts.
|
||||||
|
| Fill-Annahme | H1 ØR / PF / ΣR | H2 ØR / PF / ΣR |
|
||||||
|
|---|---|---|
|
||||||
|
| Level exakt (= A) | +0,456 / 2,65 / +370 | +0,611 / 3,56 / +778 |
|
||||||
|
| **Level +0,05×ATR** | **+0,397 / 2,28 / +322** | **+0,553 / 3,06 / +697** |
|
||||||
|
| Level +0,10×ATR | +0,355 / 2,07 / +288 | +0,509 / 2,76 / +639 |
|
||||||
|
| **Level +0,20×ATR (pessimistisch)** | **+0,244 / 1,62 / +196** | **+0,426 / 2,25 / +531** |
|
||||||
|
| Market/Live (= B) | −0,158 / 0,74 / −126 | −0,006 / 0,99 / −8 |
|
||||||
|
**Selbst mit 0,20×ATR unterstellter Fill-Slippage — dem ~9-fachen des Median-Spreads
|
||||||
|
— bleibt es in BEIDEN Hälften klar positiv.**
|
||||||
|
⚠⚠ **Der Schlüssel ist nicht der Median, sondern der SCHWANZ.** Live ist der
|
||||||
|
Median-Abstand +0,306×ATR, der **Mittelwert aber +0,741** (Max +4,339). Eine
|
||||||
|
Stop-Order **deckelt den Einstiegspreis konstruktiv**; die Market-Order auf dem
|
||||||
|
5-s-Poll tut das nicht. Die Extremfälle (+3,5 / +4,3×ATR) stammen erkennbar aus
|
||||||
|
**blockiert-dann-freigegebenen** Ausbrüchen: feuert der Squeeze, während eine
|
||||||
|
Position offen ist (oder Nacht-/News-Fenster), wird KEIN Dedup-Marker gesetzt — der
|
||||||
|
Entry kommt später zum dann gültigen Marktpreis, u. U. weit hinter dem Level.
|
||||||
|
⚠ **Noch NICHT gebaut** — Umsetzung hat echte Fallstricke: die Guards (Nacht,
|
||||||
|
News-Blackout, Cooldowns, flat-Prüfung) wirken heute als Laufzeit-Checks; mit einer
|
||||||
|
ruhenden Order müssten sie über **Platzieren/Stornieren** durchgesetzt werden, sonst
|
||||||
|
feuert eine vergessene Pending-Order in einem gesperrten Fenster. Dazu: MT5-Mindest-
|
||||||
|
abstand (`SYMBOL_TRADE_STOPS_LEVEL`) kann die Platzierung ablehnen, wenn der Kurs
|
||||||
|
schon zu nah am Level steht, und die Order muss storniert werden, sobald der Squeeze
|
||||||
|
sich klärt. **Das ist der stärkste offene Hebel im Projekt** — größer als jeder der
|
||||||
|
22 verworfenen Signal-Eingriffe.
|
||||||
- **Auto-Squeeze-Entry = LIVE AUTONOM (User-Vorgabe 2026-07-16, `[trading]
|
- **Auto-Squeeze-Entry = LIVE AUTONOM (User-Vorgabe 2026-07-16, `[trading]
|
||||||
auto_squeeze=true`, Default FALSE):** der Bot eröffnet **selbständig eine echte
|
auto_squeeze=true`, Default FALSE):** der Bot eröffnet **selbständig eine echte
|
||||||
Order**, sobald der **gemessen-validierte** Squeeze-Ausbruch feuert (`wave.squeeze.
|
Order**, sobald der **gemessen-validierte** Squeeze-Ausbruch feuert (`wave.squeeze.
|
||||||
|
|||||||
@@ -97,6 +97,28 @@ def lauf_limit(K, H, L, C, lo, hi, warte: int, puffer: float = 0.0):
|
|||||||
return rs, verpasst
|
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 zeile(lbl, k1, k2, extra=""):
|
||||||
def f(k):
|
def f(k):
|
||||||
if not k:
|
if not k:
|
||||||
@@ -162,6 +184,22 @@ def main():
|
|||||||
erg[lbl] = (kennzahlen(r1), kennzahlen(r2))
|
erg[lbl] = (kennzahlen(r1), kennzahlen(r2))
|
||||||
zeile(lbl, *erg[lbl], extra=f"verpasst {v1}/{v2}")
|
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"]
|
a1, a2 = erg["A Einstieg AM LEVEL"]
|
||||||
b1, b2 = erg["B Einstieg am Bar-Close"]
|
b1, b2 = erg["B Einstieg am Bar-Close"]
|
||||||
print()
|
print()
|
||||||
|
|||||||
Reference in New Issue
Block a user