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) {
+11 -9
View File
@@ -6,7 +6,7 @@
<meta name="theme-color" content="#0d1117">
<title>Oil · MT5</title>
<link rel="manifest" href="manifest.json">
<link rel="stylesheet" href="style.css?v=139">
<link rel="stylesheet" href="style.css?v=140">
</head>
<body>
<!-- Modul-Menü (ganz oben) -->
@@ -90,6 +90,12 @@
<div class="vd-modules" id="vd-modules"></div>
<!-- Zeitebenen-Ampel (M1/M5/M15/M30/H1), aus der Welle hierher verschoben -->
<div class="tf-turns" id="wave-turns"></div>
<!-- Erwartete Spanne, komprimiert (User-Vorgabe 2026-08-05; die eigene Karte
`#card-cone` ist dafür entfallen). ⚠ STREUUNG, nicht Richtung — deshalb
bewusst UNTER der Bias-Nadel und neutral gefärbt, damit sie nicht als
Richtungsaussage gelesen wird. Beschriftet mit der REAL gemessenen
Abdeckung, nicht mit dem Nennwert 80 %. -->
<div class="vd-cone" id="vd-cone"></div>
</section>
<!-- Meldungen (ex-Position + Wellen-Meldungen; Welle-Karte entfällt) -->
@@ -143,13 +149,9 @@
<div class="ca-list" id="ca-list"><span class="dim"></span></div>
</section>
<!-- Wahrscheinlichkeits-Kegel — Streuung, NICHT Richtung. Out-of-sample
kalibriert (analyze_cone.py); die UI nennt die REAL gemessene Abdeckung -->
<section class="card wide" id="card-cone">
<h2>Erwartete Spanne <span class="ca-tf">kalibriert · keine Richtung</span></h2>
<div class="cone-list" id="cone-list"><span class="dim"></span></div>
</section>
<!-- Karte „Erwartete Spanne" ENTFERNT 2026-08-05 (User-Vorgabe) — die Kernwerte
stehen jetzt komprimiert in der Gesamtempfehlung (`#vd-cone`). Backend
(`core/cone.py`, Snapshot `cone`, MT5-Export `CN;…`) ist unverändert aktiv. -->
<!-- KI-Agent -->
<section class="card wide" id="card-agent">
<h2>KI-Copilot</h2>
@@ -287,6 +289,6 @@
<div id="toast" class="toast hidden"></div>
<script src="lightweight-charts.standalone.production.js?v=114"></script>
<script src="app.js?v=139"></script>
<script src="app.js?v=140"></script>
</body>
</html>
+9 -8
View File
@@ -186,14 +186,15 @@ main{display:grid;grid-template-columns:1fr 1fr;gap:11px;padding:11px}
.ca-ago{margin-left:auto;font-size:12px;color:var(--dim);font-family:var(--mono)}
.ca-bars{font-size:12px;margin-top:3px;font-family:var(--mono);color:var(--dim)}
.ca-note{font-size:12px;color:var(--dim);margin-top:3px;line-height:1.4}
/* Erwartete Spanne — neutral, bewusst ohne Richtungsfarbe */
.cone-row{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
padding:6px 0;border-bottom:1px solid var(--border)}
.cone-row:last-of-type{border-bottom:none}
.cone-h{font-weight:700;font-size:14px;color:var(--bright);min-width:64px}
.cone-band{font-family:var(--mono);font-size:14px;color:var(--bright)}
.cone-band i{font-style:normal;font-size:11px;color:var(--dim);margin-left:6px}
.cone-inner{margin-left:auto;font-family:var(--mono);font-size:12px;color:var(--dim)}
/* Erwartete Spanne — komprimiert in der Gesamtempfehlung (2026-08-05, die eigene
Karte ist entfallen). Bewusst OHNE Richtungsfarbe und ohne Rahmen: die Zeile
zeigt Streuung, sie darf optisch nicht mit der Bias-Nadel darüber konkurrieren. */
.vd-cone{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
margin:6px 0 0;padding-top:6px;border-top:1px solid var(--line)}
.vd-cone-lbl{font-size:12px;color:var(--dim)}
.vd-cone-item{font-family:var(--mono);font-size:13px;color:var(--bright)}
.vd-cone-item i{font-style:normal;font-size:11px;color:var(--dim);margin-right:3px}
.vd-cone-cov{margin-left:auto;font-size:11px;color:var(--dim)}
#card-verdict{border-color:var(--accent)}
.vd-head{display:flex;align-items:center;gap:14px;margin-bottom:10px}
.vd-ring{width:60px;height:60px;border-radius:50%;flex:0 0 auto;