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:
co-authored by
Claude Opus 5
parent
4f85d2ce75
commit
874ee16e00
+56
-2
@@ -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): 48–51 %.
|
||||
// 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: 48–51 %.";
|
||||
} 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}`;
|
||||
|
||||
Reference in New Issue
Block a user