Hoe vind je 'Memory Leaks' in een bot die wekenlang draait?
Een trading bot die wekenlang draait, is als een marathonloper die nooit stopt.
Je wilt niet dat hij halverwege in slaap valt. Memory leaks sluipen binnen en laten je bot langzaam vastlopen, terwijl de markt doordraait. Je bot crasht net als de EUR/USD piekt. Herkenbaar? Laten we dat oplossen.
Wat je nodig hebt voordat je begint
Je hebt een bot nodig die echt draait, bijvoorbeeld op een VPS van €5-€10 per maand. Gebruik Python 3.10 of nieuwer, met libraries zoals pandas, numpy en ccxt voor de broker-API.
Installeer een lichte IDE zoals VS Code of PyCharm Community. Zorg dat je broker-toegang hebt bij Interactive Brokers, Binance, of Kraken met API-sleutels.
Een backtestomgeving helpt, maar je zoekt leaks in live bots. Haal deze tools: memory_profiler (€0), objgraph (€0), psutil (€0), en een lichtgewicht monitoring-dashboard zoals Grafana (gratis) of een simpel script naar CSV. Reken op 1-2 uur voorbereiding.
Zorg voor een testaccount met €100-€500 speelgeld. Gebruik geen hoofdaccount tijdens het debuggen. Veelgemaakte fout: meteen live draaien zonder buffer. Start altijd in een sandbox of paper-trading omgeving.
Check je broker-limieten: Binance heeft 1200 requests per minuut, Kraken ongeveer 1.
Je bot mag niet te veel loggen. Gebruik een loglevel van INFO en schakel debug uit in productie.
Voor risicomanagement: zet een stop-loss en een max-drawdown in je bot, bijvoorbeeld 2% per trade. Schrijf je configuratie op: API-key, symbolen, interval (bijvoorbeeld 1m voor scalping), en risk-per-trade. Zonder dit raak je het spoor bijster.
Stap 1: Monitor het geheugen tijdens live draaien
Start je bot en voeg meteen geheugenmonitoring toe. Gebruik psutil om elke minuut het RAM-gebruik te loggen.
Een eenvoudig scriptje: import psutil; log(psutil.Process().memory_info().rss / 1024**2). Je ziet meteen of je bot groeit. Test 1 uur en noteer de baseline: bijvoorbeeld 150 MB.
- Installeer psutil: pip install psutil. Doe dit op je VPS, niet alleen lokaal.
- Schrijf een logger naar CSV: tijd, RSS (MB), swap (MB), CPU%. Max 1 regel per minuut.
- Draai 2 uur en kijk of je geheugen stabiel blijft binnen 10% van de baseline.
- Gebruik een plotje: matplotlib of Grafana. Zie je een ladderpatroon? Dat is een leak.
Groeit het naar 300 MB na 3 uur? Dat is een signaal.
Tijdsindicatie: 30-45 minuten voor setup en eerste run. Veelgemaakte fout: te veel loggen, waardoor je bot vertraagt.
Beperk logs tot essentieel. Als je broker-API rate-limits raakt, verlaag de logfrequentie. Tip: log alleen trades, errors en geheugen elke minuut. Zo blijft je bot snel en stabiel.
Gebruik een tweede terminal om top of htop te draaien. Zie je geheugen langzaam stijgen zonder daling?
Dat is een klassieke leak. Check ook of je bot cache groeit, zoals een pandas DataFrame die nooit wordt geleegd. Een concrete maat: als je bot 10 symbolen scant en elke candle een nieuwe DataFrame maakt, kan dat 50 MB per uur kosten. Schrijf die weg of wis ze.
Stap 2: Vind de lek met memory_profiler en objgraph
Nu duik je dieper. Gebruik memory_profiler om functies te meten die veel geheugen vragen.
Voeg @profile toe aan een functie en draai met mprof run. Je ziet welke regel meer geheugen claimt.
- Installeer: pip install memory_profiler objgraph. Ook line_profiler helpt voor detail.
- Voeg @profile toe aan je event-loop en data-update functies.
- Draai mprof run --python je_bot.py en laat het 1 uur lopen.
- Bekijk mprof plot: zoek pieken na 20-30 minuten. Noteer de functie.
Voor een live bot: draai dit in een testomgeving, want het vertraagt 10-20%. Focus op data-verwerking: orderboek-parsing, indicator-berekeningen en API-calls. Gebruik objgraph om objecten te tellen.
Voeg dit toe na 30 minuten draaien: import objgraph; objgraph.show_most_common_types(limit=10). Je ziet bijvoorbeeld 5000 dict-objecten groeien. Dat wijst op een cache die nooit invalidated wordt. Een concrete maat: als je bot een trade-history bijhoudt, beperk deze tot max 1000 entries of gebruik een ringbuffer.
Veelgemaakte fout: objgraph gebruiken zonder garbage collection. Voeg gc.collect() toe voor en na metingen.
Tijdsindicatie: 1 uur voor metingen, 30 minuten voor analyse. Als je bot synchroniseert met een broker-API, check dan de response-objects.
Soms blijven JSON-payloads in geheugen hangen. Gebruik del response na verwerking. Tip voor Python 3.11+: gebruik tracemalloc voor fijnmazige tracking.
Activeer tracemalloc.start() en vergelijk snapshots met tracemalloc.compare_to(). Dit toont exacte regels die geheugen claimen.
Ideaal voor pandas-gebruik: een DataFrame groeit door append zonder drop. Los op met df = df.tail(1000) om een venster te houden.
Stap 3: Check je event-loop en API-calls
Veel trading bots draaien op asyncio of threading. Een leak zit vaak in niet-afgesloten sessies of callbacks die opstapelen. Voor ccxt: elke API-call maakt een connection. Voorkom veelgemaakte Python-fouten in je scripts door hier scherp op te zijn.
- Gebruik async with client = ccxt.binance() voor elke call, niet een globale client.
- Voeg timeouts toe: await asyncio.wait_for(call, timeout=5).
- Log active tasks: len(asyncio.all_tasks()) mag niet oneindig groeien.
- Draai 4 uur en vergelijk geheugen met stap 1.
Als je die niet sluit, blijft RAM groeien. Test met Binance spot: een bot die elke seconde een kline ophaalt, kan na 24 uur 200 MB extra gebruiken.
Check je broker-API voor keep-alive. IBKR (Interactive Brokers) gebruikt TWS API; sluit sockets netjes af.
Kraken en Binance ondersteunen websockets; herbruik niet oneindig. Een concrete maat: houd websocket-connections onder de 10. Als je bot 5 symbolen scant, sluit overbodige streams na 5 minuten inactief.
Veelgemaakte fout: callbacks registreren zonder unregister. Bij een event-driven bot, voorkom bugs door fouten tijdig op te sporen en vergeet niet handlers te verwijderen na een trade.
Tijdsindicatie: 2 uur testen, 30 minuten fixen. Gebruik een profiel van 50 trades per dag voor een realistische load. Voor risicomanagement: zet een circuit-breaker die je bot stopt als RAM > 80%. Tip: voor backtesting-checks, draai je bot in een simulatie met historische data.
Gebruik pandas 1.5+ en beperk je dataset tot 100k candles. Zo voorkomt je dat geheugen explodeert tijdens testen. Als je bot live draait, zet een watchdog-timer: elke 30 minuten check RAM en restart indien nodig.
Stap 4: Los op en voorkom terugval
Zodra je de lek vindt, fix je de oorzaak. Voor pandas: vervang df.append door pd.concat met een lijst, en drop na elke iteratie.
Voor dicts: gebruik collections.deque met maxsize 1000 voor caches. Voor API-calls: implementeer een connection pool met max 5 sessions. Test je fix met een bot die 24 uur draait op een VPS van €5/maand.
- Pas de code aan en draai een unit-test met 1000 iteraties.
- Monitor 6 uur live met psutil en memory_profiler.
- Check of geheugen binnen 10% van baseline blijft.
- Herhaal voor meerdere symbolen en timeframes.
Voeg een garbage-collector trigger toe: gc.collect() elke 10 minuten, maar niet te vaak.
Tijdsindicatie: 1-2 uur voor fix, 6 uur voor validatie. Veelgemaakte fout: fixen zonder testen onder load. Gebruik een testaccount bij je broker voor 10-20 trades.
Check ook je logfiles: groeien die te snel? Beperk tot 10 MB per dag.
Voor risicomanagement: koppel je bot aan een dashboard dat alerts stuurt bij geheugengroei.
Gebruik Telegram of email via een lichte library zoals python-telegram-bot (€0). Een concrete maat: stuur een alert bij >300 MB RAM. Zo voorkom je een crash tijdens een volatile markt, zoals een FOMC-announcement.
Verificatie-checklist
Gebruik deze lijst na elke stap om zeker te zijn dat je bot stabiel is en ontdek hoe je de state herstelt na een crash.
- Baseline RAM stabiel: binnen 10% na 2 uur draaien.
- Geen groei in objgraph: top 10 types niet meer dan 5% gestegen.
- API-calls slagen: response-time <500ms, geen timeouts na 4 uur.
- Event-loop schoon: aantal tasks constant, geen callbacks over.
- Logs beheersbaar: <10 MB per dag, geen onnodige data.
- Risk-check: stop-loss en drawdown-limieten actief, bot stopt bij RAM >80%.
- Live test: 24 uur draaien op testaccount met €100-€500, geen crashes.
Vink elk item af voor je live gaat. Als je alle items haalt, is je bot klaar voor langere sessies. Herhaal deze checklist wekelijks, vooral na updates van libraries of broker-APIs. Zo blijft je algoritmische trading bot soepel draaien, zonder onaangename verrassingen.
