Neues Modul: Visuelle Chartmuster-Erkennung (core/patterns.py) — reine Anzeige
Erkennt aus M30-Swing-Pivots: Doppeltop/-boden, Kopf-Schulter/inverse SKS, Tasse+Henkel/invers, auf-/absteigendes+symmetrisches Dreieck. Je Muster Richtung, Trigger/Nackenlinie, Measured-Move-Ziel, Status (bildet sich/bestätigt/ungültig), Güte. Dashboard-Karte #card-patterns + Disclaimer (v=116). KEIN Signal, kein Verdict-Gewicht — Signal-Einfluss erst nach Backtest (Muster-Klasse 2x verworfen, hohe Beweislast). Live getestet: findet bestätigten Doppeltop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
cd8ee5b01b
commit
e5589da08b
+32
@@ -224,6 +224,37 @@ function renderCircuitBreaker(cb) {
|
||||
}
|
||||
}
|
||||
|
||||
// Chartmuster (visuell) — reine Anzeige. Status: bildet sich / bestätigt / (ungültig raus).
|
||||
function renderPatterns(pt) {
|
||||
const el = $("pt-list");
|
||||
if (!el) return;
|
||||
const items = (pt && pt.patterns) || [];
|
||||
if (!items.length) {
|
||||
el.innerHTML = `<span class="dim">Aktuell kein klares Muster erkannt.</span>`;
|
||||
return;
|
||||
}
|
||||
el.innerHTML = items.map(m => {
|
||||
const dirCls = m.dir === "bull" ? "up" : m.dir === "bear" ? "down" : "dim";
|
||||
const arr = m.dir === "bull" ? "▲" : m.dir === "bear" ? "▼" : "◆";
|
||||
const st = m.status === "confirmed"
|
||||
? `<span class="pt-badge conf">bestätigt</span>`
|
||||
: `<span class="pt-badge form">bildet sich</span>`;
|
||||
const tgt = m.target != null
|
||||
? `Ziel <b>${fmt(m.target, 2)}</b>` : `Ausbruch offen`;
|
||||
const q = Math.round((m.quality || 0) * 100);
|
||||
return `<div class="pt-item ${dirCls}">
|
||||
<div class="pt-head"><span class="pt-name">${arr} ${m.name}</span>${st}
|
||||
<span class="pt-q">Güte ${q}%</span></div>
|
||||
<div class="pt-det">Trigger <b>${fmt(m.trigger, 2)}</b> · ${tgt}
|
||||
· Höhe ${m.height_atr}×ATR · vor ${m.bars_ago} Bars</div>
|
||||
<div class="pt-note">${m.note || ""}</div>
|
||||
</div>`;
|
||||
}).join("") +
|
||||
`<div class="pt-disclaimer">📊 Reine Anzeige (mechanisch aus M30-Pivots) — KEIN Signal,
|
||||
kein Einfluss auf die Empfehlung. Muster-Klasse im Projekt als Signal noch unbelegt;
|
||||
Einfluss erst nach Backtest.</div>`;
|
||||
}
|
||||
|
||||
function render(d) {
|
||||
// ── Header ──────────────────────────────
|
||||
$("conn").className = "dot " + (d.connected ? "on" : "off");
|
||||
@@ -314,6 +345,7 @@ function render(d) {
|
||||
// ── Gesamtempfehlung (aggregiert) ───────
|
||||
renderVerdict(d.verdict || {}, d);
|
||||
renderCircuitBreaker(d.circuit_breaker);
|
||||
renderPatterns(d.patterns);
|
||||
renderStructure(d.structure);
|
||||
renderStatsCompact(d.stats_compact, d.market);
|
||||
renderGaps(d.gaps, d.market);
|
||||
|
||||
Reference in New Issue
Block a user