Files
AH-Oil-Trader/analyze_verworfene_nachbarn.py
T
Axel HocksandClaude Opus 5 7e03e481ca Verworfene Setups auf der Ausfuehrungs-Achse — und der Squeeze steht mit auf null
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>
2026-08-06 22:21:06 +02:00

81 lines
3.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""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("0008 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)