User: "backteste alle verworfenen Signale". Bewusst kein Komplettlauf (der lief am 04.08., 14 Klassen, alle blieben verworfen) — neu ist genau eine Achse, der Einstiegspreis, angewandt mit der heutigen Korrektur (Fill bei BERUEHRUNG statt bei Schluss-Bruch) und nur dort, wo sie greifen kann: stehendes Level + Ausbruchsrichtung. Ergebnis (Variante C, 80k M5, 2 Halbjahre): KONTROLLE Squeeze +0,133/+0,293 (reproduziert touchfill — Pipeline ok) ORB (4 Varianten) faellt durch (bestaetigt 2026-07-17) PDH/PDL +0,246/+0,464 Asian Range +0,142/+0,134 Equal H/L +0,218/+0,170 Alle drei nachbar-robust (11 Zellen, keine kippt). ⚠ Das sind keine drei neuen Signale: PDH/PDL, Asian-Range-Extrem, Equal H/L und die Squeeze-Box sind dasselbe — waagerechtes Level aus frueheren Extremen, gebrochen, ruhende Order, kanonisches Trailing. Deckt sich mit der Kontrolle "beliebige Box" aus dem Multi-Instrument-Lauf. ⚠⚠ Mit der gemessenen Exit-Slippage bleibt fast nichts uebrig. Beim guenstigsten Wert (0,0124 $, Tagfenster): PDH/PDL +0,099/+0,386 haelt, Equal H/L duenn, Asian Range faellt — und der LIVE laufende Auto-Squeeze steht in H1 bei -0,002. Die Edges dieser Familie liegen in derselben Groessenordnung wie die Ausstiegskosten, und die Slippage-Zahl ist eine Untergrenze. Konsequenz: kein neues Setup bauen. Der naechste Hebel ist die Ausfuehrungsqualitaet am EXIT, nicht ein weiteres Einstiegs-Signal. Offen und benannt: Volume-Profile-LVN und die Chartmuster-Nackenlinie qualifizieren sich, wurden aber nicht gemessen (Laufzeit bzw. Detektor). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
58 lines
2.4 KiB
Python
58 lines
2.4 KiB
Python
"""Halten die drei Ueberlebenden auch mit gemessener Exit-Slippage?
|
|
|
|
`backtest_verworfene_v2.lauf` rechnet nur den Spread. Aus
|
|
`analyze_slippage_holdtime.py`: E[Slippage] >= 0,0370 $ ueber alle Stunden,
|
|
0,0124 $ im Fenster 10-17. Bei ATR_M5 ~0,15 sind das 0,08-0,25 R je Trade —
|
|
gegen Edges von +0,13..+0,25 ist das nicht vernachlaessigbar.
|
|
"""
|
|
import sys
|
|
sys.path.insert(0, r"c:\Users\ah\Downloads\tradingrobot")
|
|
import MetaTrader5 as mt5
|
|
from backtest_cost_gate import _atr_series, kennzahlen
|
|
from core.exit_model import LIVE, simulate
|
|
import backtest_verworfene_v2 as V
|
|
|
|
mt5.initialize(); sym = "SpotCrude"
|
|
b = mt5.copy_rates_from_pos(sym, mt5.TIMEFRAME_M5, 0, 80000)
|
|
point = mt5.symbol_info(sym).point
|
|
mt5.shutdown()
|
|
H=[float(x["high"]) for x in b]; L=[float(x["low"]) for x in b]
|
|
C=[float(x["close"]) for x in b]; T=[int(x["time"]) for x in b]
|
|
SP=[float(x["spread"])*point for x in b]
|
|
A=_atr_series(H,L,C); m=len(C)//2
|
|
|
|
|
|
def lauf_slip(levels, lo, hi, slip_usd):
|
|
ev=[]
|
|
for ab,bis,lvl,d in levels:
|
|
for i in range(max(ab,1), min(bis+1, len(C)-2)):
|
|
atr=A[i-1]
|
|
if not atr or atr < V._ATRMIN: continue
|
|
if not ((H[i]>=lvl) if d>0 else (L[i]<=lvl)): continue
|
|
ev.append((i,d,lvl,atr,SP[i])); break
|
|
ev.sort(); rs=[]; frei=lo
|
|
for i,d,entry,atr,sp in ev:
|
|
if not (lo<=i<hi) or i<frei: continue
|
|
r,xb=simulate(entry,d,atr,H,L,C,i+1,LIVE,timestop=True,use_tp=True,ret_bar=True)
|
|
rs.append(r-(sp if sp>0 else 0.0225)/atr - slip_usd/atr)
|
|
frei=xb+1
|
|
return rs
|
|
|
|
setups=[("KONTROLLE Squeeze", V.squeeze_kontrolle(H,L,C,A)),
|
|
("PDH / PDL Bruch", V.tagesextrem(H,L,T)),
|
|
("Asian Range Bruch", V.asia(H,L,T)),
|
|
("Equal H/L Bruch", V.equal_hl(H,L,A))]
|
|
print("="*92)
|
|
print(" EXIT-SLIPPAGE angesetzt (gemessen: >=0,0124 $ im Tagfenster, >=0,0370 $ gesamt)")
|
|
print("="*92)
|
|
print(f" {'Setup':<22} {'0,000 $':>18} {'0,0124 $':>18} {'0,0370 $':>18}")
|
|
for name,lv in setups:
|
|
z=f" {name:<22}"
|
|
for s in (0.0, 0.0124, 0.0370):
|
|
k1=kennzahlen(lauf_slip(lv,0,m,s)); k2=kennzahlen(lauf_slip(lv,m,len(C),s))
|
|
z += (f" {k1['oer']:>+7.3f}/{k2['oer']:>+7.3f}" if k1 and k2 else f" {'—':^16}")
|
|
print(z)
|
|
print()
|
|
print(" ⚠ Die Edges liegen bei +0,13..+0,25 R — eine Slippage von 0,08..0,25 R")
|
|
print(" je Trade ist dagegen keine Randgroesse, sondern der entscheidende Posten.")
|