WebSocket API v1 commandoregel-client (Python)

Laatst bijgewerkt: 1 apr 2025

De volgende Python-code implementeert een commandoregel-API-client voor onze exchange WebSocket API v1. De code kan worden gebruikt als een zelfstandige API-client, of kan worden aangeroepen vanuit andere geïnterpreteerde of gecompileerde programmeertalen (Bash, C++, enz.).

De standaard Python WebSocket-bibliotheek (websocket-client) is vereist voor de WebSocket-netwerken, maar geen andere API-bibliotheken/modules zijn vereist.

De WebSocket API commandoregel-client kan ook worden gedownload als krakenws.py.

Alle openbare marktdatafeeds (ticker, book, spread, ohlc, trade), privé accountbeheerfeeds (openOrders en ownTrades), en trading-endpoints (addOrder, cancelOrder, cancelAll) worden ondersteund.

Voor de privéfeeds/endpoints moet een WebSocket-authenticatietoken worden verstrekt door het token op te halen via het REST API GetWebSocketsToken endpoint, en vervolgens de tokenwaarde te kopiëren/plakken in een tekstbestand genaamd WS_Token (in dezelfde directory/map als de commandoregel-API-client).

Gebruik

  • 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

Het gebruik van de WebSocket API v1 commandoregel-client is als volgt:

Python Code

#!/usr/bin/env python

# Kraken WebSocket API
#
# Gebruik: ./krakenws.py feed/endpoint [parameters]
# Voorbeeld: ./krakenws.py ticker XBT/USD
# Voorbeeld: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Voorbeeld: ./krakenws.py book XBT/USD XBT/EUR 10
# Voorbeeld: ./krakenws.py openOrders
# Voorbeeld: ./krakenws.py ownTrades
# Voorbeeld: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Voorbeeld: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Voor accountbeheer en trading moet een geldig WebSocket-authenticatietoken (van het REST API GetWebSocketsToken endpoint) worden opgegeven in een platte tekstbestand genaamd 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("Gebruik: %s feed/endpoint [parameters]" % sys.argv[0])
print("Voorbeeld: %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-authenticatietoken ontbreekt (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-authenticatietoken ontbreekt (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("Gebruik: %s feed/endpoint [parameters]" % sys.argv[0])
print("Voorbeeld: %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-verbinding mislukt (%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-abonnement/verzoek mislukt (%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-berichten mislukt (%s)" % error)
sys.exit(1)

sys.exit(1)

Meer hulp nodig?