{"record":{"id":"e71204518942695f","repo":"nautechsystems/nautilus_trader","slug":"unsupported-order-type-for-kraken-ws-order-type","errorCode":null,"errorMessage":"Unsupported order type for Kraken WS: {order_type:?}","messagePattern":"Unsupported order type for Kraken WS: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/common/order_params.rs","lineNumber":81,"sourceCode":"        OrderType::TrailingStopMarket | OrderType::TrailingStopLimit\n    ) {\n        anyhow::bail!(\"Trailing stop orders are not yet supported on the Kraken WS path; use REST\",);\n    }\n\n    if order.display_qty().is_some() {\n        anyhow::bail!(\n            \"Iceberg (display_qty) orders are not supported on the Kraken WS path; use REST\"\n        );\n    }\n\n    let kraken_order_type = match order_type {\n        OrderType::Market => KrakenOrderType::Market,\n        OrderType::Limit => KrakenOrderType::Limit,\n        OrderType::StopMarket => KrakenOrderType::StopLoss,\n        OrderType::StopLimit => KrakenOrderType::StopLossLimit,\n        OrderType::MarketIfTouched => KrakenOrderType::TakeProfit,\n        OrderType::LimitIfTouched => KrakenOrderType::TakeProfitLimit,\n        _ => anyhow::bail!(\"Unsupported order type for Kraken WS: {order_type:?}\"),\n    };\n\n    let is_limit_order = matches!(\n        order_type,\n        OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched\n    );\n\n    if is_limit_order && order.price().is_none() {\n        anyhow::bail!(\"limit_price is required for order type {order_type:?}\");\n    }\n\n    let ws_tif = compute_ws_time_in_force(is_limit_order, time_in_force, order.expire_time())?;\n    let expire_time = match (ws_tif, order.expire_time()) {\n        (Some(KrakenTimeInForce::GoodTilDate), Some(ts)) => Some(format_expire_time(ts)),\n        _ => None,\n    };\n\n    let is_conditional = matches!(","sourceCodeStart":63,"sourceCodeEnd":99,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/common/order_params.rs#L63-L99","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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."],"exampleFix":"// before\nlet order = order_factory.market_to_limit(...); // MarketToLimit not mapped for Kraken WS\n// after\nlet order = order_factory.limit(...); // use a mapped order type","handlingStrategy":"validation","validationCode":"const KRAKEN_WS_ORDER_TYPES: &[OrderType] = &[\n    OrderType::Market, OrderType::Limit, OrderType::StopMarket,\n    OrderType::StopLimit, OrderType::MarketIfTouched, OrderType::LimitIfTouched,\n];\nif !KRAKEN_WS_ORDER_TYPES.contains(&order.order_type()) {\n    // route to REST or reject\n}","typeGuard":null,"tryCatchPattern":"match ws_client.submit(order).await {\n    Err(e) if e.to_string().starts_with(\"Unsupported order type for Kraken WS\") => {\n        rest_client.submit(order).await?;\n    }\n    r => r?,\n}","preventionTips":["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."],"tags":["rust","kraken","websocket","unsupported-order-type","enum-mapping"],"backgroundTag":"unsupported-enum-value","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}