Ejemplo de código de libro de órdenes (Python 2)

Las instrucciones detalladas para mantener un libro de órdenes válido desde un feed de libros de órdenes de WebSocket están disponibles en nuestra página de soporte Cómo mantener un libro de órdenes válido.

El código de ejemplo (en Python 2) que ilustra la lógica del libro de órdenes de WebSocket se proporciona a continuación y también está disponible para descargar como krakenwsbook.py.

El código de ejemplo implementa un cliente de línea de comandos que se suscribe al feed del libro de órdenes especificado, luego crea y mantiene un libro de órdenes válido a partir de los mensajes del feed, mientras que produce el libro actual de órdenes una vez por segundo.

El uso del cliente de línea de comandos es ./krakenwsbook.py symbol depth tal como los siguientes comandos de ejemplo:

  • ./krakenwsbook.py xbt/usd 10
  • ./krakenwsbook.py ltc/eur 25

Código de ejemplo

#!/usr/bin/env python

# Kraken Websocket API Order Book
#
# Usage: ./krakenwsbook.py symbol depth

import sys
import json
import signal
from websocket import create_connection

def alarmfunction(signalnumber, frame):
	signal.alarm(1)
	api_output_book()

def api_output_book():
	bid = sorted(api_book["bid"].items(), reverse=True)
	ask = sorted(api_book["ask"].items())
	print("Bid\t\t\t\t\t\tAsk")
	for x in range(int(api_depth)):
		print("%(bidprice)s (%(bidvolume)s)\t\t\t\t%(askprice)s (%(askvolume)s)" % {"bidprice":bid[x][0], "bidvolume":bid[x][1], "askprice":ask[x][0], "askvolume":ask[x][1]})

def api_update_book(side, data):
	for x in data:
		price_level = x[0]
		if float(x[1]) != 0.0:
			api_book[side].update({price_level:float(x[1])})
		else:
			if price_level in api_book[side]:
				api_book[side].pop(price_level)
	if side == "bid":
		api_book["bid"] = dict(sorted(api_book["bid"].items(), reverse=True)[:int(api_depth)])
	elif side == "ask":
		api_book["ask"] = dict(sorted(api_book["ask"].items())[:int(api_depth)])

signal.signal(signal.SIGALRM, alarmfunction)

if len(sys.argv) < 3:
	print("Usage: %s symbol depth" % sys.argv[0])
	print("Example: %s xbt/usd 10" % sys.argv[0])
	sys.exit(1)

api_feed = "book"
api_symbol = sys.argv[1].upper()
api_depth = sys.argv[2]
api_domain = "wss://ws.kraken.com/"
api_book = {"bid":{}, "ask":{}}

try:
	ws = create_connection(api_domain)
except Exception as error:
	print("WebSocket connection failed (%s)" % error)
	sys.exit(1)

api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "depth":%(depth)s}, "pair":["%(symbol)s"]}' % {"feed":api_feed, "depth":api_depth, "symbol":api_symbol}

try:
	ws.send(api_data)
except Exception as error:
	print("Feed subscription failed (%s)" % error)
	ws.close()
	sys.exit(1)

while True:
	try:
		api_data = ws.recv()
	except KeyboardInterrupt:
		ws.close()
		sys.exit(0)
	except Exception as error:
		print("WebSocket message failed (%s)" % error)
		ws.close()
		sys.exit(1)
	api_data = json.loads(api_data)
	if type(api_data) == list:
		if "as" in api_data[1]:
			api_update_book("ask", api_data[1]["as"])
			api_update_book("bid", api_data[1]["bs"])
			signal.alarm(1)
		elif "a" in api_data[1] or "b" in api_data[1]:
			for x in api_data[1:]:
				if "a" in x:
					api_update_book("ask", x["a"])
				elif "b" in x:
					api_update_book("bid", x["b"])

ws.close()
sys.exit(1)