Skip to content

Commit b1a630f

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

5 files changed

Lines changed: 177 additions & 24 deletions

File tree

src/kraken/spot/trade.py

Lines changed: 85 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,17 @@ 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+
post_only: bool | None = None,
510+
userref: int | None = None,
511+
validate: bool = False,
496512
*,
497513
extra_params: dict | None = None,
498514
) -> dict:
@@ -504,22 +520,64 @@ def amend_order(
504520
505521
- https://docs.kraken.com/api/docs/rest-api/amend-order
506522
523+
:param txid: The txid of the order to edit
524+
:type txid: str, optional
525+
:param cl_ord_id: Client order id (optional)
526+
:type cl_ord_id: str, optional
527+
:param order_qty: Set a new order quantity
528+
:type order_qty: str | float, optional
529+
:param display_qty: Set a new display quantity
530+
:type display_qty: str | float, optional
531+
:param limit_price: Set a new limit price
532+
:type limit_price: str | float, optional
533+
:param trigger_price: Set a new trigger price
534+
:type trigger_price: str | float, optional
535+
:param post_only: Set post-only flag
536+
:type post_only: bool, optional
537+
:param userref: User reference id for example to group orders
538+
:type userref: int, optional
539+
:param validate: Validate the order without placing on the market (default: ``False``)
540+
:type validate: bool, optional
541+
:raises ValueError: If both ``txid`` and ``cl_ord_id`` are not set
542+
:return: Success or failure
543+
:rtype: dict
544+
507545
.. code-block:: python
508546
:linenos:
509547
:caption: Spot Trade: Amend order
510548
511549
>>> from kraken.spot import Trade
512550
>>> trade = Trade(key="api-key", secret="secret-key")
513551
>>> trade.amend_order(
514-
... extra_params={
515-
... "txid": "OVM3PT-56ACO-53SM2T",
516-
... "limit_price": "105636.9",
517-
... }
552+
... txid="OVM3PT-56ACO-53SM2T",
553+
... limit_price="105636.9"
518554
... )
519555
"""
556+
params: dict = {"validate": validate}
557+
if defined(txid):
558+
params["txid"] = txid
559+
if defined(cl_ord_id):
560+
params["cl_ord_id"] = cl_ord_id
561+
if not defined(txid) and not defined(cl_ord_id):
562+
raise ValueError("Either txid or cl_ord_id must be set!")
563+
564+
if defined(order_qty):
565+
params["order_qty"] = str(order_qty)
566+
if defined(display_qty):
567+
params["display_qty"] = str(display_qty)
568+
if defined(limit_price):
569+
params["limit_price"] = str(limit_price)
570+
if defined(trigger_price):
571+
params["trigger_price"] = str(trigger_price)
572+
if defined(post_only):
573+
params["post_only"] = post_only
574+
if defined(userref):
575+
params["userref"] = userref
576+
520577
return self.request( # type: ignore[return-value]
521578
"POST",
522579
uri="/0/private/AmendOrder",
580+
params=params,
523581
extra_params=extra_params,
524582
)
525583

@@ -535,6 +593,7 @@ def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
535593
deadline: str | None = None,
536594
cancel_response: bool | None = None, # noqa: FBT001
537595
userref: int | None = None,
596+
cl_ord_id: str | None = None,
538597
*,
539598
truncate: bool = False,
540599
validate: bool = False,
@@ -573,6 +632,8 @@ def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
573632
:type validate: bool, optional
574633
:param userref: User reference id for example to group orders
575634
:type userref: int
635+
:param cl_ord_id: Client order id (optional)
636+
:type cl_ord_id: str, optional
576637
:return: Success or failure
577638
:rtype: dict
578639
@@ -602,6 +663,8 @@ def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
602663
params: dict = {"txid": txid, "pair": pair, "validate": validate}
603664
if defined(userref):
604665
params["userref"] = userref
666+
if defined(cl_ord_id):
667+
params["cl_ord_id"] = cl_ord_id
605668
if defined(volume):
606669
params["volume"] = (
607670
str(volume)
@@ -632,21 +695,24 @@ def edit_order( # pylint: disable=too-many-arguments # noqa: PLR0913, PLR0917
632695
@ensure_string("txid")
633696
def cancel_order(
634697
self: Trade,
635-
txid: str,
698+
txid: str | None = None,
699+
cl_ord_id: str | None = None,
636700
*,
637701
extra_params: dict | None = None,
638702
) -> dict:
639703
"""
640704
Cancel a specific order by ``txid``. Instead of a transaction id
641-
a user reference id can be passed.
705+
a user reference id or client order id can be passed.
642706
643707
Requires the ``Cancel/close orders`` permission in
644708
the API key settings.
645709
646710
- https://docs.kraken.com/api/docs/rest-api/cancel-order
647711
648-
:param txid: Transaction id or comma delimited list of user reference ids to cancel.
649-
:type txid: str
712+
:param txid: Transaction id, client order id, or comma delimited list of user reference ids to cancel.
713+
:type txid: str, optional
714+
:param cl_ord_id: Client order id (optional)
715+
:type cl_ord_id: str, optional
650716
:return: Success or failure - Number of closed orders
651717
:rtype: dict
652718
@@ -659,10 +725,18 @@ def cancel_order(
659725
>>> trade.cancel_order(txid="OAUHYR-YCVK6-P22G6P")
660726
{ 'count': 1 }
661727
"""
728+
params: dict = {}
729+
if defined(txid):
730+
params["txid"] = txid
731+
elif defined(cl_ord_id):
732+
params["txid"] = cl_ord_id
733+
else:
734+
raise ValueError("Either txid or cl_ord_id must be set!")
735+
662736
return self.request( # type: ignore[return-value]
663737
method="POST",
664738
uri="/0/private/CancelOrder",
665-
params={"txid": txid},
739+
params=params,
666740
extra_params=extra_params,
667741
)
668742

@@ -742,7 +816,7 @@ def cancel_order_batch(
742816
extra_params: dict | None = None,
743817
) -> dict:
744818
"""
745-
Cancel a a list of orders by ``txid`` or ``userref``
819+
Cancel a list of orders by ``txid``, ``userref`` or ``cl_ord_id``.
746820
747821
Requires the ``Cancel/close orders`` permission in
748822
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)