Een SQLite database koppelen aan je Python trading bot
Stel je voor: je hebt een prachtige Python trading bot gebouwd. Hij draait, hij handelt, hij verdient (soms).
Maar na een week weet je niet meer precies wat er gebeurd is.
Welke trades heeft hij gedaan? Waarom? En hoe presteerde hij vergeleken met die andere strategie die je in je achterhoofd had? Als je dit met losse Excel-bestanden of printstatements probeert bij te houden, ben je je tijd aan het verspillen.
Je bot heeft een geheugen nodig. Een echt geheugen. Een SQLite database is het antwoord. Het is de simpelste, krachtigste manier om je bot een eigen archief te geven. Laten we het bouwen.
Waarom een database en niet zomaer een bestand?
Je zou kunnen denken: "Ik save toch gewoon een CSV'tje?" Sure, dat kan voor de allereerste test.
Maar op het moment dat je bot 24/7 draait, wil je iets robuusters. Een CSV-bestand wordt snel een chaos.
Je moet het telkens openen, sluiten, je bent bang dat het corrupt raakt als de stroom uitvalt tijdens een schrijfactie, en het is trager als je duizenden dataregels per dag verwerkt. Bovendien, wat als je de historie van specifieke symbolen wilt opvragen? Of je wilt weten wat je totale winst was in Q3? Met een CSV word je een SQL-expert zonder dat je het wilt.
SQLite is de oplossing die al in Python zit. Ja, echt. Je hoeft niets te installeren.
Het is een lichtgewicht database die je als een simpel bestand opslaat (bijvoorbeeld bot_data.db). Het is ongelooflijk stabiel. Als je bot tijdens het schrijven naar de database crasht, blijft de database intact.
Je kunt er complexe queries op loslaten (zoals "geef me alle trades van strategie A met een risico-reward ratio groter dan 2") en het is supersnel. Het is het fundament voor serieuze risicomanagement en backtesting.
De basis: Verbinding maken en je eerste tabel bouwen
Om te beginnen open je je Python script. Je hebt geen fancy libraries nodig, alleen de standaard sqlite3 module.
Het enige wat je doet is een connectie maken naar een bestand. Als dat bestand niet bestaat, maakt Python het voor je aan. Vervolgens maak je een cursor.
Die cursor is je gereedschap; hij voert de commando's uit. Je wilt waarschijnlijk een tabel voor je trades maken.
Denk na over wat je echt nodig hebt: een uniek ID, de ticker (bijv. BTC/USD), de entry prijs, de exit prijs, de richting (long of short), het aantal eenheden, de timestamp en de winst of verlies. Dit is je "ledger". Dit is de waarheid.
import sqlite3
# Maak verbinding (of maak het bestand)
conn = sqlite3.connect('trading_bot.db')
c = conn.cursor()
# Maak een tabel aan (als die nog niet bestaat)
c.execute('''
CREATE TABLE IF NOT EXISTS trades (
id INTEGER PRIMARY KEY AUTOINCREMENT,
symbol TEXT NOT NULL,
entry_price REAL,
exit_price REAL,
quantity REAL,
direction TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,
profit REAL
)
''')
conn.commit()
Hieronder zie je hoe je dat in Python zet. Let op de types: REAL voor getallen met komma's, TEXT voor tekst, INTEGER voor hele getallen.
Zie je wat er gebeurt? We hebben nu een permanente opslagplaats. Elke keer dat je bot een trade sluit, schrijf je gewoon één regel naar deze tabel. Je hoeft nooit meer bang te zijn dat je data kwijt raakt.
Data schrijven: De long en short van een trade
Het schrijven van data moet naadloos in je bestaande trading-logica passen. Stel je bot heeft een entry-signal, verfijnd door optimale hyperparameter tuning.
Je koopt 0.5 BTC op $60.000. Je wilt deze actie direct vastleggen. Je gebruikt de INSERT functionaliteit.
Je kunt parameters gebruiken (die vraagtekens) om SQL-injectie te voorkomen en je code schoon te houden. Dit is veiliger en sneller.
# Voorbeeld: Een trade openen
symbol = "BTC/USD"
entry_price = 60000.00
quantity = 0.5
direction = "LONG"
c.execute("INSERT INTO trades (symbol, entry_price, quantity, direction) VALUES (?, ?, ?, ?)",
(symbol, entry_price, quantity, direction))
conn.commit()
trade_id = c.lastrowid # Dit ID onthouden we voor later!
# ... later, als de trade sluit ...
exit_price = 61000.00
profit = (exit_price - entry_price) * quantity # Simpele winstberekening
c.execute("UPDATE trades SET exit_price = ?, profit = ? WHERE id = ?",
(exit_price, profit, trade_id))
conn.commit()
Wanneer de trade gesloten wordt, moet je diezelfde regel updaten. Je kent de exit-prijs en de winst.
Je gebruikt dan UPDATE met een WHERE clause. Hieronder zie je hoe dat eruitziet in je Python-code. Dit is het hart van je bot: elke actie wordt direct vertaald naar een database-actie. Door de trade_id op te slaan (het returnt lastrowid), weet je precies welke database-regel je moet updaten. Dit voorkomt chaos. Je kunt nu je bot gerust op de achtergrond laten draaien, wetende dat elke winst en elk verlies correct wordt vastgelegd.
Uitlezen: Je eigen persoonlijke analist
Het echte plezier begint als je de data gaat ophalen. Dit is waar je bot slimmer wordt.
Je wilt weten: "Hoe doe ik het deze week?" of "Wat is mijn gemiddelde winst op trades die langer dan 1 uur duren?". Je gebruikt SELECT om dit te filteren. Je kunt Python gebruiken om de resultaten netjes in lijsten of dictionaries te stoppen, wat makkelijk is voor verdere analyse, het berekenen van gewogen voortschrijdende gemiddelden, of visualisatie met libraries zoals Matplotlib.
Laten we zeggen dat je een rapport wilt maken van alle winstgevende long trades vandaag.
# Haal alle winstgevende LONG trades van vandaag op
c.execute("SELECT symbol, profit, timestamp FROM trades WHERE direction='LONG' AND profit > 0")
rows = c.fetchall()
for row in rows:
print(f"Symbool: {row[0]}, Winst: ${row[1]}, Datum: {row[2]}")
# Als je alleen het totaal wilt weten:
c.execute("SELECT SUM(profit) FROM trades WHERE direction='LONG'")
total_profit = c.fetchone()[0]
print(f"Totaal winst LONG: ${total_profit}")
Je kunt SQL bijna als een normale zin schrijven. Dit maakt het heel intuïtief. Hieronder een voorbeeld van hoe je die data uit je database haalt en print.
Je kunt hier ook geavanceerde dingen mee doen. Je kunt een Python script bouwen die deze data pakt en elke avond een emailtje stuurt met je P&L (Profit & Loss). Of je kunt de data gebruiken om je eigen "backtesting" engine te bouwen: je haalt de historische data op, past je strategie met technische indicatoren erop toe en kijkt wat er gebeurd was.
Praktische tips voor je database setup
Er zijn een paar dingen die je meteen goed moet doen om jezelf een hoop hoofdpijn te besparen. Ten eerste: sluit je connectie.
Als je script crasht, kan een open connectie je database corrupt maken. Gebruik een try...finally blok of een context manager (with sqlite3.connect(...)) zodat de verbinding altijd netjes wordt gesloten. Dit is echt cruciaal voor de stabiliteit van je bot.
Ten tweede, denk na over je schema voordat je begint. Voeg je later een kolom toe?
Dat kan, maar het is rommelig. Wat dacht je van extra kolommen voor order_id (van je broker zoals Interactive Brokers of Binance), fees (handelskosten!), en strategy_name? Fees zijn essentieel; een bot die $10 winst maakt maar $12 aan fees kost is een drama.
Zorg dat je die direct meeneemt. Een andere tip: maak backups.
Omdat je database een simpel .db bestand is, kun je dit makkelijk kopiëren.
Maak een simpele cron-job of scheduled task die dit bestand elke dag kopieert naar een andere map. Als er iets misgaat, ben je nooit alles kwijt. Tot slot: begin klein. Je hoeft geen honderd tabellen te maken.
Start met een trades tabel en een errors tabel (om logs van crashes in op te slaan). Dat is genoeg om professioneel te beginnen.
