Kachel "Erwartete Spanne" entfernt, Kernwerte komprimiert in die Gesamtempfehlung

User-Vorgabe. #card-cone/#cone-list raus; neu die einzeilige #vd-cone unter der
Bias-Nadel: "erwartete Spanne · 30' 75,99-76,77 · 60' ... · trifft 77 %".
Gezeigt wird nur noch das 80-%-Band je Horizont; das enge 50-%-Band und der
Erklaer-Absatz stecken im title.

Platzierung und Farbe sind Absicht: die Zeile steht UNTER der Nadel und ist
neutral/randlos - sie zeigt Streuung, nicht Richtung, und darf optisch nicht mit
dem Bias konkurrieren. Beschriftet bleibt sie mit der REAL gemessenen Abdeckung
(~77 %), nicht mit dem Nennwert 80 %.

Backend unveraendert aktiv (core/cone.py, Snapshot cone, MT5-Export CN;...).
Verifiziert am ausgelieferten HTML: card-cone weg, vd-cone da, keine verwaisten
JS-Referenzen, Klammern-Balance ok. v=140.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 13:17:18 +02:00
co-authored by Claude Opus 5
parent 516f1eaa7f
commit e55b866f29
4 changed files with 55 additions and 43 deletions
+19 -23
View File
@@ -383,31 +383,27 @@ function renderCandles(ca) {
// mit der REAL gemessenen Abdeckung (~76 %), nicht mit dem Nennwert 80 %. Der Kegel
// ist out-of-sample geprüft (analyze_cone.py, Fit H1 → Abdeckung H2) und damit nach
// dem P(break)-Modell die zweite kalibrierte Komponente im Projekt.
// ⚠ Seit 2026-08-05 KOMPRIMIERT in der Gesamtempfehlung (`#vd-cone`) statt in einer
// eigenen Karte (User-Vorgabe). Gezeigt wird nur noch das 80 %-Band je Horizont —
// das enge 50 %-Band und der Fließtext sind entfallen und stecken im `title`.
function renderCone(cn) {
const el = $("cone-list");
if (!el) return;
const el = $("vd-cone");
if (!el) return; // null-sicher (Cache-Regel)
const lv = (cn && cn.levels) || [];
if (!lv.length) {
el.innerHTML = `<span class="dim">—</span>`;
return;
}
const byMin = {};
lv.forEach(x => { (byMin[x.minutes] = byMin[x.minutes] || {})[x.band] = x; });
el.innerHTML = Object.keys(byMin).sort((a, b) => a - b).map(mn => {
const b80 = byMin[mn][80], b50 = byMin[mn][50];
const cov = b80 && b80.coverage != null ? `${fmt(b80.coverage, 0)}%` : "~";
return `<div class="cone-row">
<span class="cone-h">${mn} min</span>
<span class="cone-band">${b80 ? `${fmt(b80.lo, 2)}${fmt(b80.hi, 2)}` : "—"}
<i>trifft ${cov}</i></span>
<span class="cone-inner">${b50 ? `enger: ${fmt(b50.lo, 2)}${fmt(b50.hi, 2)}` : ""}</span>
</div>`;
}).join("") +
`<div class="pt-disclaimer">📐 <b>Streuung, keine Richtung.</b> Die Spanne sagt, wie
WEIT der Kurs plausibel läuft — nicht wohin. Out-of-sample geprüft
(<code>analyze_cone.py</code>, Fit auf einem Halbjahr, Abdeckung im anderen
gemessen): das nominale 80 %-Band trifft real ~76 %, ist also leicht zu eng.
Kein Signal, kein Einfluss auf die Empfehlung.</div>`;
const b80 = lv.filter(x => x.band === 80)
.sort((a, b) => a.minutes - b.minutes);
if (!b80.length) { el.innerHTML = ""; return; }
const cov = b80[0].coverage != null ? `${fmt(b80[0].coverage, 0)} %` : "~";
el.innerHTML = `<span class="vd-cone-lbl">📐 erwartete Spanne</span>`
+ b80.map(x => `<span class="vd-cone-item"><i>${x.minutes}</i>`
+ `${fmt(x.lo, 2)}${fmt(x.hi, 2)}</span>`).join("")
+ `<span class="vd-cone-cov">trifft ${cov}</span>`;
// Die Einordnung gehört an die Zahl, nicht in einen Absatz darunter — sonst
// liest jemand die Spanne als Richtungsprognose.
el.title = "STREUUNG, nicht Richtung: wie WEIT der Kurs plausibel läuft, nicht "
+ "wohin. 80 %-Band, out-of-sample geprüft (analyze_cone.py, Fit auf einem "
+ "Halbjahr, Abdeckung im anderen gemessen) — es trifft real ~76 %, ist also "
+ "leicht zu eng. Kein Signal, kein Einfluss auf die Empfehlung.";
}
function renderPatterns(pt) {