Πελάτης γραμμής εντολών WebSocket API v1 (Python)

Τελευταία ενημέρωση: 1 Απριλίου 2025

Ο ακόλουθος κώδικας Python υλοποιεί ένα πρόγραμμα-πελάτη API γραμμής εντολών για το WebSocket API v1 του ανταλλακτηρίου μας. Ο κώδικας μπορεί να χρησιμοποιηθεί ως αυτόνομος πελάτης API ή να κληθεί από άλλες διερμηνευόμενες ή μεταγλωττισμένες γλώσσες προγραμματισμού (Bash, C++, κ.λπ.).

Η τυπική βιβλιοθήκη Python WebSocket (websocket-client) απαιτείται για τη δικτύωση WebSocket, αλλά δεν απαιτούνται άλλες βιβλιοθήκες/ενότητες API.

Ο πελάτης γραμμής εντολών WebSocket API μπορεί επίσης να ληφθεί ως krakenws.py.

Υποστηρίζονται όλες οι δημόσιες ροές δεδομένων αγοράς (ticker, book, spread, ohlc, trade), οι ιδιωτικές ροές διαχείρισης λογαριασμού (openOrders και ownTrades) και τα τελικά σημεία συναλλαγών (addOrder, cancelOrder, cancelAll).

Για τις ιδιωτικές ροές/τελικά σημεία, πρέπει να παρασχεθεί ένα διακριτικό ελέγχου ταυτότητας WebSocket, ανακτώντας το διακριτικό από το τελικό σημείο REST API GetWebSocketsToken και στη συνέχεια αντιγράφοντας/επικολλώντας την τιμή του διακριτικού σε ένα αρχείο κειμένου με όνομα WS_Token (στον ίδιο κατάλογο/φάκελο με τον πελάτη API γραμμής εντολών).

Χρήση

  • krakenws.py feed/endpoint [parameters]

  • ./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

Η χρήση του πελάτη γραμμής εντολών WebSocket API v1 είναι η εξής: όπως:

Κώδικας Python

#!/usr/bin/env python

# Kraken WebSocket API
#
# Χρήση: ./krakenws.py feed/endpoint [parameters]
# Παράδειγμα: ./krakenws.py ticker XBT/USD
# Παράδειγμα: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Παράδειγμα: ./krakenws.py book XBT/USD XBT/EUR 10
# Παράδειγμα: ./krakenws.py openOrders
# Παράδειγμα: ./krakenws.py ownTrades
# Παράδειγμα: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Παράδειγμα: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Για τη διαχείριση λογαριασμού και τις συναλλαγές, πρέπει να παρασχεθεί ένα έγκυρο διακριτικό ελέγχου ταυτότητας WebSocket (από το τελικό σημείο REST API GetWebSocketsToken) σε ένα αρχείο απλού κειμένου με όνομα 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("Usage: %s feed/endpoint [parameters]" % sys.argv[0])
print("Example: %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("WebSocket authentication token missing (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("WebSocket authentication token missing (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("Usage: %s feed/endpoint [parameters]" % sys.argv[0])
print("Example: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

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

try:
print("Client -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Client: %s" % ws.recv())
except Exception as error:
print("WebSocket subscription/request failed (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Client: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("WebSocket messages failed (%s)" % error)
sys.exit(1)

sys.exit(1)

Χρειάζεστε περισσότερη βοήθεια;