{"record":{"id":"f9fdd28eba50150e","repo":"nautechsystems/nautilus_trader","slug":"limit-price-is-required-for-order-type-order-type","errorCode":null,"errorMessage":"limit_price is required for order type {order_type:?}","messagePattern":"limit_price is required for order type (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/kraken/src/common/order_params.rs","lineNumber":90,"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        _ => 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!(\n        order_type,\n        OrderType::StopMarket\n            | OrderType::StopLimit\n            | OrderType::MarketIfTouched\n            | OrderType::LimitIfTouched\n    );\n\n    let limit_price = order.price().map(|p| p.as_decimal());\n","sourceCodeStart":72,"sourceCodeEnd":108,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/kraken/src/common/order_params.rs#L72-L108","documentation":"Limit-style Kraken WS orders (Limit, StopLimit, LimitIfTouched) require a limit price. build_add_order_params checks order.price() and bails when a limit-order type is submitted without one, since the Kraken API has no field to fill it from.","triggerScenarios":"Submitting a Limit, StopLimit, or LimitIfTouched order via Kraken WS where order.price() returns None — i.e. the order was constructed without a limit price or with a null price.","commonSituations":"A bug in order construction (price left unset), strategies that dynamically compute prices where a computation can yield None (e.g. no quotes yet), or reusing market-order builders for limit orders.","solutions":["Ensure a price is set when creating Limit/StopLimit/LimitIfTouched orders via the order factory.","Guard the strategy: compute a fallback or skip submission when the limit price cannot be determined.","Log/inspect order.price() before submission to confirm it is Some for all limit-style orders."],"exampleFix":"// before\nlet price = best_bid(instrument_id); // may be None\nsubmit(limit_order(price));\n// after\nlet Some(price) = best_bid(instrument_id) else {\n    anyhow::bail!(\"no market data to derive limit price for {instrument_id}\");\n};\nsubmit(limit_order(Some(price)));","handlingStrategy":"validation","validationCode":"if matches!(order.order_type(), OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched)\n    && order.price().is_none() {\n    return Err(anyhow::anyhow!(\"{} requires a limit price\", order.order_type()));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always construct limit-style orders with an explicit price from the order factory.","Never derive prices from market data that can be empty without a None check.","Cover price-required invariants with unit tests on order builders."],"tags":["rust","kraken","websocket","missing-price","order-submission"],"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-14T05:17:10.506Z"}