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).