- Python 85.5%
- JavaScript 7.7%
- CSS 3.9%
- HTML 2.9%
| deploy | ||
| docs | ||
| scripts | ||
| src/krypto_dca | ||
| tests | ||
| web | ||
| .gitattributes | ||
| .gitignore | ||
| config.example.ini | ||
| LICENSE | ||
| pyproject.toml | ||
| README.md | ||
| requirements-dev.txt | ||
| requirements.txt | ||
krypto-dca-bot
Automatischer Krypto-DCA-Bot (Dollar-Cost-Averaging) mit kleinem Startkapital. Läuft „fire and forget" nativ per systemd auf einem VPS, kauft nach festem Zeitplan BTC/ETH auf Kraken und stellt ein Web-Dashboard mit Beständen, Wertentwicklung und Buy&Hold-Vergleich bereit.
⚠️ Risiko-Hinweis / kein Finanzrat Krypto ist hochvolatil. Bei kleinem Einsatz ist auf kurze Sicht (Wochen/Monate) eher mit Verlust als mit Gewinn zu rechnen – unabhängig von der Qualität des Bots. Als langfristiges, geduldiges DCA-Projekt (Jahre) ist die Ausgangslage realistischer, aber weiterhin nicht risikofrei. Vor dem Live-Betrieb im
paper-Modus laufen lassen. Nutzung auf eigene Gefahr.
Architektur
Alles läuft nativ (kein Docker) auf dem VPS, getrennt in drei Einheiten:
| Einheit | Typ | Aufgabe |
|---|---|---|
| Bot-Kern | systemd-Timer | wöchentlicher DCA-Kauf, täglicher Dip-Kauf, Snapshots – kein Dauerprozess |
| Backend | systemd-Service (Restart=always) |
krypto-dca serve – FastAPI/uvicorn, liest SQLite read-only, REST für's Frontend |
| Frontend | statische Dateien | Dashboard, von nginx ausgeliefert |
REST-Endpunkte (alle read-only, hinter nginx + Basic Auth):
| Endpunkt | Zweck |
|---|---|
GET /api/health |
Liveness + DB-Erreichbarkeit |
GET /api/summary |
aktueller Stand: investiert, Cash, Bestände, Wert, PnL, Buy&Hold-Vergleich |
GET /api/history?days=30 |
Zeitreihen: Portfoliowert, kumuliert investiert, Buy&Hold-Linie, Kurse je Symbol |
GET /api/trades?limit=50&offset=0 |
Trade-Historie (neueste zuerst, paginiert) |
GET /api/backtest?days=730&source=binance |
Strategie-Replay (DCA / DCA+Dip / Buy&Hold); holt/cacht bei Bedarf OHLC-Kurse – der einzige nicht rein lesende Endpunkt |
- Exchange: Kraken über
ccxt - Datenhaltung: SQLite (
trades,balance_snapshots,price_history,ohlcv_cachefürs Backtesting) - Reverse Proxy: bestehendes nginx auf dem VPS →
trading.uliana.de(acme.sh-Zertifikat, HTTP Basic Auth); FastAPI lauscht nur auf127.0.0.1 - Logs: stdout → journald → promtail → Loki
- Service-User: dedizierter
krypto-dca(nicht root)
/opt/krypto-dca-bot/ # Deployment-Ziel auf dem VPS
├── src/krypto_dca/ # Bot-Kern + FastAPI (api.py)
├── deploy/ # systemd-Units + nginx-vhost
├── web/ # statisches Dashboard (HTML/CSS/JS, kein Build)
├── scripts/seed_demo.py # Demo-DB für lokale Dashboard-Entwicklung
├── data/trading.db # SQLite (nicht im Repo)
└── config.ini # Secrets & Parameter (nicht im Repo)
Sicherheit
Der Kraken-API-Key wird ausschließlich mit diesen Rechten angelegt:
- ✅ Query Funds
- ✅ Query Open Orders & Trades
- ✅ Create & Modify Orders
- ❌ niemals Withdraw Funds
config.ini liegt nur auf dem Server (chmod 600, Owner krypto-dca) und ist
über .gitignore vom Repo ausgeschlossen. Vorlage: config.example.ini.
Konfiguration (Defaults)
Alle Werte in config.ini überschreibbar:
| Parameter | Default |
|---|---|
mode |
paper (simuliert, echte Kurse – Umstellung auf live per Config) |
| Rhythmus | wöchentlich, Montag 08:00 Ortszeit (Europe/Berlin) |
| Betrag | 12 € pro Kauf |
| Assets | BTC/EUR 50 %, ETH/EUR 50 % |
| Snapshots | Preis stündlich, Bestand 2×/Tag (08:00 + 20:00 Ortszeit) plus direkt nach jedem Kauf |
Extra-Kauf ([dip]) |
aus; SMA 20 Tage, Kauf bei ≥ 10 % darunter, max. 1×/Woche/Asset |
Telegram ([notify]) |
aus |
| Backend | 127.0.0.1:8787 |
Extra-Kauf bei Kurseinbruch: krypto-dca dip-buy (eigener Timer, täglich)
kauft zusätzlich zum Wochenrhythmus, wenn ein Asset ≥ dip.threshold_pct unter
seinem gleitenden Durchschnitt (dip.ma_days aus der price_history) liegt.
Höchstens ein Dip-Kauf pro Asset pro ISO-Woche, immer durch
safety.max_total_spend gedeckelt. Standardmäßig deaktiviert ([dip] enabled).
Setup
Schritt-für-Schritt-Anleitung für den VPS: docs/SETUP.md.
Dashboard lokal ausprobieren
python scripts/seed_demo.py data/trading.db # synthetische Demo-Daten
cp config.example.ini config.ini && sed -i 's#^data_dir = .*#data_dir = data#' config.ini
krypto-dca --config config.ini serve # http://127.0.0.1:8787/
serve liefert im Dev auch die statischen Dateien aus web/ aus (same-origin,
kein CORS). In Produktion macht das nginx, serve bleibt reines /api.
Backtesting
krypto-dca backtest spielt die aktuelle Konfiguration ([strategy] + [dip])
gegen historische Kraken-Kurse durch und vergleicht drei Strategien über
denselben Zeitraum und dasselbe Geld: wöchentliches DCA, DCA + Dip, Buy & Hold.
krypto-dca backtest --days 365 # letzte 365 Tage, Tageskerzen
krypto-dca backtest --from 2024-01-01 --to 2025-01-01
krypto-dca backtest --from 2021-01-01 --source binance --json
Ausgabe: eingezahlt, Endwert, PnL, CAGR, max. Drawdown, Anzahl Käufe je Strategie
(--json für die maschinenlesbare Form). Kurse werden in ohlcv_cache (SQLite)
zwischengespeichert; --refresh erzwingt einen Neuabruf. Der Backtest schreibt
nie in trades o.ä.
Datenquelle (--source, Default kraken):
| Quelle | Reichweite | Hinweis |
|---|---|---|
kraken |
~720 Kerzen (~2 J. bei 1d) |
über ccxt, wie der Bot selbst |
binance |
mehrere Jahre 1d |
keyless Public-Klines, nur von Binance gelistete Paare (BTC/EUR, ETH/EUR ok) |
Für weiter zurückreichende Tages-Backtests --source binance; kraken warnt,
wenn das Fenster vor seinem Horizont beginnt.
Das Dashboard hat dieselbe Funktion als Panel (Zeitraum / Kerzen / Quelle →
Ergebnistabelle), es ruft GET /api/backtest auf.
Umsetzungsstand
- PR1 – Projektgerüst, Config, DB, Kraken-Client, DCA-Strategie, Paper-Modus, systemd-Units, Tests
- PR2 – FastAPI-Backend (
/api/summary,/api/history,/api/trades,/api/health),krypto-dca serve, backend-Service, nginx-vhost - PR3 – Statisches Dashboard (Kennzahlen, Wertentwicklungs-Chart mit 30/90/365-Tage-Umschalter, paginierte Trade-Historie, Buy&Hold-Vergleich);
servemountetweb/im Dev, nginx im Prod; Demo-Seed-Skript - PR4 – Telegram-Benachrichtigungen (
[notify], stdlib-HTTP) je Buy-/Dip-Lauf; Extra-Kaufkrypto-dca dip-buybei Kurs unter gleitendem Durchschnitt ([dip], eigener Timer) - PR5 – Backtesting:
krypto-dca backtestspielt[strategy]+[dip]gegen historische Kurse durch (DCA / DCA+Dip / Buy&Hold), OHLC-Cache in SQLite, Text- oder JSON-Report - PR6 –
backtest --source binance: keyless Binance-Klines als zweite OHLC-Quelle für mehrjährige Tages-Backtests (Kraken bleibt Default) - PR7 – Backtest im Dashboard:
GET /api/backtest+ Panel im Frontend (Zeitraum/Kerzen/Quelle → Tabelle);load_and_runvon CLI und API geteilt
Mitwirkende
Dieses Projekt wurde in Zusammenarbeit mit Claude (Sonnet 5) von Anthropic entwickelt und iterativ ausgebaut. Der überwiegende Teil des Codes, der Architektur und der Dokumentation wurde durch KI generiert und gemeinsam verfeinert.
| Rolle | Person / Tool |
|---|---|
| Projektidee, Anforderungen & Tests | DasAoD |
| Code, Architektur, Dokumentation | Claude (Anthropic) |