{"record":{"id":"496b4939de29a44b","repo":"nautechsystems/nautilus_trader","slug":"conditional-orders-require-a-trigger-price","errorCode":null,"errorMessage":"Conditional orders require a trigger price","messagePattern":"Conditional orders require a trigger price","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/binance/src/spot/execution.rs","lineNumber":2730,"sourceCode":"    order: &impl Order,\n    client_order_id: ClientOrderId,\n    is_post_only: bool,\n    is_quote_quantity: bool,\n    use_gtd: bool,\n) -> anyhow::Result<NewOrderParams> {\n    let binance_side = BinanceSide::try_from(order.order_side())?;\n    let binance_order_type = order_type_to_binance_spot(order.order_type(), is_post_only)?;\n\n    let requires_trigger = matches!(\n        order.order_type(),\n        OrderType::StopMarket\n            | OrderType::StopLimit\n            | OrderType::MarketIfTouched\n            | OrderType::LimitIfTouched\n    );\n\n    if requires_trigger && order.trigger_price().is_none() {\n        anyhow::bail!(\"Conditional orders require a trigger price\");\n    }\n\n    let supports_tif = matches!(\n        binance_order_type,\n        BinanceSpotOrderType::Limit\n            | BinanceSpotOrderType::StopLossLimit\n            | BinanceSpotOrderType::TakeProfitLimit\n    );\n    let binance_tif = time_in_force_to_binance_spot(order.time_in_force(), use_gtd)?;\n    let binance_tif = if supports_tif {\n        Some(binance_tif)\n    } else {\n        None\n    };\n\n    let qty_str = order.quantity().to_string();\n    let (base_qty, quote_qty) = if is_quote_quantity {\n        (None, Some(qty_str))","sourceCodeStart":2712,"sourceCodeEnd":2748,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/binance/src/spot/execution.rs#L2712-L2748","documentation":"`build_new_order_params` determines whether the mapped Binance Spot order type is conditional (StopLoss, StopLimit, MarketIfTouched, LimitIfTouched / stop-loss variants) and bails if the order carries no trigger price, since Binance requires stopPrice for these order types.","triggerScenarios":"Submitting (via `submit_order_internal`) or building a spot OCO (`build_spot_oco_order_list_params`) with an order of type StopMarket, StopLimit, MarketIfTouched, or LimitIfTouched whose `trigger_price()` is None.","commonSituations":"Constructing stop orders with a factory that leaves trigger_price unset; porting strategy code from venues that derive the trigger from price; forgetting to set the trigger when converting a plain limit order into a stop-limit.","solutions":["Set a trigger_price on the order before submission (e.g. via order_factory.stop_limit(..., trigger_price=...))","Validate order.trigger_price().is_some() for conditional types in the strategy before submit","If a plain limit/market order was intended, change the order type instead of leaving a conditional type without a trigger"],"exampleFix":"// before\nlet order = order_factory.stop_limit(\n    instrument_id, Side::Sell, qty, price,\n    TimeInForce::Gtc, None, None, // no trigger\n);\n// after\nlet order = order_factory.stop_limit(\n    instrument_id, Side::Sell, qty, price,\n    TimeInForce::Gtc, None, Some(trigger_price),\n);","handlingStrategy":"validation","validationCode":"fn conditional_needs_trigger(order: &OrderAny) -> bool {\n    matches!(order.order_type(), OrderType::StopMarket | OrderType::StopLimit | OrderType::MarketIfTouched | OrderType::LimitIfTouched)\n        && order.trigger_price().is_none()\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass trigger_price when creating stop/MIT orders","Add a pre-submit assertion for conditional order types","Avoid copying plain-limit construction code for conditional orders"],"tags":["binance","spot","order-params","validation","conditional-orders"],"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-23T08:17:48.524Z"}