"""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.")
