Gesamtempfehlung: Selbst-Kalibrierung, voller Ausrichtungs-Split, Block-Gruende,

Elliott entmachtet (v=144)

Vier Verbesserungen, alle aus dem Gemessenen abgeleitet — kein neues Signal.
Ausgangspunkt: die Karte hat genau eine belegte Funktion, das Veto; als Prognose
ist sie ein Muenzwurf (48-51 % ueber 1.071 Episoden).

(1) SELBST-KALIBRIERUNG. Neue Tabelle rec_outcomes: eine Zeile je EPISODE
    (Richtungswechsel, nicht je Minute), Auswertung ~alle 5 min gegen candles_m1
    nach 30/60 min, Snapshot rec_track, Zeile #vd-selfcal. Gegen 50 % zu lesen.
    Warum der groesste Hebel: die Qualitaet war bis heute unsichtbar und musste
    auf Nachfrage rueckwirkend gemessen werden. Dasselbe Muster
    (pbreak_predictions) hat den Ausfall des P(break)-Modells LIVE aufgedeckt.
    Mit 4 Szenarien getestet (tests_rec_outcomes.py). Zwei Fehlschlaege dabei
    waren Testfehler, keine Code-Fehler — dokumentiert.

(2) alignment_stats auf die VOLLE Historie (1.216 statt 40 Trades) und
    zusaetzlich je Lot. Absolute Euro-Vergleiche sind bei wechselnder
    Positionsgroesse ungueltig (Lehre 04.08.). Damit steht die einzige
    beidhaelftig robuste Aussage der Karte auf ihrer vollen Stichprobe.

(3) Block-Gruende sichtbar (block_mix -> #vd-blocks): "heute X % ohne Block ·
    entry_room … · min_conf …". Bisher nur per DB-Abfrage zu beantworten.

(4) ELLIOTT: Verdict-Gewicht 1,0 -> 0. Gemessen ueber 15.544 Zeilen hatte es mit
    1.384 Episoden die groesste Stichprobe der Tabelle und ist darin flach
    (-0,075/+0,032, 50 % Treffer) — bei 25,9 % Einfluss auf die Nadel, weil es
    in nur 1 % der Zeilen schweigt. Chip bleibt, Stimme entfaellt.
    ⚠ Folge: die Nadel schlaegt staerker aus (real +0,33 -> +1,00).

⚠ Namenskollision beim Bau gefunden und behoben: die neue Klasse hiess zuerst
.vd-track — so heisst bereits die Schiene der Bias-Nadel; sie waere
ueberschrieben worden. Jetzt .vd-selfcal.

Live verifiziert: alignment je Lot, block_mix (93 von 1381 ohne Block),
rec_outcomes angelegt, Elliott weight=0 bei erhaltenem Chip, v=144 ausgeliefert,
eine Instanz auf Port 8000.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-06 23:21:52 +02:00
co-authored by Claude Opus 5
parent 4f85d2ce75
commit 874ee16e00
9 changed files with 705 additions and 48 deletions
+19 -3
View File
@@ -96,8 +96,18 @@ def _htf_sign(C, i, n, atr):
def lauf(w, H, L, C, T, A, SP, EF, ES, AD, HTF, H1, PH, PL, lo, hi,
min_conf, nacht, am_level, slip=0.0):
"""Ein Durchlauf: sequentiell, EIN Positions-Slot, Live-Dedup."""
min_conf, nacht, am_level, slip=0.0, fill="close"):
"""Ein Durchlauf: sequentiell, EIN Positions-Slot, Live-Dedup.
`fill` (2026-08-06 ergaenzt, Default = bisheriges Verhalten, bitgenau):
"close" — die Bestaetigung gilt, wenn der Bar-CLOSE das Level bricht.
"touch" — die ruhende Stop-Order fuellt bei der ERSTEN BERUEHRUNG, auch
wenn der Bar wieder zurueckfaellt. Das ist, was live passiert.
⚠ Der Unterschied ist kein Detail: beim Momentum betrug er 0,45 R und drehte
+0,40 auf 0,06 (`backtest_momentum_v2.py`), beim Squeeze 0,32 R
(`backtest_squeeze_touchfill.py`). "close" konditioniert auf den Bar-Schluss,
den eine liegende Order nicht kennen kann.
"""
def kosten(i, atr):
return (SP[i] if SP[i] > 0 else 0.0225) / atr
@@ -135,7 +145,13 @@ def lauf(w, H, L, C, T, A, SP, EF, ES, AD, HTF, H1, PH, PL, lo, hi,
pend = {"dir": d, "level": C[i] + d * _K * atr,
"invalid": C[i] - d * _K * atr, "confirmed": False, "bar": i}
if not pend["confirmed"]:
broke = (C[i] >= pend["level"]) if d > 0 else (C[i] <= pend["level"])
if fill == "touch":
# Beruehrung genuegt — die Order liegt dort und wird ausgeloest.
broke = ((H[i] >= pend["level"]) if d > 0
else (L[i] <= pend["level"]))
else:
broke = ((C[i] >= pend["level"]) if d > 0
else (C[i] <= pend["level"]))
against = (C[i] <= pend["invalid"]) if d > 0 else (C[i] >= pend["invalid"])
if broke:
pend["confirmed"] = True