trading-system-docs/trend-pullback-v1.1-spec.md
Red Queen 022c30e537 feat(tolaria): migrate C3H HR wave 1 — 16 safe root↔canonical pairs to schema v1
C3H HUMAN REVIEW WAVE 1: migriert 16 freigegebene HR-A PAIR_MIGRATION_SAFE Paare.
Pro Pair: Root (representation=source) + Canonical (representation=canonical,
derived_from=Root-ID) atomar. Body byte-genau unveraendert. IDs stabil aus
C3 Mapping Preview v2. modul-12/18/19/vps.md NICHT angefasst.
Knowledge schema v1. (Red Queen)
2026-08-25 19:19:02 +00:00

123 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
knowledge_schema: 1
id: object/91c7786c-cffa-1197-0837-e55a87cdc161
type: design
role: design
representation: source
state: current
---
# 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_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.
```