🌕 MOON

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:

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:

AssetTradesWin%PnLPF
BTC5152.9%+$0.271.01
ETH6738.8%-$10.390.86
SOL5030.0%-$26.360.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:

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.

ParameterVorherNachher
Fast EMA38
Slow EMA1521
Signal35

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):


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():


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:


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).

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:

VorherNachher
03-26 14:3026.03. 14:30
$84,500$84.500