Skip to content

Commit 8329e36

Browse files
committed
Adds cl_ord_id spot endpoints
1 parent 65be039 commit 8329e36

5 files changed

Lines changed: 153 additions & 24 deletions

File tree

src/kraken/spot/trade.py

Lines changed: 90 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ def create_order( # pylint: disable=too-many-branches,too-many-arguments # noqa
9696
close_price2: str | float | None = None,
9797
deadline: str | None = None,
9898
userref: int | None = None,
99+
cl_ord_id: str | None = None,
99100
*,
100101
truncate: bool = False,
101102
reduce_only: bool | None = False,
@@ -190,6 +191,8 @@ def create_order( # pylint: disable=too-many-branches,too-many-arguments # noqa
190191
:type validate: bool, optional
191192
:param userref: User reference id for example to group orders
192193
:type userref: int, optional
194+
:param cl_ord_id: Client order id (optional)
195+
:type cl_ord_id: str, optional
193196
:raises ValueError: If input is not correct
194197
:return: The transaction id
195198
:rtype: dict
@@ -400,6 +403,8 @@ def create_order( # pylint: disable=too-many-branches,too-many-arguments # noqa
400403
params["deadline"] = deadline
401404
if defined(userref):
402405
params["userref"] = userref
406+
if defined(cl_ord_id):
407+
params["cl_ord_id"] = cl_ord_id
403408
if defined(displayvol):
404409
params["displayvol"] = str(displayvol)
405410

@@ -456,6 +461,7 @@ def create_order_batch(
456461
... "timeinforce": "GTC",
457462
... "type": "buy",
458463
... "userref": 16861348843,
464+
... "cl_ord_id": "my-client-order-id-1",
459465
... "volume": 1,
460466
... },
461467
... {
@@ -464,6 +470,7 @@ def create_order_batch(
464470
... "timeinforce": "GTC",
465471
... "type": "sell",
466472
... "userref": 16861348843,
473+
... "cl_ord_id": "my-client-order-id-2",
467474
... "volume": 2,
468475
... },
469476
... ],
@@ -491,8 +498,19 @@ def create_order_batch(
491498
extra_params=extra_params,
492499
)
493500

494-
def amend_order(
501+
def amend_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
495502
self: Trade,
503+
txid: str | None = None,
504+
cl_ord_id: str | None = None,
505+
order_qty: str | float | None = None,
506+
display_qty: str | float | None = None,
507+
limit_price: str | float | None = None,
508+
trigger_price: str | float | None = None,
509+
pair: str | None = None,
510+
post_only: bool | None = None,
511+
deadline: str | None = None,
512+
nonce: int | None = None,
513+
validate: bool = False,
496514
*,
497515
extra_params: dict | None = None,
498516
) -> dict:
@@ -504,22 +522,72 @@ def amend_order(
504522
505523
- https://docs.kraken.com/api/docs/rest-api/amend-order
506524
525+
:param txid: The txid of the order to edit
526+
:type txid: str, optional
527+
:param cl_ord_id: Client order id (optional)
528+
:type cl_ord_id: str, optional
529+
:param order_qty: Set a new order quantity
530+
:type order_qty: str | float, optional
531+
:param display_qty: Set a new display quantity
532+
:type display_qty: str | float, optional
533+
:param limit_price: Set a new limit price
534+
:type limit_price: str | float, optional
535+
:param trigger_price: Set a new trigger price
536+
:type trigger_price: str | float, optional
537+
:param pair: Pair of the order, required on amends for non-crypto orders
538+
:type pair: str, optional
539+
:param post_only: Set post-only flag
540+
:type post_only: bool, optional
541+
:param deadline: RFC3339 timestamp
542+
:type deadline: str, optional
543+
:param nonce: Nonce used in construction of API-Sign header
544+
:type nonce: int, optional
545+
:param validate: Validate the order without placing on the market (default: ``False``)
546+
:type validate: bool, optional
547+
:raises ValueError: If both ``txid`` and ``cl_ord_id`` are not set
548+
:return: Success or failure
549+
:rtype: dict
550+
507551
.. code-block:: python
508552
:linenos:
509553
:caption: Spot Trade: Amend order
510554
511555
>>> from kraken.spot import Trade
512556
>>> trade = Trade(key="api-key", secret="secret-key")
513557
>>> trade.amend_order(
514-
... extra_params={
515-
... "txid": "OVM3PT-56ACO-53SM2T",
516-
... "limit_price": "105636.9",
517-
... }
558+
... txid="OVM3PT-56ACO-53SM2T",
559+
... limit_price="105636.9"
518560
... )
519561
"""
562+
params: dict = {"validate": validate}
563+
if defined(txid):
564+
params["txid"] = txid
565+
if defined(cl_ord_id):
566+
params["cl_ord_id"] = cl_ord_id
567+
if not defined(txid) and not defined(cl_ord_id):
568+
raise ValueError("Either txid or cl_ord_id must be set!")
569+
570+
if defined(order_qty):
571+
params["order_qty"] = str(order_qty)
572+
if defined(display_qty):
573+
params["display_qty"] = str(display_qty)
574+
if defined(limit_price):
575+
params["limit_price"] = str(limit_price)
576+
if defined(trigger_price):
577+
params["trigger_price"] = str(trigger_price)
578+
if defined(pair):
579+
params["pair"] = pair
580+
if defined(post_only):
581+
params["post_only"] = post_only
582+
if defined(deadline):
583+
params["deadline"] = deadline
584+
if defined(nonce):
585+
params["nonce"] = nonce
586+
520587
return self.request( # type: ignore[return-value]
521588
"POST",
522589
uri="/0/private/AmendOrder",
590+
params=params,
523591
extra_params=extra_params,
524592
)
525593

@@ -632,21 +700,24 @@ def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
632700
@ensure_string("txid")
633701
def cancel_order(
634702
self: Trade,
635-
txid: str,
703+
txid: str | None = None,
704+
cl_ord_id: str | None = None,
636705
*,
637706
extra_params: dict | None = None,
638707
) -> dict:
639708
"""
640709
Cancel a specific order by ``txid``. Instead of a transaction id
641-
a user reference id can be passed.
710+
a user reference id or client order id can be passed.
642711
643712
Requires the ``Cancel/close orders`` permission in
644713
the API key settings.
645714
646715
- https://docs.kraken.com/api/docs/rest-api/cancel-order
647716
648-
:param txid: Transaction id or comma delimited list of user reference ids to cancel.
649-
:type txid: str
717+
:param txid: Transaction id, client order id, or comma delimited list of user reference ids to cancel.
718+
:type txid: str, optional
719+
:param cl_ord_id: Client order id (optional)
720+
:type cl_ord_id: str, optional
650721
:return: Success or failure - Number of closed orders
651722
:rtype: dict
652723
@@ -659,10 +730,18 @@ def cancel_order(
659730
>>> trade.cancel_order(txid="OAUHYR-YCVK6-P22G6P")
660731
{ 'count': 1 }
661732
"""
733+
params: dict = {}
734+
if defined(txid):
735+
params["txid"] = txid
736+
elif defined(cl_ord_id):
737+
params["cl_ord_id"] = cl_ord_id
738+
else:
739+
raise ValueError("Either txid or cl_ord_id must be set.")
740+
662741
return self.request( # type: ignore[return-value]
663742
method="POST",
664743
uri="/0/private/CancelOrder",
665-
params={"txid": txid},
744+
params=params,
666745
extra_params=extra_params,
667746
)
668747

@@ -742,7 +821,7 @@ def cancel_order_batch(
742821
extra_params: dict | None = None,
743822
) -> dict:
744823
"""
745-
Cancel a a list of orders by ``txid`` or ``userref``
824+
Cancel a list of orders by ``txid``, ``userref`` or ``cl_ord_id``.
746825
747826
Requires the ``Cancel/close orders`` permission in
748827
the API key settings.

src/kraken/spot/user.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,7 @@ def get_trade_balance(
252252
def get_open_orders(
253253
self: User,
254254
userref: int | None = None,
255+
cl_ord_id: str | None = None,
255256
*,
256257
trades: bool | None = False,
257258
extra_params: dict | None = None,
@@ -266,6 +267,8 @@ def get_open_orders(
266267
267268
:param userref: Filter the results by user reference id
268269
:type userref: int, optional
270+
:param cl_ord_id: Filter the results by client order id
271+
:type cl_ord_id: str, optional
269272
:param trades: Include trades related to position or not into the
270273
response (default: ``False``)
271274
:type trades: bool
@@ -316,6 +319,8 @@ def get_open_orders(
316319
params: dict = {"trades": trades}
317320
if defined(userref):
318321
params["userref"] = userref
322+
if defined(cl_ord_id):
323+
params["cl_ord_id"] = cl_ord_id
319324
return self.request( # type: ignore[return-value]
320325
method="POST",
321326
uri="/0/private/OpenOrders",
@@ -326,6 +331,7 @@ def get_open_orders(
326331
def get_closed_orders(
327332
self: User,
328333
userref: int | None = None,
334+
cl_ord_id: str | None = None,
329335
start: int | None = None,
330336
end: int | None = None,
331337
ofs: int | None = None,
@@ -344,6 +350,8 @@ def get_closed_orders(
344350
345351
:param userref: Filter the results by user reference id
346352
:type userref: int, optional
353+
:param cl_ord_id: Filter the results by client order id
354+
:type cl_ord_id: str, optional
347355
:param start: Unix timestamp to start the search from
348356
:type start: int, optional
349357
:param end: Unix timestamp to define the last result to include
@@ -404,6 +412,8 @@ def get_closed_orders(
404412
params: dict = {"trades": trades, "closetime": closetime}
405413
if defined(userref):
406414
params["userref"] = userref
415+
if defined(cl_ord_id):
416+
params["cl_ord_id"] = cl_ord_id
407417
if defined(start):
408418
params["start"] = start
409419
if defined(end):
@@ -423,6 +433,7 @@ def get_orders_info(
423433
self: User,
424434
txid: list[str] | str,
425435
userref: int | None = None,
436+
cl_ord_id: str | None = None,
426437
*,
427438
trades: bool | None = False,
428439
consolidate_taker: bool | None = True,
@@ -441,6 +452,8 @@ def get_orders_info(
441452
:type txid: str | list[str]
442453
:param userref: Filter results by user reference id
443454
:type userref: int, optional
455+
:param cl_ord_id: Filter results by client order id
456+
:type cl_ord_id: str, optional
444457
:param trades: Include trades in the result or not (default: ``False``)
445458
:type trades: bool, optional
446459
:param consolidate_taker: Consolidate trades by individual taker trades
@@ -524,6 +537,8 @@ def get_orders_info(
524537
}
525538
if defined(userref):
526539
params["userref"] = userref
540+
if defined(cl_ord_id):
541+
params["cl_ord_id"] = cl_ord_id
527542
return self.request( # type: ignore[return-value]
528543
method="POST",
529544
uri="/0/private/QueryOrders",

src/kraken/spot/ws_client.py

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ async def send_message( # noqa: C901 # pylint: disable=arguments-differ
253253
... "order_qty": 1.0,
254254
... "side": "buy",
255255
... "symbol": "BTC/USD",
256+
... "cl_ord_id": "my-client-order-id"
256257
... },
257258
... }
258259
... )
@@ -275,13 +276,15 @@ async def send_message( # noqa: C901 # pylint: disable=arguments-differ
275276
... "order_qty": 1,
276277
... "order_type": "limit",
277278
... "order_userref": 123456789,
279+
... "cl_ord_id": "my-client-order-id-1",
278280
... "side": "buy",
279281
... },
280282
... {
281283
... "limit_price": 500.21,
282284
... "order_qty": 2.12345,
283285
... "order_type": "limit",
284286
... "order_userref": 212345679,
287+
... "cl_ord_id": "my-client-order-id-2",
285288
... "side": "sell",
286289
... "stp_type": "cancel_both",
287290
... },
@@ -307,7 +310,8 @@ async def send_message( # noqa: C901 # pylint: disable=arguments-differ
307310
... "orders": [
308311
... "123456789",
309312
... "212345679",
310-
... "ORDER-ID123-4567890"
313+
... "ORDER-ID123-4567890",
314+
... "my-client-order-id"
311315
... ],
312316
... },
313317
... }
@@ -356,25 +360,26 @@ async def send_message( # noqa: C901 # pylint: disable=arguments-differ
356360
... message={
357361
... "method": "cancel_order",
358362
... "params": {
359-
... "order_id": ["ORDER-ID123-456789", "ORDER-ID123-987654"],
363+
... "order_id": ["ORDER-ID123-456789", "my-client-order-id"],
360364
... },
361365
... }
362366
... )
363367
364-
**Editing orders** can be done as shown in the example below. See
365-
https://docs.kraken.com/api/docs/websocket-v2/edit_order for more information.
368+
**Amending orders** can be done as shown in the example below. See
369+
https://docs.kraken.com/api/docs/websocket-v2/amend_order for more information.
366370
367371
.. code-block:: python
368372
:linenos:
369-
:caption: Spot Websocket: Cancel order(s)
373+
:caption: Spot Websocket: Amend order
370374
371375
>>> await client_auth.send_message(
372376
... message={
373-
... "method": "edit_order",
377+
... "method": "amend_order",
374378
... "params": {
375379
... "order_id": "ORDER-ID123-456789",
376380
... "order_qty": 2.5,
377381
... "symbol": "BTC/USD",
382+
... "cl_ord_id": "my-client-order-id"
378383
... },
379384
... }
380385
... )
@@ -586,7 +591,7 @@ def private_methods(self: SpotWSClient) -> list[str]:
586591
June 2023):
587592
588593
- `add_order <https://docs.kraken.com/api/docs/websocket-v2/add_order>`_
589-
- `amend_order` <https://docs.kraken.com/api/docs/websocket-v2/amend_order>`_
594+
- `amend_order <https://docs.kraken.com/api/docs/websocket-v2/amend_order>`_
590595
- `cancel_order <https://docs.kraken.com/api/docs/websocket-v2/cancel_order>`_
591596
- `cancel_all <https://docs.kraken.com/api/docs/websocket-v2/cancel_all>`_
592597
- `cancel_all_orders_after <https://docs.kraken.com/api/docs/websocket-v2/cancel_after>`_

0 commit comments

Comments
 (0)