Exit-Abstand aus M15-ATR gemessen = faellt durch, Exit bleibt am M5-ATR

Zweiter Teil der M15-Idee: M5-Einstieg behalten, nur den Exit groeber fuehren.
Schliesst zugleich den seit 31.07. in core/trailing.py offenen Punkt
("bisher misst er nur M5").

  M5-ATR (heute)  H1 +0,219 / PF 1,41 / Worst -2,17
                  H2 +0,117 / PF 1,25 / Worst -2,23
  M15-ATR         H1 +0,096 / PF 1,14 / Worst -4,26
                  H2 +0,019 / PF 1,02 / Worst -6,73

Schlechter in BEIDEN Haelften und das Tail-Risiko verdreifacht sich. Dasselbe
Muster wie bei backtest_sl_basis.py.

Zwei Methoden-Fallen, die die Messung fast entwertet haetten:

1) simulate() normiert R mit DEMSELBEN ATR, den es fuer SL/Trail/TP nutzt. Mit
   dem 1,86x groesseren M15-ATR waere dieselbe Dollar-Bewegung ein kleineres R -
   die M15-Variante haette mechanisch schlechter ausgesehen. Beide werden
   deshalb in M5-Risikoeinheiten zurueckgerechnet.

2) Der erste Lauf sammelte die Entry-Liste ueber exit_fn - das wird von scan()
   bei JEDEM Box-Ausbruch gerufen, nicht nur bei den komprimierten: 519 statt
   132 Einstiege, also die Kontrollgruppe statt des Squeeze. Behoben ueber den
   additiven Rueckruf on_entry(j, d, lvl, atr, komprimiert) in
   core/squeeze_scan.py; Bitgleichheit weiter durch tests/test_squeeze_scan.py
   belegt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-08 15:01:44 +02:00
co-authored by Claude Opus 5
parent b5eff2a5d6
commit 010007f7a3
3 changed files with 175 additions and 1 deletions
+27
View File
@@ -4942,6 +4942,33 @@ Modell schliesst keine Trades.
„die Rangfolge ist kaputt" ist **nicht** belegt; belegt ist nur die
Basisraten-/Kalibrierungslücke.
## ⚠⚠ 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.
Gemessen (`backtest_exit_atr_tf.py`, 80k M5, feste geteilte Entry-Liste,
kanonischer Exit, Echtkosten). Schliesst zugleich den seit dem 31.07. in
`core/trailing.py` offenen Punkt („bisher misst er nur M5").
| | H1 ØR / PF / Worst | H2 ØR / PF / Worst |
|---|---|---|
| **M5-ATR (heute)** | **+0,219 / 1,41 / 2,17** | **+0,117 / 1,25 / 2,23** |
| M15-ATR (1,86× breiter) | +0,096 / 1,14 / **4,26** | +0,019 / 1,02 / **6,73** |
**Schlechter in BEIDEN Hälften — und das Tail-Risiko verdreifacht sich.**
Dasselbe Muster wie bei `backtest_sl_basis.py`: ein breiterer Exit kauft nichts
und kostet Tail. **Der Exit bleibt am M5-ATR.**
⚠⚠ **METHODEN-FALLE, die die Messung fast entwertet hätte** — zweimal:
**(1)** `simulate()` normiert R mit DEMSELBEN ATR, den es für SL/Trail/TP nutzt.
Mit dem 1,86× grösseren M15-ATR wäre dieselbe Dollar-Bewegung ein kleineres R —
die M15-Variante hätte mechanisch schlechter ausgesehen. Beide werden deshalb in
**M5-Risikoeinheiten** zurückgerechnet (`R × ATR_verwendet / ATR_M5`).
**(2)** Der erste Lauf sammelte die Entry-Liste über `exit_fn` — das wird von
`scan()` bei **JEDEM** Box-Ausbruch gerufen, nicht nur bei den komprimierten:
**519 statt 132 Einstiege**, also die Kontrollgruppe statt des Squeeze. Behoben
über den additiven Rückruf **`on_entry(j, d, lvl, atr, komprimiert)`** in
`core/squeeze_scan.py` (Bitgleichheit weiter durch `tests/test_squeeze_scan.py`
belegt). ⚠ **Ein Haken, der mehr liefert als gedacht, ist eine stille
Populations-Änderung.**
## ⚠⚠ SQUEEZE AUF M15 = FÄLLT DURCH — kein M15-Modul gebaut (2026-08-08)
Anlass: User „baue mir das M15-Empfehlungsmodul". Der Squeeze ist der einzige