Changelog — Kraken RBI Bot
2026-04-16 — Walk-Forward-Validierung & strukturelle Hebel
Ehrliche Aufarbeitung der Strategie-Performance auf langer Historie. Aus "30d-Sample mit Phantom-PF 2.85" wurde nach 7 systematischen Hebel-Tests eine "540d-validierte Strategie mit PF 1.09 / OOS PF 1.74". Jede Änderung ist In-Sample und Out-of-Sample dokumentiert (siehe STRATEGIES.md §8).
1. Daten: 30d → 540d echte Historie
Problem: BTC_USD_1h_90d.csv enthielt nur 720 Bars (= 30 Tage) — Krakens Public-OHLCV-API liefert max ~720 Bars zurück, ignoriert since-Parameter.
Fix: data/downloader.py um download_long_history() erweitert (Binance als Quelle, BTC/USDT als <0.1%-Spread-Proxy für BTC/USD). Echte paginierte Historie. Aktuell 12'960 Bars (= 540 Tage) verfügbar.
python3 data/downloader.py --source binance --symbol BTC/USDT --days 540
2. Asymmetrische Exits (sl_tp_only) — größter Einzelhebel
Problem: adaptive_strategy.py hat MACD sowohl für Entry _als auch_ Exit verwendet → Whipsaw in choppy Phasen, 10/11 paired Live-Trades exiteten via MACD-Reversal vor Erreichen von SL/TP.
Fix: Neuer Default exit_mode='sl_tp_only'. MACD-Cross-Down-Exit entfernt; Exits laufen ausschließlich über ATR-SL/TP plus HTF-Reversal/ Regime-Shift als strukturelle Notbremse. 'macd_reverse' bleibt für A/B-Vergleich erhalten.
Effekt: WR 33.6% → 48.5%, PF 0.56 → 0.90, DD 4.25% → 1.74%.
3. Pro-Trade-SL/TP in Backtest = Live-Konsistenz
adaptive_strategy.py schreibt jetzt sl_price/tp_price pro Bar via _atr_levels(), was die RISK_PROFILES aus bot/dynamic_risk.py spiegelt. Backtest-Engine (engine.py) liest diese Spalten und nutzt sie statt der statischen BacktestConfig-Werte.
Garantie: Was der Backtest sieht, sieht der Live-Bot 1:1 — nur mit echten Order-Fills statt modellierter Hits.
4. Squeeze-Breakouts disabled (Negativ-Befund)
Befund OOS: 60% SL-Hit-Rate, -7.4% net. BB-Upper-Confirmation feuert nach dem Move.
Fix: enable_squeeze_breakout=False als Default. Code-Pfad bleibt erhalten für späteres Re-Testing mit anderen Daten.
Effekt: OUT-PF 1.18 → 1.74, WR 52.8% → 63.6%.
5. Volume + MACD-Strength Filter (getestet, verworfen)
In-Sample-Quantil-Analyse suggerierte Edge bei Q4-MACD-Strength-Cap (Q4 hatte 25% WR). Walk-Forward widerlegte das vollständig — Filter senkte OUT-WR von 52.8% auf 43.3%. Klassisches Overfitting auf 32 Trades.
min_volume_ratio/min_macd_strength/max_macd_strength bleiben als no-op-Defaults im Code, dokumentiert. Können mit ≥200 Trades neu getunt werden.
6. Short-Engine mit HTF-Persistence-Filter
Spiegelbildliche MACD-Cross-Down-Entries für TRENDING_DOWN-Regime. Engine + dynamic_risk vollständig short-fähig:
Trade.side('long'/'short')- Gespiegelte SL/TP-Hit-Logik (high vs low)
- Korrekte PnL-Vorzeichen
- Eigenes
macd_trend_shortRisk-Profil - 24h-HTF-Persistenz-Filter: Short nur wenn HTF-Trend seit 24 Bars
durchgehend bearish (filtert Pullbacks im Bull-Trend)
Befund: Im 540d-Bull-Sample technisch sauber (50% WR), aber per-Trade-effizienz schlechter als Long-only (Sharpe 0.63 vs 1.10 OOS) — BTC-Bull-Bias macht symmetrische ATR-TPs für Shorts zu eng.
enable_shorts=False als Default (auch weil Kraken-Spot keine Shorts kann).
7. Multi-Asset Portfolio-Runner (Negativ-Befund)
backtesting/portfolio_runner.py neu: Pro-Symbol-Strategy → chronologisch geordnetes Tape → Shared-Capital-Pool mit Risk-pro-Trade-Sizing → Korrelations- Matrix.
ETH und SOL Historie geladen (je 540d 1h von Binance). Resultate:
| Asset | Trades | Win% | PnL | PF |
|---|---|---|---|---|
| BTC | 51 | 52.9% | +$0.27 | 1.01 |
| ETH | 67 | 38.8% | -$10.39 | 0.86 |
| SOL | 50 | 30.0% | -$26.36 | 0.62 |
PnL-Korrelationen sind ideal niedrig (0.09–0.30), aber wenn 2 von 3 Assets keinen Edge haben, diversifiziert man nur Verluste. Strategie ist BTC-spezifisch. Multi-Asset wird _nicht_ aktiviert.
8. Funding-Rate-Filter (struktureller Edge)
Neuer Daten-Loader download_funding_rates() — Binance Perp BTCUSDT Funding-Historie (alle 8h, 1620 Samples auf 540d).
Adaptive Strategy liest optional funding_rate-Spalte. Default-Filter max_funding_for_long=0.00010 (0.010% pro 8h) vetoiert Long-Entries bei überhitztem Markt.
Effekt: Filter dropt 3 von 51 FULL-Trades — alle drei waren Verlierer. PnL +$0.18 → +$3.16, PF 1.00 → 1.09. OOS-Trades waren alle unter Schwelle (kein Effekt OOS, kein Schaden). Filter wirkt strukturell in Mania-Phasen.
9. Live-Bot mit Funding-Integration
bot/funding.py neu: FundingFeed-Klasse, robust mit 15min-Cache, no-auth (Binance Public-API), failsafe (None → Filter wird no-op).
run_bot_v2.py integriert: fetcht Funding pro Cycle, mergt in DataFrame vor generate_signals(), loggt aktuellen Wert.
Garantie: Live-Bot nutzt identische Strategie-Defaults wie Backtest.
10. Backtest-Engine Long+Short-Erweiterung
backtesting/engine.py:
Trade.side,Trade.sl_price,Trade.tp_price,Trade.source- Gespiegelte SL/TP-Hit-Logik je nach Side
_close_trade()mit korrektem PnL-Vorzeichen- Strategy-Output respektiert:
sl_price/tp_price/sideSpalten überschreiben Config-Defaults
11. Dokumentation: STRATEGIES.md neu
Vollständige Architektur, alle Strategien, alle Konfigurations-Defaults mit Begründung, Walk-Forward-Resultate, getestete-aber-verworfene Hebel, Lektionen, Live-Start-Anleitung. Single source of truth für den aktuellen System-Stand.
2026-04-13 — Code Review & Fixes
Umfassende Plausibilitätsprüfung und Bugfixes über das gesamte Projekt.
1. Daily-Loss-Limit Logik (Bug)
Dateien: bot/run_bot.py, bot/run_bot_v2.py
Der Vergleich < wurde zu <= korrigiert. Vorher stoppte der Bot erst nach Überschreitung des Limits, nicht bei Erreichen.
# Vorher
if self.daily_pnl < -(self.max_daily_loss_pct):
# Nachher
if self.daily_pnl <= -(self.max_daily_loss_pct):
2. Position-Closing mit tatsächlichem Betrag (Bug)
Datei: bot/run_bot_v2.py
Der hardcoded Multiplikator 0.08 wurde durch die tatsächliche Positionsgröße ersetzt. Neue Variable position_size_usd trackt den Einstiegsbetrag und berechnet den aktuellen Wert beim Schließen.
# Vorher
amount_usd = self.get_balance() * 0.08 # Approximate
# Nachher
sell_amount = self.position_size_usd * (price / self.entry_price)
3. MACD-Parameter angepasst
Datei: strategies/macd_strategy.py
Die aggressiven Parameter 3/15/3 erzeugten zu viele Fehlsignale auf 1h-Candles. Geändert auf 8/21/5 — weniger Rauschen, bessere Signalqualität.
| Parameter | Vorher | Nachher |
|---|---|---|
| Fast EMA | 3 | 8 |
| Slow EMA | 15 | 21 |
| Signal | 3 | 5 |
4. VWAP Daily Reset (Bug)
Datei: strategies/rsi_strategy.py
VWAP wurde kumulativ über den gesamten Datensatz berechnet und driftete über Tage hinweg. Jetzt wird VWAP täglich zurückgesetzt via groupby(date).
# Vorher — kumulativ ohne Reset
cumulative_tp_vol = (typical_price * df['volume']).cumsum()
# Nachher — Reset pro Tag
cumulative_tp_vol = tp_vol.groupby(date_group).cumsum()
5. HTF Look-Ahead-Bias behoben
Datei: strategies/multi_timeframe.py
Die Higher-Timeframe-Werte (4h) wurden ohne Verzögerung auf die Basis-Candles (1h) gemerged — das bedeutete, man "wusste" den 4h-Trend bevor die Kerze geschlossen war. Fix: 1-Bar-Shift auf alle HTF-Spalten vor dem Merge.
6. Regime-Detector Hysterese
Datei: strategies/regime_detector.py
ADX-Werte um die Schwellen (z.B. 20/25) führten zu ständigem Hin-und-Her-Wechsel zwischen Regimes. Neuer Hysterese-Mechanismus mit konfigurierbarem Puffer (Standard: 2 Punkte):
- Zum Eintritt in ein Regime: ADX muss Schwelle überschreiten
- Zum Verbleib im Regime: ADX darf bis
Schwelle - Hysteresefallen - Zusätzlich: ATR-Percentile benötigt jetzt min. 100 Bars statt 50
7. Adaptive Strategy: HTF-Confirmation & Squeeze-Bug
Datei: strategies/adaptive_strategy.py
HTF-Confirmation verschärft:
# Vorher — neutral (0) reichte als Bestätigung
if htf_trend >= 0:
# Nachher — nur bullish erlaubt
if htf_trend > 0:
Squeeze-Breakout korrigiert:
# Vorher — verglich mit vorheriger Kerze
df['close'].iloc[i] > df['bb_upper'].iloc[i-1]
# Nachher — vergleicht mit aktueller Kerze
df['close'].iloc[i] > df['bb_upper'].iloc[i]
8. Position-State-Persistence (Neu)
Datei: bot/run_bot_v2.py
Neue Funktionen _load_state(), _save_state(), _save_trades():
- Position-State wird nach jedem Open/Close in
logs/position_state.jsongesichert - File-Locking via
fcntlverhindert Race Conditions - Nach Bot-Crash wird die offene Position automatisch wiederhergestellt
- Trade-Log (
logs/trades.json) nutzt ebenfalls File-Locking
9. Hardcoded Pfade entfernt
Dateien: bot/signal_status.py, moon-server.js
Alle absoluten Pfade (/root/kraken-rbi-bot/..., /root/.pm2/logs/...) durch relative bzw. konfigurierbare Pfade ersetzt:
signal_status.py: Nutzt jetztos.path.join(BASE_DIR, 'logs', ...)moon-server.js: Nutztpath.join(__dirname, ...)undprocess.env.PM2_LOG_DIR
10. ATR-basierte Stop-Losses für alle Strategien (Neu)
Dateien: strategies/macd_strategy.py, strategies/rsi_strategy.py, strategies/cvd_strategy.py
Alle drei Einzelstrategien hatten keine Stop-Losses. Jetzt berechnet jede Strategie bei Entry einen ATR-basierten Stop-Loss (Standard: 2× ATR unter Einstiegspreis).
- MACD: Stop-Loss wird bei MACD-Crossover-Entry gesetzt
- RSI: Stop-Loss wird bei RSI-Oversold-Entry gesetzt
- CVD: ATR-Stop ersetzt den hardcoded 2%-Drop
stop_loss = entry_price - atr_sl_mult * df['atr'].iloc[i]
11. Deutsches Datumsformat im Dashboard
Datei: moon-server.js
Trade-History-Tabelle zeigt Datum jetzt im deutschen Format:
| Vorher | Nachher |
|---|---|
03-26 14:30 | 26.03. 14:30 |
$84,500 | $84.500 |