From dcdd53b7032a7e50c64704ac8f2c36d6493e2f9d Mon Sep 17 00:00:00 2001 From: Axel Hocks Date: Tue, 4 Aug 2026 11:28:38 +0200 Subject: [PATCH] Winkel-Beschriftung korrigiert (Zahlen unveraendert) + Spiegeltest bestanden Anlass: "pruefe die Logik im umgekehrten Fall, fallender Kurs". 1) Spiegeltest bestanden. Mit reversal_enabled=false ist das Verhalten ueber die ganze Ueberdehnungs-Spanne exakt symmetrisch (steigend/LONG <-> fallend/SHORT): gleiche Signale, gleiche Konfidenz, gleicher Anti-Ueberdehnungs-Schnitt bei 3,5. 2) Dabei gefunden: die Winkel-Beschriftung war ueberall invertiert. calc_trend_angle liefert 0 Grad = AUFWAERTS ... 180 = ABWAERTS, also ist ad = angle-90 NEGATIV bei steigendem Kurs. Ein LONG in einem steigenden Markt bekam daher "Winkel gegen EMA" (-10), ein LONG in einem fallenden "Winkel bestaetigt" (+5). ABER: backtest_angle.py benutzt DIESELBE verdrehte Beschriftung (a5_dis = a5 < 90-dead fuer LONG heisst "dagegen", ist aber STEIGEND). Der dokumentierte Befund "dafuer/neutral +0,055 vs dagegen +0,025" bedeutet richtig gelesen: LONG bei FALLENDEM Kurzfrist-Winkel (= Pullback) traegt doppelt so gut. Das ist der mehrfach belegte Pullback-Effekt. => Die Gewichtung war von Anfang an NUMERISCH RICHTIG. Nicht umgedreht. Geaendert wurden nur die Reason-Texte und Kommentare. Verifiziert: Konfidenzwerte vorher/nachher identisch (60/70/75 je Richtung). Lehre: der erste Verdacht "systematisch invertierte Logik" war falsch - die Zahlen stimmten, die Sprache log. Bei einer verdrehten Konvention erst pruefen, ob die MESSUNG dieselbe Verdrehung teilt, bevor man den Code "repariert". Beim Reversal war es anders: dort wies die eigenstaendige Messung das Setup unabhaengig von der Beschriftung als negativ aus. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 26 ++++++++++++++++++++++++++ core/wave_rec.py | 28 +++++++++++++++++++--------- 2 files changed, 45 insertions(+), 9 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 4a250f1..340a779 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -385,6 +385,32 @@ dort bereits nachvalidiert, ØR +0,305.) **Eine** Oberfläche: `_after_min`. Mit 4 synthetischen Szenarien getestet (5 min vor/nach Event, 50 min davor = kein Blackout, disabled) + Live-Fetch verifiziert (EIA lag korrekt auf Mi 16:30 Berlin). +- **⚠⚠ WINKEL-BESCHRIFTUNG WAR ÜBERALL INVERTIERT — Text korrigiert 2026-08-04, ZAHLEN + unverändert.** Beim Spiegeltest (User: „prüfe die Logik im umgekehrten Fall, fallender + Kurs") kam heraus: `calc_trend_angle` liefert **0°=AUFWÄRTS … 180°=ABWÄRTS**, also ist + `ad = angle−90` **negativ bei STEIGENDEM** Kurs. Damit sagten die Texte das Gegenteil + dessen, was passierte — ein LONG in einem steigenden Markt bekam „⚠ Winkel gegen EMA" + (−10), ein LONG in einem fallenden „Winkel bestätigt" (+5). + ⚠ **Und `backtest_angle.py` benutzt DIESELBE verdrehte Beschriftung** + (`a5_dis = a5 < 90-dead` für LONG heißt „dagegen", ist aber STEIGEND). Der + dokumentierte Befund „Winkel dafür/neutral +0,055 vs dagegen +0,025" bedeutet richtig + gelesen: **LONG bei FALLENDEM Kurzfrist-Winkel (= Pullback) trägt doppelt so gut wie + bei bereits steigendem.** Das ist der im Projekt mehrfach belegte **Pullback-Effekt** + (vgl. „⭐ tiefer Pullback" und den RSI-Befund: *bestätigende* Oszillatoren sind + schlechter). + ✅ **Konsequenz: die Gewichtung war von Anfang an NUMERISCH RICHTIG** — nur hieß der + Bonus „bestätigt", obwohl er den Gegen-Winkel belohnt. **Nicht umdrehen.** Geändert + wurden ausschließlich die Reason-Texte („⭐ Pullback (Kurzfrist-Winkel gegen den + Trend)" / „kein Pullback — Kurs läuft dem Signal schon davon") und die Kommentare. + Verifiziert: Konfidenzwerte vorher/nachher identisch (60/70/75 je Richtung). + ⚠ **Lehre:** Der erste Verdacht lautete „systematisch invertierte Logik" — er war + falsch. Die Zahlen stimmten, die Sprache log. Bei einer verdrehten Konvention muss man + prüfen, ob die MESSUNG dieselbe Verdrehung teilt, bevor man den Code „repariert". + (Beim Reversal war es anders: dort hat die eigenständige Messung das Setup unabhängig + von der Beschriftung als negativ ausgewiesen.) + ✅ **Spiegeltest bestanden:** Mit `reversal_enabled=false` ist das Verhalten über die + ganze Überdehnungs-Spanne **exakt symmetrisch** (steigend/LONG ↔ fallend/SHORT): + gleiche Signale, gleiche Konfidenz, gleicher Anti-Überdehnungs-Schnitt bei 3,5. - **Winkel-vs-EMA-Warnung (nur Konfidenz):** Regressions-Winkel der Basis-TF gegen die EMA-Richtung → −10 „⚠ Winkel gegen EMA (mögliche Wende)" (nachlaufende EMA!); dafür → +5. `backtest_angle.py`: dafür/neutral +0,055 vs dagegen +0,025; als Gate diff --git a/core/wave_rec.py b/core/wave_rec.py index 8917fee..74a6f90 100644 --- a/core/wave_rec.py +++ b/core/wave_rec.py @@ -94,8 +94,9 @@ _H1_AGAINST_PEN = 8 # H1 steht gegen die Richtung (M30 ok/neutral) → sc # +0,025). NUR Konfidenz/Warnung — als hartes Gate senkt es den Gesamtertrag. _ANGLE_LR = 14 # Regressionsfenster (= ANGLE_LR_BARS) _ANGLE_DEAD = 2.0 # Totband um 90° (Grad) → darunter „neutral" -_ANGLE_BONUS = 5 # Winkel bestätigt die EMA-Richtung -_ANGLE_PENALTY = 10 # Winkel klar GEGEN die EMA-Richtung (mögliche Wende) +# ⚠ Namen historisch, Bedeutung 2026-08-04 richtiggestellt (Zahlen unverändert): +_ANGLE_BONUS = 5 # Kurzfrist-Winkel läuft GEGEN das Signal = PULLBACK → besser +_ANGLE_PENALTY = 10 # Kurzfrist-Winkel läuft schon MIT = kein Pullback → schlechter # Tageszeit-Gate — REAKTIVIERT 2026-07-13 (User-OK) nach Echtkosten-Messung # (`backtest_realcosts.py`, Kosten = Bar-Spread/ATR statt pauschal 0,1): @@ -819,17 +820,26 @@ class WaveRecommender: conf -= _H1_AGAINST_PEN reasons.append("H1 gegen Richtung — schwächeres Setup") - # ── Regressions-Winkel vs nachlaufende EMA (nur Konfidenz/Warnung) ─── - # Steht der Winkel der Basis-TF klar GEGEN die EMA-Richtung, ist die EMA - # evtl. am Nachlaufen (Wende) → Warnung. Backtest: Winkel-dafür trägt - # klar besser; als Gate aber Gesamtertrag-negativ → nur Konfidenz. - # (ad = angle − 90 wurde oben in der Reversal-Prüfung bereits berechnet.) + # ── Kurzfrist-Winkel als PULLBACK-Maß (nur Konfidenz) ──────────────── + # ⚠⚠ BESCHRIFTUNG KORRIGIERT 2026-08-04 — die ZAHLEN sind unverändert. + # `calc_trend_angle` liefert 0°=AUFWÄRTS … 180°=ABWÄRTS, also ist + # `ad = angle−90` NEGATIV bei steigendem Kurs. Die alten Texte + # („Winkel bestätigt" / „⚠ Winkel gegen EMA") sagten deshalb genau das + # GEGENTEIL dessen, was hier passiert — und `backtest_angle.py` benutzt + # dieselbe verdrehte Beschriftung („Winkel klar dagegen" = `a5 < 90-dead` + # = in Wahrheit STEIGEND). Der gemessene Befund lautet richtig gelesen: + # LONG bei FALLENDEM/flachem Kurzfrist-Winkel (= Pullback) → ØR +0,055 + # LONG bei bereits STEIGENDEM Winkel (kein Pullback) → ØR +0,025 + # Das ist der im Projekt mehrfach belegte Pullback-Effekt (vgl. „⭐ tiefer + # Pullback" und den RSI-Befund: bestätigende Oszillatoren sind schlechter). + # Die Gewichtung war also von Anfang an numerisch RICHTIG; nur hieß der + # Bonus „bestätigt", obwohl er den Gegen-Winkel belohnt. NICHT umdrehen. if (d_sig > 0 and ad < -_ANGLE_DEAD) or (d_sig < 0 and ad > _ANGLE_DEAD): conf -= _ANGLE_PENALTY - reasons.append("⚠ Winkel gegen EMA (mögliche Wende)") + reasons.append("kein Pullback — Kurs läuft dem Signal schon davon") elif (d_sig > 0 and ad > _ANGLE_DEAD) or (d_sig < 0 and ad < -_ANGLE_DEAD): conf += _ANGLE_BONUS - reasons.append("Winkel bestätigt") + reasons.append("⭐ Pullback (Kurzfrist-Winkel gegen den Trend)") # Hohe Vola dämpfen (oberes ATR-Terzil = schwächster/negativer Edge) — # nur Konfidenz (Schwelle regime-abhängig, kein hartes Gate).