Dashboard-Zeile fuer Slot 2 + Doku des Zwei-Slot-Umbaus

Die vom Breakout-Trader gehaltene Position ist jetzt sichtbar (#brk-pos in der
Breakout-Karte): Richtung, Lots, Einstieg, P&L - und vor allem der
Trailing-Zustand.

⚠ Der Trailing-Hinweis ist der wichtigste Teil der Zeile: steht er auf
"⚠ TRAILING AUS - nur Broker-SL!", laeuft der Trade in der gemessen
DURCHGEFALLENEN SL-only-Variante (backtest_brk_slonly.py: alle zehn
Konfidenzintervalle enthalten die Null, Trefferquote faellt 40 -> 21 %). Ohne
diese Anzeige waere das im Betrieb nicht bemerkbar - genau Deployment-Drift
Fall 8 (nicht die Strategie driftet, sondern ihre Beobachtbarkeit).

Richtung wird aus SL/TP abgeleitet statt ein weiteres Snapshot-Feld zu bauen -
place_stop setzt immer einen SL. Damit bleibt es eine reine Frontend-Aenderung
(v=185), kein Neustart noetig, die offene Position unberuehrt.

Verifiziert: v=185 wird ausgeliefert, div 85/85 ausgeglichen, keine doppelten
IDs, keine verwaisten JS-Referenzen, node --check gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-19 20:12:26 +02:00
co-authored by Claude Opus 5
parent a9a6c487d2
commit 5593f270cc
3 changed files with 85 additions and 3 deletions
+24
View File
@@ -169,6 +169,30 @@ function beepRecommendation(sig, isNew) {
function renderBrk(d) {
const box = $streng("card-brk");
if (!box) return;
// --- Slot 2: die vom Breakout-Trader gehaltene Position -------------------
// Ohne diese Zeile waere eine offene BRK-Position im Dashboard unsichtbar --
// genau Deployment-Drift Fall 8 (dort driftete nicht die Strategie, sondern
// ihre Beobachtbarkeit) in neuer Form.
const bp = d.position_brk, bpEl = $streng("brk-pos");
if (bpEl) {
if (!bp) {
bpEl.textContent = "keine — Slot frei";
bpEl.className = "";
} else {
// Richtung aus SL/TP ableiten: place_stop setzt IMMER einen SL.
const e = Number(bp.entry) || 0;
const lg = (bp.sl && e) ? (bp.sl < e) : (bp.tp ? bp.tp > e : null);
const pfeil = lg === null ? "" : (lg ? "▲ LONG" : "▼ SHORT");
const pnl = Number(bp.pnl) || 0;
const t = [`${pfeil} ${bp.lots ?? "?"} @ ${e ? e.toFixed(3) : "?"}`,
`${pnl >= 0 ? "+" : ""}${pnl.toFixed(2)}`];
// ⚠ Der wichtigste Teil der Zeile: ohne Trailing laeuft der Trade in der
// gemessen durchgefallenen SL-only-Variante.
t.push(bp.trail ? "Trailing an" : "⚠ TRAILING AUS — nur Broker-SL!");
bpEl.textContent = t.join(" · ");
bpEl.className = bp.trail ? (pnl >= 0 ? "pos" : "neg") : "neg";
}
}
// Einsatz je Pfad einspielen. ⚠ NICHT, solange das Feld den Fokus hat --
// sonst ueberschreibt der 1-s-Snapshot die laufende Eingabe (dieselbe Falle
// wie beim Mindestgewinn-Feld).