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:
co-authored by
Claude Opus 5
parent
7873bf2fb7
commit
03be3b8f5f
+34
@@ -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
@@ -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>
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user