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
- Restrict the strategy to Kraken WS-supported types: Market, Limit, StopMarket, StopLimit, MarketIfTouched, LimitIfTouched.
- Route unsupported order types to the Kraken REST execution client.
- 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
- Restrict strategy order templates to order types the venue adapter supports.
- Re-audit order-type usage when porting strategies between adapters.
- Add a config-time check that fails fast on unsupported order types per venue.
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
- Trailing stop orders are not yet supported on the Kraken WS
- Iceberg (display_qty) orders are not supported on the Kraken
- limit_price is required for order type {order_type:?}
- Unsupported trigger type for Kraken Spot WS: {other:?} (only
- trigger_price is required for conditional order type {order_
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/e71204518942695f.
Report an issue: GitHub.