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:
co-authored by
Claude Opus 5
parent
516f1eaa7f
commit
e55b866f29
+19
-23
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user