Stufe 1: voller Entscheidungskontext beim Einstieg + Karte "Manuelle Trades"
Frage: kann der Bot aus den manuellen Trades lernen? Vorpruefung: noch NICHT.
1) Die entscheidenden Merkmale wurden nie gespeichert - beim Einstieg nur 5
Felder, davon ai_sentiment in 1,4 % und news_score in 34 % befuellt.
2) Das naive Lernziel ("wann steigt er ein") braucht unbeschriftete Negative;
brauchbar ist nur "welche Einstiege liefen gut" (Labels ueber P&L).
3) Die scheinbaren Muster sind Einzeltage: Stunde 13:00 zeigt +478 EUR ueber
n=69, davon +382 EUR (80 %) aus den fuenf Trades des 04.08.
Gebaut wurde Stufe 1 - reine Telemetrie, kein Verhalten:
- trades um 16 ctx_*-Spalten erweitert (DB-Backup .bak-2026-08-04, 1.148 Zeilen
unveraendert): p_break_target/-stop, dist_res_atr/dist_sup_atr, structure,
squeeze, htf_trend/h1_trend, spread_atr, session, block_reason, conf_pct,
atr_m5, bias, cone_pos, hour
- log_trade_open haengt die Spalten dynamisch an und ignoriert unbekannte
Schluessel -> aeltere DB ohne Migration laeuft weiter (fail-open)
- Kette: engine._run_analysis -> trader.set_open_context(ctx=) -> log_trade_open
Fallstrick beim Bau: wave_snap existiert in _run_analysis NICHT (nur in
snapshot()). Der erste Entwurf haette einen NameError erzeugt, den das umgebende
except still geschluckt haette - der Kontext waere dauerhaft leer geblieben ohne
dass es auffaellt. Jetzt self.wave.snapshot(); vd zusaetzlich per locals()-Guard.
Verifiziert auf einer DB-KOPIE: alle 16 Spalten korrekt geschrieben, unbekannter
Schluessel ignoriert, Basisfelder unberuehrt. Snapshot liefert manual_stats.
Dashboard-Karte "Manuelle Trades" (#card-manual, v=134): heute / 30 Tage /
gesamt / Bot-Vergleich plus Split mit vs ohne Signal-Deckung. Backend
history.manual_stats(30) mit ~120-s-Cache wie _alignment_cached. Bewusst neutral
gefaerbt und deskriptiv; eine Reifegrad-Zeile nennt die ctx-Abdeckung (heute
0 %), damit die Karte nicht ueberschaetzt wird.
Stufe 2 NICHT gebaut: erst bei ausreichender ctx-Abdeckung messen, was Gewinner
von Verlierern unterscheidet (Fit H1, validiert H2, AUC + Kalibrierung). Ergebnis
waere ein Hinweis im Order-Dialog, ausdruecklich KEIN Auto-Entry.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
7432be0e8c
commit
da7d8f5b90
+34
@@ -226,6 +226,39 @@ function renderGaps(g, m) {
|
||||
}).join("");
|
||||
}
|
||||
|
||||
// Manuelle Trades (2026-08-04) — DESKRIPTIV. Zeigt die eigene Historie, macht
|
||||
// keine Vorhersage: der volle Entscheidungskontext wird erst seit dem 04.08.
|
||||
// mitgeschrieben, vorher wären Aussagen daraus Rauschen. Die Reifegrad-Zeile
|
||||
// nennt die Abdeckung ehrlich, damit die Karte nicht überschätzt wird.
|
||||
function renderManual(m) {
|
||||
const grid = $("mt-grid"); if (!grid) return; // null-sicher (Cache-Regel)
|
||||
if (!m || !m.gesamt) { grid.innerHTML = '<span class="dim">—</span>'; return; }
|
||||
const cls = v => v > 0 ? "up" : v < 0 ? "down" : "";
|
||||
const box = (lbl, b) => !b || !b.n ? "" :
|
||||
`<div class="mt-box"><div class="mt-lbl">${lbl}</div>`
|
||||
+ `<div class="mt-val ${cls(b.sum)}">${b.sum >= 0 ? "+" : ""}${fmt(b.sum, 2)}</div>`
|
||||
+ `<div class="mt-sub2">${b.n} Trades · ${fmt(b.wr, 1)} % · Ø ${b.avg >= 0 ? "+" : ""}${fmt(b.avg, 2)}</div></div>`;
|
||||
grid.innerHTML = box("heute", m.heute) + box(`${m.tage} Tage`, m.fenster)
|
||||
+ box("gesamt", m.gesamt) + box("Bot (Vergleich)", m.bot);
|
||||
|
||||
// Signal-Deckung: die dokumentierte Kern-Frage — trägt Handeln OHNE Empfehlung?
|
||||
const sp = $("mt-split");
|
||||
if (sp) {
|
||||
const z = (lbl, b) => !b || !b.n ? "" :
|
||||
`<span class="mt-chip"><b>${lbl}</b> ${b.n}× · ${fmt(b.wr, 1)} % · `
|
||||
+ `<span class="${cls(b.sum)}">${b.sum >= 0 ? "+" : ""}${fmt(b.sum, 2)}</span></span>`;
|
||||
sp.innerHTML = z("mit Signal", m.mit_signal) + z("ohne Signal", m.ohne_signal);
|
||||
}
|
||||
const nt = $("mt-note");
|
||||
if (nt) {
|
||||
const c = m.ctx_abdeckung || {};
|
||||
nt.textContent = `Entscheidungs-Kontext gespeichert für ${c.mit_ctx || 0} von `
|
||||
+ `${c.n || 0} Trades (${fmt(c.pct || 0, 1)} %). Erst ab ausreichender `
|
||||
+ `Abdeckung lässt sich messen, WORAN gute von schlechten Einstiegen zu `
|
||||
+ `unterscheiden sind — bis dahin ist diese Karte reine Beschreibung.`;
|
||||
}
|
||||
}
|
||||
|
||||
// Marktstruktur (M30) — reine Anzeige (HH/HL/LH/LL, BOS, Regressionskanal).
|
||||
function renderStructure(s) {
|
||||
s = s || {};
|
||||
@@ -571,6 +604,7 @@ function render(d) {
|
||||
renderCandles(d.candle_anat);
|
||||
renderCone(d.cone);
|
||||
renderStructure(d.structure);
|
||||
renderManual(d.manual_stats);
|
||||
renderStatsCompact(d.stats_compact, d.market);
|
||||
renderGaps(d.gaps, d.market);
|
||||
|
||||
|
||||
+12
-2
@@ -6,7 +6,7 @@
|
||||
<meta name="theme-color" content="#0d1117">
|
||||
<title>Oil · MT5</title>
|
||||
<link rel="manifest" href="manifest.json">
|
||||
<link rel="stylesheet" href="style.css?v=133">
|
||||
<link rel="stylesheet" href="style.css?v=134">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Modul-Menü (ganz oben) -->
|
||||
@@ -124,6 +124,16 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Manuelle Trades — deskriptiv (2026-08-04). Zeigt die EIGENE Historie,
|
||||
rechnet nichts hoch. Der volle Entscheidungskontext (ctx_*) wird erst
|
||||
seit dem 04.08. mitgeschrieben; die Reifegrad-Zeile macht das sichtbar. -->
|
||||
<section class="card wide" id="card-manual">
|
||||
<h2>Manuelle Trades <span class="mt-sub">deine Historie · 30 Tage</span></h2>
|
||||
<div class="mt-grid" id="mt-grid"></div>
|
||||
<div class="mt-split" id="mt-split"></div>
|
||||
<div class="mt-note dim" id="mt-note"></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>
|
||||
@@ -249,6 +259,6 @@
|
||||
<div id="toast" class="toast hidden"></div>
|
||||
|
||||
<script src="lightweight-charts.standalone.production.js?v=114"></script>
|
||||
<script src="app.js?v=133"></script>
|
||||
<script src="app.js?v=134"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -489,3 +489,26 @@ main{padding-bottom:74px} /* Platz für die fixe Leiste */
|
||||
gefaerbt als der Broker-Kurs, damit man ihn nicht verwechselt. */
|
||||
#hdr-price.hl-price{color:var(--accent)}
|
||||
#hdr-price-lbl{letter-spacing:.3px}
|
||||
|
||||
/* ── Manuelle Trades (2026-08-04) ─────────────────────────────────────────
|
||||
Bewusst NEUTRAL gehalten: die Karte beschreibt die eigene Historie und
|
||||
sagt nichts voraus. Farbe nur am Vorzeichen der Summe, keine Ampel. */
|
||||
#card-manual .mt-sub { font-size: 13px; color: var(--dim); font-weight: 400; }
|
||||
.mt-grid {
|
||||
display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
|
||||
gap: 10px; margin-bottom: 10px;
|
||||
}
|
||||
.mt-box {
|
||||
background: var(--surface-2); border: 1px solid var(--border);
|
||||
border-radius: var(--r-sm); padding: 9px 11px;
|
||||
}
|
||||
.mt-lbl { font-size: 13px; color: var(--dim); margin-bottom: 3px; }
|
||||
.mt-val { font-family: var(--mono); font-size: 21px; font-weight: 600; }
|
||||
.mt-sub2 { font-size: 12px; color: var(--dim); font-family: var(--mono); margin-top: 2px; }
|
||||
.mt-split { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 8px; }
|
||||
.mt-chip {
|
||||
background: var(--surface-2); border: 1px solid var(--line);
|
||||
border-radius: var(--r-sm); padding: 5px 10px;
|
||||
font-size: 13px; font-family: var(--mono);
|
||||
}
|
||||
.mt-note { font-size: 12px; line-height: 1.45; }
|
||||
|
||||
Reference in New Issue
Block a user