diff --git a/CLAUDE.md b/CLAUDE.md index 21189e0..990be67 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -9459,3 +9459,48 @@ unabhängig vom Schalter berechnet. ⚠ Diese Anzeigen tragen dieselbe Inversion sie sind Kontext, kein Urteil. **Was weiter schützt:** Broker-SL 2×ATR, Trailing, Time-Stop. **Zurück:** Knopf **S/R** — dann bitte den Wächter-Anker mitdrehen. + +## ✅⚠⚠ BESTÄTIGTES CHARTMUSTER IM MT5-CHART (2026-08-21, Indikator v1.45/1.46) + +User: „kannst Du das bestätigte Chartmuster in das jeweils passende Chart +(M1, M5, M15, H1) im MT5 einzeichnen". + +**Neue CSV-Zeile `PT;;;;;`** — gespeist aus +`engine.patterns_tf` (fünf `PatternDetector`, je Zeitebene einer). Exportiert +werden **nur `status == "confirmed"`**-Muster. Der Indikator zeichnet die +Trigger-/Nackenlinie durchgezogen und das Measured-Move-Ziel gepunktet, dazu ein +Label mit Name und Richtung. + +⚠ **Das Label nennt die Messung mit: „(trifft 13–38 %)".** Die +Muster-Klasse ist im Projekt **3× als Signal verworfen** +(`backtest_doubletop.py`, `backtest_structure_tf.py`, `backtest_patterns.py`) — +der positive ØR dort kam nachweislich vom **Trailing auf einem Momentum-Bruch**, +nicht von der Muster-Prognose. Eine Linie im Chart ohne diese Zahl würde +autoritativer aussehen, als sie ist. **Kein Verdict-Gewicht, kein Trigger.** + +⚠ **Round-Robin statt fünf Aufrufe am Stück.** Der erste Bau ließ alle fünf +Detektoren in EINEM Trend-Loop-Durchlauf unter `mt5_lock` laufen — real hängte +danach `_trend_loop` beim Serverstart, `_pos_loop` 70 s später, und alle 15 s +stand „Time-Stop-Close fehlgeschlagen: MT5 belegt" im Log (User: „G/V +aktualisiert nicht mehr"). Jetzt wird **je Durchlauf genau EINE** Zeitebene +aufgefrischt. + +⚠⚠ **DER FEHLER, der es unsichtbar machte — und er traf JEDE Zeitebene, nicht +nur M30 (v1.46, User: „in M30 müsste ,Tasse mit Henkel' zu sehen sein, ist aber +nicht sichtbar").** Der TF-Filter verglich gegen `TFName(PERIOD_CURRENT)`. +**`PERIOD_CURRENT` ist der WERT 0.** MT5-Funktionen wie `iTime()` deuten die 0 +selbst als „dieser Chart" — ein `switch` trifft damit aber **keinen case**, und +`TFName()` fiel auf `EnumToString()` zurück und lieferte den String +`"PERIOD_CURRENT"`. Der Vergleich war deshalb **immer** wahr, jede `PT`-Zeile +wurde übersprungen. +✅ **Fix: `TFName((ENUM_TIMEFRAMES)_Period)`** — `_Period` liefert die +tatsächliche Chart-Periode als Wert. Die übrigen `PERIOD_CURRENT`-Vorkommen im +Indikator sind **korrekt** und bleiben: sie stehen als Argument in +`iTime()`/`Bars()`, wo MT5 die 0 auflöst. +⚠ **Merksatz: `PERIOD_CURRENT` ist ein Argument-Platzhalter, kein Wert.** Wer +darauf vergleicht oder `switch`t, prüft gegen die 0 — und die gehört zu keiner +Zeitebene. +⚠ Von außen sah alles richtig aus: CSV-Zeile vorhanden, Snapshot `confirmed`, +`.ex5` frisch, `0 errors`. **Nur das Ergebnis fehlte** — dieselbe Klasse wie die +vier dokumentierten Fälle „Erfolg melden, wo nichts geprüft wurde". +Abschaltbar: `InpShowMuster=false`; Farben `InpMusterBullColor`/`…BearColor`.