120 lines
5.6 KiB
Markdown
120 lines
5.6 KiB
Markdown
---
|
||
type: Trading-Modul-System
|
||
_organized: true
|
||
---
|
||
|
||
# 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
|
||
**1–4 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_close` ⇒ `break_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.
|
||
```
|