Muster als gefuellte geometrische Formen im MT5-Chart (v1.47)

User-Vorgabe: Dreiecke/Rechtecke/Ellipsen ueber OBJ_* an den berechneten
Swings verankern, mit leichtem Grauton gefuellt.

PT-Zeile traegt jetzt die Geometrie:
  PT;<TF>;<name>;<dir>;<trigger>;<ziel>;<form>;<t1>;<p1>;<t2>;<p2>;...

  dreieck  (3 Anker) -> OBJ_TRIANGLE   Doppeltop/-boden, Dreiecke, Keile, Wimpel
  dreieck2 (5 Anker) -> 2x OBJ_TRIANGLE  SKS, inv. SKS, Dreifach-Top/-Boden
  rechteck (2 Anker) -> OBJ_RECTANGLE  Rechteck (Range), Flagge
  ellipse  (3 Anker) -> OBJ_ELLIPSE    Tasse+Henkel, inverse Tasse

dreieck2 braucht ZWEI Objekte, weil OBJ_TRIANGLE nur drei Punkte kennt; die
beiden Dreiecke (Schulter-Kopf, Kopf-Schulter) kacheln die Silhouette exakt.

OBJPROP_FILL faerbt mit OBJPROP_COLOR - ein Objekt kann keine graue Flaeche UND
einen farbigen Rand haben. Deshalb Flaeche neutral grau (InpMusterFill) und
OBJPROP_BACK (hinter den Kerzen); die Richtungsaussage tragen Trigger- und
Ziellinie darueber. Inhaltlich richtig: die Form ist eine Beobachtung, keine
Richtungsprognose.

Python (core/patterns.py): add() nimmt form + punkte, legt sie als form/anker
in den Muster-dict. REIN ADDITIV - kein bestehender Schluessel aendert sich.

Neuer Helfer _keil(): schneidet die beiden Linien und DECKELT den Apex auf
last_idx+40 (ein fast paralleles Paar schneidet sich im Unendlichen); nach
links begrenzt, damit der Apex nicht im Muster liegt.

_anker() rechnet einen Index jenseits des letzten Bars ueber die Bar-Dauer
hoch - sonst waere der Apex auf den letzten Bar geklemmt und jedes Dreieck
haette einen senkrechten rechten Rand. Bar-Dauer aus den DATEN, nicht aus der
TF-Konstante.

Zeitstempel sind ROHE Broker-Zeit (rates["time"]) - genau das, was iTime()
liefert. Keine Offset-Rechnung, gleiche Konvention wie EQ; und TR;.

Vor dem Export wird geprueft, dass Form und Punktzahl zueinander passen - ein
Dreieck mit zwei Punkten wuerde der Indikator still verwerfen.
Abwaertsvertraeglich in beide Richtungen.

Verifiziert: 6 synthetische Muster (Form, Punktzahl, aufsteigende Zeitstempel,
Apex in der Zukunft) + live Snapshot patterns_tf.M5 form=dreieck anker=3 +
CSV-Zeile mit Geometrie. Compile 0 errors, Pipeline gruen, deployt.
This commit is contained in:
Axel Hocks
2026-08-21 15:55:36 +02:00
parent c512863e5f
commit 72c2aedc1a
4 changed files with 264 additions and 19 deletions
+60
View File
@@ -9504,3 +9504,63 @@ Zeitebene.
`.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`.
## ✅ MUSTER ALS GEFÜLLTE GEOMETRISCHE FORMEN IM MT5-CHART (2026-08-21, v1.47)
User-Vorgabe: Dreiecke/Rechtecke/Ellipsen über `OBJ_*` an den berechneten
Swings verankern, **„mit leichtem Grauton gefüllt"**.
**Die `PT;`-Zeile trägt jetzt die Geometrie mit:**
```
PT;<TF>;<name>;<dir>;<trigger>;<ziel>;<form>;<t1>;<p1>;<t2>;<p2>;…
```
| `form` | Anker | MT5-Objekt | Muster |
|---|---|---|---|
| `dreieck` | 3 | `OBJ_TRIANGLE` | Doppeltop/-boden, Dreiecke, Keile, Wimpel |
| `dreieck2` | 5 | **2×** `OBJ_TRIANGLE` | SKS, inverse SKS, Dreifach-Top/-Boden |
| `rechteck` | 2 | `OBJ_RECTANGLE` | Rechteck (Range), Flagge |
| `ellipse` | 3 | `OBJ_ELLIPSE` | Tasse+Henkel, inverse Tasse |
**`dreieck2` braucht ZWEI Objekte**, weil `OBJ_TRIANGLE` nur drei Punkte
kennt. Die Dreiecke (SchulterKopf und KopfSchulter) kacheln die Silhouette
exakt — kein Annähern, keine Überdeckung.
⚠⚠ **Die Füllung kann KEINEN andersfarbigen Rand haben:** `OBJPROP_FILL`
färbt mit `OBJPROP_COLOR`. Deshalb ist die Fläche neutral grau
(`InpMusterFill`, `C'205,205,205'`) **und `OBJPROP_BACK`** — sie liegt hinter
den Kerzen; die Richtungsaussage tragen die farbige Trigger- und Ziellinie
darüber. Das ist auch inhaltlich richtig: die **Form** ist eine Beobachtung,
keine Richtungsprognose.
**Umsetzung Python** (`core/patterns.py`): `add()` nimmt `form` und `punkte`
(Bar-Index + Preis) und legt sie als `form`/`anker` in den Muster-dict — **rein
additiv**, kein bestehender Schlüssel ändert sich (das Verdict-Gewicht liest
ohnehin nur `type`/`dir`/`status`/`quality`).
⚠ Neuer Helfer **`_keil()`** für die konvergierenden Muster: er schneidet die
beiden Linien und **deckelt den Apex** auf `last_idx + 40` — ein fast
paralleles Linienpaar schneidet sich sonst im Unendlichen und spännte ein
Dreieck über den halben Chart. Nach links begrenzt auf einen Bar hinter dem
letzten Stützpunkt, sonst läge der Apex INNERHALB des Musters und die Form
würde sich selbst durchdringen.
`_anker()` rechnet einen Index **jenseits des letzten Bars** über die
Bar-Dauer hoch (`T` hat dafür keinen Eintrag). Ohne das wäre der Apex auf den
letzten Bar geklemmt und **jedes Dreieck hätte einen senkrechten rechten Rand**.
Die Bar-Dauer kommt aus den DATEN (`T[-1]-T[-2]`), nicht aus der TF-Konstante —
so stimmt sie auch, wenn der Broker Bars auslässt.
⚠ Die Zeitstempel sind **rohe Broker-Zeit** aus `rates["time"]` — genau das,
was `iTime()` liefert und was ein `OBJ_*`-Anker erwartet. **Keine
Offset-Rechnung**, gleiche Konvention wie `EQ;` und `TR;`.
**Vor dem Export geprüft, dass Form und Punktzahl zueinander passen** — ein
Dreieck mit zwei Punkten würde der Indikator still verwerfen, und der Fehler
wäre von außen unsichtbar (dieselbe Klasse wie der `PERIOD_CURRENT`-Fall).
**Abwärtsverträglich in beide Richtungen:** eine alte CSV ohne Geometrie
fällt still auf „nur Linien" zurück, ein alter Indikator ignoriert die
Zusatzfelder.
**Gegenprobe an sechs synthetischen Mustern** (Doppeltop, Doppelboden, SKS,
Tasse, auf-/absteigendes Dreieck): Form, Punktzahl und aufsteigende Zeitstempel
stimmen; der Dreiecks-Apex landet korrekt in der Zukunft.
**Live verifiziert:** Snapshot `patterns_tf.M5 = {form: dreieck, anker: 3}`,
CSV-Zeile
`PT;M5;Doppeltop;bear;87.384;86.814;dreieck;1787327400;87.954;1787328000;87.384;1787330100;87.914`.
Abschaltbar wie bisher `InpShowMuster=false`; Füllfarbe `InpMusterFill`.