{"record":{"id":"6cd347dc51d426c9","repo":"nautechsystems/nautilus_trader","slug":"invalid-order-side-e","errorCode":null,"errorMessage":"Invalid order side: {e}","messagePattern":"Invalid order side: (.+?)","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/architect_ax/src/execution.rs","lineNumber":228,"sourceCode":"        };\n\n        let ws_orders = self.ws_orders.clone();\n        let trader_id = self.core.trader_id;\n        let emitter = self.emitter.clone();\n        let clock = self.clock;\n\n        let http_client = self.http_client.clone();\n\n        self.spawn_task(\"submit_order\", async move {\n            // AX emulates market orders with preview-priced IOC limits, so book moves\n            // between preview and submission can produce partial fills.\n            let (price, submit_time_in_force, submit_post_only) = if order_type\n                == OrderType::Market\n            {\n                let preview_result: anyhow::Result<Price> = async {\n                    let symbol = instrument_id.symbol.inner();\n                    let ax_side = AxOrderSide::try_from(order_side)\n                        .map_err(|e| anyhow::anyhow!(\"Invalid order side: {e}\"))?;\n                    let qty_contracts = quantity_to_contracts(quantity)?;\n\n                    let instrument = http_client.get_instrument(&symbol).ok_or_else(|| {\n                        anyhow::anyhow!(\"Instrument {instrument_id} not found in cache\")\n                    })?;\n\n                    let request =\n                        PreviewAggressiveLimitOrderRequest::new(symbol, qty_contracts, ax_side);\n                    let response = http_client\n                        .inner\n                        .preview_aggressive_limit_order(&request)\n                        .await\n                        .map_err(|e| {\n                            anyhow::anyhow!(\"Failed to preview aggressive limit order: {e}\")\n                        })?;\n\n                    if response.remaining_quantity > 0 {\n                        log::warn!(","sourceCodeStart":210,"sourceCodeEnd":246,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/a4b06ed870971b5671d12754ea138a3ab99b1dec/crates/adapters/architect_ax/src/execution.rs#L210-L246","documentation":"Thrown while pricing an emulated MARKET order during submit_order: the adapter converts the Nautilus OrderSide to AX's two-value side enum (B/S) via AxOrderSide::try_from. AX only encodes Buy and Sell, so any other OrderSide discriminant (NO_SIDE or UNDEFINED) fails with 'Invalid order side for AX', wrapped by this message. In practice Nautilus orders normally always carry BUY or SELL, so hitting this means an order object was built or deserialized without a side.","triggerScenarios":"Submitting a MARKET order whose order_side() is NO_SIDE/UNDEFINED (manually constructed OrderAny, corrupted order state, or a code path that creates an OrderInitialized without setting side); any future OrderSide variant added to Nautilus that the adapter has not mapped.","commonSituations":"Custom strategy code constructing orders directly instead of via the order factory; porting code where the side parameter was accidentally dropped; serialized/restored order objects with a default-0 (NO_SIDE) side field.","solutions":["Log order.order_side() before submit and fix the caller so the order is created with OrderSide::Buy or OrderSide::Sell","Create orders through the Strategy's order_factory so side is always populated","If the side truly is optional in your flow, submit a LIMIT order only after the side is known"],"exampleFix":"// before\nlet order = factory.market(\n    instrument.id,\n    order_side_from_signal.unwrap_or_default(), // NO_SIDE when None\n    qty,\n); // -> \"Invalid order side\"\n// after\nlet side = order_side_from_signal\n    .context(\"signal produced no order side\")?; // fail before submit\nlet order = factory.market(instrument.id, side, qty);","handlingStrategy":"validation","validationCode":"// Before submit_order for a MARKET order\nuse nautilus_model::enums::OrderSide;\nfn side_ok(side: OrderSide) -> bool {\n    matches!(side, OrderSide::Buy | OrderSide::Sell)\n}\nassert!(side_ok(order.order_side()), \"order has no side\");","typeGuard":"fn is_ax_supported_side(side: OrderSide) -> bool {\n    matches!(side, OrderSide::Buy | OrderSide::Sell)\n}","tryCatchPattern":null,"preventionTips":["Always build orders with the Strategy order_factory so side is a required argument","Assert side_ok(...) in debug builds before every submit","Never default a side parameter with unwrap_or_default() (that yields NO_SIDE)"],"tags":["architect-ax","order-submission","order-side","market-order","rust"],"backgroundTag":"invalid-order-side","analyzedSha":"a4b06ed870971b5671d12754ea138a3ab99b1dec","analyzedAt":"2026-08-16T22:54:50.089Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}