Приклад коду для інтерпретації стрічки книги замовлень WebSocket API v1 (асинхронний/багатопотоковий)

Останнє оновлення: 2 квіт. 2025 р.

Детальні інструкції щодо інтерпретації стрічки книги замовлень WebSocket API v1 доступні на нашій сторінці підтримки Як підтримувати дійсну книгу замовлень.

Приклад коду на Python для інтеграції зі стрічкою книги замовлень WebSocket API v1 та підтримки локальної копії книги замовлень наведено нижче.

Код використовує стандартну бібліотеку Python WebSocket та реалізує асинхронний (керований подіями/багатопотоковий) підхід, що дозволяє іншим завданням виконуватися паралельно з інтерпретацією стрічки книги замовлень.

Використання

Код слід виконувати через командний рядок (наприклад, Термінал macOS) таким чином:

  • krakenwsorderbookasync.py symbol depth, or,

  • python3 krakenwsorderbookasync.py symbol depth

Наприклад, наступна команда отримає та інтерпретує стрічку книги замовлень Dogecoin/USD (XDG/USD) з глибиною 10 цінових рівнів (з кожного боку):

  • krakenwsorderbookasync.py XDG/USD 10

Зверніть увагу, що код працюватиме безкінечно, доки не буде перерваний перериванням з клавіатури (Ctrl+C у більшості середовищ командного рядка).

Код Python

Код Python можна переглянути нижче, а також завантажити як krakenwsorderbookasync.py.

#!/usr/bin/env python3

# Import WebSocket client library (and others)
import sys
import json
import signal
import time
import _thread
import websocket

# Parse command line arguments (symbol and depth)
if len(sys.argv) < 3:
sys.exit(1)
else:
api_symbol = sys.argv[1]
api_depth = int(sys.argv[2])

# Define order book variables
api_book = {'bid':{}, 'ask':{}}

# Define order book update functions
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])

# Define WebSocket callback functions
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 new thread for WebSocket interface
_thread.start_new_thread(ws_thread, ())

# Output order book (once per second) in 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)

Потрібна додаткова допомога?