This is an unofficial collection of REST and websocket clients for Spot and Futures trading on the Kraken cryptocurrency exchange using Python.
There is no guarantee that this software will work flawlessly at this or later times. Of course, no responsibility is taken for possible profits or losses. This software probably has some errors in it, so use it at your own risk. Also no one should be motivated or tempted to invest assets in speculative forms of investment.
- November 23, 2022
- Spot REST Clients
- Spot Websocket Client
- Futures REST Clients
- Futures Websocket Client
- access both public and private endpoints
- responsive error handling and logging
- Installation and setup
- Spot Clients Example Usage
- Futures Clients Example Usage
- Spot Clients Documentation
- Futures Clients Documentation
- Notes
- References
python3 -m pip install python-kraken-sdk
- Spot Trading: https://www.kraken.com/u/security/api
- Futures Trading: https://futures.kraken.com/trade/settings/api
- Futures Sandbox: https://demo-futures.kraken.com/settings/api
If any unexpected behavior occurs, please check your API permissions, rate limits, and if the error persits please open an issue.
... can be found in /examples/spot_examples.py
from kraken.spot.client import User, Market, Trade, Funding, Staking
def main() -> None:
key = 'Kraken-public-key'
secret = 'Kraken-secret-key'
# ____USER________
user = User(key=key, secret=secret)
print(user.get_account_balance())
print(user.get_open_orders())
# ____MARKET_______
market = Market()
print(market.get_ticker(pair='BTCUSD'))
# ____TRADE________
trade = Trade(key=key, secret=secret)
print(trade.create_order(
ordertype='limit',
side='buy',
volume=1,
pair='BTC/EUR',
price=20000
))
# ____FUNDING______
funding = Funding(key=key, secret=secret)
print(funding.withdraw_funds(asset='DOT', key='MyPolkadotWallet', amount=200))
print(funding.cancel_widthdraw(asset='DOT', refid='<some id>'))
# ____STAKING______
staking = Staking(key=key, secret=secret)
print(staking.list_stakeable_assets())
print(staking.stake_asset(asset='DOT', amount=20, method='polkadot-staked'))
if __name__ == '__main__': main()
... can be found in /examples/spot_ws_examples.py
import asyncio, time
from kraken.spot.client import KrakenSpotWSClient
async def main() -> None:
key = 'Kraken-public-key'
secret = 'Kraken-secret-key'
class Bot(KrakenSpotWSClient):
async def on_message(self, msg) -> None:
if 'event' in msg:
if msg['event'] in ['pong', 'heartbeat']: return
print(msg)
# if condition:
# await self.create_order(
# ordertype='limit',
# side='buy',
# pair='BTC/EUR',
# price=20000,
# volume=1
# )
# ... it is also possible to call regular Spot REST endpoints
# but using the WsClient's functions is more efficient
# because the requests will be sent via the ws connection
# ___Public_Websocket_Feeds_______
bot = Bot() # only use this one if you dont need private feeds
print(bot.public_sub_names) # list public subscription names
await bot.subscribe(subscription={ 'name': 'ticker' }, pair=['XBT/EUR', 'DOT/EUR'])
await bot.subscribe(subscription={ 'name': 'spread' }, pair=['XBT/EUR', 'DOT/EUR'])
# await bot.subscribe(subscription={ 'name': 'book' }, pair=['BTC/EUR'])
# await bot.subscribe(subscription={ 'name': 'book', 'depth': 25}, pair=['BTC/EUR'])
# await bot.subscribe(subscription={ 'name': 'ohlc' }, pair=['BTC/EUR'])
# await bot.subscribe(subscription={ 'name': 'ohlc', 'interval': 15}, pair=['XBT/EUR', 'DOT/EUR'])
# await bot.subscribe(subscription={ 'name': 'trade' }, pair=['BTC/EUR'])
# await bot.subscribe(subscription={ 'name': '*' } , pair=['BTC/EUR'])
time.sleep(2) # wait because unsubscribing is faster than subscribing ...
await bot.unsubscribe(subscription={ 'name': 'ticker' }, pair=['XBT/EUR','DOT/EUR'])
await bot.unsubscribe(subscription={ 'name': 'spread' }, pair=['XBT/EUR'])
await bot.unsubscribe(subscription={ 'name': 'spread' }, pair=['DOT/EUR'])
# ....
# ___Authenticated_Websocket_____
# when using the authenticated bot, you can also subscribe to public feeds
auth_bot = Bot(key=key, secret=secret)
print(auth_bot.private_sub_names) # list private subscription names
await auth_bot.subscribe(subscription={ 'name': 'ownTrades' })
await auth_bot.subscribe(subscription={ 'name': 'openOrders' })
time.sleep(2)
await auth_bot.unsubscribe(subscription={ 'name': 'ownTrades' })
await auth_bot.unsubscribe(subscription={ 'name': 'openOrders' })
while True: await asyncio.sleep(6)
if __name__ == '__main__':
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try: asyncio.run(main())
except KeyboardInterrupt: loop.close()
Note: Authenticated Spot websocket clients can also un/subscribe from/to public feeds.
Kraken provides a sandbox environment at https://demo-futures.kraken.com for paper trading. When using this API keys you have to set the sandbox
parameter to True
when instantiating the respecitve client.
... can be found in /examples/futures_examples.py
from kraken.futures.client import Market, User, Trade, Funding
def main() -> None:
key = 'futures-api-key'
secret = 'futures-secret-key'
# ____USER__________
user = User(key=key, secret=secret) # optional: sandbox=True
print(user.get_wallets())
print(user.get_open_orders())
print(user.get_open_positions())
print(user.get_subaccounts())
# ....
# ____MARKET_________
market = Market()
print(market.get_ohlc(tick_type='trade', symbol='PI_XBTUSD', resolution='5m'))
priv_market = Market(key=key, secret=secret)
print(priv_market.get_fee_schedules_vol())
print(priv_market.get_execution_events())
# ....
# ____TRADE_________
trade = Trade(key=key, secret=secret)
print(trade.get_fills())
print(trade.create_batch_order(
batchorder_list = [{
'order': 'send',
'order_tag': '1',
'orderType': 'lmt',
'symbol': 'PI_XBTUSD',
'side': 'buy',
'size': 1,
'limitPrice': 12000,
'cliOrdId': 'some-client-id'
}, {
'order': 'send',
'order_tag': '2',
'orderType': 'stp',
'symbol': 'PI_XBTUSD',
'side': 'buy',
'size': 1,
'limitPrice': 10000,
'stopPrice': 11000,
}, {
'order': 'cancel',
'order_id': 'e35dsdfsdfsddd-8a30-4d5f-a574-b5593esdf0',
}, {
'order': 'cancel',
'cliOrdId': 'another-client-id',
}],
))
print(trade.cancel_all_orders())
print(trade.create_order(orderType='lmt', side='buy', size=1, limitPrice=4, symbol='pf_bchusd'))
# ....
# ____FUNDING_______
funding = Funding(key=key, secret=secret)
# ....
if __name__ == '__main__': main()
... can be found in /examples/futures_ws_examples.py
import asyncio
from kraken.futures.client import KrakenFuturesWSClient
async def main() -> None:
key = 'futures-api-key'
secret = 'futures-secret-key'
# ___Custom_Trading_Bot__________
class Bot(KrakenFuturesWSClient):
async def on_message(self, event) -> None:
print(event)
# >> apply your trading strategy here <<
# you can also combine this with the Futures REST clients
# _____Public_Websocket_Feeds___________________
bot = Bot()
# print(bot.get_available_public_subscription_feeds())
products = ['PI_XBTUSD', 'PF_ETHUSD']
# subscribe to a public websocket feed
await bot.subscribe(feed='ticker', products=products)
# await bot.subscribe(feed='book', products=products)
# ...
# unsubscribe from a public websocket feed
# await bot.unsubscribe(feed='ticker', products=products)
# _____Authenticated_Websocket__________________
auth_bot = Bot(key=key, secret=secret)
# print(auth_bot.get_available_private_subscription_feeds())
# subscribe to a private/authenticated websocket feed
await auth_bot.subscribe(feed='fills')
await auth_bot.subscribe(feed='open_positions')
await auth_bot.subscribe(feed='open_orders')
# ...
# unsubscribe from a private/authenticaed websocket feed
await auth_bot.unsubscribe(feed='fills')
while True: await asyncio.sleep(6)
if __name__ == '__main__':
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
try: asyncio.run(main())
except KeyboardInterrupt: loop.close()
Note: Authenticated Futures websocket clients can also un/subscribe from/to public feeds.
Method | Documentation |
---|---|
create_order |
https://docs.kraken.com/rest/#operation/addOrder |
create_order_batch |
https://docs.kraken.com/rest/#operation/addOrderBatch |
edit_order |
https://docs.kraken.com/rest/#operation/editOrder |
cancel_order |
https://docs.kraken.com/rest/#operation/cancelOrder |
cancel_all_orders |
https://docs.kraken.com/rest/#operation/cancelAllOrders |
cancel_all_orders_after_x |
https://docs.kraken.com/rest/#operation/cancelAllOrdersAfter |
cancel_order_batch |
https://docs.kraken.com/rest/#operation/cancelOrderBatch |
Method | Documentation |
---|---|
get_assets |
https://docs.kraken.com/rest/#operation/getAssetInfo |
get_tradable_asset_pair |
https://docs.kraken.com/rest/#operation/getTradableAssetPairs |
get_ticker |
https://docs.kraken.com/rest/#operation/getTickerInformation |
get_ohlc |
https://docs.kraken.com/rest/#operation/getOHLCData |
get_order_book |
https://docs.kraken.com/rest/#operation/getOrderBook |
get_recent_trades |
https://docs.kraken.com/rest/#operation/getRecentTrades |
get_recend_spreads |
https://docs.kraken.com/rest/#operation/getRecentSpreads |
get_system_status |
checks if Kraken is online |
Method | Documentation |
---|---|
get_deposit_methods |
https://docs.kraken.com/rest/#operation/getDepositMethods |
get_deposit_address |
https://docs.kraken.com/rest/#operation/getDepositAddresses |
get_recend_deposits_status |
https://docs.kraken.com/rest/#operation/getStatusRecentDeposits |
get_withdrawal_info |
https://docs.kraken.com/rest/#operation/getWithdrawalInformation |
withdraw_funds |
https://docs.kraken.com/rest/#operation/withdrawFund |
get_recend_withdraw_status |
https://docs.kraken.com/rest/#operation/getStatusRecentWithdrawals |
cancel_withdraw |
https://docs.kraken.com/rest/#operation/cancelWithdrawal |
wallet_transfer |
https://docs.kraken.com/rest/#operation/walletTransfer |
Method | Documentation |
---|---|
stake_asset |
https://docs.kraken.com/rest/#operation/stake |
unstake_asset |
https://docs.kraken.com/rest/#operation/unstake |
list_stakeable_assets |
https://docs.kraken.com/rest/#operation/getStakingAssetInfo |
get_pending_staking_transactions |
https://docs.kraken.com/rest/#operation/getStakingPendingDeposits |
list_staking_transactions |
https://docs.kraken.com/rest/#operation/getStakingTransactions |
Method | Documentation |
---|---|
get_ws_token |
https://docs.kraken.com/rest/#tag/Websockets-Authentication |
create_order |
https://docs.kraken.com/websockets/#message-addOrder |
edit_order |
https://docs.kraken.com/websockets/#message-editOrder |
cancel_order |
https://docs.kraken.com/websockets/#message-cancelOrder |
cancel_all_orders |
https://docs.kraken.com/websockets/#message-cancelAll |
cancel_all_orders_after |
https://docs.kraken.com/websockets/#message-cancelAllOrdersAfter |
subscribe |
https://docs.kraken.com/websockets/#message-subscribe |
unsubscribe |
https://docs.kraken.com/websockets/#message-unsubscribe |
private_sub_names |
get private subscription names |
public_sub_names |
get public subscription names |
active_private_subscriptions |
get active private subscriptions |
active_public_subscriptions |
get active public subscriptions |
on_message |
function which should be overloaded or will execute the callback function |
Method | Documentation |
---|---|
get_historical_funding_rates |
https://docs.futures.kraken.com/#http-api-trading-v3-api-historical-funding-rates-historicalfundingrates |
initiate_wallet_transfer |
https://docs.futures.kraken.com/#http-api-trading-v3-api-transfers-initiate-wallet-transfer |
initiate_subccount_transfer |
https://docs.futures.kraken.com/#http-api-trading-v3-api-transfers-initiate-sub-account-transfer |
initiate_withdrawal_to_spot_wallet |
https://docs.futures.kraken.com/#http-api-trading-v3-api-transfers-initiate-withdrawal-to-spot-wallet |
Method | Documentation |
---|---|
subscribe |
subscribe to a feed |
unsubscribe |
unsubscribe from a feed |
get_available_public_subscription_feeds |
returns all available public feeds |
get_available_private_subscription_feeds |
returns all available private feeds |
on_message |
callback function which should be overloaded |
- Pull requests will be ignored until the owner finished the core idea
- https://docs.kraken.com/rest/
- https://docs.kraken.com/websockets
- https://docs.futures.kraken.com/
- https://support.kraken.com/hc/en-us/sections/360012894412-Futures-API