Skip to content

WS

Kraky websocket module

KrakyWsClient

Kraken Websocket client implementation

Source code in kraky/ws.py
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
class KrakyWsClient:
    """Kraken Websocket client implementation"""

    def __init__(
        self, connection_env: str = "production", logging_level: str = "INFO"
    ) -> None:
        """
        Arguments:
            connection_env: Predefined environment strings (production[-auth] and beta[-auth])
                will be mapped to the corresponding URLs, otherwise the string is
                taken as it is as target URL. https://docs.kraken.com/websockets/#connectionDetails
            logging_level: Change the log level
        """
        self.connection_env = connection_env
        self.connections: dict = {}
        self.logger = get_module_logger(__name__, logging_level)

    async def connect(
        self, handler: Callable, connection_name: str = "main", sleep_time: int = 5
    ) -> None:
        """
        Connect to the websocket and start the handler coroutine.

        Arguments:
            handler: coroutine that will handle the incoming messages
            connection_name: name of the connection you want to subscribe to
            sleep_time: time to wait before retrying to connect
        """
        if self.connection_env == "production":
            ws_url = "wss://ws.kraken.com"
        elif self.connection_env == "production-auth":
            ws_url = "wss://ws-auth.kraken.com"
        elif self.connection_env == "beta":
            ws_url = "wss://beta-ws.kraken.com"
        elif self.connection_env == "beta-auth":
            ws_url = "wss://beta-ws-auth.kraken.com"
        else:
            ws_url = self.connection_env
        self.connections[connection_name] = {}
        self.connections[connection_name]["closed"] = False
        self.connections[connection_name]["subscriptions"] = []
        async for websocket in websockets.connect(ws_url):
            self.connections[connection_name]["websocket"] = websocket
            try:
                # If the subscription list is already populated for this
                # connection at this point, this means the connection was
                # re-established – thus we're resubscribing to be safe.
                for subscription in self.connections[connection_name]["subscriptions"]:
                    self.logger.debug(
                        "Connection %s re-established - resubscribing %s.",
                        connection_name,
                        subscription,
                    )
                    await self.subscribe(
                        subscription=subscription["subscription"],
                        pair=subscription["pair"],
                        connection_name=connection_name,
                    )
                async for message in websocket:
                    data = json.loads(message)
                    if "errorMessage" in data:
                        self.logger.error(data["errorMessage"])
                    else:
                        await handler(data)
            except (
                socket.gaierror,
                websockets.exceptions.ConnectionClosed,
                ConnectionResetError,
            ) as err:
                self.logger.debug(
                    "%s - retrying connection in %s sec.",
                    type(err).__name__,
                    sleep_time,
                )
                await asyncio.sleep(sleep_time)
                continue
            finally:
                if (
                    self.connections[connection_name]["websocket"].closed
                    and self.connections[connection_name]["closed"]
                ):
                    self.logger.debug("Connection successfully closed.")
                    break
                continue
        del self.connections[connection_name]
        self.logger.info(
            "Connection '%s' closed and deleted, exiting connect coroutine.",
            connection_name,
        )

    async def disconnect(self, connection_name: str = "main") -> None:
        """
        Close the websocket connection.

        Arguments:
            connection_name: name of the connection you want to subscribe to
        """
        if (
            connection_name in self.connections
            and "websocket" in self.connections[connection_name]
        ):
            self.logger.debug("Closing websocket connection '%s'.", connection_name)
            self.connections[connection_name]["closed"] = True
            await self.connections[connection_name]["websocket"].close()

    async def _send(self, data: dict, connection_name: str = "main") -> None:
        """Internal function to send data to WS"""
        while not (
            connection_name in self.connections
            and "websocket" in self.connections[connection_name]
        ):
            await asyncio.sleep(0.1)
        try:
            await self.connections[connection_name]["websocket"].send(json.dumps(data))
            await asyncio.sleep(0.1)
        except (
            socket.gaierror,
            websockets.exceptions.ConnectionClosed,
            ConnectionResetError,
        ) as err:
            self.logger.debug("%s - message not sent.", type(err).__name__)

    async def ping(
        self, reqid: Optional[int] = None, connection_name: str = "main"
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-ping
        https://docs.kraken.com/websockets/#message-pong

        Arguments:
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data: dict = {}
        data["event"] = "ping"
        if reqid:
            data["reqid"] = reqid
        await self._send(data=data, connection_name=connection_name)

    async def _sub_unsub(
        self,
        event: str,
        subscription: dict,
        pair: Optional[list] = None,
        reqid: Optional[int] = None,
        connection_name: str = "main",
    ) -> None:
        """
        Internal function to subscribe or unsubscribe to a topic on a single or multiple currency pairs.
        Arguments:
            event: subscribe or unsubscribe
            subscription: Subscribe to a topic on a single or multiple currency pairs.
            pair: Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data: dict = {
            "event": event,
            "subscription": subscription,
        }
        if pair:
            data["pair"] = pair
        if reqid:
            data["reqid"] = reqid
        await self._send(data=data, connection_name=connection_name)

    async def subscribe(
        self,
        subscription: dict,
        pair: Optional[list] = None,
        reqid: Optional[int] = None,
        connection_name: str = "main",
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-subscribe

        Arguments:
            subscription: Subscribe to a topic on a single or multiple currency pairs.
            pair: Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        await self._sub_unsub(
            event="subscribe",
            subscription=subscription,
            pair=pair,
            reqid=reqid,
            connection_name=connection_name,
        )
        self.connections[connection_name]["subscriptions"].append(
            {"event": "subscribe", "pair": pair, "subscription": subscription}
        )

    async def unsubscribe(
        self,
        subscription: dict,
        pair: Optional[list] = None,
        reqid: Optional[int] = None,
        connection_name: str = "main",
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-subscribe

        Arguments:
            subscription: Unsubscribe from a topic on a single or multiple currency pairs.
            pair: Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        await self._sub_unsub(
            event="unsubscribe",
            subscription=subscription,
            pair=pair,
            reqid=reqid,
            connection_name=connection_name,
        )

    async def add_order(
        self,
        token: str,
        pair: str,
        type: str,
        ordertype: str,
        volume: float,
        price: Optional[float] = None,
        price2: Optional[float] = None,
        leverage: Optional[float] = None,
        reduce_only: Optional[bool] = None,
        oflags: Optional[str] = None,
        starttm: Optional[str] = None,
        expiretm: Optional[str] = None,
        userref: Optional[str] = None,
        validate: Optional[str] = None,
        close_ordertype: Optional[str] = None,
        close_price: Optional[float] = None,
        close_price2: Optional[float] = None,
        timeinforce: Optional[str] = None,
        reqid: Optional[int] = None,
        event: str = "addOrder",
        connection_name: str = "main",
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-addOrder

        Arguments:
            token: Authentication token
            pair: Asset pair
            type: Type of order (buy/sell)
            ordertype: Order type:
                market
                limit (price = limit price)
                stop-loss (price = stop loss price)
                take-profit (price = take profit price)
                stop-loss-profit (price = stop loss price, price2 = take profit price)
                stop-loss-profit-limit (price = stop loss price, price2 = take profit price)
                stop-loss-limit (price = stop loss trigger price, price2 = triggered limit price)
                take-profit-limit (price = take profit trigger price, price2 = triggered limit price)
                trailing-stop (price = trailing stop offset)
                trailing-stop-limit (price = trailing stop offset, price2 = triggered limit offset)
                stop-loss-and-limit (price = stop loss price, price2 = limit price)
                settle-position
            volume: Order volume in lots
            price: Price (optional.  dependent upon ordertype)
            price2: Secondary price (optional.  dependent upon ordertype)
            leverage: Amount of leverage desired (optional.  default = none)
            reduce_only: Indicates that the order should only reduce an existing position (optional.  default = false)
            oflags: Comma delimited list of order flags (optional):
                viqc = volume in quote currency (not available for leveraged orders)
                fcib = prefer fee in base currency
                fciq = prefer fee in quote currency
                nompp = no market price protection
                post = post only order (available when ordertype = limit)
            starttm: Scheduled start time (optional):
                0 = now (default)
                +<n> = schedule start time <n> seconds from now
                <n> = unix timestamp of start time
            expiretm: Expiration time (optional):
                0 = no expiration (default)
                +<n> = expire <n> seconds from now
                <n> = unix timestamp of expiration time
            userref: User reference id.  32-bit signed number.  (optional)
            validate: Validate inputs only.  do not submit order (optional)
            close_ordertype: Order type:
                limit (price = limit price)
                stop-loss (price = stop loss price)
                take-profit (price = take profit price)
                stop-loss-profit (price = stop loss price, price2 = take profit price)
                stop-loss-profit-limit (price = stop loss price, price2 = take profit price)
                stop-loss-limit (price = stop loss trigger price, price2 = triggered limit price)
                take-profit-limit (price = take profit trigger price, price2 = triggered limit price)
                trailing-stop (price = trailing stop offset)
                trailing-stop-limit (price = trailing stop offset, price2 = triggered limit offset)
                stop-loss-and-limit (price = stop loss price, price2 = limit price)
                settle-position
            close_price: Secondary price (optional.  dependent upon ordertype)
            close_price2: Secondary price (optional.  dependent upon ordertype)
            timeinforce: Time in force.  (optional)
                GTC = Good till cancelled (default)
                IOC = Immediate or cancel
                FOK = Fill or kill
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data = {
            sub(r"^close_(\w+)", r"close[\1]", arg): value
            for arg, value in locals().items()
            if arg != "self" and arg != "connection_name" and value is not None
        }
        await self._send(data=data, connection_name=connection_name)

    async def edit_order(
        self,
        token: str,
        orderid: list,
        pair: str,
        volume: float,
        price: Optional[float] = None,
        price2: Optional[float] = None,
        oflags: Optional[str] = None,
        newuserref: Optional[str] = None,
        validate: Optional[str] = None,
        reqid: Optional[int] = None,
        event: str = "editOrder",
        connection_name: str = "main",
    ):
        """
        https://docs.kraken.com/websockets/#message-editOrder

        Arguments:
            token: Authentication token
            orderid: Order id
            pair: Asset pair
            volume: Order volume in lots
            price: Price (optional.  dependent upon ordertype)
            price2: Secondary price (optional.  dependent upon ordertype)
            oflags: Comma delimited list of order flags (optional):
                viqc = volume in quote currency (not available for leveraged orders)
                fcib = prefer fee in base currency
                fciq = prefer fee in quote currency
                nompp = no market price protection
                post = post only order (available when ordertype = limit)
            newuserref: Updated user reference id.  32-bit signed number.  (optional)
            validate: Validate inputs only.  do not submit order (optional)
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data = {
            sub(r"^close_(\w+)", r"close[\1]", arg): value
            for arg, value in locals().items()
            if arg != "self" and arg != "connection_name" and value is not None
        }
        await self._send(data=data, connection_name=connection_name)

    async def cancel_order(
        self,
        token: str,
        txid: list,
        reqid: Optional[int] = None,
        event: str = "cancelOrder",
        connection_name: str = "main",
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-cancelOrder

        Arguments:
            token: Authentication token
            txid: Transaction id
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data = {
            arg: value
            for arg, value in locals().items()
            if arg != "self" and arg != "connection_name" and value is not None
        }
        await self._send(data=data, connection_name=connection_name)

    async def cancel_all(
        self,
        token: str,
        reqid: Optional[int] = None,
        event: str = "cancelAll",
        connection_name: str = "main",
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-cancelAll

        Arguments:
            token: Authentication token
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data = {
            arg: value
            for arg, value in locals().items()
            if arg != "self" and arg != "connection_name" and value is not None
        }
        await self._send(data=data, connection_name=connection_name)

    async def cancel_all_orders_after(
        self,
        token: str,
        timeout: int,
        reqid: Optional[int] = None,
        event: str = "cancelAllOrdersAfter",
        connection_name: str = "main",
    ) -> None:
        """
        https://docs.kraken.com/websockets/#message-cancelAllOrdersAfter

        Arguments:
            token: Authentication token
            timeout: Timeout in seconds. 0 = cancel timer (optional)
            reqid: Optional - client originated ID reflected in response message
            connection_name: name of the connection you want to subscribe to
        """
        data = {
            arg: value
            for arg, value in locals().items()
            if arg != "self" and arg != "connection_name" and value is not None
        }
        await self._send(data=data, connection_name=connection_name)

__init__(connection_env='production', logging_level='INFO')

Parameters:

Name Type Description Default
connection_env str

Predefined environment strings (production[-auth] and beta[-auth]) will be mapped to the corresponding URLs, otherwise the string is taken as it is as target URL. https://docs.kraken.com/websockets/#connectionDetails

'production'
logging_level str

Change the log level

'INFO'
Source code in kraky/ws.py
16
17
18
19
20
21
22
23
24
25
26
27
28
def __init__(
    self, connection_env: str = "production", logging_level: str = "INFO"
) -> None:
    """
    Arguments:
        connection_env: Predefined environment strings (production[-auth] and beta[-auth])
            will be mapped to the corresponding URLs, otherwise the string is
            taken as it is as target URL. https://docs.kraken.com/websockets/#connectionDetails
        logging_level: Change the log level
    """
    self.connection_env = connection_env
    self.connections: dict = {}
    self.logger = get_module_logger(__name__, logging_level)

add_order(token, pair, type, ordertype, volume, price=None, price2=None, leverage=None, reduce_only=None, oflags=None, starttm=None, expiretm=None, userref=None, validate=None, close_ordertype=None, close_price=None, close_price2=None, timeinforce=None, reqid=None, event='addOrder', connection_name='main') async

https://docs.kraken.com/websockets/#message-addOrder

Parameters:

Name Type Description Default
token str

Authentication token

required
pair str

Asset pair

required
type str

Type of order (buy/sell)

required
ordertype str

Order type: market limit (price = limit price) stop-loss (price = stop loss price) take-profit (price = take profit price) stop-loss-profit (price = stop loss price, price2 = take profit price) stop-loss-profit-limit (price = stop loss price, price2 = take profit price) stop-loss-limit (price = stop loss trigger price, price2 = triggered limit price) take-profit-limit (price = take profit trigger price, price2 = triggered limit price) trailing-stop (price = trailing stop offset) trailing-stop-limit (price = trailing stop offset, price2 = triggered limit offset) stop-loss-and-limit (price = stop loss price, price2 = limit price) settle-position

required
volume float

Order volume in lots

required
price Optional[float]

Price (optional. dependent upon ordertype)

None
price2 Optional[float]

Secondary price (optional. dependent upon ordertype)

None
leverage Optional[float]

Amount of leverage desired (optional. default = none)

None
reduce_only Optional[bool]

Indicates that the order should only reduce an existing position (optional. default = false)

None
oflags Optional[str]

Comma delimited list of order flags (optional): viqc = volume in quote currency (not available for leveraged orders) fcib = prefer fee in base currency fciq = prefer fee in quote currency nompp = no market price protection post = post only order (available when ordertype = limit)

None
starttm Optional[str]

Scheduled start time (optional): 0 = now (default) + = schedule start time seconds from now = unix timestamp of start time

None
expiretm Optional[str]

Expiration time (optional): 0 = no expiration (default) + = expire seconds from now = unix timestamp of expiration time

None
userref Optional[str]

User reference id. 32-bit signed number. (optional)

None
validate Optional[str]

Validate inputs only. do not submit order (optional)

None
close_ordertype Optional[str]

Order type: limit (price = limit price) stop-loss (price = stop loss price) take-profit (price = take profit price) stop-loss-profit (price = stop loss price, price2 = take profit price) stop-loss-profit-limit (price = stop loss price, price2 = take profit price) stop-loss-limit (price = stop loss trigger price, price2 = triggered limit price) take-profit-limit (price = take profit trigger price, price2 = triggered limit price) trailing-stop (price = trailing stop offset) trailing-stop-limit (price = trailing stop offset, price2 = triggered limit offset) stop-loss-and-limit (price = stop loss price, price2 = limit price) settle-position

None
close_price Optional[float]

Secondary price (optional. dependent upon ordertype)

None
close_price2 Optional[float]

Secondary price (optional. dependent upon ordertype)

None
timeinforce Optional[str]

Time in force. (optional) GTC = Good till cancelled (default) IOC = Immediate or cancel FOK = Fill or kill

None
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
async def add_order(
    self,
    token: str,
    pair: str,
    type: str,
    ordertype: str,
    volume: float,
    price: Optional[float] = None,
    price2: Optional[float] = None,
    leverage: Optional[float] = None,
    reduce_only: Optional[bool] = None,
    oflags: Optional[str] = None,
    starttm: Optional[str] = None,
    expiretm: Optional[str] = None,
    userref: Optional[str] = None,
    validate: Optional[str] = None,
    close_ordertype: Optional[str] = None,
    close_price: Optional[float] = None,
    close_price2: Optional[float] = None,
    timeinforce: Optional[str] = None,
    reqid: Optional[int] = None,
    event: str = "addOrder",
    connection_name: str = "main",
) -> None:
    """
    https://docs.kraken.com/websockets/#message-addOrder

    Arguments:
        token: Authentication token
        pair: Asset pair
        type: Type of order (buy/sell)
        ordertype: Order type:
            market
            limit (price = limit price)
            stop-loss (price = stop loss price)
            take-profit (price = take profit price)
            stop-loss-profit (price = stop loss price, price2 = take profit price)
            stop-loss-profit-limit (price = stop loss price, price2 = take profit price)
            stop-loss-limit (price = stop loss trigger price, price2 = triggered limit price)
            take-profit-limit (price = take profit trigger price, price2 = triggered limit price)
            trailing-stop (price = trailing stop offset)
            trailing-stop-limit (price = trailing stop offset, price2 = triggered limit offset)
            stop-loss-and-limit (price = stop loss price, price2 = limit price)
            settle-position
        volume: Order volume in lots
        price: Price (optional.  dependent upon ordertype)
        price2: Secondary price (optional.  dependent upon ordertype)
        leverage: Amount of leverage desired (optional.  default = none)
        reduce_only: Indicates that the order should only reduce an existing position (optional.  default = false)
        oflags: Comma delimited list of order flags (optional):
            viqc = volume in quote currency (not available for leveraged orders)
            fcib = prefer fee in base currency
            fciq = prefer fee in quote currency
            nompp = no market price protection
            post = post only order (available when ordertype = limit)
        starttm: Scheduled start time (optional):
            0 = now (default)
            +<n> = schedule start time <n> seconds from now
            <n> = unix timestamp of start time
        expiretm: Expiration time (optional):
            0 = no expiration (default)
            +<n> = expire <n> seconds from now
            <n> = unix timestamp of expiration time
        userref: User reference id.  32-bit signed number.  (optional)
        validate: Validate inputs only.  do not submit order (optional)
        close_ordertype: Order type:
            limit (price = limit price)
            stop-loss (price = stop loss price)
            take-profit (price = take profit price)
            stop-loss-profit (price = stop loss price, price2 = take profit price)
            stop-loss-profit-limit (price = stop loss price, price2 = take profit price)
            stop-loss-limit (price = stop loss trigger price, price2 = triggered limit price)
            take-profit-limit (price = take profit trigger price, price2 = triggered limit price)
            trailing-stop (price = trailing stop offset)
            trailing-stop-limit (price = trailing stop offset, price2 = triggered limit offset)
            stop-loss-and-limit (price = stop loss price, price2 = limit price)
            settle-position
        close_price: Secondary price (optional.  dependent upon ordertype)
        close_price2: Secondary price (optional.  dependent upon ordertype)
        timeinforce: Time in force.  (optional)
            GTC = Good till cancelled (default)
            IOC = Immediate or cancel
            FOK = Fill or kill
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    data = {
        sub(r"^close_(\w+)", r"close[\1]", arg): value
        for arg, value in locals().items()
        if arg != "self" and arg != "connection_name" and value is not None
    }
    await self._send(data=data, connection_name=connection_name)

cancel_all(token, reqid=None, event='cancelAll', connection_name='main') async

https://docs.kraken.com/websockets/#message-cancelAll

Parameters:

Name Type Description Default
token str

Authentication token

required
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
async def cancel_all(
    self,
    token: str,
    reqid: Optional[int] = None,
    event: str = "cancelAll",
    connection_name: str = "main",
) -> None:
    """
    https://docs.kraken.com/websockets/#message-cancelAll

    Arguments:
        token: Authentication token
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    data = {
        arg: value
        for arg, value in locals().items()
        if arg != "self" and arg != "connection_name" and value is not None
    }
    await self._send(data=data, connection_name=connection_name)

cancel_all_orders_after(token, timeout, reqid=None, event='cancelAllOrdersAfter', connection_name='main') async

https://docs.kraken.com/websockets/#message-cancelAllOrdersAfter

Parameters:

Name Type Description Default
token str

Authentication token

required
timeout int

Timeout in seconds. 0 = cancel timer (optional)

required
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
async def cancel_all_orders_after(
    self,
    token: str,
    timeout: int,
    reqid: Optional[int] = None,
    event: str = "cancelAllOrdersAfter",
    connection_name: str = "main",
) -> None:
    """
    https://docs.kraken.com/websockets/#message-cancelAllOrdersAfter

    Arguments:
        token: Authentication token
        timeout: Timeout in seconds. 0 = cancel timer (optional)
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    data = {
        arg: value
        for arg, value in locals().items()
        if arg != "self" and arg != "connection_name" and value is not None
    }
    await self._send(data=data, connection_name=connection_name)

cancel_order(token, txid, reqid=None, event='cancelOrder', connection_name='main') async

https://docs.kraken.com/websockets/#message-cancelOrder

Parameters:

Name Type Description Default
token str

Authentication token

required
txid list

Transaction id

required
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
async def cancel_order(
    self,
    token: str,
    txid: list,
    reqid: Optional[int] = None,
    event: str = "cancelOrder",
    connection_name: str = "main",
) -> None:
    """
    https://docs.kraken.com/websockets/#message-cancelOrder

    Arguments:
        token: Authentication token
        txid: Transaction id
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    data = {
        arg: value
        for arg, value in locals().items()
        if arg != "self" and arg != "connection_name" and value is not None
    }
    await self._send(data=data, connection_name=connection_name)

connect(handler, connection_name='main', sleep_time=5) async

Connect to the websocket and start the handler coroutine.

Parameters:

Name Type Description Default
handler Callable

coroutine that will handle the incoming messages

required
connection_name str

name of the connection you want to subscribe to

'main'
sleep_time int

time to wait before retrying to connect

5
Source code in kraky/ws.py
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
async def connect(
    self, handler: Callable, connection_name: str = "main", sleep_time: int = 5
) -> None:
    """
    Connect to the websocket and start the handler coroutine.

    Arguments:
        handler: coroutine that will handle the incoming messages
        connection_name: name of the connection you want to subscribe to
        sleep_time: time to wait before retrying to connect
    """
    if self.connection_env == "production":
        ws_url = "wss://ws.kraken.com"
    elif self.connection_env == "production-auth":
        ws_url = "wss://ws-auth.kraken.com"
    elif self.connection_env == "beta":
        ws_url = "wss://beta-ws.kraken.com"
    elif self.connection_env == "beta-auth":
        ws_url = "wss://beta-ws-auth.kraken.com"
    else:
        ws_url = self.connection_env
    self.connections[connection_name] = {}
    self.connections[connection_name]["closed"] = False
    self.connections[connection_name]["subscriptions"] = []
    async for websocket in websockets.connect(ws_url):
        self.connections[connection_name]["websocket"] = websocket
        try:
            # If the subscription list is already populated for this
            # connection at this point, this means the connection was
            # re-established – thus we're resubscribing to be safe.
            for subscription in self.connections[connection_name]["subscriptions"]:
                self.logger.debug(
                    "Connection %s re-established - resubscribing %s.",
                    connection_name,
                    subscription,
                )
                await self.subscribe(
                    subscription=subscription["subscription"],
                    pair=subscription["pair"],
                    connection_name=connection_name,
                )
            async for message in websocket:
                data = json.loads(message)
                if "errorMessage" in data:
                    self.logger.error(data["errorMessage"])
                else:
                    await handler(data)
        except (
            socket.gaierror,
            websockets.exceptions.ConnectionClosed,
            ConnectionResetError,
        ) as err:
            self.logger.debug(
                "%s - retrying connection in %s sec.",
                type(err).__name__,
                sleep_time,
            )
            await asyncio.sleep(sleep_time)
            continue
        finally:
            if (
                self.connections[connection_name]["websocket"].closed
                and self.connections[connection_name]["closed"]
            ):
                self.logger.debug("Connection successfully closed.")
                break
            continue
    del self.connections[connection_name]
    self.logger.info(
        "Connection '%s' closed and deleted, exiting connect coroutine.",
        connection_name,
    )

disconnect(connection_name='main') async

Close the websocket connection.

Parameters:

Name Type Description Default
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
103
104
105
106
107
108
109
110
111
112
113
114
115
116
async def disconnect(self, connection_name: str = "main") -> None:
    """
    Close the websocket connection.

    Arguments:
        connection_name: name of the connection you want to subscribe to
    """
    if (
        connection_name in self.connections
        and "websocket" in self.connections[connection_name]
    ):
        self.logger.debug("Closing websocket connection '%s'.", connection_name)
        self.connections[connection_name]["closed"] = True
        await self.connections[connection_name]["websocket"].close()

edit_order(token, orderid, pair, volume, price=None, price2=None, oflags=None, newuserref=None, validate=None, reqid=None, event='editOrder', connection_name='main') async

https://docs.kraken.com/websockets/#message-editOrder

Parameters:

Name Type Description Default
token str

Authentication token

required
orderid list

Order id

required
pair str

Asset pair

required
volume float

Order volume in lots

required
price Optional[float]

Price (optional. dependent upon ordertype)

None
price2 Optional[float]

Secondary price (optional. dependent upon ordertype)

None
oflags Optional[str]

Comma delimited list of order flags (optional): viqc = volume in quote currency (not available for leveraged orders) fcib = prefer fee in base currency fciq = prefer fee in quote currency nompp = no market price protection post = post only order (available when ordertype = limit)

None
newuserref Optional[str]

Updated user reference id. 32-bit signed number. (optional)

None
validate Optional[str]

Validate inputs only. do not submit order (optional)

None
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
async def edit_order(
    self,
    token: str,
    orderid: list,
    pair: str,
    volume: float,
    price: Optional[float] = None,
    price2: Optional[float] = None,
    oflags: Optional[str] = None,
    newuserref: Optional[str] = None,
    validate: Optional[str] = None,
    reqid: Optional[int] = None,
    event: str = "editOrder",
    connection_name: str = "main",
):
    """
    https://docs.kraken.com/websockets/#message-editOrder

    Arguments:
        token: Authentication token
        orderid: Order id
        pair: Asset pair
        volume: Order volume in lots
        price: Price (optional.  dependent upon ordertype)
        price2: Secondary price (optional.  dependent upon ordertype)
        oflags: Comma delimited list of order flags (optional):
            viqc = volume in quote currency (not available for leveraged orders)
            fcib = prefer fee in base currency
            fciq = prefer fee in quote currency
            nompp = no market price protection
            post = post only order (available when ordertype = limit)
        newuserref: Updated user reference id.  32-bit signed number.  (optional)
        validate: Validate inputs only.  do not submit order (optional)
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    data = {
        sub(r"^close_(\w+)", r"close[\1]", arg): value
        for arg, value in locals().items()
        if arg != "self" and arg != "connection_name" and value is not None
    }
    await self._send(data=data, connection_name=connection_name)

ping(reqid=None, connection_name='main') async

https://docs.kraken.com/websockets/#message-ping https://docs.kraken.com/websockets/#message-pong

Parameters:

Name Type Description Default
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
async def ping(
    self, reqid: Optional[int] = None, connection_name: str = "main"
) -> None:
    """
    https://docs.kraken.com/websockets/#message-ping
    https://docs.kraken.com/websockets/#message-pong

    Arguments:
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    data: dict = {}
    data["event"] = "ping"
    if reqid:
        data["reqid"] = reqid
    await self._send(data=data, connection_name=connection_name)

subscribe(subscription, pair=None, reqid=None, connection_name='main') async

https://docs.kraken.com/websockets/#message-subscribe

Parameters:

Name Type Description Default
subscription dict

Subscribe to a topic on a single or multiple currency pairs.

required
pair Optional[list]

Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.

None
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
async def subscribe(
    self,
    subscription: dict,
    pair: Optional[list] = None,
    reqid: Optional[int] = None,
    connection_name: str = "main",
) -> None:
    """
    https://docs.kraken.com/websockets/#message-subscribe

    Arguments:
        subscription: Subscribe to a topic on a single or multiple currency pairs.
        pair: Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    await self._sub_unsub(
        event="subscribe",
        subscription=subscription,
        pair=pair,
        reqid=reqid,
        connection_name=connection_name,
    )
    self.connections[connection_name]["subscriptions"].append(
        {"event": "subscribe", "pair": pair, "subscription": subscription}
    )

unsubscribe(subscription, pair=None, reqid=None, connection_name='main') async

https://docs.kraken.com/websockets/#message-subscribe

Parameters:

Name Type Description Default
subscription dict

Unsubscribe from a topic on a single or multiple currency pairs.

required
pair Optional[list]

Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.

None
reqid Optional[int]

Optional - client originated ID reflected in response message

None
connection_name str

name of the connection you want to subscribe to

'main'
Source code in kraky/ws.py
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
async def unsubscribe(
    self,
    subscription: dict,
    pair: Optional[list] = None,
    reqid: Optional[int] = None,
    connection_name: str = "main",
) -> None:
    """
    https://docs.kraken.com/websockets/#message-subscribe

    Arguments:
        subscription: Unsubscribe from a topic on a single or multiple currency pairs.
        pair: Optional - Array of currency pairs. Format of each pair is "A/B", where A and B are ISO 4217-A3 for standardized assets and popular unique symbol if not standardized.
        reqid: Optional - client originated ID reflected in response message
        connection_name: name of the connection you want to subscribe to
    """
    await self._sub_unsub(
        event="unsubscribe",
        subscription=subscription,
        pair=pair,
        reqid=reqid,
        connection_name=connection_name,
    )