nautechsystems/nautilus_trader · error

Unsupported order type: {order_type:?}

Error message

Unsupported order type: {order_type:?}

What it means

Kraken Spot supports a limited set of order types (Limit, Market, StopLoss, StopLossLimit, TakeProfit, TakeProfitLimit, TrailingStop, TrailingStopLimit). The catch-all arm of the OrderType mapping bails for any other type (e.g. LimitOnClose, MarketToLimit) since there is no Kraken equivalent.

Source

Thrown at crates/adapters/kraken/src/http/spot/client.rs:3029

        let raw_symbol = instrument.raw_symbol().inner();
        let asset_class = Self::asset_class_for(&instrument);

        let kraken_side = match order_side {
            OrderSide::Buy => KrakenOrderSide::Buy,
            OrderSide::Sell => KrakenOrderSide::Sell,
        };

        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,
            OrderType::TrailingStopMarket => KrakenOrderType::TrailingStop,
            OrderType::TrailingStopLimit => KrakenOrderType::TrailingStopLimit,
            _ => anyhow::bail!("Unsupported order type: {order_type:?}"),
        };

        let mut oflags = Vec::new();
        let is_limit_order = matches!(
            order_type,
            OrderType::Limit
                | OrderType::StopLimit
                | OrderType::LimitIfTouched
                | OrderType::TrailingStopLimit
        );

        if time_in_force == TimeInForce::Fok && order_type != OrderType::Limit {
            anyhow::bail!("FOK time in force only supported for LIMIT orders on Kraken Spot");
        }

        let (timeinforce, expiretm) =
            compute_time_in_force(is_limit_order, time_in_force, expire_time)?;

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Use a supported OrderType: Limit, Market, StopMarket, StopLimit, MarketIfTouched, LimitIfTouched, TrailingStopMarket, or TrailingStopLimit.
  2. Emulate unsupported semantics with supported types (e.g. use StopMarket with triggers instead of LOC orders).
  3. Gate strategy configuration to exclude Kraken Spot unsupported order types via supported_order_types on the venue/execution client.

Example fix

// before
let order = order_factory.limit_on_close(instrument_id, side, qty, price, time_in_force);

// after
let order = order_factory.limit(instrument_id, side, qty, price, time_in_force);
Defensive patterns

Strategy: validation

Validate before calling

use nautilus_model::enums::OrderType;
fn is_kraken_spot_order_type(t: &OrderType) -> bool {
    matches!(t, OrderType::Limit | OrderType::Market | OrderType::StopMarket | OrderType::StopLimit
        | OrderType::MarketIfTouched | OrderType::LimitIfTouched
        | OrderType::TrailingStopMarket | OrderType::TrailingStopLimit)
}

Type guard

fn supported_on_kraken_spot(t: &OrderType) -> bool {
    !matches!(t, OrderType::LimitOnClose | OrderType::MarketToLimit)
}

Try / catch

if !is_kraken_spot_order_type(&order.order_type()) {
    return Err(format!("order type {:?} not supported on Kraken Spot", order.order_type()));
}
client.submit_order(order).await?;

Prevention

When it happens

Trigger: Submitting an order with OrderType variants outside the explicitly mapped set — e.g. OrderType::LimitIfTouched, MarketToLimit, or LimitOnClose — via the spot submit path.

Common situations: Strategies ported from venues that support those order types; generic order factories emitting LOC/MIT types; missing feature gating so unsupported order types reach the Kraken adapter.

Related errors


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