Código de ejemplo para interpretar el feed del libro de órdenes de la API v1 de WebSocket (asíncrono/multihilo)

Última actualización: 2 abr 2025

Encontrarás instrucciones detalladas para interpretar el feed del libro de órdenes de la API v1 de WebSocket en nuestra página de soporte Cómo mantener un libro de órdenes válido.

A continuación, se proporciona un código de ejemplo en Python para la integración con el feed del libro de órdenes de la API v1 de WebSocket y el mantenimiento de una copia local de un libro de órdenes.

El código utiliza la biblioteca estándar de Python WebSocket e implementa un enfoque asíncrono (dirigido por eventos/multihilo), que permite que otras tareas continúen en paralelo a la interpretación del feed del libro de órdenes.

Uso

El código debe ejecutarse a través de un símbolo del sistema (como la Terminal de macOS) de la siguiente manera:

  • krakenwsorderbookasync.py symbol depth, o,

  • python3 krakenwsorderbookasync.py symbol depth

Por ejemplo, el siguiente comando recuperaría e interpretaría el feed del libro de órdenes de Dogecoin/USD (XDG/USD) con una profundidad de 10 niveles de precio (por lado):

  • krakenwsorderbookasync.py XDG/USD 10

Ten en cuenta que el código se ejecutará indefinidamente hasta que se termine mediante una interrupción de teclado (Ctrl+C en la mayoría de los entornos de línea de comandos).

Código Python

El código Python se puede ver a continuación y también se puede descargar como 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)

¿Necesita más ayuda?