Einen Krypto-Trading-Bot mit KI zu bauen ist heute wirklich einfach: Ein Coding-Agent wie Claude Code oder Codex kann einen Python-Bot schreiben, der sich über ccxt mit einer Börse verbindet, eine einfache Strategie ausführt und Orders platziert. Die eigentliche Arbeit steckt in allem rund um den Code: Tests im Testnet und in Backtests, ein API-Schlüssel, der nur handeln darf, und der Umstieg auf echtes Geld mit winzigen Beträgen.
Diese Anleitung führt Schritt für Schritt von einem leeren Ordner zu einem Bot, der rund um die Uhr auf einem Server läuft und dir Telegram-Alerts schickt. Zuerst aber der Teil, bei dem ich ehrlich sein muss.
Zuerst das Risiko: Das ist keine Finanzberatung
Dies ist ein Software-Tutorial, keine Anlageberatung. Ein paar Fakten vorab:
- Die meisten Trading-Bots verlieren Geld. Besonders die einfachen Strategien aus dem Netz, sobald Gebühren, Slippage und plötzliche Kursbewegungen eingerechnet sind.
- Eine Strategie, die im Backtest großartig aussieht, versagt live oft. Strategien, die auf vergangene Daten zugeschnitten sind (Overfitting), brechen schnell zusammen.
- KI-geschriebener Code kann teure Fehler enthalten. Eine falsche Mengeneinheit, eine vertauschte Kauf-/Verkaufsbedingung oder eine Retry-Schleife, die immer weiter Orders platziert, kann ein Konto in Minuten leeren.
- Gib einem Bot nur Geld, dessen Verlust du verkraften kannst. Starte im Testnet, dann geh live mit dem kleinsten Betrag, den die Börse erlaubt.
Die Strategie in diesem Beitrag ist ein Code-Beispiel. Ich stelle sie nicht als Weg dar, Geld zu verdienen.
Welchen Stack du wählst
Wenn du einen Bot per Vibe Coding baust, wähle den Stack, den der Agent am besten kennt. Meine Wahl:
- Python 3.11+: das ausgereifteste Ökosystem für Daten (pandas), Backtesting und Börsenbibliotheken, und die Sprache, in der Agenten die meisten Beispiele gesehen haben.
- ccxt: eine Open-Source-Bibliothek, die über eine einheitliche Schnittstelle mit vielen Börsen spricht. Für eine Börse geschriebener Code lässt sich meist mit wenigen geänderten Zeilen auf eine andere übertragen, und sie unterstützt den Testnet-/Sandbox-Modus vieler Börsen.
- pandas: um Kerzendaten (OHLCV) als Tabelle zu bearbeiten.
- python-dotenv: um API-Schlüssel in einer
.env-Datei zu halten, nicht im Code. - SQLite: um offene Positionen und Orders festzuhalten, ohne einen Datenbankserver zu betreiben.
Einrichtung:
mkdir crypto-bot && cd crypto-bot
git init
python3 -m venv .venv && source .venv/bin/activate
pip install ccxt pandas python-dotenv requests
echo ".env" >> .gitignore
echo ".venv/" >> .gitignore
Füge diese .gitignore-Zeilen in der ersten Minute hinzu. Ein versehentlich auf GitHub gepushter API-Schlüssel ist der häufigste und teuerste Fehler in diesem ganzen Bereich.
Schritt 1: ein Testnet-Konto und ein richtig eingeschränkter API-Schlüssel
Viele große Börsen bieten eine Testumgebung (Testnet oder Sandbox), in der kein echtes Geld fließt. Suche in der Entwicklerdokumentation der Börse nach „testnet“ oder „sandbox“ und lege dort ein eigenes Testkonto und einen Test-API-Schlüssel an. Gibt es kein Testnet oder fehlt dein Paar dort, lassen wir den Agenten einen Paper-Trading-Modus bauen, der echte Preise liest, Orders aber nur lokal aufzeichnet.
Wenn du später einen Schlüssel für das echte Konto erstellst:
- Aktiviere nur Lesen und Handeln. Aktiviere nie Auszahlungen. Wenn der Schlüssel geleakt wird, kann niemand dein Guthaben woandershin senden.
- Nutze IP-Whitelisting. Wenn die Börse es unterstützt, binde den Schlüssel an die statische IP deines VPS.
- Lass Futures und Margin deaktiviert. Beginne mit Spot.
- Lege pro Bot einen eigenen Schlüssel an, damit du nur diesen widerrufen kannst, falls etwas schiefgeht.
Eine .env-Datei sieht so aus:
EXCHANGE=binance
API_KEY=your-test-key
API_SECRET=your-test-secret
USE_TESTNET=true
TELEGRAM_TOKEN=
TELEGRAM_CHAT_ID=
Füge diese Werte nicht in den Chat mit dem Agenten ein. Der Agent muss wissen, dass .env existiert, nicht, was darin steht.
Schritt 2: der erste Prompt
Öffne den Agenten im Projektordner (claude oder codex) und bitte um den Bot in Schichten, nicht alles auf einmal. Ein erster Prompt zum Kopieren:
Set up a skeleton for a simple spot trading bot in Python 3.11 with ccxt.
Rules:
- Read settings from .env with python-dotenv. Never open or print .env.
- If USE_TESTNET=true, enable ccxt sandbox mode; otherwise print a
"LIVE MODE" warning on start and wait 10 seconds.
- Modules: config.py, exchange.py (connection, balance, candles, orders),
strategy.py (returns a signal, never places orders), risk.py (position
size, daily loss limit), bot.py (main loop), storage.py (SQLite log).
- Every order must pass risk.py first. Max 2% of balance per order;
stop the bot if the daily loss exceeds 5%.
- With DRY_RUN=true, never place orders, only log them.
- Use Python logging to logs/bot.log and the console.
- No strategy yet: strategy.py should always return "hold".
When done, summarize the file layout and how to run it.
Warum zuerst ein Grundgerüst? Wenn Strategie, Order-Platzierung und Risikoregeln in getrennten Dateien liegen, lässt sich der Code leichter prüfen und Fehler fallen eher auf. Kann die Strategie keine Orders platzieren, erzeugt ein Fehler dort schlimmstenfalls ein falsches Signal, und die Risikoschicht begrenzt den Schaden.
Schritt 3: eine Beispielstrategie (Kreuzung gleitender Durchschnitte)
Noch einmal: Das ist ein Beispiel, kein Rat. Eine Kreuzung gleitender Durchschnitte ist eine der klarsten Strategien, um die Struktur zu zeigen. Kreuzt der schnelle Durchschnitt den langsamen von unten nach oben, signalisiert das „buy“; kreuzt er nach unten, „sell“.
# strategy.py — example only, not financial advice
import pandas as pd
def signal(ohlcv: list, fast: int = 20, slow: int = 50) -> str:
df = pd.DataFrame(ohlcv, columns=["ts", "open", "high", "low", "close", "volume"])
if len(df) < slow + 2:
return "hold"
df["fast"] = df["close"].rolling(fast).mean()
df["slow"] = df["close"].rolling(slow).mean()
prev, last = df.iloc[-3], df.iloc[-2] # the last candle is still open, skip it
if prev.fast <= prev.slow and last.fast > last.slow:
return "buy"
if prev.fast >= prev.slow and last.fast < last.slow:
return "sell"
return "hold"
Ein Detail, das auffallen sollte: Das Signal wird aus der letzten geschlossenen Kerze berechnet, weil die neueste noch in Bewegung ist. Agenten übersehen das oft, und der Bot springt dann innerhalb einer Kerze hin und her.
Prompt, um sie hinzuzufügen:
Add a 20/50 moving average crossover to strategy.py. Compute signals from
closed candles only. Write pytest tests for the signal function: cross up,
cross down, not enough data and a flat market. Run the tests and show me
the output.
Schritt 4: Backtesting
Bevor du live gehst, lass die Strategie auf historischen Daten laufen. Du kannst den Agenten Kerzen mit ccxt holen und eine einfache Backtest-Schleife schreiben lassen. Für Ernsteres schau dir backtesting.py, vectorbt oder Freqtrade an; Freqtrade ist ein ausgereiftes Open-Source-Bot-Framework, das Backtesting, Dry Run und Telegram-Steuerung schon mitbringt.
Ein Prompt:
Write backtest.py. Fetch the last year of BTC/USDT 1h candles with ccxt,
paginating, and save them as CSV under data/. Apply strategy.signal candle
by candle without looking ahead. Deduct 0.1% fee and 0.05% slippage per
trade. Report total return, number of trades, win rate, max drawdown and
buy-and-hold return over the same period.
Beim Lesen der Ergebnisse:
- Rechne immer Gebühren und Slippage ein. Ohne sie sieht fast jede Strategie gut aus.
- Vergleiche mit Buy-and-Hold. Schneidet der Bot schlechter ab als bloßes Halten, lohnt der Aufwand nicht.
- Prüfe Look-ahead-Bias selbst. Lies die Schleife und stelle sicher, dass sie nie Daten nutzt, die es noch nicht gab.
- Dreh nicht so lange an den Parametern, bis die Kurve schön aussieht. Wenn 17/43 besser abschneidet als 20/50, ist das höchstwahrscheinlich Zufall.
Schritt 5: Testnet und Paper Trading
Lass den Bot nach dem Backtest mindestens ein paar Tage im Testnet laufen:
DRY_RUN=false USE_TESTNET=true python bot.py
In dieser Phase prüfst du das Verhalten, nicht den Gewinn. Gehen Orders mit der richtigen Menge raus? Erinnert sich der Bot nach einem Neustart an eine offene Position? Stürzt er ab, wenn die Börse einen Fehler zurückgibt, oder wartet er und versucht es erneut? Greift das Tagesverlustlimit tatsächlich?
Löse absichtlich einen Fehler aus, zum Beispiel eine Order, die größer ist als dein Guthaben, und sieh zu, wie der Bot ihn sauber loggt und stoppt.
Schritt 6: Rate Limits, Fehlerbehandlung und Logging
Börsen begrenzen API-Anfragen. Ein Bot, der sie überschreitet, bekommt zuerst Fehler und wird bei weiterem Drauflosfeuern möglicherweise vorübergehend gesperrt. Die ccxt-Option enableRateLimit verteilt Anfragen automatisch; lass den Agenten bestätigen, dass sie aktiv ist.
Review exchange.py:
- Make sure ccxt enableRateLimit is on.
- On NetworkError and RateLimitExceeded, retry up to 5 times with
increasing backoff. On InsufficientFunds and InvalidOrder, do not retry;
log it and send a Telegram alert.
- Log the request, exchange response and order id for every order.
- Prevent a second order for the same signal (idempotency).
Eine gute Logzeile beantwortet später die Frage „Warum hat der Bot das getan?“: Zeit, Signal, Preis, berechnete Menge, Ergebnis der Risikoprüfung, Order-ID. Logge nie API-Schlüssel oder Secrets.
Schritt 7: Telegram-Alerts
Der Bot sollte dir sagen, was er tut. Am einfachsten geht das mit einem schlichten HTTP-Aufruf an die Telegram Bot API:
# notify.py
import os, requests
def send(text: str) -> None:
token, chat = os.getenv("TELEGRAM_TOKEN"), os.getenv("TELEGRAM_CHAT_ID")
if not token or not chat:
return
try:
requests.post(f"https://api.telegram.org/bot{token}/sendMessage",
json={"chat_id": chat, "text": text}, timeout=10)
except requests.RequestException:
pass # a failed alert must not stop the bot
Den Token bekommst du über Telegrams offiziellen Ablauf zum Erstellen von Bots. Ereignisse, die einen Alert wert sind: Bot gestartet/gestoppt, Order platziert, Fehler, Tagesverlustlimit erreicht. Mein Leitfaden zum Telegram-Bot mit KI bauen zeigt, wie du Befehle ergänzt, etwa um den Bot aus der Ferne zu stoppen.
Schritt 8: rund um die Uhr auf einem VPS laufen lassen
Geht dein Laptop in den Ruhezustand, tut es der Bot auch. Ein kleiner Linux-VPS genügt; eine statische IP ist für die IP-Whitelist wichtig.
Mit systemd
# /etc/systemd/system/crypto-bot.service
[Unit]
Description=Crypto bot
After=network-online.target
[Service]
User=bot
WorkingDirectory=/home/bot/crypto-bot
EnvironmentFile=/home/bot/crypto-bot/.env
ExecStart=/home/bot/crypto-bot/.venv/bin/python bot.py
Restart=on-failure
RestartSec=30
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now crypto-bot
journalctl -u crypto-bot -f
Lass den Bot unter einem eigenen Benutzer laufen, nicht als root, und sichere die Env-Datei mit chmod 600 .env.
Mit Docker
Wenn du Docker bevorzugst, lass den Agenten ein Dockerfile und eine docker-compose.yml schreiben, mit restart: unless-stopped, env_file für .env und Volumes für logs/ und die SQLite-Datei, damit Bot und Aufzeichnungen einen Server-Neustart überstehen.
Häufige Fehler: was die KI gern falsch macht
- Mengen und Präzision. Börsen erzwingen pro Paar eine Mindestmenge und eine Dezimalpräzision. Agenten überspringen das und bekommen abgelehnte Orders oder runden falsch. Lass sie
amount_to_precisionvon ccxt und die Markt-Limits verwenden. - Die offene Kerze nutzen. Signale aus einer Kerze, die sich noch bewegt, sind Rauschen.
- Testnet-Flag in Produktion an gelassen oder beim Testen aus. Logge den Modus beim Start deutlich.
- Zustand beim Neustart verlieren. Vergisst der Bot eine offene Position, kauft er womöglich erneut. Halte den Zustand in SQLite und gleiche ihn beim Start mit der Börse ab.
- Orders in einer Retry-Schleife. Umschließt die Retry-Logik das Platzieren der Order, kann dieselbe Order viele Male rausgehen.
- Verschluckte Fehler. Überall
except: passergibt einen Bot, der lebendig aussieht und nichts tut. - „Tests bestanden“ blind vertrauen. Sieh dir die Ausgabe selbst an.
Sicherheits-Checkliste
- API-Schlüssel liegen nur in
.env, und.envsteht in.gitignore. - Füge Schlüssel nie in den Agenten, einen Chat oder einen Screenshot ein.
- Auszahlungen aus, IP-Whitelist an, Margin aus.
- Lies die Befehle, die der Agent ausführen will, bevor du zustimmst, besonders alles, was
.envliest, Dateien hochlädt oder Netzwerkaufrufe macht. - Wenn du vermutest, dass ein Schlüssel geleakt ist, widerrufe ihn sofort bei der Börse und erstelle einen neuen.
- Aktiviere Zwei-Faktor-Authentifizierung für das Börsenkonto.
- Installiere nur Abhängigkeiten, die du kennst; prüfe jeden Paketnamen, den der Agent vorschlägt und von dem du noch nie gehört hast.
So mache ich das mit AgentVera
Bei solchen Projekten lasse ich mehrere Agenten nebeneinander laufen. In einem AgentVera-Raster kann Claude Code in einem Worktree an Strategie und Backtest arbeiten, während Codex in einem anderen die Telegram-Alerts und Docker-Dateien baut, ohne dass sie sich in die Quere kommen. Nach jedem Turn lässt das automatische Code-Review ein zweites Modell lesen, was der Agent geschrieben hat; das ist ein nützliches zweites Augenpaar bei Mengenrechnungen und Kauf-/Verkaufsbedingungen. Du prüfst den Diff im Git-Panel, bevor du mergst, und siehst die Token-Nutzung pro Agent. Ist der Bot fertig, bringt SSH und SFTP die Dateien auf den VPS, und der Docker-Manager zeigt den Container lokal.
Nichts davon ist Pflicht; zwei Terminals und Git funktionieren auch. Wenn dich das parallele Setup interessiert, lies parallele Coding-Agenten.
Fazit
Die Coding-Seite beim Bau eines Krypto-Trading-Bots mit KI kostet ein paar Stunden: Python, ccxt, klar getrennte Module, eine Risikoschicht und gute Logs. Was Zeit braucht und wirklich zählt, ist das Testen: Backtest, Testnet, Paper Trading und erst dann ein winziger Live-Betrag. Beschränke den API-Schlüssel auf den Handel, schalte Auszahlungen aus und lies jede Order-Zeile, die der Agent schreibt. Und denk daran, dass die meisten Bots Geld verlieren; baue diesen, um zu lernen, nicht um reich zu werden.