Erfolgskontrolle fuer den Stop-Order-Umbau: Skript + Reminder

analyze_squeeze_entry_gap.py fuehrt die zwei noetigen Quellen zusammen - das
Ausbruchs-Level steht NUR im Log, der tatsaechliche Fill NUR in trades - und
splittet am Umbau-Stichtag. Die Erfolgsmeldung ist paradox: eine per Pending
gefuellte Order erzeugt KEINE AUTO-SQUEEZE-ENTRY-Logzeile (die entsteht nur im
Market-Fallback), Squeeze-Trades ohne Log-Treffer sind also der Erfolg. Das
Skript weist sie deshalb getrennt aus.

Als Messung squeeze_entry_gap im measurement_reminder.py hinterlegt (>=12
Squeeze-Trades ab dem Umbau). Stichtag exakt 05.08. 08:55 statt Mitternacht -
der 08:33-Trade lief noch ueber die Market-Order und haette die Zaehlung
verfaelscht (0/12 statt faelschlich 1/12).

Zahlen-Korrektur: die zuerst dokumentierten +0,306 / +0,741 xATR stammten aus
einer Scratchpad-Auswertung mit FESTEM Stundenversatz. DST-korrekt ueber
zoneinfo sind es +0,275 / +0,686 (n=34 unveraendert). In CLAUDE.md, engine.py,
trader.py und der ini nachgezogen; die Schlussfolgerung aendert sich nicht.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 09:06:50 +02:00
co-authored by Claude Opus 5
parent 5e0e8b00ca
commit 5f70980e59
5 changed files with 201 additions and 10 deletions
+22 -8
View File
@@ -1466,8 +1466,8 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
**`backtest_breakout_squeeze.py` steigt AM LEVEL ein** (`sim(lvl, …)`). Live schickt
`_check_auto_squeeze` eine **MARKET**-Order, sobald `state=='active'` — der Kurs ist
dann schon ein Stück weiter. **Aus 34 echten Live-Entries (Logs 16.07.05.08.,
Level aus der Log-Zeile × Einstiegspreis aus der DB): Median +0,306×ATR über dem
Level**, Mittel +0,741 · 75 % +0,863 · Max +4,339; nur **18 %** liegen innerhalb
Level aus der Log-Zeile × Einstiegspreis aus der DB): Median +0,275×ATR über dem
Level**, Mittel +0,686 · 75 % +0,744 · Max +4,339; nur **18 %** liegen innerhalb
0,10×ATR, **53 % über 0,30×ATR**.
**Was dieser Preisunterschied kostet** (80k M5, 2 Halbjahre, sequentiell EIN Slot,
kanonischer Exit, Echtkosten):
@@ -1477,7 +1477,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
| **B Einstieg am Bar-Close** (≈ live) | **0,158 / 125,9** | **0,006 / 7,6** | 37/42 % |
**Allein der Einstiegspreis dreht das Setup — 0,61 ØR in BEIDEN Hälften, WR bricht
von 56 auf 37 %.** Modell B ist dabei **nicht pessimistisch**: sein Median-Abstand
(0,38×ATR) liegt nah am LIVE gemessenen (0,31×ATR); der Live-Betrieb liegt also
(0,38×ATR) liegt nah am LIVE gemessenen (0,28×ATR); der Live-Betrieb liegt also
~80 % des Weges von A nach B, also grob bei **breakeven bis leicht negativ**
nicht bei den dokumentierten +0,14…+0,23.
⚠⚠ **Das ordnet den B4-Befund vom 01.08. NEU ein.** Dort stand: „Mechanik +0,102 vs.
@@ -1520,7 +1520,7 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
**Selbst mit 0,20×ATR unterstellter Fill-Slippage — dem ~9-fachen des Median-Spreads
— bleibt es in BEIDEN Hälften klar positiv.**
⚠⚠ **Der Schlüssel ist nicht der Median, sondern der SCHWANZ.** Live ist der
Median-Abstand +0,306×ATR, der **Mittelwert aber +0,741** (Max +4,339). Eine
Median-Abstand +0,275×ATR, der **Mittelwert aber +0,686** (Max +4,339). Eine
Stop-Order **deckelt den Einstiegspreis konstruktiv**; die Market-Order auf dem
5-s-Poll tut das nicht. Die Extremfälle (+3,5 / +4,3×ATR) stammen erkennbar aus
**blockiert-dann-freigegebenen** Ausbrüchen: feuert der Squeeze, während eine
@@ -1560,9 +1560,23 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
Live verifiziert am Snapshot: `squeeze_pending=true`, `squeeze_max_chase_atr=0.2`,
`squeeze_pending_levels` (leer, weil eine Position offen war = korrektes Verhalten).
**Zurück zum alten Verhalten: `squeeze_pending_entry=false`.**
**B4-Pflicht:** der Live-Abstand Einstieg↔Level muss jetzt gegen ~0 gehen
(vorher Median +0,306×ATR). Das ist die Erfolgskontrolle — nachrechnen wie in
diesem Abschnitt (Log-Zeile „Ausbruch <level>" × `trades.entry_price`).
**B4-Pflicht + Werkzeug:** der Live-Abstand Einstieg↔Level muss jetzt gegen ~0
gehen (vorher Median +0,275×ATR). Dafür gibt es jetzt
**`analyze_squeeze_entry_gap.py`** (führt die zwei nötigen Quellen zusammen: das
Level steht NUR im Log, der Fill NUR in `trades`) — mit Vorher/Nachher-Split am
Umbau-Stichtag. ⚠ **Die Erfolgsmeldung ist paradox:** eine per Pending gefüllte
Order erzeugt **keine** `AUTO-SQUEEZE-ENTRY`-Logzeile (die entsteht nur im
Market-Fallback). Squeeze-Trades **ohne** Log-Treffer sind also der Erfolg, nicht
ein Fehler — das Skript weist sie deshalb getrennt aus. Überwacht als Messung
`squeeze_entry_gap` im `measurement_reminder.py` (≥12 Squeeze-Trades ab dem
Umbau; Stichtag exakt 05.08. 08:55, nicht Mitternacht — der 08:33-Trade lief noch
über Market). Bleibt der Abstand bei ~0,3×ATR, füllt die Pending nicht → Broker-
Mindestabstand und die Logzeile „Squeeze-Pending nicht platzierbar" prüfen.
**Zahlen-Korrektur (05.08.):** zuerst standen hier Median +0,306 / Ø +0,741 —
das war eine Scratchpad-Auswertung mit FESTEM Stundenversatz. `analyze_squeeze_
entry_gap.py` rechnet DST-korrekt über `zoneinfo` und liefert **+0,275 / +0,686**
(n=34 unverändert). Gültig sind die zweiten Werte; die Schlussfolgerung ändert
sich nicht.
- **Auto-Squeeze-Entry = LIVE AUTONOM (User-Vorgabe 2026-07-16, `[trading]
auto_squeeze=true`, Default FALSE):** der Bot eröffnet **selbständig eine echte
Order**, sobald der **gemessen-validierte** Squeeze-Ausbruch feuert (`wave.squeeze.
@@ -3019,7 +3033,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** |
| 7 | Auto-Squeeze-**Einstiegspreis** | Fill **AM Ausbruchs-Level** (`backtest_breakout_squeeze.py`) | **MARKET**-Order, live median **+0,306×ATR** über dem Level (34 echte Entries) | ØR **+0,456 → 0,158** (H1) bzw. **+0,611 → 0,006** (H2); WR 56 → 37 % |
| 7 | Auto-Squeeze-**Einstiegspreis** | Fill **AM Ausbruchs-Level** (`backtest_breakout_squeeze.py`) | **MARKET**-Order, live median **+0,275×ATR** über dem Level (34 echte Entries) | ØR **+0,456 → 0,158** (H1) bzw. **+0,611 → 0,006** (H2); WR 56 → 37 % |
| 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** |