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>
81 lines
3.0 KiB
Python
81 lines
3.0 KiB
Python
"""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)
|