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
+56 -2
View File
@@ -172,6 +172,52 @@ function renderVerdict(v, snap) {
`<span class="m-vote">${a}</span></div>` +
`<div class="m-det">${mod.detail || ""}</div></div>`;
}).join("");
// ── Selbst-Kalibrierung: die Karte zeigt ihre eigene Trefferquote ─────
// ⚠ Gegen 50 % zu lesen, nicht gegen 0 — es ist eine Richtungsaussage.
// Ausgangsstand (analyze_signal_live.py, 1.071 Episoden): 4851 %.
// Bis genug Episoden ausgewertet sind, steht hier ehrlich „sammelt noch".
// Null-sicher (s. Cache-Regel): neue IDs treffen evtl. auf alte, gecachte HTML.
const trkEl = $("vd-selfcal");
if (trkEl) {
const tr = snap && snap.rec_track;
if (tr && tr.n >= 20 && tr.wr30 != null) {
const d = (x) => (x == null ? "—" : (x >= 0 ? "+" : "") + fmt(x, 3));
const cls = tr.wr30 >= 55 ? "up" : tr.wr30 <= 45 ? "down" : "";
trkEl.className = "vd-selfcal " + cls;
trkEl.textContent =
`🎯 eigene Trefferquote (letzte ${tr.n} Episoden): ${tr.wr30} % auf 30`
+ (tr.wr60 != null ? ` · ${tr.wr60} % auf 60` : "")
+ ` · Ø ${d(tr.avg30)}×ATR`;
trkEl.title = "Selbst-Kalibrierung: jede gerichtete Empfehlung wird nach "
+ "30 und 60 Minuten gegen den echten Kurs ausgewertet. Gegen 50 % lesen, "
+ "nicht gegen 0. Gemessener Ausgangsstand über 1.071 Episoden: 4851 %.";
} else {
trkEl.className = "vd-selfcal dim";
trkEl.textContent = `🎯 eigene Trefferquote: sammelt noch`
+ (tr && tr.n ? ` (${tr.n} von 20 Episoden ausgewertet)` : "");
trkEl.title = "Jede gerichtete Empfehlung wird nach 30/60 Minuten gegen "
+ "den echten Kurs ausgewertet. Ab 20 ausgewerteten Episoden erscheint "
+ "die Quote hier.";
}
}
// ── Warum WARTEN? Verteilung der blockierenden Gates (heute) ───────────
const blkEl = $("vd-blocks");
if (blkEl) {
const bm = snap && snap.block_mix;
if (bm && bm.total) {
const pc = (n) => Math.round(100 * n / bm.total);
const top = (bm.top || []).map(x => `${x.grund} ${pc(x.n)} %`).join(" · ");
blkEl.textContent = `⛔ heute ${pc(bm.frei)} % ohne Block`
+ (top ? ` · ${top}` : "");
blkEl.title = "Welches Gate hält die Empfehlung gerade zurück — über den "
+ "heutigen Tag gezählt. Ohne diese Zeile war „warum gab es so wenige "
+ "Empfehlungen?" + '"' + " nur per Datenbank-Abfrage zu beantworten.";
} else {
blkEl.textContent = "";
}
}
}
@@ -1171,8 +1217,16 @@ document.querySelectorAll(".btn[data-side]").forEach(btn => {
const isWait0 = (sigNow === "WARTEN" || sigNow === "—");
if (al && cl.items.some(x => x.key === "signal" && x.state === "fail")) {
const grp = isWait0 ? al.none : al.against, ref = al.with;
const f = g => (g && g.n >= 5)
? `${g.wr}% Treffer · ${g.pnl >= 0 ? "+" : ""}${fmt(g.pnl, 0)} € (n${g.n})` : null;
// ⚠ JE LOT ist die belastbare Zahl: absolute Euro-Vergleiche sind bei
// wechselnder Positionsgroesse ungueltig (Lehre 04.08. — ein reiner
// Groessenzuwachs sah wie ein Strategie-Effekt aus). Seit 06.08. laeuft
// der Split ueber die VOLLE Historie (1.216 Trades) statt ueber 40.
const f = g => {
if (!g || g.n < 5) return null;
const lot = (g.pnl_lot === null || g.pnl_lot === undefined) ? ""
: ` · ${g.pnl_lot >= 0 ? "+" : ""}${fmt(g.pnl_lot, 2)} €/Lot`;
return `${g.wr}% Treffer${lot} · ${g.pnl >= 0 ? "+" : ""}${fmt(g.pnl, 0)} € (n${g.n})`;
};
const own = f(grp), rf = f(ref);
if (own) body += `\n\n📊 Deine Trades ${isWait0 ? "OHNE" : "GEGEN"} Signal: ${own}`;
if (rf) body += `\n📊 Mit Signal: ${rf}`;