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 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-01 17:42:25 +02:00
co-authored by Claude Opus 5
parent 7d68dfc4db
commit d0f3b78796
2 changed files with 42 additions and 9 deletions
+20 -4
View File
@@ -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
+22 -5
View File
@@ -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
# (2326 %), 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 (2326 %), 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