{"record":{"id":"8b37e3a4215c1556","repo":"nautechsystems/nautilus_trader","slug":"bbo-side-type-and-bbo-level-are-not-supported","errorCode":null,"errorMessage":"`bbo_side_type` and `bbo_level` are not supported for order type {order_type:?}","messagePattern":"`bbo_side_type` and `bbo_level` are not supported for order type (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/bybit/src/execution.rs","lineNumber":574,"sourceCode":"    fn validate_bbo_params(\n        order: &OrderAny,\n        product_type: BybitProductType,\n        tp_sl: &BybitTpSlParams,\n    ) -> anyhow::Result<()> {\n        if !tp_sl.has_bbo() {\n            return Ok(());\n        }\n\n        anyhow::ensure!(\n            matches!(\n                product_type,\n                BybitProductType::Linear | BybitProductType::Inverse\n            ),\n            \"`bbo_side_type` and `bbo_level` are only supported for Bybit linear and inverse products\"\n        );\n\n        let order_type = order.order_type();\n        anyhow::ensure!(\n            matches!(\n                order_type,\n                OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched\n            ),\n            \"`bbo_side_type` and `bbo_level` are not supported for order type {order_type:?}\"\n        );\n\n        Ok(())\n    }\n\n    fn build_ws_place_params(\n        order: &OrderAny,\n        product_type: BybitProductType,\n        raw_symbol: &str,\n        tp_sl: &BybitTpSlParams,\n        position_idx: Option<BybitPositionIdx>,\n        smp_type: Option<BybitOrderSmpType>,\n    ) -> anyhow::Result<BybitWsPlaceOrderParams> {","sourceCodeStart":556,"sourceCodeEnd":592,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/bybit/src/execution.rs#L556-L592","documentation":"BBO trigger parameters only make sense for limit-style orders. validate_bbo_params allows only Limit, StopLimit, and LimitIfTouched; any other OrderType (e.g. Market, StopMarket) with bbo params set fails this ensure! check.","triggerScenarios":"Attaching bbo_side_type/bbo_level to a Market, StopMarket, or MarketIfTouched order.","commonSituations":"Copy-pasting a BBO params builder across order builders; changing an order from Limit to Market while keeping BBO params.","solutions":["Switch the order to OrderType::Limit, StopLimit, or LimitIfTouched","Drop the bbo_side_type/bbo_level keys for market-style orders","Gate BBO params behind order type in your submission code"],"exampleFix":"// before\norder_builder.order_type(OrderType::Market).tp_sl(tp_sl_with_bbo);\n// after\norder_builder.order_type(OrderType::Limit).tp_sl(tp_sl_with_bbo);","handlingStrategy":"validation","validationCode":"let bbo_allowed = matches!(order.order_type(),\n    OrderType::Limit | OrderType::StopLimit | OrderType::LimitIfTouched);\nif tp_sl.has_bbo() && !bbo_allowed {\n    // remove BBO params or change order type before submission\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = validate_bbo_params(product_type, &order, &tp_sl) {\n    if e.to_string().contains(\"order type\") {\n        tracing::warn!(\"dropping BBO params for {:?}\", order.order_type());\n        tp_sl.bbo_side_type = None;\n        tp_sl.bbo_level = None;\n    } else {\n        return Err(e);\n    }\n}","preventionTips":["Only attach BBO params in limit-order builders","Re-validate params after any order-type change","Cover the BBO+order-type matrix in tests"],"tags":["bybit","validation","orders","order-type"],"backgroundTag":"unsupported-operation","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"}