WebSocket API v1 -komentoriviasiakasohjelma (Python)

Viimeksi päivitetty: 1. huhtikuuta 2025

Seuraava Python-koodi toteuttaa komentorivipohjaisen API-asiakasohjelman exchange WebSocket API v1 -rajapintaamme varten. Koodia voidaan käyttää itsenäisenä API-asiakasohjelmana tai sitä voidaan kutsua muista tulkatuista tai käännetyistä ohjelmointikielistä (Bash, C++ jne.).

Standardi Python WebSocket -kirjasto (websocket-client) vaaditaan WebSocket-verkkoyhteyksiin, mutta muita API-kirjastoja/moduuleja ei tarvita.

WebSocket API -komentoriviasiakasohjelman voi ladata myös nimellä krakenws.py.

Kaikki julkiset markkinatietovirrat (ticker, book, spread, ohlc, trade), yksityiset tilinhallintavirrat (openOrders ja ownTrades) ja kaupankäyntipäätepisteet (addOrder, cancelOrder, cancelAll) ovat tuettuja.

Yksityisiä virtoja/päätepisteitä varten on annettava WebSocket-todennustunnus hakemalla tunnus REST API GetWebSocketsToken -päätepisteestä ja kopioimalla/liittämällä tunnuksen arvo tekstitiedostoon nimeltä WS_Token (sama hakemisto/kansio kuin komentorivipohjaisella API-asiakasohjelmalla).

Käyttö

  • krakenws.py syöte/päätepiste [parametrit]

  • ./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 -komentoriviohjelman käyttö on seuraava:

Python-koodi

#!/usr/bin/env python

# Kraken WebSocket API
#
# Käyttö: ./krakenws.py syöte/päätepiste [parametrit]
# Esimerkki: ./krakenws.py ticker XBT/USD
# Esimerkki: ./krakenws.py spread XBT/USD XBT/EUR ETH/USD LTC/EUR
# Esimerkki: ./krakenws.py book XBT/USD XBT/EUR 10
# Esimerkki: ./krakenws.py openOrders
# Esimerkki: ./krakenws.py ownTrades
# Esimerkki: ./krakenws.py addOrder pair=XBT/EUR type=sell ordertype=limit price=7500 volume=0.125
# Esimerkki: ./krakenws.py cancelOrder txid=OADMSD-7AGC3-IMB46A,OD6VRE-HCSPM-CKORER
#
# Tilinhallintaa ja kaupankäyntiä varten on annettava kelvollinen WebSocket-todennustunnus (REST API GetWebSocketsToken -päätepisteestä) tekstitiedostossa nimeltä 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("Käyttö: %s syöte/päätepiste [parametrit]" % sys.argv[0])
print("Esimerkki: %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-todennustunnus puuttuu (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-todennustunnus puuttuu (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("Käyttö: %s syöte/päätepiste [parametrit]" % sys.argv[0])
print("Esimerkki: %s ticker XBT/USD" % sys.argv[0])
sys.exit(1)

try:
ws = create_connection(api_domain)
print("WebSocket -> Asiakas: %s" % ws.recv())
except Exception as error:
print("WebSocket-yhteys epäonnistui (%s)" % error)
sys.exit(1)

try:
print("Asiakas -> WebSocket: %s" % api_data)
ws.send(api_data)
print("WebSocket -> Asiakas: %s" % ws.recv())
except Exception as error:
print("WebSocket-tilaus/pyyntö epäonnistui (%s)" % error)
ws.close()
sys.exit(1)

while True:
try:
print("WebSocket -> Asiakas: %s" % ws.recv())
except KeyboardInterrupt:
ws.close()
sys.exit(0)
except Exception as error:
print("WebSocket-viestit epäonnistuivat (%s)" % error)
sys.exit(1)

sys.exit(1)

Tarvitsetko lisää apua?