nautechsystems/nautilus_trader · error · anyhow::Error

Unsupported order type for Kraken WS: {order_type:?}

Error message

Unsupported order type for Kraken WS: {order_type:?}

What it means

build_add_order_params maps a fixed set of Nautilus order types to Kraken WS order types (Market, Limit, StopMarket, StopLimit, MarketIfTouched, LimitIfTouched). Any other order type falls into the catch-all arm and bails with this debug-formatted message.

Source

Thrown at crates/adapters/kraken/src/common/order_params.rs:81

        OrderType::TrailingStopMarket | OrderType::TrailingStopLimit
    ) {
        anyhow::bail!("Trailing stop orders are not yet supported on the Kraken WS path; use REST",);
    }

    if order.display_qty().is_some() {
        anyhow::bail!(
            "Iceberg (display_qty) orders are not supported on the Kraken WS path; use REST"
        );
    }

    let kraken_order_type = match order_type {
        OrderType::Market => KrakenOrderType::Market,
        OrderType::Limit => KrakenOrderType::Limit,
        OrderType::StopMarket => KrakenOrderType::StopLoss,
        OrderType::StopLimit => KrakenOrderType::StopLossLimit,
        OrderType::MarketIfTouched => KrakenOrderType::TakeProfit,
        OrderType::LimitIfTouched => KrakenOrderType::TakeProfitLimit,
        _ => anyhow::bail!("Unsupported order type for Kraken WS: {order_type:?}"),
    };

    let is_limit_order = matches!(
        order_type,
        OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched
    );

    if is_limit_order && order.price().is_none() {
        anyhow::bail!("limit_price is required for order type {order_type:?}");
    }

    let ws_tif = compute_ws_time_in_force(is_limit_order, time_in_force, order.expire_time())?;
    let expire_time = match (ws_tif, order.expire_time()) {
        (Some(KrakenTimeInForce::GoodTilDate), Some(ts)) => Some(format_expire_time(ts)),
        _ => None,
    };

    let is_conditional = matches!(

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Restrict the strategy to Kraken WS-supported types: Market, Limit, StopMarket, StopLimit, MarketIfTouched, LimitIfTouched.
  2. Route unsupported order types to the Kraken REST execution client.
  3. Check the log's {order_type:?} value to identify exactly which type leaked through, then fix the order-generation logic.

Example fix

// before
let order = order_factory.market_to_limit(...); // MarketToLimit not mapped for Kraken WS
// after
let order = order_factory.limit(...); // use a mapped order type
Defensive patterns

Strategy: validation

Validate before calling

const KRAKEN_WS_ORDER_TYPES: &[OrderType] = &[
    OrderType::Market, OrderType::Limit, OrderType::StopMarket,
    OrderType::StopLimit, OrderType::MarketIfTouched, OrderType::LimitIfTouched,
];
if !KRAKEN_WS_ORDER_TYPES.contains(&order.order_type()) {
    // route to REST or reject
}

Try / catch

match ws_client.submit(order).await {
    Err(e) if e.to_string().starts_with("Unsupported order type for Kraken WS") => {
        rest_client.submit(order).await?;
    }
    r => r?,
}

Prevention

When it happens

Trigger: Submitting an order type outside the mapped set via the Kraken WS client — e.g. TrailingStopLimit (reaching this arm only if earlier guards change), MarketToLimit, or any future/venue-specific order type.

Common situations: Strategy emits order types the Kraken Spot WS API simply has no equivalent for; commonly hit after porting a strategy from another adapter (e.g. Binance or IBKR) without auditing its order-type usage.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/e71204518942695f. Report an issue: GitHub.