Squeeze-Einstieg ueber ruhende Stop-Orders + Meta-Labeling gemessen (verworfen)

1) STOP-ORDER STATT MARKET (gebaut, live). engine._manage_squeeze_pending haelt
beide Box-Grenzen mit BUY_STOP/SELL_STOP bestueckt, solange der Squeeze armed
ist; trader.place_stop/cancel_pending/pending_orders neu. Groesse und SL kommen
aus denselben Funktionen wie die Market-Order, nur bezogen auf den Trigger.
OCO-Ersatz: faellt eine Seite, wird die andere im selben Tick storniert.

Der kritische Punkt bei einer ruhenden Order sind die Gates - sie waren bisher
Laufzeit-Checks im Market-Pfad. Neu: engine._squeeze_guard() als EINE Quelle
fuer beide Wege, jeden Tick neu bewertet; schlaegt ein Gate zu, werden die
Orders storniert. Market bleibt Fallback mit Nachjagd-Bremse
squeeze_max_chase_atr=0.20 (gemessen der noch positive Bereich).

Behandelt: Broker-Mindestabstand, falsche Marktseite, Toleranz 0,02 xATR gegen
Order-Churn, Log nur bei Fehleraenderung, Startup-Schonfrist. 10 Szenarien
getestet, live am Snapshot verifiziert.

2) META-LABELING (backtest_metalabel.py) - VERWORFEN. Zweitmodell auf 12
kausalen Merkmalen, Fit/Test in BEIDEN Richtungen: AUC 0,508 und 0,479 =
Muenzwurf, Kalibrierung im Top-Bucket 74 % vorhergesagt gegen 39 % real, und
8 von 12 Gewichten kippen das Vorzeichen. Die scheinbar besseren Schwellen
sind reine Handelsvermeidung und reproduzieren gegenlaeufig nicht.
23. verworfener Signal-Eingriff - deckt sich mit dem Caveat der Quelle.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-05 09:03:14 +02:00
co-authored by Claude Opus 5
parent 3b00820c15
commit 5e0e8b00ca
4 changed files with 627 additions and 36 deletions
+63 -8
View File
@@ -1236,6 +1236,32 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
**21. verworfener Signal-Eingriff.** ⚠ Grenzen: eine Schwung-Definition (M15-Pivots
k=3, ≥2×ATR); die Pivot-Kontrolle ist dünner (n=173/224). Der Vergleich ist aber
design-intern, die relative Aussage damit robuster als die Absolutwerte.
- **Meta-Labeling (López de Prado) auf dem Wellensignal = VERWORFEN (gemessen
`backtest_metalabel.py`, 2026-08-05, aus der Web-Recherche „Best Practices"):**
Kein 23. Filter, sondern ein **Zweitmodell**, das für ein bereits erzeugtes Signal
P(Gewinn) schätzt — dieselbe Machinerie wie das erfolgreiche P(break)-Modell
(12 kausale Merkmale: Konfidenz · Überdehnung · HTF/H1-Übereinstimmung · Kosten ·
Vola-Regime · mom3/mom6 · Efficiency Ratio · Nacht · Entry-Raum · Winkel;
logistische Regression, Fit auf einer Hälfte, Test auf der anderen, **in BEIDEN
Richtungen**). Population = der volle Live-Gate-Stack (929 bzw. 1316 Signale).
**Fällt klar durch:**
| | Fit H1 → Test H2 | Fit H2 → Test H1 |
|---|---|---|
| **AUC oos** | **0,508** | **0,479** |
| Kalibrierung | 49,3 % vorhergesagt vs. **38,6 %** real | 37,2 vs. 38,0 % |
| Top-Bucket (p≥0,55) | **74,1 % vorhergesagt, 39,1 % real** | (existiert nicht) |
Münzwurf in beiden Richtungen (P(break) erreicht 0,65), und **8 von 12
Merkmalsgewichten kippen das Vorzeichen** zwischen den Fits — das Modell lernt
nichts Stabiles. Die im H1→H2-Lauf scheinbar „besseren" Schwellen (p≥0,45…0,55)
sind reine **Handelsvermeidung** (ΣR steigt nur, weil n fällt; ØR bleibt negativ)
und reproduzieren in der Gegenrichtung nicht. **23. verworfener Signal-Eingriff.**
⚠ Deckt sich exakt mit dem Caveat der Quelle (Hudson & Thames): *„if the algorithm
is bad then meta-labeling would likely only reduce the downside."* Das Wellensignal
ist in H1 gemessen negativ — ein Zweitmodell rettet ein schwaches Primärsignal nicht.
**Was das positiv zeigt:** die Trennung „am Signal ist nichts zu holen, der Hebel
liegt in **Ausführung** und Verhalten" hält auch gegen die aktuelle Lehrmeinung.
Am selben Tag hat der Ausführungs-Hebel (Stop-Order statt Market) **+0,61 ØR**
gebracht — mehr als alle 23 Signal-Ideen zusammen.
- **„Erst messen, dann umbauen":** Strategie-Änderungen per Backtest belegen, nicht
raten. Gegen-Trend verliert; nicht bei WARTEN handeln. **Stichproben ~28 Tage**
ein Trend-Regime; Befunde später auf mehr/andere History gegenprüfen.
@@ -1500,14 +1526,43 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche:
**blockiert-dann-freigegebenen** Ausbrüchen: feuert der Squeeze, während eine
Position offen ist (oder Nacht-/News-Fenster), wird KEIN Dedup-Marker gesetzt — der
Entry kommt später zum dann gültigen Marktpreis, u. U. weit hinter dem Level.
**Noch NICHT gebaut** Umsetzung hat echte Fallstricke: die Guards (Nacht,
News-Blackout, Cooldowns, flat-Prüfung) wirken heute als Laufzeit-Checks; mit einer
ruhenden Order müssten sie über **Platzieren/Stornieren** durchgesetzt werden, sonst
feuert eine vergessene Pending-Order in einem gesperrten Fenster. Dazu: MT5-Mindest-
abstand (`SYMBOL_TRADE_STOPS_LEVEL`) kann die Platzierung ablehnen, wenn der Kurs
schon zu nah am Level steht, und die Order muss storniert werden, sobald der Squeeze
sich klärt. **Das ist der stärkste offene Hebel im Projekt** — größer als jeder der
22 verworfenen Signal-Eingriffe.
✅✅ **GEBAUT & LIVE (2026-08-05, User-Vorgabe „setze alle Vorschläge um"),
`[trading] squeeze_pending_entry=true`.** `engine._manage_squeeze_pending` (im
`_pos_loop`, VOR dem Market-Pfad) hält **beide Box-Grenzen** mit ruhenden
`BUY_STOP`/`SELL_STOP` bestückt, solange der Squeeze `armed` ist:
`trader.place_stop/cancel_pending/pending_orders` (Größe und SL aus **denselben**
Funktionen wie die Market-Order, nur bezogen auf den Trigger-Preis — sonst wäre der
SL-Abstand ein anderer als validiert). **OCO-Ersatz:** füllt eine Seite, existiert
eine Position → die Bedingung „soll liegen" wird falsch und die Gegenseite wird im
selben Tick storniert (MT5 kennt kein natives OCO).
**Der kritische Punkt bei einer RUHENDEN Order: die Gates.** Nacht-Fenster,
News-Blackout, Circuit-Breaker und der An/Aus-Schalter waren bisher Laufzeit-Checks
im Market-Pfad; eine liegende Order würde sie schlicht ignorieren. Deshalb neu
**`engine._squeeze_guard()` als EINE Quelle für beide Wege** — jeden Tick neu
bewertet, und sobald ein Gate zuschlägt, werden die Orders **storniert**. Zwei
Kopien derselben Gates wären genau die Divergenz, die hier siebenmal als
Deployment-Drift dokumentiert ist.
**Market bleibt nur noch FALLBACK — mit Nachjagd-Bremse** (`squeeze_max_chase_atr`
= **0,20**): greift keine Pending (Broker-Mindestabstand, Squeeze sprang direkt auf
`active`, Order-Fehler), wird nur noch eingestiegen, solange der Kurs **höchstens
0,20×ATR** über dem Level steht — genau der Bereich, der gemessen in beiden Hälften
positiv ist (+0,244/+0,426). Darüber: Ausbruch auslassen, Log „⏭ Auto-Squeeze
übersprungen". `_squeeze_last_sig` wird dabei NICHT gesetzt → läuft der Kurs zum
Level zurück, darf der Entry noch kommen.
⚠ Weitere Fallstricke, alle behandelt: **Broker-Mindestabstand**
(`trade_stops_level`) wird VOR dem Senden geprüft und der Fehler nur bei ÄNDERUNG
geloggt (sonst 1 Zeile/Sekunde, wenn der Kurs an der Box-Grenze klebt) · Order auf
der falschen Marktseite wird abgelehnt · **Toleranz 0,02×ATR**, damit nicht jede
ATR-Zuckung die Orders löscht und neu setzt · Startup-Schonfrist gilt auch hier.
**Mit 10 Szenarien getestet** (setzen · Idempotenz beim zweiten Tick · Fill →
Gegenseite weg · Squeeze klärt sich · Gate schlägt zu · Schonfrist · Feature aus ·
Box verschiebt sich · Broker lehnt ab · Nachjagd-Bremse in beide Richtungen).
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`).
- **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.