# Gesamtempfehlung (Verdict-Panel) Grafischer Empfehlungsbereich ganz oben im Mobile-Dashboard (`web/`), der die Module zu **einer** Aussage zusammenfasst. ## Wer berechnet was - **Backend (`core/engine.py` → `_verdict`)** baut die Aggregation und legt sie als `verdict` in den Snapshot (`/api/snapshot`, `/ws`). Eine Quelle der Wahrheit — das Frontend rendert nur. - **Frontend (`web/app.js` → `renderVerdict`)** zeichnet Ring, Bias-Balken und Modul-Chips. Markup in `web/index.html` (`#card-verdict`), Stil in `web/style.css` (`.vd-*`). ## Logik **Headline = die validierte Welle** (`wave_signal`) — das einzige Modul mit per Backtest belegtem Edge. Sie bestimmt LONG/SHORT/WARTEN und die Order-Freigabe. Die übrigen Module bilden nur einen **gewichteten Konsens** (Anzeige, kein Eingriff in die Order-Logik). Votes je Modul: `+1` LONG · `−1` SHORT · `0` neutral. Gewichte: | Modul | Gewicht | Quelle | |-------|---------|--------| | Welle | **3,0** | `wave_signal.signal` (validierter Edge) | | M30 | 1,5 | `wave.htf_trend` (EMA12/50 der M30 — exakt das Signal, das die Welle nutzt) | | H1 | 1,5 | `wave.h1_trend` (EMA12/50 der H1) | | KI-Copilot | 1,0 *(nur mit Bias)* | `agent.advisory.bias` — ohne advisory/Bias **Gewicht 0** | | Elliott/FVG | 1,0 *(nur mit Ziel)* | Richtung zum `elliott.target` — ohne Ziel **Gewicht 0** | | Squeeze | 2,0 *(nur `active`)* | `wave.squeeze` — armed/keine Kompression **Gewicht 0** | (TradersUnion wurde 2026-07-06 aus dem Konsens entfernt — nur noch Anzeige.) ``` bias = Σ(gewicht · vote) / Σ(gewicht) → −1 … +1 ``` ⚠ **Stimmberechtigt sind nur Module mit Aussage** (Fix 2026-07-15): Module ohne anwendbares Signal (Squeeze ohne Ausbruch, Elliott ohne Ziel, KI aus) bekommen Gewicht 0 und stehen NICHT im Nenner — vorher dämpfte z. B. das fast immer neutrale Squeeze-Gewicht (2,0) die Nadel dauerhaft um ~×0,8 Richtung Mitte. „Flach" bei Welle/M30/H1 bleibt dagegen eine ECHTE Neutral-Stimme (mit Gewicht). `bias` steuert die **Nadel** im Balken (−1 = ganz SHORT/links, +1 = ganz LONG/rechts: `left% = (bias+1)/2·100`). `agree/total` = wie viele der **anderen** stimmberechtigten Module (ohne die Welle selbst — die zählte sich bis 2026-07-15 mit) die Headline-Richtung teilen. Der **Konfidenz-Ring** zeigt `wave.conf_pct` als conic-gradient in Richtungsfarbe. > ⚠ Wichtig: Für M30/H1 werden die **EMA12/50-Signale der Welle** genutzt > (`htf_trend`/`h1_trend`), NICHT das Regressions-Winkelmaß `market.angles` — > die beiden können sich widersprechen, das Panel muss zur Empfehlung passen. ## Snapshot-Feld `verdict` ```json { "headline": "SHORT", "conf": 90, "bias": -1.0, "agree": 3, "total": 3, "votes": [{"name": "Welle", "vote": -1, "weight": 3.0, "detail": "SHORT · 90%"}, …] } ``` ## Pflege Neues Modul ins Panel → Vote/Gewicht in `_verdict` ergänzen; das Frontend rendert `votes` generisch. Bei JS/CSS-Änderung Asset-Version `v=N` in `index.html` hochzählen. Siehe `CLAUDE.md`.