From d0f3b78796ea67912c0f2afaa1077c491160e967 Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Sat, 1 Aug 2026 17:42:25 +0200 Subject: [PATCH] Muster-Verdict-Gewicht 1,0 -> 0,25 (5%) + Korrektur der adverse15-Anekdote Muster-Stimme (User-Vorgabe "geben wir dem Muster doch 5%"): _PAT_W = 0.25 statt fest 1,0; "forming" weiter die Haelfte. Empirisch gesetzt: ueber die letzten 4.000 verdict_votes liegt die Gewichtssumme der uebrigen Module im Median bei 4,50 -> Anteil 5,3 % (vorher 18,2 %). Muster hat in 24,7 % der Verdicts ueberhaupt eine Richtung, max. Nadel-Verschiebung 0,053. Reine Anzeige - der Bias steuert keine Order. Korrektur in CLAUDE.md: Die Anekdote zum Abschalten der 15-Minuten-Regel war falsch. "+19,28/+17,60 moeglich" und "32 EUR weiter dagegen" waren MAXIMALE AUSLENKUNG, nicht das, was der Exit gefangen haette. Mit core/exit_model.py nachgerechnet waere der 11:44-Trade OHNE Regel besser gewesen (-21,43 statt -26,31) und der 20:00-Squeeze schlechter (-23,27 statt -13,77). Ueber alle 7 Bot-Trades des 31.07. haette das Abschalten -16,42 EUR gekostet. Die Entscheidung bleibt richtig - sie ruht auf backtest_adverse15_squeeze.py (16/16 Kombinationen in beiden Haelften negativ), nicht auf einem Tag mit n=3. Der Tagesgewinn kam aus Trail 1,5 -> 1,0 (+24,86 EUR auf denselben Trades). Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 24 ++++++++++++++++++++---- core/engine.py | 27 ++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 182dc56..6149686 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1040,10 +1040,26 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: ein Schnitt nach 15 min trifft genau den Tail. Ohne Regel H1 −54 / H2 **+220**, mit 0,5 H1 −72 / H2 +186. **Anlass (real, 2026-07-31):** drei Bot-Trades wurden per `adverse15` geschlossen — - der **Auto-Signal**-Trade um 11:44 (−26,31 €) wurde damit **gerettet** (danach lief - der Kurs 32 € weiter dagegen), die beiden **Squeeze**-Trades um 20:15/20:36 - (−13,77 / −28,09 €) wurden **zu früh gekappt** (danach +19,28 bzw. +17,60 € möglich, - aus `candles_m1` nachgerechnet). Genau das Muster, das die Messung erklärt. + der **Auto-Signal**-Trade um 11:44 (−26,31 €) und die beiden **Squeeze**-Trades um + 20:15/20:36 (−13,77 / −28,09 €). + ⚠⚠ **DIE URSPRÜNGLICHE ANEKDOTE DAZU WAR FALSCH — korrigiert 2026-08-01.** Hier stand, + der 11:44-Trade sei „gerettet" worden (Kurs lief 32 € weiter dagegen) und die beiden + Squeeze-Trades seien „zu früh gekappt" worden (+19,28 / +17,60 € möglich). Beide Zahlen + waren **maximale Auslenkung** (bester bzw. schlechtester danach berührter Kurs) — also + das, was der Markt hergab, NICHT das, was der Exit gefangen hätte. Mit dem kanonischen + Exit nachgerechnet (`core/exit_model.py`, M5 aus `candles_m1`): + | Trade | IST (mit Regel) | ohne Regel, Trail 1,5 | + |---|---|---| + | 11:29 AUTOSIG | −26,31 | **−21,43** (also NICHT gerettet) | + | 20:00 SQUEEZE | −13,77 | **−23,27** (also NICHT zu früh) | + | 20:21 SQUEEZE | −28,09 | −25,02 | + Über alle 7 Bot-Trades des Tages hätte das Abschalten der Regel **−16,42 € gekostet**; + die Regel hat an DIESEM Tag also geholfen. ⚠ **Die Entscheidung, sie abzuschalten, + bleibt trotzdem richtig** — sie ruht auf `backtest_adverse15_squeeze.py` (alle 16 + Kombinationen in BEIDEN Hälften negativ), nicht auf einem Tag mit n=3. Lehre: eine + Einzeltag-Anekdote taugt nicht als Beleg, auch nicht als *bestätigende* — und + „maximale Auslenkung" ist keine erzielbare Zahl. Der Gewinn des Tages kam woanders her: + die Umstellung **Trail 1,5 → 1,0** brachte auf denselben 7 Trades **+24,86 €**. **Umsetzung:** `_bot_open_source` merkt sich beim Öffnen, WOMIT der Bot eröffnet hat (`auto_squeeze` | `auto_signal`); `_check_adverse15` steigt bei `auto_squeeze` aus. Mit 7 Szenarien getestet (Signal/Squeeze/manuell/altes Ticket · zu früh · unter diff --git a/core/engine.py b/core/engine.py index 5f30bd9..03a44ea 100644 --- a/core/engine.py +++ b/core/engine.py @@ -72,6 +72,11 @@ _MIN_CONF_DISPLAY = 70 # Konfidenz-Schwelle für die "Order ohne Sign # Trader beheimatet, hier als eigener Wert erhalten) _BERLIN = ZoneInfo("Europe/Berlin") _OB_IMB_MIN = 0.30 # Orderbuch-Imbalance darunter = zu schwach fuer eine Stimme +_PAT_W = 0.25 # Verdict-Gewicht der Chartmuster-Stimme (bestaetigt; `forming` + # zaehlt halb). User-Vorgabe 2026-08-01 „5 %" — empirisch aus den + # letzten 4.000 `verdict_votes`: Median der uebrigen Gewichte 4,50 + # → 0,25/(4,50+0,25) = 5,3 % Anteil an der Bias-Nadel (vorher 1,0 + # = 18,2 %). Begruendung + Beleglage bei der Stimme in `_verdict`. _SQUEEZE_NIGHT = (0, 1, 2, 3, 4, 5, 6, 7) # Auto-Squeeze-Nacht-Sperre (Kostenfalle) _SQUEEZE_SR_COOLDOWN_S = 180.0 # nach S/R-Close kein Auto-Squeeze in GLEICHER Richtung # (sonst Close-„Level hält" vs. Entry-„Level bricht"- @@ -2538,10 +2543,22 @@ class TradingEngine: # BEIDEN Hälften positiven, aber kleinen Zusatz über einen GENERISCHEN # Breakout hinaus liefern — Muster ØR +0,206/+0,328 vs. beliebiger Swing-Bruch # +0,184/+0,220 (Delta nur +0,022 in H1, +0,108 in H2). Der Löwenanteil des - # Ertrags kommt also vom Breakout+Trailing, nicht vom Muster. Deshalb 1,0 - # (wie Elliott/KI) statt 2,0 (Squeeze) — und `forming` zählt nur halb, weil - # das Muster dort noch nicht bestätigt ist. Ziel-Trefferquote bleibt niedrig - # (23–26 %), die Stimme sagt also „Richtungstendenz", nicht „Kursziel". + # Ertrags kommt also vom Breakout+Trailing, nicht vom Muster. `forming` zählt + # nur halb, weil das Muster dort noch nicht bestätigt ist. Ziel-Trefferquote + # bleibt niedrig (23–26 %), die Stimme sagt also „Richtungstendenz", nicht + # „Kursziel". + # ⚠ ABGESENKT 1,0 → `_PAT_W`=0,25 (User-Vorgabe 2026-08-01 „geben wir dem + # Muster doch 5 %"). Anlass war die Nachmessung der 2026-07-31 ergänzten + # Handbuch-Muster: von den 8 gemessenen Alt-Typen schlägt nur `cup` die + # Kontrolle, und unter 6 neu getesteten Typen war `wedge_rise` der einzige + # Treffer — bei 6 Vergleichen ist das gut mit Zufall vereinbar. Empfehlung war + # Gewicht 0 (reine Anzeige); der User wollte die Stimme behalten, aber klein. + # 0,25 ist EMPIRISCH gesetzt, nicht geraten: über die letzten 4.000 + # `verdict_votes` liegt die Gewichtssumme der übrigen Module im Median bei + # 4,50 → Anteil 0,25/(4,50+0,25) = **5,3 %** (die alten 1,0 waren 18,2 %). + # Ändert sich das Modul-Gefüge, mit derselben Rechnung nachziehen. + # REINE ANZEIGE — der Bias steuert keine Order (die hängt an der Wellen- + # Headline); die Stimme wird in `verdict_votes` weiter mitgeloggt. pv, pdet, pw = 0, "—", 0.0 try: _pats = (snap_parts_patterns or {}).get("patterns") or [] @@ -2560,7 +2577,7 @@ class TradingEngine: if _p0: pv = 1 if _p0["dir"] == "bull" else -1 _conf = _p0.get("status") == "confirmed" - pw = 1.0 if _conf else 0.5 + pw = _PAT_W if _conf else _PAT_W / 2 pdet = f"{_p0.get('name', '—')} · {'bestätigt' if _conf else 'bildet sich'}" except Exception: pass