Gate 4 der M15-Karte: Ziel nur noch in der ERLAUBTEN Richtung

User-Fund: Karte zeigte "verboten SHORT" (= LONG erlaubt) UND ein Ziel
0,15 $ UNTER dem Kurs. Die Arithmetik war korrekt - aber fuer die
verbotene Richtung.

Ursache: das Ziel war schlicht das entferntere der beiden Level
(max nach gap), ohne Richtungspruefung. Strukturell steckte dahinter
ein Fade-Trade (Gegenlevel als Ziel = Mean Reversion) in einer Kette,
deren Gate 2 ein Trendfilter ist - zwei unvereinbare Konzepte. Damit
derselbe Fehler, wegen dem die Gesamtempfehlung entfernt wurde: aus
einem VERBOT wird ueber die Hintertuer wieder eine RICHTUNG.

Fix nach der gemessenen Population (backtest_m15_gates.py): Einstieg
am naechstgelegenen Level, Richtung = die vom HTF erlaubte. Ein Ziel
nur, wenn es jenseits dieses Einstiegs in der erlaubten Richtung
liegt; sonst "kein Ziel" mit Grund statt einer erfundenen Zahl.
Richtung steht jetzt im Anzeigetext.

- tests/test_m15_ziel.py (6 Tests, Invariante ueber 32 Konstellationen)
- Mutationsprobe: alte Zeile zurueck -> 4 von 6 Tests fallen
- deploy.py --feld unterstuetzt jetzt Punktpfade (m15_setup.ziel_grund)
- v=159

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-10 06:36:02 +02:00
co-authored by Claude Opus 5
parent b8705e297f
commit 5474c2be61
6 changed files with 293 additions and 30 deletions
+66
View File
@@ -5154,6 +5154,72 @@ Mit **5 Szenarien getestet** (alles passt · Bias uneinig · Kosten teuer · Lev
zu weit · Kaltstart ohne ATR_M15 → kein Absturz), live verifiziert über
`deploy.py --feld m15_setup`.
### ⚠⚠ GATE ④ ZEIGTE DAS ZIEL IN DER VERBOTENEN RICHTUNG — behoben 2026-08-10
**User-Fund:** „Kurs ist ca. 79 und Ziel ist 78,7 bei Empfehlung LONG — ein
Widerspruch?" **Ja, und zwar ein echter.** Live nachgestellt:
| | |
|---|---|
| Kurs (bid) | **78,918** |
| ② Bias | `verboten: SHORT` → erlaubt ist **LONG** |
| ④ Ziel | **78,768** — 0,15 $ **unter** dem Kurs, `von: 79,033` |
Gelesen heisst das „am Widerstand einsteigen, Support anlaufen" = ein **SHORT**.
**Die Arithmetik war korrekt — nur für die verbotene Richtung.** Ursache war
eine Zeile:
```python
fern = max(zonen, key=lambda x: x["gap_atr15"]) # rein geometrisch
```
Das Ziel war schlicht das **entferntere** der beiden Level, ohne jede
Richtungsprüfung.
⚠⚠ **Der strukturelle Grund ist der wichtigere Teil: zwei unvereinbare
Handelskonzepte in einer Kette.** Gate ④ unterstellte stillschweigend einen
**Fade-Trade** (Level anlaufen, Gegenlevel als Ziel = Mean Reversion), Gate ② ist
aber ein **Trendfilter**. Damit ist es **derselbe Fehler, wegen dem die
Gesamtempfehlung entfernt wurde**: aus einem **VERBOT** wird über die Hintertür
wieder eine **RICHTUNG** — hier nicht über verrechnete Stimmen, sondern über die
Geometrie. Und es ist der zweite Fall in dieser Karte (der erste war der
Richtungs-Bias, korrigiert 08.08. nach 13 LONG-Episoden an einem fallenden Tag).
**Ein Verbot lässt sich offenbar auf mehr Wegen in eine Richtung verwandeln, als
man beim Bauen sieht.**
**Fix — die gemessene Population ist der Maßstab.** `backtest_m15_gates.py`
misst: Einstieg am **nächstgelegenen** Level, Richtung = die vom HTF **erlaubte**;
der Exit ist der kanonische Trailing-Exit — **ein Level-Ziel war NIE gemessen**
(④ ist ausdrücklich „reine Arithmetik"). Jetzt gilt:
| Lage (LONG erlaubt) | Anzeige |
|---|---|
| nächstes Level = **Support** → Abpraller | Ziel = Widerstand darüber ▲ |
| nächstes Level = **Widerstand** → Ausbruch | **kein Ziel** + Grund |
| **kein Veto** (M30 flach) | **kein Ziel** — ein einzelnes wäre wieder Richtung |
**„Kein Ziel" ist ein eigener Zustand, keine Lücke** — die Karte nennt den
Grund, statt eine Zahl zu erfinden. Beim Ausbruchs-Einstieg ist das nächste Ziel
schlicht **nicht berechenbar**: `_draw_levels` liefert bewusst nur die nächste
Linie je Seite (Entscheidung 14.07., sonst tauchen beim Kurslauf laufend Linien
auf/ab).
⚠ Die **Richtung steht jetzt IM Text** (`④ Ziel ▲ 79,033 … Einstieg 78,768`).
Ein Ziel ohne genannte Richtung lässt sich still wieder verdrehen — mit genannter
nicht. Neue Felder: `ziel.richtung`, `ziel_grund`.
**Mutationsprobe bestanden** (ein grüner Test belegt sonst nichts): mit der
alten Zeile zurückgebaut fallen **4 von 6** Tests, und die Fehlermeldung
reproduziert den Fund wörtlich (`{'level': 78.768, … 'von': 79.033}`).
⚠ Die zwei übrigen bleiben **korrekterweise** grün — dort liegt das entferntere
Level tatsächlich in der erlaubten Richtung, alt und neu stimmen überein. Ein
Test, der auch die richtigen Fälle rot färbt, wäre zu eng gefasst.
`tests/test_m15_ziel.py` (6 Tests) prüft die Invariante **„ein ausgewiesenes Ziel
liegt IMMER in der erlaubten Richtung"** über 32 Konstellationen × 2 Richtungen.
**Live beide Zweige belegt**, weil der Kurs während der Prüfung lief: bei
bid 78,918 (nächstes = Widerstand) → kein Ziel + „Ausbruch"; bei bid 78,871
(nächstes = Support) → Ziel 79,033 ▲, Einstieg 78,768.
⚠ **Nebenbei behoben: `deploy.py --feld` konnte nur die oberste Snapshot-Ebene**
(`a.feld in snap`). Für `m15_setup.ziel_grund` war der Neuheits-Beweis damit gar
nicht führbar — und Schritt 4 ist der EINZIGE belastbare Nachweis, dass neuer
Python-Code läuft. Jetzt mit **Punktpfaden**; ein Feld mit Wert `None` zählt als
vorhanden (geprüft wird der Schlüssel, nicht der Inhalt).
## ⚠⚠ EXIT-ABSTAND AUS M15-ATR = FÄLLT DURCH (2026-08-08)
Zweiter Teil der M15-Idee: M5-Einstieg behalten, nur den EXIT gröber führen.