Kosten-Gate gegen Stunden-Gate gemessen: Nachtsperre ist auf falscher Population begruendet

backtest_cost_gate.py — echte _squeeze_one, kanonischer Exit, Echtkosten,
80k M5, 2 Halbjahre, geteilte Entry-Liste + sequentielle 1-Slot-Sim.

(a) Kein Kosten-Gate ersetzt das Stunden-Gate nach der vorab fixierten Regel.
(b) Das Stunden-Gate selbst kostet in BEIDEN Haelften: sequentiell SigmaR
    -42 (H1) / -243 (H2) gegen "kein Gate". Die geblockten Ausbrueche sind
    in beiden Haelften positiv (OeR +0,496/+0,589).

Mechanismus belegt: die Nacht-Kostenfalle ist echt (alle Nacht-Bars Median
0,333 / Mittel 0,387 xATR, reproduziert backtest_realcosts), gilt aber nicht
fuer Squeeze-Ausbrueche (0,183/0,191 = Tag-Niveau). Der Squeeze verlangt
anziehenden ATR und selektiert sich damit aus der Falle heraus. Gemessen am
Wellensignal, angewandt auf den Squeeze = Deployment-Drift Fall 6.

KEINE Aenderung vorgenommen: Slippage ist nicht modelliert (groesste
Bedrohung des Befunds), die duenne Live-Stichprobe sagt das Gegenteil, und
der Beaufsichtigungs-Grund ist eine Praeferenz. auto_squeeze_skip_night
bleibt true.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 08:17:03 +02:00
co-authored by Claude Opus 5
parent c9f1e8d039
commit cdee6eced7
2 changed files with 403 additions and 3 deletions
+52 -3
View File
@@ -1454,9 +1454,57 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
**Kosten**-Aussage (Spread÷ATR 0,320,50). In dieser Nacht lagen die realen Kosten
bei **0,110,22×ATR**, also klar UNTER der Falle — weil der ATR hoch war. Ein
**kosten-basiertes statt stunden-basiertes Gate** („blocke, wenn Spread/ATR > X")
würde genau solche Nächte durchlassen und ruhige weiter sperren. **Ungemessen**
vor dem Bau 2-Stichproben-Test gegen das Stunden-Gate; und es hebelt den
Beaufsichtigungs-Grund aus, ist also zusätzlich eine User-Entscheidung.
würde genau solche Nächte durchlassen und ruhige weiter sperren.
⚠⚠ **GEMESSEN am selben Tag (`backtest_cost_gate.py`, 80k M5, 2 Halbjahre,
kanonischer Exit, Echtkosten, ECHTE `_squeeze_one`) — und das Ergebnis fällt
anders aus als die Frage lautete.**
**(a) Kein Kosten-Gate ersetzt das Stunden-Gate** nach der vorab fixierten Regel
(ΣR **und** ØR in beiden Hälften ≥ Stunden-Gate, plus Nachbar-Schwellen): alle 7
Schwellen 0,150,50 fallen durch.
**(b) Der eigentliche Befund: das STUNDEN-Gate selbst kostet Geld — in BEIDEN
Hälften.** Sequentiell mit EINEM Positions-Slot (die konto-relevante Rechnung;
ein geblockter Nacht-Trade gibt den Slot frei):
| Variante | H1 ΣR | H2 ΣR |
|---|---|---|
| **ohne Gate** | **+369,5** | **+778,1** |
| Stunden-Gate 07 (live) | +327,1 | +535,5 |
| Kosten-Gate 0,30 | +356,3 | +760,1 |
| Kosten-Gate 0,35 | +369,3 | +781,9 |
→ das Live-Gate kostet **42 R (H1) und 243 R (H2)**. Die von ihm GEBLOCKTEN
Ausbrüche sind in beiden Hälften **positiv** (ØR +0,496/+0,589) — in H1 sogar
besser als die behaltenen (+0,382). Es wirft gute Trades weg.
⚠⚠ **MECHANISMUS BELEGT — die Nachtsperre ist auf der FALSCHEN Population
begründet (Deployment-Drift, Fall 6).** Die Nacht-Kostenfalle ist echt und
reproduziert (`backtest_realcosts.py`): über ALLE Nacht-Bars Median **0,333** /
Ø **0,387** ×ATR gegen Tag 0,163/0,185. **Aber der Squeeze feuert dort gar nicht**
er verlangt einen Ausbruch, also anziehenden ATR. Seine Nacht-Ausbrüche kosten nur
**Median 0,183 / Ø 0,191** (Tag 0,156/0,162), liegen also praktisch auf Tag-Niveau
und weit unter der Falle. **Der Squeeze selektiert sich aus der Kostenfalle
heraus.** Gemessen wurde die Falle am Wellensignal, angewandt wird das Gate auf den
Squeeze — dieselbe Fehlerklasse wie bei der 15-Minuten-Regel (auf Wave-Entries
kalibriert, auf alle Bot-Trades angewandt, auf Squeeze gemessen schädlich).
⚠ Nebenbefund: **ein Kosten-Gate TRENNT tatsächlich** in die richtige Richtung
(bei 0,30 hat die geblockte Gruppe H1 WR 44,9 % / ØR +0,175 gegen +0,485 behalten)
— nur ist auch sie noch positiv, deshalb kostet jedes Blocken ΣR. Bester ΣR-Wert
ist 0,35, und der blockt praktisch nichts mehr (1 bzw. 10 Trades) = faktisch „kein
Gate".
**Methodik-Lehre zur eigenen Regel:** „ΣR UND ØR ≥ Referenz" ist als
Entscheidungsregel schlecht spezifiziert, wenn die Varianten unterschiedlich viele
Trades handeln — ØR und ΣR laufen dann mechanisch gegeneinander (0,30 schlägt das
Stunden-Gate im ΣR um +29/+225, verfehlt das ØR in H2 um 0,004). Die Regel wurde
**nicht nachträglich gelockert**; stattdessen ist der Vergleich „Gate gegen KEIN
Gate" separat ausgewiesen — er stand ohnehin in derselben Tabelle.
⚠⚠ **DREI Gründe, warum daraus NICHT automatisch „Nachtsperre aus" folgt:**
(1) **Slippage ist nicht modelliert** — nachts ist das Buch dünner, der gemessene
Tail liegt bei 0,75×ATR über den Stop hinaus (`analyze_execution.py`). Das trifft
Nacht-Trades selektiv und ist die größte Bedrohung des Befunds. (2) **Live sagt das
Gegenteil**, wenn auch dünn: von den 31 Squeeze-Trades des B4-Fensters waren 12
Nacht-Trades mit **78,92 €** — allerdings alle VOR den Exit-Reparaturen vom 31.07.
(P(break) nachtrainiert, 15-Min-Regel aus, Trail 1,5→1,0). (3) Der
**Beaufsichtigungs-Grund** („kein Trade soll feuern, während ich schlafe",
User-Vorgabe 2026-07-24) ist eine Präferenz und wird von keiner Zahl berührt.
**Deshalb KEINE Änderung vorgenommen**`auto_squeeze_skip_night` bleibt `true`.
Die Messung liegt vor, die Entscheidung ist eine Nutzungs-, keine Messfrage.
**Stop-&-Reverse = AUS (Default, `[trading] auto_squeeze_reverse=false`,
`_squeeze_reverse`; User-Vorgabe 2026-07-17):** War kurz scharf, dann abgeschaltet —
nur der **flat-Entry ist gemessen-validiert**, der Reverse ist unbelegt, verdoppelt
@@ -2772,6 +2820,7 @@ Bedingungen BETRIEBEN als VALIDIERT. An EINEM Tag wurden drei Fälle gefunden:
| 2 | `breakout_k=0,3` | **feste** Zeitebene | TF wechselt 33×/Tag, löscht den Anker | 43 % → **93 % WARTEN** |
| 3 | Trailing `mult` | **1,5** | **1,53,0** je nach TF | H1 ΣR 249 → **1367**, Worst 1,50 → 2,50 |
| 4 | `_broker_offset_s()` | **frischem** Tick | Tick beliebig alt (Wochenende) | Offset **9,5 h statt +3 h** → `open_time` 12,5 h in der Zukunft, **Time-Stop-Alter negativ** |
| 6 | `auto_squeeze_skip_night` | Nacht-Kostenfalle am **Wellensignal** (alle Nacht-Bars: 0,333×ATR) | **Squeeze**-Ausbrüche, die nur bei anziehendem ATR feuern (0,183×ATR = Tag-Niveau) | Gate kostet ΣR **42 (H1) / 243 (H2)**; geblockte Ausbrüche sind in beiden Hälften positiv |
| 5 | `backtest_auto_signal.py` | **ohne Winkel** (`_build` ohne `angle=` → Default 90 → `ad=0`) | Winkel steuert einen **Signalzweig** (Reversal) UND **±15 Konfidenzpunkte** | Urteil vom 30.07. beschrieb weder das alte noch das neue System; der Winkelterm allein hebt H1 bei conf 75 von **0,123 auf 0,047** |
Keiner wäre durch MEHR Backtesting gefunden worden — die Backtests waren korrekt.