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 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-04 11:28:38 +02:00
co-authored by Claude Opus 5
parent 1a67944842
commit dcdd53b703
2 changed files with 45 additions and 9 deletions
+19 -9
View File
@@ -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 = angle90` 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).