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
+16 -3
View File
@@ -2377,7 +2377,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
`recommendations.news_score` seit 2026-07-24 wieder BEFÜLLT (war auf None `recommendations.news_score` seit 2026-07-24 wieder BEFÜLLT (war auf None
degradiert) → in ein paar Monaten messbar. degradiert) → in ein paar Monaten messbar.
- **Karten** (Dashboard, von oben): Gesamtempfehlung · **Meldungen** · Marktstruktur · - **Karten** (Dashboard, von oben): Gesamtempfehlung · **Meldungen** · Marktstruktur ·
Chartmuster · Kerzen-Anatomie · Erwartete Spanne · KI-Copilot · Chartmuster · Kerzen-Anatomie · KI-Copilot ·
**Statistik (live) ganz unten**. **Statistik (live) ganz unten**.
⚠ **Drei Karten am 2026-08-05 in den Statistik-Tab verschoben (User-Vorgabe, ⚠ **Drei Karten am 2026-08-05 in den Statistik-Tab verschoben (User-Vorgabe,
v=138): „Manuelle Trades" (`#card-manual`), „Letzte Trades" (`#card-trades`) und v=138): „Manuelle Trades" (`#card-manual`), „Letzte Trades" (`#card-trades`) und
@@ -2664,7 +2664,20 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
Schalter `InpShowArrows`, Farben einzeln. **Der Kegel bleibt im Code** und in der Schalter `InpShowArrows`, Farben einzeln. **Der Kegel bleibt im Code** und in der
Dashboard-Kachel; der Bot exportiert ihn nur nicht mehr ins Chart Dashboard-Kachel; der Bot exportiert ihn nur nicht mehr ins Chart
(`[trading] export_cone=false`, `true` holt ihn zurück). (`[trading] export_cone=false`, `true` holt ihn zurück).
- **Wahrscheinlichkeits-Kegel „Erwartete Spanne" (`core/cone.py` + Kachel `#card-cone` - ⚠ **KACHEL „Erwartete Spanne" ENTFERNT, Kernwerte in die Gesamtempfehlung
gezogen (User-Vorgabe 2026-08-05, v=140).** `#card-cone`/`#cone-list` sind raus;
neu ist die einzeilige `#vd-cone` **unter der Bias-Nadel** in `#card-verdict`:
„📐 erwartete Spanne · 30 75,9976,77 · 60 75,8276,94 · 120 75,5577,21 ·
trifft 77 %". Gezeigt wird nur noch das **80 %-Band** je Horizont; das enge
50 %-Band und der Erklär-Absatz sind entfallen und 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 unverändert aktiv** (`core/cone.py`, Snapshot `cone`, MT5-Export `CN;…`).
Verifiziert am ausgelieferten HTML (`card-cone` weg, `vd-cone` da, keine verwaisten
JS-Referenzen).
- **Wahrscheinlichkeits-Kegel „Erwartete Spanne" (`core/cone.py` + ehem. Kachel `#card-cone`
+ MT5 `CN;…`, 2026-07-31): STREUUNG, NICHT RICHTUNG — und out-of-sample kalibriert.** + MT5 `CN;…`, 2026-07-31): STREUUNG, NICHT RICHTUNG — und out-of-sample kalibriert.**
Der User wollte ein „Kursvorhersagemodul, das mögliche Verläufe in MT5 einzeichnet". Der User wollte ein „Kursvorhersagemodul, das mögliche Verläufe in MT5 einzeichnet".
Eingezeichnete PFADE wurden bewusst NICHT gebaut (suggerieren eine Präzision, die es Eingezeichnete PFADE wurden bewusst NICHT gebaut (suggerieren eine Präzision, die es
@@ -2971,7 +2984,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
Signal → **Hinweis-Dialog „trotzdem eröffnen?"** (überschreibbar). CLOSE bei Signal → **Hinweis-Dialog „trotzdem eröffnen?"** (überschreibbar). CLOSE bei
**negativem** P&L → Sicherheitsabfrage; im Plus/Breakeven direkt. Sonst keine **negativem** P&L → Sicherheitsabfrage; im Plus/Breakeven direkt. Sonst keine
Token-Dialoge (`require_token=false`). Audio braucht 1× Nutzer-Tap. Token-Dialoge (`require_token=false`). Audio braucht 1× Nutzer-Tap.
- Asset-Version aktuell **v=139** (in `web/index.html` hochzählen, siehe Workflows). - Asset-Version aktuell **v=140** (in `web/index.html` hochzählen, siehe Workflows).
Schriftgrößen 2026-07-24 global **+4px** (2× je +2px auf User-Wunsch; Body-Basis Schriftgrößen 2026-07-24 global **+4px** (2× je +2px auf User-Wunsch; Body-Basis
14→18px). ⚠ Betrifft in `style.css` sowohl `font-size:Npx` (71×) ALS AUCH die 14→18px). ⚠ Betrifft in `style.css` sowohl `font-size:Npx` (71×) ALS AUCH die
`font:<weight> Npx/…`-**Shorthand** (3×: `.ms-chip`/`.ms-bos-lbl`/`.sqm-badge` `font:<weight> Npx/…`-**Shorthand** (3×: `.ms-chip`/`.ms-bos-lbl`/`.sqm-badge`
+19 -23
View File
@@ -383,31 +383,27 @@ function renderCandles(ca) {
// mit der REAL gemessenen Abdeckung (~76 %), nicht mit dem Nennwert 80 %. Der Kegel // 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 // 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. // 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) { function renderCone(cn) {
const el = $("cone-list"); const el = $("vd-cone");
if (!el) return; if (!el) return; // null-sicher (Cache-Regel)
const lv = (cn && cn.levels) || []; const lv = (cn && cn.levels) || [];
if (!lv.length) { const b80 = lv.filter(x => x.band === 80)
el.innerHTML = `<span class="dim">—</span>`; .sort((a, b) => a.minutes - b.minutes);
return; if (!b80.length) { el.innerHTML = ""; return; }
} const cov = b80[0].coverage != null ? `${fmt(b80[0].coverage, 0)} %` : "~";
const byMin = {}; el.innerHTML = `<span class="vd-cone-lbl">📐 erwartete Spanne</span>`
lv.forEach(x => { (byMin[x.minutes] = byMin[x.minutes] || {})[x.band] = x; }); + b80.map(x => `<span class="vd-cone-item"><i>${x.minutes}</i>`
el.innerHTML = Object.keys(byMin).sort((a, b) => a - b).map(mn => { + `${fmt(x.lo, 2)}${fmt(x.hi, 2)}</span>`).join("")
const b80 = byMin[mn][80], b50 = byMin[mn][50]; + `<span class="vd-cone-cov">trifft ${cov}</span>`;
const cov = b80 && b80.coverage != null ? `${fmt(b80.coverage, 0)}%` : "~"; // Die Einordnung gehört an die Zahl, nicht in einen Absatz darunter — sonst
return `<div class="cone-row"> // liest jemand die Spanne als Richtungsprognose.
<span class="cone-h">${mn} min</span> el.title = "STREUUNG, nicht Richtung: wie WEIT der Kurs plausibel läuft, nicht "
<span class="cone-band">${b80 ? `${fmt(b80.lo, 2)}${fmt(b80.hi, 2)}` : "—"} + "wohin. 80 %-Band, out-of-sample geprüft (analyze_cone.py, Fit auf einem "
<i>trifft ${cov}</i></span> + "Halbjahr, Abdeckung im anderen gemessen) — es trifft real ~76 %, ist also "
<span class="cone-inner">${b50 ? `enger: ${fmt(b50.lo, 2)}${fmt(b50.hi, 2)}` : ""}</span> + "leicht zu eng. Kein Signal, kein Einfluss auf die Empfehlung.";
</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>`;
} }
function renderPatterns(pt) { function renderPatterns(pt) {
+11 -9
View File
@@ -6,7 +6,7 @@
<meta name="theme-color" content="#0d1117"> <meta name="theme-color" content="#0d1117">
<title>Oil · MT5</title> <title>Oil · MT5</title>
<link rel="manifest" href="manifest.json"> <link rel="manifest" href="manifest.json">
<link rel="stylesheet" href="style.css?v=139"> <link rel="stylesheet" href="style.css?v=140">
</head> </head>
<body> <body>
<!-- Modul-Menü (ganz oben) --> <!-- Modul-Menü (ganz oben) -->
@@ -90,6 +90,12 @@
<div class="vd-modules" id="vd-modules"></div> <div class="vd-modules" id="vd-modules"></div>
<!-- Zeitebenen-Ampel (M1/M5/M15/M30/H1), aus der Welle hierher verschoben --> <!-- Zeitebenen-Ampel (M1/M5/M15/M30/H1), aus der Welle hierher verschoben -->
<div class="tf-turns" id="wave-turns"></div> <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> </section>
<!-- Meldungen (ex-Position + Wellen-Meldungen; Welle-Karte entfällt) --> <!-- 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> <div class="ca-list" id="ca-list"><span class="dim"></span></div>
</section> </section>
<!-- Wahrscheinlichkeits-Kegel — Streuung, NICHT Richtung. Out-of-sample <!-- Karte „Erwartete Spanne" ENTFERNT 2026-08-05 (User-Vorgabe) — die Kernwerte
kalibriert (analyze_cone.py); die UI nennt die REAL gemessene Abdeckung --> stehen jetzt komprimiert in der Gesamtempfehlung (`#vd-cone`). Backend
<section class="card wide" id="card-cone"> (`core/cone.py`, Snapshot `cone`, MT5-Export `CN;…`) ist unverändert aktiv. -->
<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>
<!-- KI-Agent --> <!-- KI-Agent -->
<section class="card wide" id="card-agent"> <section class="card wide" id="card-agent">
<h2>KI-Copilot</h2> <h2>KI-Copilot</h2>
@@ -287,6 +289,6 @@
<div id="toast" class="toast hidden"></div> <div id="toast" class="toast hidden"></div>
<script src="lightweight-charts.standalone.production.js?v=114"></script> <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> </body>
</html> </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-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-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} .ca-note{font-size:12px;color:var(--dim);margin-top:3px;line-height:1.4}
/* Erwartete Spanne — neutral, bewusst ohne Richtungsfarbe */ /* Erwartete Spanne — komprimiert in der Gesamtempfehlung (2026-08-05, die eigene
.cone-row{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap; Karte ist entfallen). Bewusst OHNE Richtungsfarbe und ohne Rahmen: die Zeile
padding:6px 0;border-bottom:1px solid var(--border)} zeigt Streuung, sie darf optisch nicht mit der Bias-Nadel darüber konkurrieren. */
.cone-row:last-of-type{border-bottom:none} .vd-cone{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;
.cone-h{font-weight:700;font-size:14px;color:var(--bright);min-width:64px} margin:6px 0 0;padding-top:6px;border-top:1px solid var(--line)}
.cone-band{font-family:var(--mono);font-size:14px;color:var(--bright)} .vd-cone-lbl{font-size:12px;color:var(--dim)}
.cone-band i{font-style:normal;font-size:11px;color:var(--dim);margin-left:6px} .vd-cone-item{font-family:var(--mono);font-size:13px;color:var(--bright)}
.cone-inner{margin-left:auto;font-family:var(--mono);font-size:12px;color:var(--dim)} .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)} #card-verdict{border-color:var(--accent)}
.vd-head{display:flex;align-items:center;gap:14px;margin-bottom:10px} .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; .vd-ring{width:60px;height:60px;border-radius:50%;flex:0 0 auto;