โค้ดตัวอย่างสำหรับการตีความฟีด order book ของ WebSocket API v1 (แบบ synchronous/single-threaded)

อัปเดตล่าสุด: More than 3 months ago

คำแนะนำโดยละเอียดสำหรับการดูแลรักษา order book ที่ถูกต้องจากฟีด order book ของ WebSocket API v1 มีอยู่ใน วิธีการดูแลรักษา order book ที่ถูกต้อง หน้าสนับสนุนของเรา

โค้ดตัวอย่าง (ใน Python) ที่แสดงตรรกะของ order book ของ WebSocket API v1 มีให้ด้านล่างและยังสามารถดาวน์โหลดได้ในรูปแบบ krakenwsorderbook.py

โค้ดตัวอย่างนี้ใช้ไคลเอนต์บรรทัดคำสั่งที่สมัครรับฟีด order book ที่ระบุ จากนั้นสร้างและดูแลรักษา order book ที่ถูกต้องจากข้อความฟีด พร้อมทั้งแสดงผล order book ปัจจุบันทุกหนึ่งวินาที

การใช้งานไคลเอนต์บรรทัดคำสั่งคือ ./krakenwsbook.py symbol depth เช่น คำสั่งตัวอย่างต่อไปนี้:

  • ./krakenwsbook.py xbt/usd 10

  • ./krakenwsbook.py ltc/eur 25

ตัวอย่างโค้ด

#!/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 dicttofloat(keyvalue):
return float(keyvalue[0])

def api_output_book():
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\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(), key=dicttofloat, reverse=True)[:int(api_depth)])
elif side == "ask":
api_book["ask"] = dict(sorted(api_book["ask"].items(), key=dicttofloat)[: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:len(api_data[1:])-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)

ต้องการความช่วยเหลือเพิ่มเติมหรือไม่