Voorbeeldcode voor het interpreteren van de WebSocket API v1 order book feed (asynchroon/multi-threaded)

Laatst bijgewerkt: 2 april 2025

Gedetailleerde instructies voor het interpreteren van de WebSocket API v1 order book feed zijn beschikbaar op onze supportpagina How to maintain a valid order book.

Hieronder vind je voorbeeldcode in Python voor de integratie met de WebSocket API v1 order book feed en het bijhouden van een lokale kopie van een orderboek.

De code maakt gebruik van de standaard Python WebSocket-bibliotheek en implementeert een asynchrone (event-driven/multi-threaded) aanpak, waardoor andere taken parallel aan de interpretatie van de order book feed kunnen worden uitgevoerd.

Gebruik

De code moet als volgt worden uitgevoerd via een opdrachtprompt (zoals de macOS Terminal):

  • krakenwsorderbookasync.py symbol depth, of,

  • python3 krakenwsorderbookasync.py symbol depth

De volgende opdracht haalt bijvoorbeeld de Dogecoin/USD (XDG/USD) order book feed op en interpreteert deze met een diepte van 10 prijsniveaus (per zijde):

  • krakenwsorderbookasync.py XDG/USD 10

Let op: de code blijft onbeperkt draaien totdat deze wordt beëindigd door een toetsenbordonderbreking (Ctrl+C in de meeste opdrachtregelomgevingen).

Python-code

De Python-code kan hieronder worden bekeken en kan ook worden gedownload als krakenwsorderbookasync.py.

#!/usr/bin/env python3

# Importeer WebSocket client-bibliotheek (en andere)
import sys
import json
import signal
import time
import _thread
import websocket

# Verwerk opdrachtregelargumenten (symbool en diepte)
if len(sys.argv) < 3:
sys.exit(1)
else:
api_symbol = sys.argv[1]
api_depth = int(sys.argv[2])

# Definieer orderboek-variabelen
api_book = {'bid':{}, 'ask':{}}

# Definieer orderboek-updatefuncties
def dicttofloat(data):
return float(data[0])

def api_book_update(api_book_side, api_book_data):
for data in api_book_data:
price_level = data[0]
volume = data[1]
if float(volume) > 0.0:
api_book[api_book_side][price_level] = volume
else:
api_book[api_book_side].pop(price_level)
if api_book_side == 'bid':
api_book['bid'] = dict(sorted(api_book['bid'].items(), key=dicttofloat, reverse=True)[:api_depth])
elif api_book_side == 'ask':
api_book['ask'] = dict(sorted(api_book['ask'].items(), key=dicttofloat)[:api_depth])

# Definieer WebSocket-callbackfuncties
def ws_thread(*args):
ws = websocket.WebSocketApp('wss://ws.kraken.com/', on_open=ws_open, on_message=ws_message)
ws.run_forever()

def ws_open(ws):
ws.send('{"event":"subscribe", "subscription":{"name":"book", "depth":%(api_depth)d}, "pair":["%(api_symbol)s"]}' % {'api_depth':api_depth, 'api_symbol':api_symbol})

def ws_message(ws, ws_data):
api_data = json.loads(ws_data)
if 'event' in api_data:
return
else:
if 'as' in api_data[1]:
api_book_update('ask', api_data[1]['as'])
api_book_update('bid', api_data[1]['bs'])
else:
for data in api_data[1:len(api_data)-2]:
if 'a' in data:
api_book_update('ask', data['a'])
elif 'b' in data:
api_book_update('bid', data['b'])

# Start nieuwe thread voor WebSocket-interface
_thread.start_new_thread(ws_thread, ())

# Output orderboek (één keer per seconde) in de main thread
try:
while True:
if len(api_book['bid']) < api_depth or len(api_book['ask']) < api_depth:
time.sleep(1)
else:
bid = sorted(api_book['bid'].items(), key=dicttofloat, reverse=True)
ask = sorted(api_book['ask'].items(), key=dicttofloat)
print('Bid\t\t\t\t\t\t\tAsk')
for count in range(api_depth):
print('%(bidprice)s (%(bidvolume)s)\t\t\t\t%(askprice)s (%(askvolume)s)' \
% {'bidprice':bid[count][0], 'bidvolume':bid[count][1], 'askprice':ask[count][0], 'askvolume':ask[count][1]})
time.sleep(1)
except KeyboardInterrupt:
sys.exit(0)

Meer hulp nodig?