Ứng dụng khách dòng lệnh API WebSocket v1 (Python)

Cập nhật lần cuối: 1 thg 4, 2025

Mã Python sau đây triển khai một ứng dụng khách API dòng lệnh cho API WebSocket v1 của sàn giao dịch. Mã này có thể được sử dụng như một ứng dụng khách API độc lập, hoặc có thể được gọi từ các ngôn ngữ lập trình thông dịch hoặc biên dịch khác (Bash, C++, v.v.).

Thư viện WebSocket Python tiêu chuẩn (websocket-client) là bắt buộc đối với mạng WebSocket, nhưng không yêu cầu các thư viện/mô-đun API nào khác.

Ứng dụng khách dòng lệnh API WebSocket cũng có thể được tải xuống dưới dạng krakenws.py.

Tất cả các nguồn cấp dữ liệu thị trường công khai (ticker, book, spread, ohlc, trade), nguồn cấp dữ liệu quản lý tài khoản riêng tư (openOrdersownTrades), và các điểm cuối giao dịch (addOrder, cancelOrder, cancelAll) được hỗ trợ.

Đối với các nguồn cấp dữ liệu/điểm cuối riêng tư, mã thông báo xác thực WebSocket phải được cung cấp bằng cách truy xuất mã thông báo từ điểm cuối GetWebSocketsToken của REST API, sau đó sao chép/dán giá trị mã thông báo vào một tệp văn bản có tên WS_Token (trong cùng thư mục với ứng dụng khách API dòng lệnh).

Cách sử dụng

  • krakenws.py feed/endpoint [tham số]

  • ./krakenws.py ticker XBT/USD ETH/EUR XDG/XBT

  • ./krakenws.py book ETH/USD 10

  • ./krakenws.py ohlc LTC/EUR XBT/USD 60

  • ./krakenws.py openOrders

  • ./krakenws.py ownTrades

  • ./krakenws.py addOrder pair=XBT/USD type=buy ordertype=market volume=0.002 leverage=5

  • ./krakenws.py cancelOrder txid=O6L3CW-FD5CZ-NE373X

Cách sử dụng ứng dụng khách dòng lệnh API WebSocket v1 như sau:

Mã Python

#!/usr/bin/env python

# API WebSocket của Kraken
#
# Cách sử dụng: ./krakenws.py feed/endpoint [tham số]
# Ví dụ: ./krakenws.py ticker XBT/USD
# Ví dụ: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Ví dụ: ./krakenws.py book XBT/USD XBT/EUR 10
# Ví dụ: ./krakenws.py openOrders
# Ví dụ: ./krakenws.py ownTrades
# Ví dụ: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Ví dụ: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Để quản lý tài khoản và giao dịch, mã thông báo xác thực WebSocket hợp lệ (từ điểm cuối GetWebSocketsToken của REST API) phải được cung cấp trong một tệp văn bản thuần túy có tên WS_Token.

import sys
import signal
from websocket import create_connection

def timeoutfunction(signalnumber, frame):
raise KeyboardInterrupt

signal.signal(signal.SIGALRM, timeoutfunction)

api_status = {"ping"}
api_public = {"trade", "book", "ticker", "spread", "ohlc"}
api_private = {"openOrders", "ownTrades", "balances"}
api_trading = {"addOrder", "editOrder", "cancelOrder", "cancelAll", "cancelAllOrdersAfter"}
api_domain_public = "wss://ws.kraken.com/"
api_domain_private = "wss://ws-auth.kraken.com/"
api_symbols = ""
api_number = 0

if len(sys.argv) < 2:
api_feed = "ping"
else:
api_feed = sys.argv[1]

if api_feed in api_status:
api_domain = api_domain_public
api_data = '{"event":"%(feed)s"}' % {"feed":api_feed}
signal.alarm(3)
elif api_feed in api_public:
if len(sys.argv) < 3:
print("Cách sử dụng: %s feed/endpoint [tham số]" % sys.argv[0])
print("Ví dụ: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)
for count in range(2, len(sys.argv)):
if sys.argv[count].isdecimal() == True:
api_number = int(sys.argv[count])
else:
if len(api_symbols) == 0:
api_symbols += sys.argv[count].upper()
else:
api_symbols += '","' + sys.argv[count].upper()
if api_feed == 'book':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "depth":%(depth)d}, "pair":["%(symbols)s"]}' % {"feed":api_feed, "symbols":api_symbols, "depth":api_number if api_number != 0 else 10}
elif api_feed == 'ohlc':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "interval":%(interval)d}, "pair":["%(symbols)s"]}' % {"feed":api_feed, "symbols":api_symbols, "interval":api_number if api_number != 0 else 1}
else:
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s"}, "pair":["%(symbols)s"]}' % {"feed":api_feed, "symbols":api_symbols}
api_domain = api_domain_public
elif api_feed in api_private:
api_domain = api_domain_private
try:
api_token = open("WS_Token").read().strip()
except:
print("Thiếu mã thông báo xác thực WebSocket (WS_Token)")
sys.exit(1)
if len(sys.argv) >= 3:
if api_feed == 'openOrders':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "ratecounter":%(ratecounter)s, "token":"%(token)s"}}' % {"feed":api_feed, "ratecounter":sys.argv[2].split('=')[1], "token":api_token}
elif api_feed == 'ownTrades':
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "snapshot":%(snapshot)s, "token":"%(token)s"}}' % {"feed":api_feed, "snapshot":sys.argv[2].split('=')[1], "token":api_token}
else:
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "token":"%(token)s"}}' % {"feed":api_feed, "token":api_token}
else:
api_data = '{"event":"subscribe", "subscription":{"name":"%(feed)s", "token":"%(token)s"}}' % {"feed":api_feed, "token":api_token}
elif api_feed in api_trading:
api_domain = api_domain_private
try:
api_token = open("WS_Token").read().strip()
except:
print("Thiếu mã thông báo xác thực WebSocket (WS_Token)")
sys.exit(1)
api_data = '{"event":"%(feed)s", "token":"%(token)s"' % {"feed":api_feed, "token":api_token}
for count in range(2, len(sys.argv)):
if sys.argv[count].split('=')[0] == 'txid':
api_data = api_data + ', "%(name)s":["%(value)s"]' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1].replace(',', '","')}
elif sys.argv[count].split('=')[0] == 'reqid':
api_data = api_data + ', "%(name)s":%(value)s' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1]}
elif sys.argv[count].split('=')[0] == 'timeout':
api_data = api_data + ', "%(name)s":%(value)s' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1]}
else:
api_data = api_data + ', "%(name)s":"%(value)s"' % {"name":sys.argv[count].split('=')[0], "value":sys.argv[count].split('=')[1]}
api_data = api_data + '}'
signal.alarm(3)
else:
print("Cách sử dụng: %s feed/endpoint [tham số]" % sys.argv[0])
print("Ví dụ: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> Máy khách: %s" % ws.recv())
except Exception as error:
print("Kết nối WebSocket thất bại (%s)" % error)
sys.exit(1)

try:
print("Máy khách -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Máy khách: %s" % ws.recv())
except Exception as error:
print("Đăng ký/yêu cầu WebSocket thất bại (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Máy khách: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("Tin nhắn WebSocket thất bại (%s)" % error)
sys.exit(1)

sys.exit(1)

Bạn cần thêm trợ giúp?