Konsens-Zeile korrigiert: falscher Bezug + Nenner passte nicht zu den Chips

User-Fund: "Modul-Konsens: stark LONG · 4/4 Module fuer WARTEN" - dabei sind
9 Module sichtbar. Zwei echte Fehler.

(a) FALSCHER BEZUG: der Text lautete "... Module fuer ${sig}" mit der
HEADLINE als Bezug. Seit dem ref-Fix vom 30.07. zaehlt `agree` bei WARTEN
aber die Uebereinstimmung mit der BIAS-Richtung - deshalb stand dort
"stark LONG ... fuer WARTEN". Die Richtung kommt jetzt als verdict.ref_dir
vom Backend, statt im Frontend aus `bias` nachgebaut zu werden (dort galt
ein +-0,05-Totband, im Backend `bias > 0` - die Nachbildung waere am Rand
auseinandergelaufen; dieselbe Sorte Divergenz wie die fuenf
Deployment-Drift-Faelle desselben Tages).

(b) ANDERER NENNER ALS DIE CHIPS: `total` zaehlt nur Module MIT Aussage
(Gewicht>0, ohne die Welle). Nach den Gewichts-Fixes des Tages schweigen
deutlich mehr Module -> "4/4" bei 9 sichtbaren Chips. Neu ist
verdict.silent (Module mit Gewicht 0) dabei, sodass die Summe aufgeht.

Live verifiziert: "Modul-Konsens: leicht LONG · 3 von 5 stimmberechtigten
fuer LONG (4 ohne Aussage)" - 5 + 4 = 9. Sonderfall "kein Modul mit klarer
Aussage" abgedeckt. v=125.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-31 15:37:37 +02:00
co-authored by Claude Opus 5
parent a1f471f163
commit df092674cb
4 changed files with 52 additions and 7 deletions
+16 -1
View File
@@ -1417,6 +1417,21 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
sobald dort jemand Logging ergänzt (Phantom-Fehler im ~5-s-Takt). sobald dort jemand Logging ergänzt (Phantom-Fehler im ~5-s-Takt).
**Sauber:** Frontend↔Backend (0 verwaiste Element-IDs), alle übrigen **Sauber:** Frontend↔Backend (0 verwaiste Element-IDs), alle übrigen
Verdict-Gewichte, alle anderen Config-Schlüssel. Verdict-Gewichte, alle anderen Config-Schlüssel.
⚠ **KONSENS-ZEILE korrigiert (2026-07-31, User-Fund „4/4 Module — dabei haben wir
doch 9"):** In `vd-consensus` steckten ZWEI Fehler.
**(a) Falscher Bezug:** der Text lautete `… Module für ${sig}` mit der HEADLINE als
Bezug. Seit dem `ref`-Fix vom 30.07. zählt `agree` bei WARTEN aber die Übereinstimmung
mit der **Bias-Richtung** — deshalb stand real dort „stark LONG · 4/4 Module für
**WARTEN**". Die Richtung kommt jetzt als **`verdict.ref_dir`** vom Backend, statt im
Frontend aus `bias` nachgebaut zu werden (dort galt ein ±0,05-Totband, im Backend
`bias > 0` — die Nachbildung wäre am Rand auseinandergelaufen; dieselbe Sorte
Divergenz wie die fünf Deployment-Drift-Fälle desselben Tages).
**(b) Anderer Nenner als die sichtbaren Chips:** `total` zählt nur Module MIT Aussage
(Gewicht > 0, ohne die Welle). Nach den Gewichts-Fixes des Tages schweigen deutlich
mehr Module → „4/4" bei 9 sichtbaren Chips. Neu ist **`verdict.silent`** (Module mit
Gewicht 0) dabei, sodass die Summe aufgeht. Live: „**3 von 5 stimmberechtigten für
LONG (4 ohne Aussage)**" — 5 + 4 = 9 ✅. Bei gar keiner Aussage: „kein Modul mit
klarer Aussage". v=125.
**Offen (dokumentiert, nicht geändert):** **Offen (dokumentiert, nicht geändert):**
(0) **Wellen-Konfidenz aus `_draw_levels` speisen** statt aus dem Misch-Set — würde (0) **Wellen-Konfidenz aus `_draw_levels` speisen** statt aus dem Misch-Set — würde
den 12-Abzug tatsächlich auslösen, also Konfidenz senken und das 55%-Gate den 12-Abzug tatsächlich auslösen, also Konfidenz senken und das 55%-Gate
@@ -1951,7 +1966,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=124** (in `web/index.html` hochzählen, siehe Workflows). - Asset-Version aktuell **v=125** (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`
+12
View File
@@ -2390,6 +2390,18 @@ class TradingEngine:
"headline": wsig, "conf": (wave_signal or {}).get("conf_pct", 0), "headline": wsig, "conf": (wave_signal or {}).get("conf_pct", 0),
"tf": (wave_snap or {}).get("tf"), # Zeitebene, für die die Empfehlung gilt "tf": (wave_snap or {}).get("tf"), # Zeitebene, für die die Empfehlung gilt
"bias": round(bias, 3), "agree": agree, "total": len(others), "bias": round(bias, 3), "agree": agree, "total": len(others),
# ⚠ `ref_dir` = WORAUF sich `agree` bezieht (Fix 2026-07-31). Bei WARTEN
# ist das NICHT die Headline, sondern die Bias-Richtung — das Frontend
# beschriftete es vorher mit der Headline und schrieb dadurch
# „stark LONG · 4/4 Module für WARTEN". Die Richtung kommt jetzt VON HIER,
# statt im Frontend aus `bias` nachgebaut zu werden (dort galt ein
# ±0,05-Totband, hier `bias > 0` — die Nachbildung wäre am Rand
# auseinandergelaufen; genau die Sorte Divergenz, die heute mehrfach
# aufgefallen ist).
"ref_dir": "LONG" if ref > 0 else "SHORT" if ref < 0 else None,
# Wie viele Module HABEN gerade keine Aussage (Gewicht 0)? Ohne diese Zahl
# las sich „4/4" widersprüchlich zu den 9 sichtbaren Chips.
"silent": sum(1 for v in votes if not v["weight"]),
"votes": votes, "votes": votes,
} }
+22 -4
View File
@@ -121,10 +121,28 @@ function renderVerdict(v, snap) {
const tag = cr < 0.20 ? "✅ günstig" : cr <= 0.32 ? "· normal" : "⚠ teuer"; const tag = cr < 0.20 ? "✅ günstig" : cr <= 0.32 ? "· normal" : "⚠ teuer";
costTxt = ` · Kosten ${fmt(cr, 2)}×ATR ${tag}`; costTxt = ` · Kosten ${fmt(cr, 2)}×ATR ${tag}`;
} }
$("vd-consensus").textContent = // ⚠ Konsens-Zeile korrigiert (2026-07-31). Zwei Fehler waren drin:
(sig === "—" ? "keine Daten" // (1) „… Module für ${sig}" nahm die HEADLINE als Bezug. Seit dem Fix vom 30.07.
: `Modul-Konsens: ${strength} ${dir} · ${agree}/${total} Module für ${sig}`) // zählt `agree` bei WARTEN aber die Übereinstimmung mit der BIAS-Richtung →
+ costTxt; // es stand „stark LONG · 4/4 Module für WARTEN". Die Richtung kommt jetzt als
// `ref_dir` vom Backend, statt hier aus `bias` nachgebaut zu werden.
// (2) `total` zählt nur Module MIT Aussage (Gewicht>0, ohne die Welle) — nach den
// Gewichts-Fixes schweigen mehr Module, während 9 Chips sichtbar bleiben.
// „4/4" las sich dadurch widersprüchlich. Jetzt steht dabei, wie viele
// Module gerade nichts sagen.
const refDir = v.ref_dir || null;
const silent = typeof v.silent === "number" ? v.silent : null;
let consensus;
if (sig === "—") {
consensus = "keine Daten";
} else if (!refDir || !total) {
consensus = `Modul-Konsens: ${strength} ${dir} · kein Modul mit klarer Aussage`;
} else {
consensus = `Modul-Konsens: ${strength} ${dir} · ${agree} von ${total} `
+ `stimmberechtigten für ${refDir}`
+ (silent ? ` (${silent} ohne Aussage)` : "");
}
$("vd-consensus").textContent = consensus + costTxt;
$("vd-needle").style.left = ((bias + 1) / 2 * 100).toFixed(1) + "%"; $("vd-needle").style.left = ((bias + 1) / 2 * 100).toFixed(1) + "%";
// Modul-Chips // Modul-Chips
+2 -2
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=124"> <link rel="stylesheet" href="style.css?v=125">
</head> </head>
<body> <body>
<!-- Modul-Menü (ganz oben) --> <!-- Modul-Menü (ganz oben) -->
@@ -244,6 +244,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=124"></script> <script src="app.js?v=125"></script>
</body> </body>
</html> </html>