trading-system-docs/trend-pullback-v1.1-spec.md

5.5 KiB
Raw Permalink Blame History

trend_pullback_v1.1 — Spezifikation

Status: IMPLEMENTIERT + DEPLOYT (backtesting:0.1.2, Modul-12), V1-Kompatibilitätsmodus bitgenau. Erstellt: 20.08.2026 (Rain Ocampo) · Aktualisiert: 20.08.2026

1. Motivation

Die Produktions-Strategie trend_pullback_v1 (Modul-05/12) ist unter den unveränderten produktiven Regime-Schwellen fachlich widersprüchlich (messbar): Ein TREND_UP-Regime verlangt Volatilität, der Pullback close < EMA20 verlangt ein flaches Plateau. Im 60-Bars-Produktionsfenster (regime_lookback=60) schneiden sich TREND_UP und close<EMA20 nur in 14 von 1620 Kerzen (m13_evidence.py, Messwerte 20.08.2026). Die Vol-Override (HIGH_VOL/LOW_VOL) kippt das Regime bei jedem sinnvollen Pullback (>95% der close<EMA20-Kerzen werden LOW_VOL).

V1.1 trennt Richtung und Pullback-Timing. Richtung wird aus einem strategie-internen, längeren Fenster berechnet (nicht durch Vol-Override kippbar); Volatilität fließt nur noch ins Pullback-Timing (ATR-Band um EMA20) ein.

2. Kernentscheidungen

  1. V1.1 bleibt zustandslos. Trendrichtung wird jede Bar neu aus dem aktuellen Fenster berechnet. Kein Sticky-State. Kein Hidden-State. Begründung: einfacher, transparenter und reproduzierbarer (deterministisch nach Seed/Replay).

  2. Kein kurzfristiger Vol-Override auf die Richtung. regime_vol_override=false (V1.1-Default): Die Trend-Richtung wird strategie-intern berechnet und nicht durch HIGH_/LOW_VOLATILITY überschrieben. Volatilität beeinflusst nur das Pullback-Timing (Band).

  3. Optimierungsraum für V1.1 bewusst klein. Erste Iteration optimiert ausschließlich pullback_band_atr, trend_regime_window, rr_multiplier. ADX-/EMA-Perioden und atr_period bleiben fix auf produktiven V1-Werten.

3. Pseudo-Regel (Variante A, lookahead-frei)

Strategie-intern, jede Bar, aus geordneten prev_*-Serien (kein Lookahead, kein versteckter Zustand):

# --- Trend-Richtung (Fenster = trend_regime_window) ---
ema_fast_l = EMA(prev_closes, ema_fast_period, lookback=trend_regime_window)
ema_slow_l = EMA(prev_closes, ema_slow_period, lookback=trend_regime_window)
adx_l      = ADX(prev_highs, prev_lows, prev_closes, adx_period, lookback=trend_regime_window)

trend_dir = UP   wenn (ema_fast_l > ema_slow_l) UND adx_l >= adx_trend_threshold
trend_dir = DOWN wenn (ema_fast_l < ema_slow_l) UND adx_l >= adx_trend_threshold
sonst: kein Trade            # KEIN atr_ratio-Check für die Richtung

# --- Pullback-Timing (ATR-Band um EMA20) ---
atr_prev       = ATR(prev_highs, prev_lows, prev_closes, atr_period)
ema20          = EMA20(prev_closes)
pullback_limit = ema20 + pullback_band_atr * atr_prev   # LONG
pullback_limit = ema20 - pullback_band_atr * atr_prev   # SHORT

LONG  wenn trend_dir==UP   UND last_close>sma200 UND last_close < pullback_limit
       UND last_close>prev_close UND swing_low<last_close UND rr>=min_risk_reward
SHORT wenn trend_dir==DOWN UND last_close<sma200 UND last_close > pullback_limit
       UND last_close<prev_close UND swing_high>last_close UND rr>=min_risk_reward
  • break_high entfällt (Befund: prev_high ≥ prev_closebreak_high ⇒ close_up; bleibt als close_up/close_down erhalten — nicht restriktiv).
  • Deterministisch: reine Listen-Berechnung, kein Zufall, kein Hidden-State.

4. Parameter-Tabelle

Parameter V1 produktiv (Code) V1.1 Default Min Max Zweck V1.1 Optimierbar?
pullback_band_atr — (strikt < EMA20) 0.35 0.0 1.0 ATR-Band um EMA20. 0.0=strikt V1. Ja
atr_period 14 14 14 (fix) 14 (fix) ATR-Fenster für Pullback-Band Nein (fix)
trend_regime_window 60 (geteilter 60er) 200 60 500 Fenster für strategie-internes Trend-Regime Ja
regime_vol_override true (geteilt) false false=V1.1 strategie-eigene Richtung Nein (fix)
rr_multiplier 2.0 2.0 1.0 4.0 Target = Entry + rr_multiplier×Risiko Ja
min_risk_reward 1.0 1.0 1.0 (min) 3.0 Mindest-RR; keine Kandidaten mit Chance/Risiko <1 Nein (fix)

Zusätzliche Trend-Parameter (produktiv, V1.1 fix — NICHT von Modul-13 optimieren):

Parameter V1 produktiv (Code) V1.1 Zweck
adx_trend_threshold 20.0 (config.py:54) fix 20.0 ADX-Schwelle für echten Trend
adx_period 14 (config.py:50) fix 14 ADX-Indikatorfenster
ema_fast_period 20 (config.py:36) fix 20 Fast-EMA (Strategie-Pullback-Basis)
ema_slow_period 30 (config.py:47) fix 30 Slow-EMA (Regime-Flanke)

5. V1-Kompatibilitätsmodus (bitgenau V1)

pullback_band_atr   = 0.0
regime_vol_override = true
trend_regime_window = 60
+ alle übrigen V1-Parameter auf produktiven Defaults

⇒ muss V1 bitgenau reproduzieren (Rückwärtskompatibilität; Backtest ohne strategy_params bleibt fachlich identisch). E2E-verifiziert: V1-Kompatmodus LONG+SHORT bitgenau (net 200.0, target r=2.0).

6. Abgrenzung / No-Go

  • Keine KI/LLM in V1.1, keine Live-Orders.
  • Produktions-Regime-Schwellen (adx_trend_threshold=20, trend_min_ema_gap=0.02, high_vol_atr_ratio=0.03, low_vol_atr_ratio=0.008) werden nicht verändert.
  • atr_period, ADX-/EMA-Perioden, min_risk_reward werden in dieser ersten Optimierungsrunde nicht über Modul-13 optimiert.

Geändert

Geändert von: Rain Ocampo
Datum: 20.08.2026
Grund: V1.1-Spec von ENTWURF auf DEPLOYT aktualisiert (backtesting:0.1.2); V1-Kompatmodus bitgenau E2E-verifiziert.