Automatisierter Krypto-DCA-Bot (Kraken/ccxt) mit Web-Interface für Bestände, Verläufe und Trade-Historie – läuft nativ per systemd auf dem VPS.
  • Python 85.5%
  • JavaScript 7.7%
  • CSS 3.9%
  • HTML 2.9%
Find a file
2026-08-31 16:05:08 +02:00
deploy deploy timers: switch OnCalendar to Europe/Berlin local time 2026-08-31 16:04:01 +02:00
docs web, tests, docs: backtest panel on the dashboard 2026-08-28 23:00:58 +02:00
scripts scripts/seed_demo.py, tests, deploy, docs: dashboard dev seed + nginx + coverage 2026-08-28 16:43:24 +02:00
src/krypto_dca cli.py: no buy notification on a clean no-op run 2026-08-31 15:07:50 +02:00
tests cli.py: no buy notification on a clean no-op run 2026-08-31 15:07:50 +02:00
web backtest.py, cli.py, api.py: /api/backtest endpoint, shared load_and_run 2026-08-28 23:00:51 +02:00
.gitattributes pyproject.toml, requirements.txt, .gitattributes: python packaging 2026-08-28 10:27:23 +02:00
.gitignore README.md, LICENSE, .gitignore: initial project scaffold 2026-08-28 10:14:19 +02:00
config.example.ini deploy, web, config.example.ini, docs, tests: dip-buy timer, dashboard tag, PR4 coverage 2026-08-28 17:10:17 +02:00
LICENSE README.md, LICENSE, .gitignore: initial project scaffold 2026-08-28 10:14:19 +02:00
pyproject.toml pyproject.toml, requirements: add fastapi, uvicorn, httpx 2026-08-28 15:49:31 +02:00
README.md deploy timers: switch OnCalendar to Europe/Berlin local time 2026-08-31 16:04:01 +02:00
requirements-dev.txt pyproject.toml, requirements: add fastapi, uvicorn, httpx 2026-08-28 15:49:31 +02:00
requirements.txt pyproject.toml, requirements: add fastapi, uvicorn, httpx 2026-08-28 15:49:31 +02:00

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_cache fürs Backtesting)
  • Reverse Proxy: bestehendes nginx auf dem VPS → trading.uliana.de (acme.sh-Zertifikat, HTTP Basic Auth); FastAPI lauscht nur auf 127.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); serve mountet web/ im Dev, nginx im Prod; Demo-Seed-Skript
  • PR4 – Telegram-Benachrichtigungen ([notify], stdlib-HTTP) je Buy-/Dip-Lauf; Extra-Kauf krypto-dca dip-buy bei Kurs unter gleitendem Durchschnitt ([dip], eigener Timer)
  • PR5 – Backtesting: krypto-dca backtest spielt [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_run von 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)

Lizenz

MIT