M15-Karte "Setup-Bereitschaft" gebaut - Ersatz der Gesamtempfehlung (v=153)
Nach drei negativen M15-Messungen (Squeeze-Einstieg, VWAP-Baender, Exit-ATR) steht fest: auf M15 traegt keine Richtungsquelle. Gebaut ist deshalb bewusst KEINE Empfehlung, sondern eine sequenzielle Gate-Kette: [1 HTF-BIAS M30/H1] -> [2 KOSTEN Spread/ATR_M15] -> [3 LEVEL & KEGEL] -> Order AM LEVEL Der Unterschied zur alten Karte ist grundsaetzlich: dort wurden Stimmen zu einem Bias VERRECHNET (gemessen 48-51 % Treffer), hier muss jedes Gate EINZELN passieren. Ein gefallenes Gate laesst sich nicht durch ein anderes ausgleichen. Nur belegte Bausteine: HTF-Trend (einziger robuster Filter, Edge x2), Kosten (M15 gemessen 0,104 gegen M5 0,193), naechstes stehendes Level + P(break), Kegel (out-of-sample kalibriert, 80-%-Band trifft 77 %), Veto (-6,60 EUR/Lot). Status-Banner: SETUP BEREIT / WARTEN AUF LEVEL / KEIN TRADE. Es bestaetigt ausdruecklich auch das NICHT-Handeln - die gemessene Kern-Leckage sind diskretionaere Abweichungen. Die Order-Buttons werden BEWUSST NICHT gesperrt (gegen den Vorschlag "ausgrauen"): hartes Blockieren wurde im Projekt verworfen, und User-Uebersteuerungen liefen gemessen 68 % WR. Umsetzung: engine._m15_setup() setzt nur zusammen, was der Snapshot ohnehin erzeugt. Neu gerechnet wird allein das M15-Kosten-Verhaeltnis und P(break) fuer das naechste Level. Dafuer veroeffentlicht wave_rec jetzt tf_atr (ADDITIV) - der ATR je Zeitebene wurde im Turn-Fetch laengst berechnet, war aber nirgends abrufbar. P(break)-Merkmale bleiben auf M5 (Modell ist darauf trainiert, Fix 2026-07-13). Mit 5 Szenarien getestet (alles passt, Bias uneinig, Kosten teuer, Level zu weit, Kaltstart ohne ATR_M15 -> kein Absturz), live verifiziert ueber deploy.py --feld m15_setup. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
010007f7a3
commit
44955bf70a
+79
@@ -142,6 +142,84 @@ function beepRecommendation(sig, isNew) {
|
||||
// · HL-Kontext (`#hl-note`) — schreibt in die Meldungen-Karte, nicht hierher
|
||||
// Entfallen ist die Block-Grund-Zeile (`#vd-blocks`).
|
||||
// ══════════════════════════════════════════════════════════════════════════
|
||||
// ══════════════════════════════════════════════════════════════════════════
|
||||
// M15 SETUP-BEREITSCHAFT — sequenzielle GATE-KETTE, keine Score-Aggregation.
|
||||
// [HTF-BIAS] → [KOSTEN] → [LEVEL & KEGEL] → AUSFÜHRUNG NUR AM LEVEL
|
||||
// ⚠ Bewusst KEINE Richtungsaussage. Auf M15 trägt gemessen keine (Squeeze
|
||||
// n=33/Nachbarn kippen, VWAP-Bänder ohne Edge). Die Karte sagt, ob die
|
||||
// BEDINGUNGEN stimmen — der Auslöser bleibt beim Menschen.
|
||||
// ⚠ Der Unterschied zur entfernten Gesamtempfehlung ist grundsätzlich: dort
|
||||
// wurden Stimmen zu einem Bias VERRECHNET (gemessen 48–51 % Treffer), hier
|
||||
// muss jedes Gate EINZELN passieren. Ein Gate, das fällt, lässt sich nicht
|
||||
// durch ein anderes ausgleichen.
|
||||
// ══════════════════════════════════════════════════════════════════════════
|
||||
function renderM15(s) {
|
||||
const st = $("m15-status");
|
||||
if (!s) { st.className = "m15-status"; st.textContent = "— keine Daten"; return; }
|
||||
const f = (v, d = 2) => (v == null ? "—" : (+v).toFixed(d));
|
||||
|
||||
// ── Gate 1: HTF-Bias (der einzige belegte Filter, Edge ×2) ───────────
|
||||
const b = s.bias || {};
|
||||
const bOk = !!b.einig;
|
||||
$("m15-bias").className = "m15-item " + (bOk ? "ok" : "fail");
|
||||
$("m15-bias").textContent = bOk
|
||||
? `① Bias ${b.richtung === "LONG" ? "▲ LONG" : "▼ SHORT"} · M30+H1 einig`
|
||||
: `① Bias unklar · M30 ${b.m30 || "—"} / H1 ${b.h1 || "—"}`;
|
||||
|
||||
// ── Gate 2: Kosten auf M15 ───────────────────────────────────────────
|
||||
const k = s.kosten || {};
|
||||
const kOk = k.stufe === "guenstig" || k.stufe === "normal";
|
||||
$("m15-kosten").className = "m15-item " + (k.ratio == null ? "" : kOk ? "ok" : "fail");
|
||||
$("m15-kosten").textContent = k.ratio == null
|
||||
? "② Kosten —"
|
||||
: `② Kosten ${f(k.ratio, 3)}×ATR · ${
|
||||
k.stufe === "guenstig" ? "günstig" : k.stufe === "normal" ? "normal" : "TEUER"}`;
|
||||
|
||||
// ── Gate 3: Level in Reichweite ──────────────────────────────────────
|
||||
const z = (s.zonen || []);
|
||||
const nah = z.filter(x => x.gap_atr15 != null && x.gap_atr15 <= 0.5);
|
||||
const zOk = nah.length > 0;
|
||||
$("m15-zone").className = "m15-item " + (z.length ? (zOk ? "ok" : "warn") : "");
|
||||
$("m15-zone").textContent = z.length
|
||||
? "③ " + z.map(x => `${x.seite === "res" ? "Widerstand" : "Support"} ${f(x.level, 3)}`
|
||||
+ ` (${f(x.gap_atr15)}×ATR, Bruch ${x.p_break} %)`).join(" · ")
|
||||
: "③ kein Level in Sicht";
|
||||
|
||||
// ── Reichweite (Kegel) — sagt WIE WEIT, nicht wohin ──────────────────
|
||||
const r = s.reichweite || [];
|
||||
$("m15-reich").className = "m15-item";
|
||||
$("m15-reich").textContent = r.length
|
||||
? "④ erwartete Spanne · " + r.map(x => `${x.minutes}′ ${f(x.lo, 2)}–${f(x.hi, 2)}`).join(" · ")
|
||||
: "④ erwartete Spanne —";
|
||||
|
||||
// ── Veto: die eigene Bilanz, JE LOT ──────────────────────────────────
|
||||
const v = s.veto || {};
|
||||
const g = v.against || {};
|
||||
$("m15-veto").className = "m15-item " + (g.n >= 5 ? "warn" : "");
|
||||
$("m15-veto").textContent = g.n >= 5
|
||||
? `⑤ gegen das Signal: ${g.n} Trades, ${f(g.pnl_lot, 2)} € je Lot`
|
||||
: "⑤ Veto: noch zu wenige Trades";
|
||||
|
||||
// ── Status: die Kette wird der Reihe nach ausgewertet ────────────────
|
||||
let cls, txt;
|
||||
if (!bOk) { cls = "rot"; txt = "🔴 KEIN TRADE · Bias unklar (M30/H1 uneinig)"; }
|
||||
else if (!kOk && k.ratio != null) { cls = "rot"; txt = "🔴 KEIN TRADE · Kosten zu hoch"; }
|
||||
else if (!zOk) { cls = "gelb"; txt = "🟡 WARTEN AUF LEVEL · Bias und Kosten passen"; }
|
||||
else {
|
||||
const nn = nah[0];
|
||||
cls = "gruen";
|
||||
txt = `🟢 SETUP BEREIT @ ${f(nn.level, 3)} · ${b.richtung === "LONG" ? "▲" : "▼"} `
|
||||
+ `${b.richtung} · Order ANS LEVEL legen, nicht zum Markt`;
|
||||
}
|
||||
st.className = "m15-status " + cls;
|
||||
st.textContent = txt;
|
||||
st.title = "Sequenzielle Kette: Bias → Kosten → Level. Ein gefallenes Gate lässt "
|
||||
+ "sich NICHT durch ein anderes ausgleichen. ⚠ Die Order-Buttons bleiben "
|
||||
+ "bewusst bedienbar — hartes Blockieren wurde im Projekt verworfen, und "
|
||||
+ "Übersteuerungen des Users liefen gemessen 68 % Trefferquote.";
|
||||
}
|
||||
|
||||
|
||||
function renderKontext(snap) {
|
||||
// ── Selbst-Kalibrierung: die Empfehlung zeigt ihre eigene Trefferquote ──
|
||||
// ⚠ Gegen 50 % zu lesen, nicht gegen 0 — es ist eine Richtungsaussage.
|
||||
@@ -609,6 +687,7 @@ function render(d) {
|
||||
}
|
||||
|
||||
// ── Gesamtempfehlung (aggregiert) ───────
|
||||
renderM15(d.m15_setup);
|
||||
renderKontext(d);
|
||||
renderCircuitBreaker(d.circuit_breaker);
|
||||
renderPatterns(d.patterns);
|
||||
|
||||
+28
-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=152">
|
||||
<link rel="stylesheet" href="style.css?v=153">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Modul-Menü (ganz oben) -->
|
||||
@@ -87,6 +87,32 @@
|
||||
GEBLIEBEN sind drei Dinge, die dort nur geparkt waren und je eine
|
||||
eigene, unabhaengige Beleglage haben (s. CLAUDE.md).
|
||||
══════════════════════════════════════════════════════════════════ -->
|
||||
<!-- ══════════════════════════════════════════════════════════════════
|
||||
M15 SETUP-BEREITSCHAFT (2026-08-08) — Ersatz fuer die entfernte
|
||||
Gesamtempfehlung. ⚠ KEINE Richtungsaussage: auf M15 traegt gemessen
|
||||
KEINE (Squeeze n=33/Nachbarn kippen, VWAP-Baender ohne Edge, 24
|
||||
Signal-Eingriffe gescheitert). Gezeigt werden BEDINGUNGEN nach dem
|
||||
Schema Bias -> Zone -> Reichweite -> Veto; den Ausloeser gibt der
|
||||
Mensch, dessen Auswahl-Vorteil unabhaengig belegt ist.
|
||||
══════════════════════════════════════════════════════════════════ -->
|
||||
<section class="card wide" id="card-m15">
|
||||
<h2 title="Setup-Bereitschaft auf M15. Zeigt BEDINGUNGEN, keine Richtungsprognose - auf M15 traegt gemessen kein Richtungssignal. Der Ausloeser bleibt beim Menschen.">M15 · Setup-Bereitschaft</h2>
|
||||
<!-- Status-Banner: die wichtigste Zeile. Sie bestaetigt ausdruecklich
|
||||
auch das NICHT-Handeln - die gemessene Kern-Leckage sind
|
||||
diskretionaere Abweichungen, nicht fehlende Gelegenheiten.
|
||||
⚠ Die Order-Buttons werden BEWUSST NICHT gesperrt: hartes Blockieren
|
||||
wurde im Projekt verworfen, und User-Uebersteuerungen liefen
|
||||
gemessen 68 % WR. Sichtbar machen, nicht bevormunden. -->
|
||||
<div class="m15-status" id="m15-status">—</div>
|
||||
<div class="m15-grid">
|
||||
<div class="m15-item" id="m15-bias" title="Uebergeordneter Trend M30 + H1. Der EINZIGE belegte Filter: gegen den HTF zu handeln halbiert den Edge (gemessen ×2).">—</div>
|
||||
<div class="m15-item" id="m15-kosten" title="Spread geteilt durch ATR_M15. Auf M15 gemessen 0,104 gegen 0,193 auf M5 - hier ist die groebere Zeitebene echt im Vorteil. Schwellen 0,20 / 0,32 aus backtest_realcosts.py.">—</div>
|
||||
<div class="m15-item" id="m15-zone" title="Naechstes STEHENDES Level (M30-Pivots, dieselbe Quelle wie Chart und S/R-Close) mit Abstand und Durchbruchwahrscheinlichkeit. ⚠ P(break) ist live derzeit rund 7 Pp zu niedrig kalibriert.">—</div>
|
||||
<div class="m15-item" id="m15-reich" title="Erwartete Spanne aus core/cone.py - out-of-sample geprueft, die 80-%-Baender treffen real 77 %. Sagt WIE WEIT, nicht wohin.">—</div>
|
||||
<div class="m15-item" id="m15-veto" title="Deine eigene Bilanz mit/ohne/gegen Signal, je Lot gerechnet. Gegen das Signal zu handeln kostet gemessen 6,60 EUR je Lot - beidhaelftig robust.">—</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="card wide" id="card-kontext">
|
||||
<h2 title="Drei unabhaengige Kontext-Anzeigen. KEINE Empfehlung und keine Richtungsaussage - die Aggregation zu einer Gesamtempfehlung wurde am 08.08. entfernt.">Marktkontext</h2>
|
||||
<!-- Zeitebenen-Ampel (M1/M5/M15/M30/H1) -->
|
||||
@@ -314,6 +340,6 @@
|
||||
</div>
|
||||
<div id="toast" class="toast hidden"></div>
|
||||
|
||||
<script src="app.js?v=152"></script>
|
||||
<script src="app.js?v=153"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -489,3 +489,22 @@ main{padding-bottom:74px} /* Platz für die fixe Leiste */
|
||||
.hl-note{font-size:13px;color:var(--dim);font-family:var(--mono);
|
||||
padding:5px 0;border-top:1px solid var(--line);margin-top:5px}
|
||||
.hl-note.hidden{display:none}
|
||||
|
||||
/* ── M15 Setup-Bereitschaft (2026-08-08, Ersatz der Gesamtempfehlung) ──────
|
||||
Sequenzielle Gate-Kette statt Score-Aggregation. Das Status-Banner ist
|
||||
bewusst das groesste Element der Karte: die gemessene Kern-Leckage sind
|
||||
diskretionaere Abweichungen, nicht verpasste Gelegenheiten - deshalb muss
|
||||
auch das NICHT-Handeln ausdruecklich bestaetigt werden. */
|
||||
#card-m15{border-color:var(--accent)}
|
||||
.m15-status{font-size:19px;font-weight:700;letter-spacing:.3px;
|
||||
padding:10px 12px;border-radius:var(--r);margin-bottom:10px;
|
||||
background:var(--surface-2);border:1px solid var(--border);color:var(--dim)}
|
||||
.m15-status.gruen{color:var(--up);border-color:#1d5c2a;background:#0e2413}
|
||||
.m15-status.gelb {color:var(--accent);border-color:#4a3600;background:#241d05}
|
||||
.m15-status.rot {color:var(--down);border-color:#5c1a1a;background:#240f0f}
|
||||
.m15-grid{display:flex;flex-direction:column;gap:5px}
|
||||
.m15-item{font-size:15px;color:var(--dim);padding:4px 8px;border-radius:var(--r-sm);
|
||||
background:var(--surface-2);border:1px solid var(--line)}
|
||||
.m15-item.ok {color:var(--bright);border-color:#1d5c2a}
|
||||
.m15-item.warn{color:var(--accent);border-color:#4a3600}
|
||||
.m15-item.fail{color:var(--down);border-color:#5c1a1a}
|
||||
|
||||
Reference in New Issue
Block a user