Auto-Signal (SIG) neu gemessen: besteht erstmals - aber nur am Level, nicht am Markt

backtest_auto_signal_v3.py, voller Live-Gate-Stack (echte _build /
_confirm_breakout / _room_gate), sequentiell EIN Slot, Live-Dedup,
kanonischer Exit, Echtkosten, 80k M5, 2 Halbjahre.

A) Einstieg am Bar-Close (= heutige Market-Order): in ALLEN acht Feldern
   negativ (Konf 55/65/75/85 x 2 Halbjahre). Bestaetigt die drei Vormessungen.
B) Einstieg am Bestaetigungs-Level (_pend["level"], ruhende Stop-Order):
   besteht in ALLEN acht - WR 39,6 -> 53,2 %, PF 0,83 -> 2,20, und alle vier
   Nachbar-Schwellen halten mit.

Haertetest Fill-Slippage (Konf>=65): +0,05 -> +0,315/+0,249 · +0,20 ->
+0,148/+0,090 (noch beidseitig positiv) · +0,31 -> +0,026/-0,031. Die letzte
Zeile ist die interne Kontrolle: bei Slippage gleich dem gemessenen
Median-Abstand (0,311 xATR) konvergiert B gegen A.

Nichts umgeschaltet. Grenzen dokumentiert: fuer SIG ist nicht verifizierbar,
wo live zwischen A und B liegt (nur 4 echte Trades); _pend verankert sich
staendig neu, eine ruhende Order muesste nachgezogen werden und faellt bei
Nicht-Platzierbarkeit auf A zurueck; _pend steht nicht im Snapshot.

Methodik-Fehler beim Bau gefunden und behoben: der erste Entwurf liess
pend["level"] nach der Bestaetigung stehen und waere bei verzoegertem Einstieg
zu einem laengst verlassenen Preis eingestiegen - sichtbar an einem
unplausiblen Bruch zwischen Konf 65 und 75. Behoben ueber ein frisch-Flag.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 10:55:32 +02:00
co-authored by Claude Opus 5
parent 43b7756df3
commit 12fb11fa44
2 changed files with 370 additions and 0 deletions
+60
View File
@@ -1352,6 +1352,66 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
Die Originaldatei bleibt unverändert (ihre Zahlen sind dokumentiert); die live-treue
Variante steht als `backtest_auto_signal_norev.py` daneben und sollte künftig die
Referenz sein.
- **⚠⚠ AUTO-SIGNAL NEU GEMESSEN 2026-08-05 (`backtest_auto_signal_v3.py`) — ZUM
ERSTEN MAL BESTEHT ER, ABER NUR MIT EINEM ANDEREN EINSTIEGSPREIS.**
Anlass: User-Wunsch nach einer ausführlichen Neumessung „mit den neuen Änderungen".
Geändert seit dem 04.08. waren Nacht-Fenster 07→36 und — der eigentliche Punkt —
der **Ausführungs-Befund vom selben Tag**: `_confirm_breakout` hat ein LEVEL
(`_pend["level"]` = Anker ± k×ATR), an dem eine ruhende Stop-Order liegen könnte.
ALLE bisherigen SIG-Messungen sind am Bar-Close eingestiegen.
Voller Live-Gate-Stack (echte `_build`/`_confirm_breakout`/`_room_gate`),
sequentiell EIN Slot, Live-Dedup (1× je Episode), kanonischer Exit, Echtkosten,
80k M5, 2 Halbjahre:
| Konf | **A) Market (Bar-Close)** H1 / H2 | **B) am Bestätigungs-Level** H1 / H2 |
|---|---|---|
| ≥55 | 0,098 / 0,093 | **+0,349 / +0,331** |
| ≥65 | 0,092 / 0,112 | **+0,357 / +0,317** |
| **≥75 (live)** | 0,050 / 0,189 | **+0,380 / +0,272** |
| ≥85 | 0,118 / 0,234 | **+0,351 / +0,279** |
**A ist in ALLEN acht Feldern negativ** (bestätigt die drei Vormessungen).
**B besteht in ALLEN acht** — Trefferquote 39,6 → 53,2 %, PF 0,83 → 2,20, und
**alle vier Nachbar-Schwellen halten mit** (Parameter-Robustheit, an der ORB und
die SMC-Sweeps gescheitert sind).
**HÄRTETEST Fill-Slippage** (Konf≥65) — eine Stop-Order füllt zum Markt, der
Idealpreis ist die Obergrenze: +0,05 → **+0,315/+0,249** · +0,10 → +0,273/+0,197 ·
**+0,20 → +0,148/+0,090** (noch beidseitig positiv) · **+0,31 → +0,026/0,031**.
**Die letzte Zeile ist die interne Kontrolle:** bei Slippage = dem gemessenen
Median-Abstand (0,311×ATR) konvergiert B gegen A — das Modell prüft sich selbst.
Der Kipp-Punkt liegt bei ~0,250,30×ATR Fill-Slippage.
**Abstand Bar-Close ↔ Bestätigungs-Level: Median +0,311×ATR** (Ø +0,422, Max
+5,29) — praktisch derselbe Wert wie beim Squeeze live (+0,275). Gleicher
Mechanismus, gleiche Größenordnung.
**Nacht-Fenster ist hier nahezu irrelevant:** 36 (+0,380/+0,272) · 07
(+0,371/+0,226) · keine Sperre (+0,359/**+0,302**) — alle drei bestehen, ohne
Sperre ist H2 sogar am besten. Deckt sich mit `backtest_cost_gate.py`.
⚠⚠ **GRENZEN — bewusst NICHTS umgeschaltet:**
(1) **Wo LIVE zwischen A und B liegt, ist für SIG NICHT verifizierbar** — beim
Squeeze gab es 34 echte Entries zum Nachrechnen, hier sind es 4. Die Empfehlung
macht das zwar gegenstandslos (eine ruhende Order IST B per Konstruktion), aber
behauptet ist es damit nicht.
(2) **Variante A ist STRENGER als live:** für die Vergleichbarkeit steigen beide
Varianten nur im Bar der frischen Bestätigung ein (`frisch`); live darf
`_check_auto_signal` auch später feuern. A ist ohnehin negativ, die Folgerung
bleibt — aber A ist nicht exakt das Live-Verhalten.
(3) **Operativ deutlich schwieriger als beim Squeeze:** die Squeeze-Box steht über
viele Bars still, `_pend` dagegen **verankert sich neu**, sobald der Kurs k×ATR
dagegen läuft, nach 12 Bars Timeout ODER bei Richtungswechsel. Eine ruhende Order
müsste ständig nachgezogen werden (Broker-Last, mehr Ablehnungen am
Mindestabstand) — und **wenn sie nicht platzierbar ist, landet man wieder bei A**,
also im gemessen negativen Fall. Wie oft das passiert, ist ungemessen.
(4) `_pend` wird aktuell **nicht im Snapshot veröffentlicht** — das wäre die erste
Bauarbeit.
⚠⚠ **KONSEQUENZ FÜR DEN LAUFENDEN BETRIEB:** SIG steht seit dem 05.08. 08:13 auf
AN (User-Toggle) und läuft dabei über die **Market-Order — also Variante A, die in
beiden Halbjahren negativ ist.** Solange der Pending-Pfad nicht gebaut ist, ist der
Schalter die gemessen schlechte Variante.
**Methodik-Fehler beim Bau, gefunden und behoben:** der erste Entwurf liess
`pend["level"]` nach der Bestätigung über weitere Bars stehen — bei verzögertem
Einstieg (Slot belegt, Konfidenz zu niedrig) wäre er zu einem Preis eingestiegen,
den der Markt längst verlassen hatte. Kein Look-ahead, aber **unerreichbar**, und
sichtbar an einem unplausiblen Bruch zwischen Konf 65 und 75 (+0,33 → 0,12).
Behoben über das `frisch`-Flag. **Lehre: ein Preis, der einmal galt, ist keine
Einstiegsmöglichkeit — nur der Moment der Auslösung zählt.**
- **⚠⚠ 15-MINUTEN-REGEL GANZ ABGESCHALTET (`adverse_15min_atr = 0`, 2026-07-31,
User-Entscheidung nach der Messung).** Auf die User-Frage „vielleicht die Auto-Close
auf 30 min setzen?" wurde die **ZEIT-Achse** mitgemessen