Zwei neue Tabs: "SIG Live" und "SIG Anzeige", Module nach WIRKUNG sortiert

User-Vorgabe. Sortiert wird nicht nach Thema, sondern danach, ob ein Modul die
Empfehlung bewegt - und das ist am Code pruefbar: engine._verdict ruft
add(name, vote, gewicht, ...); Gewicht > 0 heisst Einfluss auf die Bias-Nadel.

  SIG Live    <- KI-Copilot (Gewicht 1,0) · Chartmuster (_PAT_W = 0,25)
  SIG Anzeige <- Marktstruktur · Kerzen-Anatomie (gemessen ohne Einfluss)

Chartmuster landet damit bewusst in "Live", obwohl die Klasse als Signal
verworfen wurde - seit 01.08. hat sie 5 % Stimmanteil. "Gewicht" heisst nicht
"belegt"; genau deshalb ist die Trennung nach Wirkung sinnvoll: sie zeigt, was
die Empfehlung TATSAECHLICH bewegt, unabhaengig von der Beleglage.

Auf dem Dashboard bleiben Trade-Leiste, Gesamtempfehlung, Meldungen und
Statistik (live). Die Meldungen-Karte enthaelt zwar einflussreiche Teile
(Squeeze-Stimme, S/R-Close-Hinweis, Flip-Close), ist aber der Live-Meldungsstrom
zum laufenden Trade und gehoert dorthin, wo gehandelt wird.

Reiner Markup-Umzug: showView bildet data-view="siglive" auf #view-siglive ab,
keine JS-Aenderung noetig. CSS-Regel analog zum Statistik-Tab, weil beide Views
ausserhalb des <main>-Grids liegen. Die verschobenen Bloecke wurden aus git
zurueckgeholt statt nachgetippt.

Verifiziert am ausgelieferten HTML: 7 Tabs, 7 Views, keine doppelten IDs, keine
verwaisten JS-Referenzen, section-Tags balanciert. v=141.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 13:27:07 +02:00
co-authored by Claude Opus 5
parent 65e12ab264
commit a13adb891b
3 changed files with 109 additions and 45 deletions
+27 -3
View File
@@ -2037,7 +2037,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
`pnl>0`-Gate (`history`) noch vom 5-Min-Cooldown betroffen. `pnl>0`-Gate (`history`) noch vom 5-Min-Cooldown betroffen.
## Mobile-UI (web/) & Alarme ## Mobile-UI (web/) & Alarme
- Aufbau: **Tab-Navigation ganz oben** (sticky: Dashboard/Logs/Statistik/**Charts**/News), - Aufbau: **Tab-Navigation ganz oben** (sticky: Dashboard/**SIG Live**/**SIG Anzeige**/Logs/Statistik/**Charts**/News),
darunter Header. darunter Header.
- **Design-System (`style.css`, Pass 2026-07-15, KEIN Framework — Tailwind bewusst - **Design-System (`style.css`, Pass 2026-07-15, KEIN Framework — Tailwind bewusst
verworfen wegen WireGuard/Offline + kein Node):** Tokens in `:root` — Flächen-Leiter verworfen wegen WireGuard/Offline + kein Node):** Tokens in `:root` — Flächen-Leiter
@@ -2376,8 +2376,32 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
Prädiktivität unbelegt (Kalibrier-Messung: H2 nur n=4/6); dafür wird Prädiktivität unbelegt (Kalibrier-Messung: H2 nur n=4/6); dafür wird
`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.
- ⚠⚠ **ZWEI NEUE TABS: „SIG Live" und „SIG Anzeige" (User-Vorgabe 2026-08-05,
v=141).** Sortiert wird nach **WIRKUNG, nicht nach Thema** — und die Zuordnung ist
**am Code prüfbar**, nicht Geschmackssache: `engine._verdict` ruft
`add(name, vote, gewicht, …)`; wer ein Gewicht > 0 bekommt, verschiebt die
Bias-Nadel und gehört nach „SIG Live".
| Tab | Karten | Begründung |
|---|---|---|
| **SIG Live** | KI-Copilot · Chartmuster | Verdict-Gewicht **1,0** bzw. **0,25** (`_PAT_W`) |
| **SIG Anzeige** | Marktstruktur · Kerzen-Anatomie | gemessen **ohne** Einfluss, als Signal verworfen |
**„Gewicht" heißt NICHT „belegt".** Der KI-Copilot hat Stimmrecht, ist aber
gemessen nicht robust prädiktiv — genau deshalb ist die Trennung nach Wirkung
sinnvoll: sie zeigt, was die Empfehlung TATSÄCHLICH bewegt, unabhängig davon, wie
gut es belegt ist. Chartmuster steht aus demselben Grund in „Live", obwohl die
Klasse als Signal verworfen wurde — seit dem 2026-08-01 hat sie 5 % Stimmanteil.
**Auf dem Dashboard BLEIBEN** Trade-Leiste, Gesamtempfehlung, Meldungen und
Statistik (live). Die „Meldungen"-Karte enthält zwar einflussreiche Teile
(Squeeze-Stimme, S/R-Close-Hinweis, Flip-Close), ist aber der **Live-Meldungsstrom
zum laufenden Trade** — sie gehört an die Stelle, an der gehandelt wird, nicht in
einen Modul-Tab. Wer das anders will, verschiebt `#card-pos`.
Umgesetzt als reiner Markup-Umzug (`showView` bildet `data-view="siglive"` auf
`#view-siglive` ab, keine JS-Änderung nötig); CSS-Regel `#view-siglive > .card`
analog zum Statistik-Tab, weil beide außerhalb des `<main>`-Grids liegen.
Verifiziert am ausgelieferten HTML: 7 Tabs, 7 Views, keine doppelten IDs, keine
verwaisten JS-Referenzen.
- **Karten** (Dashboard, von oben): Gesamtempfehlung · **Meldungen** · Marktstruktur · - **Karten** (Dashboard, von oben): Gesamtempfehlung · **Meldungen** · Marktstruktur ·
Chartmuster · Kerzen-Anatomie · KI-Copilot · KI-Copilot (jetzt im Tab „SIG Live") ·
**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
@@ -3014,7 +3038,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=140** (in `web/index.html` hochzählen, siehe Workflows). - Asset-Version aktuell **v=141** (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`
+73 -40
View File
@@ -6,12 +6,18 @@
<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=140"> <link rel="stylesheet" href="style.css?v=141">
</head> </head>
<body> <body>
<!-- Modul-Menü (ganz oben) --> <!-- Modul-Menü (ganz oben) -->
<nav id="tabs"> <nav id="tabs">
<button class="tab active" data-view="dash">Dashboard</button> <button class="tab active" data-view="dash">Dashboard</button>
<!-- Aufteilung nach WIRKUNG (User-Vorgabe 2026-08-05), nicht nach Thema:
„SIG Live" = Module MIT Verdict-Gewicht (fließen in die Empfehlung ein),
„SIG Anzeige" = gemessen OHNE Einfluss. Die Trennung ist am Code prüfbar
(`_verdict`: `add(...)` mit Gewicht > 0), nicht Geschmackssache. -->
<button class="tab" data-view="siglive">SIG Live</button>
<button class="tab" data-view="siganzeige">SIG Anzeige</button>
<button class="tab" data-view="logs">Logs</button> <button class="tab" data-view="logs">Logs</button>
<button class="tab" data-view="stats">Statistik</button> <button class="tab" data-view="stats">Statistik</button>
<button class="tab" data-view="charts">Charts</button> <button class="tab" data-view="charts">Charts</button>
@@ -119,47 +125,9 @@
<div class="kv"><span>Lauf</span><b id="wave-move"></b></div> <div class="kv"><span>Lauf</span><b id="wave-move"></b></div>
</section> </section>
<!-- Marktstruktur (M30) — reine Anzeige, kein Signal -->
<section class="card wide" id="card-structure">
<h2>Marktstruktur <span class="ms-tf">M30</span></h2>
<div class="ms-top">
<span class="ms-trend" id="ms-trend"></span>
<div class="ms-swings" id="ms-swings"></div>
</div>
<div class="ms-bos" id="ms-bos"></div>
<div class="ms-chan" id="ms-chan">
<div class="ms-chan-head"><span id="ms-chan-dir"></span>
<span class="ms-chan-note" id="ms-chan-note"></span></div>
<div class="ms-chan-track"><div class="ms-chan-fill" id="ms-chan-fill"></div>
<div class="ms-chan-dot" id="ms-chan-dot"></div></div>
<div class="ms-chan-scale"><span>Kanal unten</span><span>oben</span></div>
</div>
</section>
<!-- Chartmuster (visuell) — reine Anzeige, kein Signal (noch nicht backtestet) -->
<section class="card wide" id="card-patterns">
<h2>Chartmuster <span class="pt-tf">M30 · visuell</span></h2>
<div class="pt-list" id="pt-list"><span class="dim"></span></div>
</section>
<!-- Kerzen-Anatomie (M5) — reine Anzeige; die Lehrbuch-Deutung ist gemessen
invertiert, deshalb steht die GEMESSENE Lesart im Hinweistext -->
<section class="card wide" id="card-candles">
<h2>Kerzen-Anatomie <span class="ca-tf">M5 · nur Anzeige</span></h2>
<div class="ca-list" id="ca-list"><span class="dim"></span></div>
</section>
<!-- Karte „Erwartete Spanne" ENTFERNT 2026-08-05 (User-Vorgabe) — die Kernwerte <!-- Karte „Erwartete Spanne" ENTFERNT 2026-08-05 (User-Vorgabe) — die Kernwerte
stehen jetzt komprimiert in der Gesamtempfehlung (`#vd-cone`). Backend stehen jetzt komprimiert in der Gesamtempfehlung (`#vd-cone`). Backend
(`core/cone.py`, Snapshot `cone`, MT5-Export `CN;…`) ist unverändert aktiv. --> (`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>
<div class="signal" id="agent-bias">◌ —</div>
<div class="agent-head" id="agent-head"></div>
<div class="agent-text" id="agent-reason"></div>
<ul class="risks" id="agent-risks"></ul>
</section>
<!-- Trailing (Dashboard-Kachel ausgeblendet 2026-07-22, User-Vorgabe; Backend/ <!-- Trailing (Dashboard-Kachel ausgeblendet 2026-07-22, User-Vorgabe; Backend/
Logik unverändert aktiv, nur die Anzeige raus) --> Logik unverändert aktiv, nur die Anzeige raus) -->
@@ -179,6 +147,71 @@
</section> </section>
</main> </main>
<!-- ══ SIG LIVE — Module MIT Verdict-Gewicht (fließen in die Empfehlung ein) ══
Die Zuordnung ist am Code prüfbar: `engine._verdict` ruft `add(name, vote,
gewicht, …)`. Wer hier steht, hat ein Gewicht > 0 und verschiebt die
Bias-Nadel. ⚠ Gewicht heißt NICHT „belegt": der KI-Copilot ist gemessen
nicht robust prädiktiv, hat aber Stimmrecht — genau deshalb ist die
Trennung nach WIRKUNG und nicht nach Beleglage sinnvoll. -->
<section id="view-siglive" class="view hidden">
<div class="view-head">
<h2>SIG Live</h2>
<span class="view-note">Module mit Einfluss auf die Gesamtempfehlung</span>
</div>
<!-- KI-Agent — Verdict-Gewicht 1,0 bei gerichteter Aussage, 0 bei NEUTRAL -->
<section class="card wide" id="card-agent">
<h2>KI-Copilot <span class="ca-tf">Gewicht 1,0</span></h2>
<div class="signal" id="agent-bias">◌ —</div>
<div class="agent-head" id="agent-head"></div>
<div class="agent-text" id="agent-reason"></div>
<ul class="risks" id="agent-risks"></ul>
</section>
<!-- Chartmuster — Verdict-Gewicht `_PAT_W`=0,25 (User-Vorgabe „5 %" 2026-08-01);
`forming` zählt halb. Deshalb LIVE, nicht Anzeige. -->
<section class="card wide" id="card-patterns">
<h2>Chartmuster <span class="pt-tf">M30 · Gewicht 0,25</span></h2>
<div class="pt-list" id="pt-list"><span class="dim"></span></div>
</section>
</section>
<!-- ══ SIG ANZEIGE — gemessen OHNE Einfluss auf die Empfehlung ══════════════
Kein Verdict-Gewicht, kein Trade-Trigger. Beide Module wurden als Signal
gemessen und verworfen; sie bleiben als Kontext, nicht als Entscheidung. -->
<section id="view-siganzeige" class="view hidden">
<div class="view-head">
<h2>SIG Anzeige</h2>
<span class="view-note">reine Anzeige — gemessen ohne Einfluss</span>
</div>
<!-- Marktstruktur (M30) — Signalvariante gemessen verworfen
(backtest_structure.py + backtest_structure_tf.py: 24/24 Zellen negativ) -->
<section class="card wide" id="card-structure">
<h2>Marktstruktur <span class="ms-tf">M30 · nur Anzeige</span></h2>
<div class="ms-top">
<span class="ms-trend" id="ms-trend"></span>
<div class="ms-swings" id="ms-swings"></div>
</div>
<div class="ms-bos" id="ms-bos"></div>
<div class="ms-chan" id="ms-chan">
<div class="ms-chan-head"><span id="ms-chan-dir"></span>
<span class="ms-chan-note" id="ms-chan-note"></span></div>
<div class="ms-chan-track"><div class="ms-chan-fill" id="ms-chan-fill"></div>
<div class="ms-chan-dot" id="ms-chan-dot"></div></div>
<div class="ms-chan-scale"><span>Kanal unten</span><span>oben</span></div>
</div>
</section>
<!-- Kerzen-Anatomie (M5) — 3× als Signal gemessen und verworfen; die
Lehrbuch-Deutung ist invertiert, deshalb steht die GEMESSENE Lesart im
Hinweistext und die Kachel ist bewusst neutral gefärbt. -->
<section class="card wide" id="card-candles">
<h2>Kerzen-Anatomie <span class="ca-tf">M5 · nur Anzeige</span></h2>
<div class="ca-list" id="ca-list"><span class="dim"></span></div>
</section>
</section>
<!-- Logs --> <!-- Logs -->
<section id="view-logs" class="view hidden"> <section id="view-logs" class="view hidden">
<div class="view-head"> <div class="view-head">
@@ -289,6 +322,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=140"></script> <script src="app.js?v=141"></script>
</body> </body>
</html> </html>
+9 -2
View File
@@ -102,8 +102,15 @@ main{display:grid;grid-template-columns:1fr 1fr;gap:11px;padding:11px}
ein Grid mit eigenem padding, `#view-stats` ist eine schlichte <section> — ohne ein Grid mit eigenem padding, `#view-stats` ist eine schlichte <section> — ohne
diese Regel klebten die verschobenen Karten randlos aneinander und `.wide` diese Regel klebten die verschobenen Karten randlos aneinander und `.wide`
(grid-column) liefe ins Leere. */ (grid-column) liefe ins Leere. */
#view-stats > .card{margin:11px 10px} #view-stats > .card,
#view-stats > .card:last-child{margin-bottom:74px} /* Platz für die fixe Leiste */ #view-siglive > .card,
#view-siganzeige > .card{margin:11px 10px}
#view-stats > .card:last-child,
#view-siglive > .card:last-child,
#view-siganzeige > .card:last-child{margin-bottom:74px} /* Platz für die fixe Leiste */
/* Untertitel in der View-Kopfzeile: sagt in einem Halbsatz, wonach der Tab
sortiert ist — ohne ihn ist „SIG Live" vs. „SIG Anzeige" nicht selbsterklärend. */
.view-note{font-size:12px;color:var(--dim);margin-left:auto}
.card h2{margin:0 0 9px;font-size:14px;letter-spacing:1.5px; .card h2{margin:0 0 9px;font-size:14px;letter-spacing:1.5px;
text-transform:uppercase;color:var(--dim);font-weight:600} text-transform:uppercase;color:var(--dim);font-weight:600}