{"record":{"id":"68e656f7459e65c3","repo":"nautechsystems/nautilus_trader","slug":"limit-price-is-required-for-batch-order-type-orde","errorCode":null,"errorMessage":"limit_price is required for batch order type {order_type:?}","messagePattern":"limit_price is required for batch order type (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/execution/spot.rs","lineNumber":1027,"sourceCode":"    }\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        ty => anyhow::bail!(\"Unsupported order type for Kraken WS batch: {ty:?}\"),\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 batch order type {order_type:?}\");\n    }\n\n    let ws_tif =\n        compute_ws_time_in_force(is_limit_order, 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!(\n        order_type,\n        OrderType::StopMarket\n            | OrderType::StopLimit\n            | OrderType::MarketIfTouched\n            | OrderType::LimitIfTouched\n    );\n\n    let trigger = if is_conditional {","sourceCodeStart":1009,"sourceCodeEnd":1045,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/execution/spot.rs#L1009-L1045","documentation":"Kraken Spot WS batch order submission requires a limit price for any order type classified as limit-like (Limit, StopLimit, LimitIfTouched). build_batch_order bails out before constructing the batch message when such an order has no price attached. The adapter cannot map the order to Kraken's batch-add schema without it.","triggerScenarios":"Calling batch_add_via_ws with an order of OrderType::Limit, StopLimit, or LimitIfTouched whose order.price() is None (e.g. a Limit order built without a price, or a price passed as a trigger price only).","commonSituations":"Submitting stop-limit orders where only the trigger price was set and the limit price was forgotten; porting code from market-order flows to batch flows; programmatic order factories that default prices to None.","solutions":["Set a limit price on the order (order.price(...)) before adding it to the batch.","Check order.price().is_some() for limit-type orders before calling batch_add_via_ws.","If a market-style order was intended, use OrderType::Market so the limit-price requirement does not apply."],"exampleFix":"// before\nlet order = OrderBuilder::limit(instrument_id, OrderSide::Buy, qty).build();\n// after\nlet order = OrderBuilder::limit(instrument_id, OrderSide::Buy, qty)\n    .price(Price::from(\"27000.00\"))\n    .build();","handlingStrategy":"validation","validationCode":"use nautilus_model::enums::OrderType;\nfn batch_limit_order_valid(t: OrderType, price: Option<Price>) -> bool {\n    !matches!(t, OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched)\n        || price.is_some()\n}","typeGuard":"fn has_price(order: &OrderAny) -> bool { order.price().is_some() }","tryCatchPattern":null,"preventionTips":["Always set a limit price when constructing limit-family orders.","Add an order-factory assertion that limit-type orders carry a price.","Keep trigger and limit prices as separate, mandatory fields in config."],"tags":["kraken","orders","validation","websocket"],"backgroundTag":"missing-required-argument","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}