Headless FastAPI-Backend (server.py + core/engine.py) mit Mobile-PWA (web/), Strategie-/Backtest-Suite und Doku. Secrets, DB, Logs und Laufzeit-State sind via .gitignore ausgeschlossen; Config-Vorlage: oil_widget_config.ini.example. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
69 lines
2.9 KiB
Markdown
69 lines
2.9 KiB
Markdown
# 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`.
|