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
+17 -1
View File
@@ -168,8 +168,24 @@ def main() -> int:
schritt(3, f"Port {p}: ⚠ {len(ids)} Instanzen {ids}")
# ── 4) beweist ein neues Feld, dass der PYTHON-Code neu ist? ─────────
# ⚠ PUNKTPFADE seit 2026-08-10 (`m15_setup.ziel_grund`). Vorher ging nur die
# oberste Ebene (`a.feld in snap`) — die meisten neuen Felder liegen aber
# verschachtelt, und fuer die war der Neuheits-Beweis damit gar nicht
# fuehrbar. Genau das ist Schritt 4 aber: der EINZIGE belastbare Nachweis,
# dass wirklich neuer Python-Code laeuft (statische Dateien beweisen
# nichts — `restart_server.bat` hat zweimal still nicht neu gestartet).
# ⚠ Ein Feld mit Wert `None` zaehlt als VORHANDEN — geprueft wird die
# Existenz des Schluessels, nicht sein Inhalt. Ein neues Feld ist beim
# ersten Snapshot oft noch leer.
if a.feld:
if a.feld in snap:
knoten, pfad_ok = snap, True
for teil in a.feld.split("."):
if isinstance(knoten, dict) and teil in knoten:
knoten = knoten[teil]
else:
pfad_ok = False
break
if pfad_ok:
schritt(4, f"Feld `{a.feld}` vorhanden → Python-Code ist neu ✅")
else:
fehler.append(f"Feld `{a.feld}` fehlt im Snapshot")