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