{"record":{"id":"d16d1022b04d2086","repo":"nautechsystems/nautilus_trader","slug":"orders-do-not-have-a-limit-price","errorCode":null,"errorMessage":"{} orders do not have a LIMIT price","messagePattern":"(.+?) orders do not have a LIMIT price","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/trading/src/strategy/mod.rs","lineNumber":373,"sourceCode":"\n        let params = params.filter(|params| !params.is_empty());\n\n        // TODO: Snapshot the order from the cache. See `cancel_order` for the rationale.\n        let order = StrategyNative::strategy_core_mut(self)\n            .cache_rc()\n            .borrow()\n            .try_order_owned(&client_order_id)\n            .map_err(|e| anyhow::anyhow!(\"Cannot modify order: {e}\"))?;\n\n        let mut updating = false;\n\n        if quantity.is_some_and(|q| q != order.quantity() || order.is_pending_update()) {\n            updating = true;\n        }\n\n        if let Some(price) = price {\n            if !LIMIT_ORDER_TYPES.contains(&order.order_type()) {\n                anyhow::bail!(\"{} orders do not have a LIMIT price\", order.order_type());\n            }\n\n            if Some(price) != order.price() {\n                updating = true;\n            }\n        }\n\n        if let Some(trigger_price) = trigger_price {\n            if !STOP_ORDER_TYPES.contains(&order.order_type()) {\n                anyhow::bail!(\n                    \"{} orders do not have a STOP trigger price\",\n                    order.order_type()\n                );\n            }\n\n            if Some(trigger_price) != order.trigger_price() {\n                updating = true;\n            }","sourceCodeStart":355,"sourceCodeEnd":391,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/trading/src/strategy/mod.rs#L355-L391","documentation":"modify_orders was given a price argument for an order whose type is not in LIMIT_ORDER_TYPES. Only limit-type orders (LIMIT, LIMIT_IF_TOUCHED, etc.) carry a limit price, so passing price for a MARKET or STOP_MARKET order bails naming the order type.","triggerScenarios":"Calling strategy.modify_order/modify_orders with price=Some(...) on a MARKET, MARKET_TO_LIMIT-unsupported, STOP_MARKET, or TRAILING_STOP_MARKET order.","commonSituations":"A bulk modify loop that forwards the same price kwarg to every open order regardless of type; assuming an order is a limit after a strategy refactor; amending stop orders intending to change the trigger but passing price.","solutions":["Only pass price for LIMIT-type orders; use trigger_price for stop orders.","Branch on order.order_type() (or self.cache order type) before supplying price.","Pass None for price when modifying non-limit orders and only amend quantity or other applicable fields."],"exampleFix":"// before\nself.modify_order(order, price=new_price)  # order is STOP_MARKET\n\n// after\nif order.order_type in (OrderType.LIMIT, OrderType.LIMIT_IF_TOUCHED):\n    self.modify_order(order, price=new_price)\nelse:\n    self.modify_order(order, trigger_price=new_trigger)","handlingStrategy":"type-guard","validationCode":"LIMIT_TYPES = {OrderType.LIMIT, OrderType.LIMIT_IF_TOUCHED}\nif price is not None and order.order_type not in LIMIT_TYPES:\n    raise TypeError(f\"{order.order_type} orders do not accept a limit price\")","typeGuard":"def accepts_limit_price(order) -> bool:\n    return order.order_type in {OrderType.LIMIT, OrderType.LIMIT_IF_TOUCHED}","tryCatchPattern":"try:\n    self.modify_order(order, price=new_price)\nexcept RuntimeError as e:\n    if \"do not have a LIMIT price\" in str(e):\n        self.log.error(\"use trigger_price for stop-type orders\")\n    else:\n        raise","preventionTips":["Look up the order type from the cache before choosing which fields to amend","In bulk-modify helpers, branch on order type and pass price/trigger_price selectively","Remember the mapping: price → limit types, trigger_price → stop types"],"tags":["rust","strategy","modify-order","order-type"],"backgroundTag":"invalid-argument-value","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"}