D+A: Klimax-Fade verworfen, Kerzen-Anatomie-Kachel gebaut (reine Anzeige, v=123)

D - backtest_candle_fade.py: der Lead aus backtest_candles.py (Fade der
volumenstarken Klimax-Kerze) faellt im echten Trade-Sim durch. Live-Exit
(SL 2,0/Trail 1,5/BE 1,3/Time-Stop 120') + Echtkosten, mit KONTROLLGRUPPE
"Fade ohne Volumen-Filter" (die Lehre aus backtest_patterns.py).

  Kontrolle   -0,080 / -0,046
  Vol >= 2,0  -0,059 / +0,103
  Vol >= 2,5  +0,144 / -0,080
  Vol >= 3,0  +0,113 / -0,064

Benachbarte Schwellen exakt gegenlaeufig = Rauschmuster. Die einzige
beidseitig positive Zelle (Vol>=2,0 + Marubozu, +0,036/+0,043) hat n=91/118
bei 7 Varianten = Mehrfachvergleich-Artefakt. 18. verworfener Eingriff.

Wichtigste Lehre: Informations-Ueberschuss != handelbarer Edge. Dieselbe
2,0-Schwelle liefert im Forward-Fenster +0,12/+0,20 beim Fade, im echten
Trade -0,059/+0,103 - die Gegenbewegung ist diffus, der 2xATR-Stop wird
unterwegs getroffen (WR nur 35-40 %). Der Weg zum Ziel zaehlt.

A - core/candles.py + Kachel #card-candles (M5, ~20 s, unter mt5_lock):
Marubozu, Langer Koerper, Langer Docht oben/unten, Spinning Top, Doji,
Engulfing. Schwellen identisch zum Backtest.

Bewusste UI-Entscheidung: die Kachel ist NEUTRAL gefaerbt (keine gruen/rot-
Ampel) und nennt die GEMESSENE Lesart ("Klimax-Kerze - der Kurs laeuft
danach eher GEGEN die Kerze"), nicht die Lehrbuch-Lesart. Eine
Richtungsampel wuerde hier systematisch falsch stupsen - gleiche Korrektur
wie bei der Bounce-Anzeige. Kein Verdict-Gewicht, kein Trigger.

Beim Bau gefunden: mt5_lock ist ein CONTEXT-MANAGER, kein Lock-Objekt -
.acquire()/.release() wirft. Jetzt "with mt5_lock(3.0) as got".

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-31 08:15:46 +02:00
co-authored by Claude Opus 5
parent 7873bf2fb7
commit 03be3b8f5f
7 changed files with 467 additions and 3 deletions
+34
View File
@@ -275,6 +275,39 @@ function _patternSvg(type, col) {
stroke-linejoin="round" stroke-linecap="round"/></svg>`;
}
// Kerzen-Anatomie (M5). ⚠ Bewusst OHNE grün/rot-Richtungsfarbe: die Lehrbuch-
// Deutung ist gemessen invertiert (`backtest_candles.py` — langer Körper läuft eher
// GEGEN sich, Volumen verstärkt das statt zu bestätigen), eine Ampel würde also
// systematisch in die falsche Richtung stupsen. Dieselbe Korrektur wie bei der
// Bounce-Anzeige, die deshalb heute „Überdehnung" heißt.
function renderCandles(ca) {
const el = $("ca-list");
if (!el) return;
const items = (ca && ca.items) || [];
if (!items.length) {
el.innerHTML = `<span class="dim">Keine markante Kerzenform in den letzten Bars.</span>`;
return;
}
el.innerHTML = items.map(m => {
const arr = m.dir > 0 ? "▲" : m.dir < 0 ? "▼" : "◆";
const ago = m.bars_ago === 1 ? "letzte Kerze" : `vor ${m.bars_ago} Kerzen`;
const vol = m.vol_x
? `<span class="ca-vol${m.hot ? " hot" : ""}">Vol ${fmt(m.vol_x, 1)}×</span>` : "";
return `<div class="ca-item${m.hot ? " hot" : ""}">
<div class="ca-head"><span class="ca-name">${arr} ${m.label}</span>
${vol}<span class="ca-ago">${ago}</span></div>
<div class="ca-bars">Körper ${m.body_pct}% · Docht oben ${m.wick_up_pct}%
· unten ${m.wick_lo_pct}%</div>
<div class="ca-note">${m.reading || ""}</div>
</div>`;
}).join("") +
`<div class="pt-disclaimer">🕯 Reine Anzeige — KEIN Signal. Gemessen
(<code>backtest_candles.py</code>, 80k Bars, 2 Halbjahre): die gängige Deutung ist
<b>invertiert</b> — der lange Körper läuft eher GEGEN sich (0,06/0,08×ATR), mit
2× Volumen noch stärker (0,12/0,20). Als Handelssignal durchgefallen
(<code>backtest_candle_fade.py</code>).</div>`;
}
function renderPatterns(pt) {
const el = $("pt-list");
if (!el) return;
@@ -398,6 +431,7 @@ function render(d) {
renderVerdict(d.verdict || {}, d);
renderCircuitBreaker(d.circuit_breaker);
renderPatterns(d.patterns);
renderCandles(d.candle_anat);
renderStructure(d.structure);
renderStatsCompact(d.stats_compact, d.market);
renderGaps(d.gaps, d.market);
+9 -2
View File
@@ -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=122">
<link rel="stylesheet" href="style.css?v=123">
</head>
<body>
<!-- Modul-Menü (ganz oben) -->
@@ -125,6 +125,13 @@
<div class="pt-list" id="pt-list"><span class="dim"></span></div>
</section>
<!-- Kerzen-Anatomie (M5) — reine Anzeige; die Lehrbuch-Deutung ist gemessen
invertiert, deshalb steht die GEMESSENE Lesart im Hinweistext -->
<section class="card wide" id="card-candles">
<h2>Kerzen-Anatomie <span class="ca-tf">M5 · nur Anzeige</span></h2>
<div class="ca-list" id="ca-list"><span class="dim"></span></div>
</section>
<!-- KI-Agent -->
<section class="card wide" id="card-agent">
<h2>KI-Copilot</h2>
@@ -230,6 +237,6 @@
<div id="toast" class="toast hidden"></div>
<script src="lightweight-charts.standalone.production.js?v=114"></script>
<script src="app.js?v=122"></script>
<script src="app.js?v=123"></script>
</body>
</html>
+18
View File
@@ -162,6 +162,24 @@ main{display:grid;grid-template-columns:1fr 1fr;gap:11px;padding:11px}
.pt-det{font-size:13px;margin-top:4px;font-family:var(--mono);color:var(--bright)}
.pt-note{font-size:12px;color:var(--dim);margin-top:3px}
.pt-disclaimer{font-size:12px;color:var(--dim);margin-top:6px;line-height:1.4}
.pt-disclaimer code{font-family:var(--mono);font-size:11px}
/* Kerzen-Anatomie — bewusst NEUTRAL gefärbt (keine grün/rot-Ampel): die
Lehrbuch-Deutung ist gemessen invertiert, eine Richtungsfarbe würde
systematisch falsch stupsen. Nur „hot" (Volumen>=2x) wird hervorgehoben. */
#card-candles .ca-tf{font-size:11px;color:var(--dim);font-weight:600;margin-left:6px}
.ca-item{background:var(--surface-2);border:1px solid var(--border);
border-left:3px solid var(--line);border-radius:var(--r-sm);
padding:8px 12px;margin-bottom:7px}
.ca-item.hot{border-left-color:var(--accent)}
.ca-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ca-name{font-weight:700;font-size:15px;color:var(--bright)}
.ca-vol{font-size:11px;font-weight:700;border-radius:4px;padding:1px 7px;
font-family:var(--mono);background:var(--bg);color:var(--dim);
border:1px solid var(--border)}
.ca-vol.hot{background:#2a1f00;color:var(--accent);border-color:#4a3600}
.ca-ago{margin-left:auto;font-size:12px;color:var(--dim);font-family:var(--mono)}
.ca-bars{font-size:12px;margin-top:3px;font-family:var(--mono);color:var(--dim)}
.ca-note{font-size:12px;color:var(--dim);margin-top:3px;line-height:1.4}
#card-verdict{border-color:var(--accent)}
.vd-head{display:flex;align-items:center;gap:14px;margin-bottom:10px}
.vd-ring{width:60px;height:60px;border-radius:50%;flex:0 0 auto;