Reversal-Setup abgeschaltet (User-Entscheidung nach der Messung)

backtest_reversal_angle.py hat den Trigger in JEDER Variante beidhaelftig
negativ gemessen (IST -0,122/-0,031 - vorzeichenkorrigiert -0,173/-0,061 -
ohne Winkelbedingung -0,099/-0,023). Ausschlag gab aber nicht nur die Zahl:
das Setup hebelt ZWEI gemessen POSITIVE Schutzmechanismen aus - die
Anti-Ueberdehnung und den M30-Gegen-Trend-Filter (Edge x2). Ein Setup ohne
eigenen Edge, das validierte Filter umgeht, ist der unguenstigste Fall.

Umsetzung: neuer Schalter [trading] reversal_enabled (Config-Default im Engine
false). WICHTIG: der Modul-Default in wave_rec bleibt True - saemtliche
Backtests rufen dasselbe _build, ein False-Default haette alle bestehenden
Messungen still veraendert. Abgeschaltet wird ausschliesslich im Live-Pfad.

Verhaltensaenderung nur im Band |stretch| 3,0-3,5: dort kam vorher ein
antizyklisches REV-Signal, jetzt das normale Trendsignal; ab 3,5 greift wie
gehabt die Anti-Ueberdehnung.

Verifiziert:
- 3 Szenarien: ueberkauft+steigend SHORT/WAVE_REV_SHORT -> LONG/WAVE_LONG,
  ueberverkauft+fallend LONG/WAVE_REV_LONG -> SHORT/WAVE_SHORT, normaler
  Trend unveraendert
- Live nach Neustart: bei 3,18xATR Ueberdehnung jetzt WARTEN/setup=WAVE/
  reversal=None statt REV_SHORT; Log "Reversal-Setup AUS"
- measurement_reminder CONFIG_DEPS ergaenzt, 11 Werte alle korrekt

Die Winkelbedingung wurde bewusst NICHT vorzeichenkorrigiert - die korrigierte
Variante misst sich schlechter. Die irrefuehrenden Kommentare sind jetzt als
solche markiert. Bounce-Anzeige bleibt unveraendert (nur Warn-Kontext).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Axel Hocks
2026-08-04 11:19:48 +02:00
co-authored by Claude Opus 5
parent d052905319
commit 1a67944842
4 changed files with 78 additions and 7 deletions
+8
View File
@@ -195,6 +195,14 @@ class TradingEngine:
self.wave.set_entry_room(float(self.cfg["trading"].get("entry_room_atr", "0.6")))
except (TypeError, ValueError):
pass
# Reversal/Bounce-Setup — Default hier **false** (User-Entscheidung 2026-08-04
# nach `backtest_reversal_angle.py`: in JEDER Variante beidhälftig negativ, und
# es hebelt Anti-Überdehnung + M30-Filter aus). Der Modul-Default in `wave_rec`
# bleibt True, damit die Backtests unverändert bleiben — abgeschaltet wird
# ausschließlich hier im Live-Pfad. `reversal_enabled=true` holt es zurück.
self.wave.set_reversal_enabled(
(self.cfg["trading"].get("reversal_enabled", "false") or "false")
.strip().lower() == "true")
# Tageszeit-Gate aus Config (Komma-Liste von Stunden; leer = AUS). Fehlt der
# Key → gemessener Default (im wave_rec-Konstanten-Set). User-Vorgabe 2026-07-22:
# ini auf leer → Gate aus, obwohl 12/16 gemessen negativ sind.
+40 -3
View File
@@ -201,6 +201,27 @@ class WaveRecommender:
# Ertrag ist durch den S/R-Auto-Close gedeckelt, Kosten fressen den Rest.
# 0 = aus. Nur Live-Pfad (refresh_market); Backtests via _build bleiben frei.
self._entry_room_atr = 0.0
# Reversal/Bounce-Setup an/aus. ⚠ Modul-Default bewusst TRUE: sämtliche
# Backtests rufen dasselbe `_build` — ein False-Default würde alle
# bestehenden Messungen still verändern. Abgeschaltet wird über die
# Config (`[trading] reversal_enabled`, s. `engine`), nicht hier.
self._reversal_enabled = True
def set_reversal_enabled(self, on: bool):
"""Antizyklisches Reversal-Setup (WAVE_REV_*) an/aus.
⚠ GEMESSEN NEGATIV (`backtest_reversal_angle.py`, 2026-08-04, 80k M5,
kanonischer Exit, Echtkosten, 2 Halbjahre): ØR 0,122/0,031, PF 0,79/0,94.
Auch die vorzeichenkorrigierte Variante (0,173/0,061) und die Kontrolle
ohne Winkelbedingung (0,099/0,023) sind beidhälftig negativ. Dazu hebt
das Setup ZWEI gemessen positive Schutzmechanismen aus (Anti-Überdehnung
und den M30-Gegen-Trend-Filter, Edge ×2). Deshalb live abgeschaltet.
`true` stellt das alte Verhalten wieder her.
"""
with self._lock:
self._reversal_enabled = bool(on)
log.info(f"Reversal-Setup {'AN' if on else 'AUS'}"
+ ("" if on else " (gemessen negativ, backtest_reversal_angle.py)"))
def set_entry_room(self, x: float):
with self._lock:
@@ -716,11 +737,27 @@ class WaveRecommender:
# aber schwächer als Trend & regime-anfällig (blutet in starken Trends).
# Hebt Anti-Überdehnung UND M30-Filter bewusst auf (per Definition gegen
# die nachlaufende EMA/HTF).
# ⚠⚠ ABGESCHALTET über `[trading] reversal_enabled=false` (2026-08-04).
# Gemessen (`backtest_reversal_angle.py`, 80k M5, kanonischer Exit,
# Echtkosten, 2 Halbjahre) ist der Trigger in JEDER Variante beidhälftig
# negativ: IST 0,122/0,031 · vorzeichenkorrigiert 0,173/0,061 ·
# ohne Winkelbedingung 0,099/0,023. Der Modul-Default bleibt True,
# damit die Backtests unverändert weiterlaufen.
# ⚠ ZUR BEDINGUNG SELBST (nicht korrigiert, weil gemessen SCHLECHTER):
# `calc_trend_angle` liefert 0°=AUFWÄRTS … 180°=ABWÄRTS, also ist
# `ad = angle90` NEGATIV bei STEIGENDEM Kurs. Die untenstehenden
# Kommentare („Winkel auf/ab") beschreiben damit das GEGENTEIL dessen,
# was der Code tut: SHORT feuert bei überkauft UND WEITER STEIGENDEM
# Winkel. Das Vorzeichen wurde bewusst NICHT gedreht — die korrigierte
# Variante misst sich schlechter, und alle Alt-Messungen beruhen auf
# diesem Verhalten.
ad = angle - 90.0
if stretch <= -_REVERSAL_STRETCH and ad >= _ANGLE_DEAD:
sig, reversal = "LONG", True # überverkauft + Winkel aufBounce
if not self._reversal_enabled:
pass # Setup ausnur Trendsignal
elif stretch <= -_REVERSAL_STRETCH and ad >= _ANGLE_DEAD:
sig, reversal = "LONG", True # ⚠ faktisch: Winkel FÄLLT noch
elif stretch >= _REVERSAL_STRETCH and ad <= -_ANGLE_DEAD:
sig, reversal = "SHORT", True # überkauft + Winkel ab → Bounce
sig, reversal = "SHORT", True # ⚠ faktisch: Winkel STEIGT noch
d_sig = 1 if sig == "LONG" else -1