Skip to content

Trading

All 8 Kraken WebSocket v2 trading methods are supported. A TokenManager must be configured for automatic token injection.

Setup

from kraken_connector import HTTPAuthenticatedClient
from kraken_connector.ws import KrakenWSClient, TokenManager

auth_client = HTTPAuthenticatedClient(
    "https://api.kraken.com",
    api_key="your-api-key",
    api_secret="your-api-secret",
)
tm = TokenManager(auth_client=auth_client)

async with KrakenWSClient(token_manager=tm) as client:
    # trading methods available here
    ...

Place an order

from kraken_connector.ws.trading import AddOrderParams

resp = await client.add_order(
    AddOrderParams(
        symbol="BTC/USD",
        side="buy",
        order_type="limit",
        order_qty=0.1,
        limit_price=26000.0,
        token="",  # auto-injected by TokenManager
    )
)
print("Order placed:", resp.result)

Use validate=True for dry-run validation without execution.

Amend an order

Amend modifies an order in-place, preserving the original order_id and queue priority:

from kraken_connector.ws.trading import AmendOrderParams

resp = await client.amend_order(
    AmendOrderParams(
        order_id="OXXXXX-XXXXX-XXXXXX",
        token="",
        limit_price=26500.0,
    )
)

Edit an order

Edit is a cancel-and-replace -- a new order_id is assigned:

from kraken_connector.ws.trading import EditOrderParams

resp = await client.edit_order(
    EditOrderParams(
        order_id="OXXXXX-XXXXX-XXXXXX",
        symbol="BTC/USD",
        token="",
        order_qty=0.2,
        limit_price=26500.0,
    )
)

Cancel orders

from kraken_connector.ws.trading import (
    CancelOrderParams,
    CancelAllParams,
)

# Cancel specific orders
await client.cancel_order(
    CancelOrderParams(token="", order_id=["OXXXXX-XXXXX-XXXXXX"])
)

# Cancel all open orders
await client.cancel_all(CancelAllParams(token=""))

Dead man's switch

Auto-cancel all orders if the timer isn't refreshed:

from kraken_connector.ws.trading import CancelAllOrdersAfterParams

# Set a 60-second dead man's switch
await client.cancel_all_orders_after(
    CancelAllOrdersAfterParams(token="", timeout=60)
)

# Disable the timer
await client.cancel_all_orders_after(
    CancelAllOrdersAfterParams(token="", timeout=0)
)

Batch operations

Batch add (2-15 orders on a single pair)

from kraken_connector.ws.trading import BatchAddParams, AddOrderParams

await client.batch_add(
    BatchAddParams(
        symbol="BTC/USD",
        token="",
        orders=[
            AddOrderParams(
                symbol="BTC/USD", side="buy", order_type="limit",
                order_qty=0.1, limit_price=25000.0, token="",
            ),
            AddOrderParams(
                symbol="BTC/USD", side="buy", order_type="limit",
                order_qty=0.1, limit_price=24000.0, token="",
            ),
        ],
    )
)

Batch cancel (2-50 orders)

from kraken_connector.ws.trading import BatchCancelParams

await client.batch_cancel(
    BatchCancelParams(
        token="",
        orders=["OXXXXX-XXXXX-XXXXXX", "OYYYYY-YYYYY-YYYYYY"],
    )
)

Error handling

Trading errors raise TradingError:

from kraken_connector.ws import TradingError

try:
    resp = await client.add_order(params)
except TradingError as e:
    print("Rejected:", e.error)
    print("Request ID:", e.req_id)

Timeout waiting for a server response raises asyncio.TimeoutError. The timeout is controlled by request_timeout on the client (default 10 seconds).