"""Nachbar-Pruefung der drei Setups, die den vollen Lauf bestanden haben.

Kippt ein Nachbar-Parameter das Vorzeichen, ist der Treffer Rauschen — genau das
Kriterium, an dem ORB (2026-07-17) und die SMC-Sweeps gescheitert sind.
"""
import sys
sys.path.insert(0, r"c:\Users\ah\Downloads\tradingrobot")
from datetime import timedelta
import MetaTrader5 as mt5
from backtest_cost_gate import _atr_series, kennzahlen
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 zeig(lbl, lv):
    k1 = kennzahlen(V.lauf(lv, H, L, C, SP, A, 0, m, "touch"))
    k2 = kennzahlen(V.lauf(lv, H, L, C, SP, A, m, len(C), "touch"))
    if not k1 or not k2:
        print(f"    {lbl:<28} — zu wenige"); return False
    gut = k1["oer"] > 0 and k2["oer"] > 0 and k1["pf"] > 1 and k2["pf"] > 1
    print(f"    {lbl:<28} H1 {k1['oer']:>+7.3f} PF {k1['pf']:.2f} n{k1['n']:<5} | "
          f"H2 {k2['oer']:>+7.3f} PF {k2['pf']:.2f} n{k2['n']:<5} {'OK' if gut else 'KIPPT'}")
    return gut


print("=" * 96)
print("  NACHBAR-PRUEFUNG (Variante C = Beruehrungs-Fill, 80k M5-Bars)")
print("=" * 96)

print("\n  PDH/PDL — Gueltigkeitsdauer variiert:")
alle_pdh = True
basis = V.tagesextrem(H, L, T)
alle_pdh &= zeig("voller Folgetag (Basis)", basis)
for kuerz in (0.5, 0.25):
    lv = [(a, a + int((bb - a) * kuerz), l, d) for a, bb, l, d in basis]
    alle_pdh &= zeig(f"nur erste {int(kuerz*100)} % des Tages", lv)

print("\n  Asian Range — Fenster variiert:")
alle_asia = True
alle_asia &= zeig("00–08 Uhr (Basis)", V.asia(H, L, T))
for h_ende in (7, 9):
    orig = V.asia.__code__
    lv = []
    tag, sam = None, []
    for i in range(len(H)):
        bz = V._berlin(T[i])
        if bz.date() != tag:
            tag, sam = bz.date(), []
        if bz.hour < h_ende:
            sam.append(i)
        elif sam and bz.hour == h_ende and bz.minute < 5:
            hi = max(H[j] for j in sam); lo = min(L[j] for j in sam)
            bis = i
            while bis < len(H) - 2 and V._berlin(T[bis]).date() == tag:
                bis += 1
            lv.append((i, bis, hi, +1)); lv.append((i, bis, lo, -1)); sam = []
    alle_asia &= zeig(f"00–{h_ende:02d} Uhr", lv)

print("\n  Equal H/L — Toleranz und Gueltigkeit variiert:")
alle_eq = True
alle_eq &= zeig("tol 0.15 · 120 Bars (Basis)", V.equal_hl(H, L, A))
for tol in (0.10, 0.25):
    alle_eq &= zeig(f"tol {tol} · 120 Bars", V.equal_hl(H, L, A, tol=tol))
for g in (60, 240):
    alle_eq &= zeig(f"tol 0.15 · {g} Bars", V.equal_hl(H, L, A, gueltig=g))

print()
print("=" * 96)
for n, ok in (("PDH/PDL", alle_pdh), ("Asian Range", alle_asia), ("Equal H/L", alle_eq)):
    print(f"  {n:<14} → {'ROBUST' if ok else 'KIPPT bei den Nachbarn — verworfen'}")
print("=" * 96)
