Chartmuster grafisch: SVG-Skizze in Karte + Trigger/Ziel-Linien im PWA-Chart

- patterns.py: nur AKTIVE, kursnahe Muster (abgearbeitete/Ziel erreicht raus,
  _MAX_DIST_ATR=5.0 Distanz-Filter)
- get_bars liefert bei M30 die Muster (patterns.snapshot) fürs Chart-Overlay
- app.js: _patternSvg-Skizze je Muster-Karte + 2 stärkste Muster als
  Trigger-/Ziel-Preislinien im M30-Chart; Gitternetz dezenter (#10151c)
- style.css: .pt-svg; index.html v=116->117; CLAUDE.md aktualisiert

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-07-27 19:13:47 +02:00
co-authored by Claude Opus 4.8
parent 21d855b163
commit ae6bbb2f35
6 changed files with 78 additions and 10 deletions
+7 -1
View File
@@ -586,16 +586,22 @@ class TradingEngine:
# Regressionskanal — nur M30 (dort ist die Marktstruktur berechnet), als
# Linien-Arrays deckungsgleich mit den Bars (Overlay im Charts-Tab).
channel = None
patterns = []
if tf_label == "M30":
try:
from core.structure import channel_series
channel = channel_series(closes, atr, k)
except Exception:
channel = None
# Visuelle Chartmuster (M30) fürs Overlay — Trigger-/Ziel-Preislinien.
try:
patterns = (self.patterns.snapshot() or {}).get("patterns") or []
except Exception:
patterns = []
return {"tf": tf_label, "symbol": sym, "trend": trend, "bars": bars,
"ema12": [round(x, 3) for x in e12[-k:]],
"ema50": [round(x, 3) for x in e50[-k:]],
"levels": levels, "channel": channel,
"levels": levels, "channel": channel, "patterns": patterns,
"broker_utc_offset": 3 * 3600}
def _in_startup_grace(self) -> bool: