{"record":{"id":"bd55abd130acbd27","repo":"nautechsystems/nautilus_trader","slug":"stop-market-order-missing-trigger-price","errorCode":null,"errorMessage":"Stop market order missing trigger_price","messagePattern":"Stop market order missing trigger_price","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/dydx/src/execution/mod.rs","lineNumber":1468,"sourceCode":"                            client_metadata,\n                            order.order_side(),\n                            order\n                                .price()\n                                .ok_or_else(|| anyhow::anyhow!(\"Limit order missing price\"))?,\n                            order.quantity(),\n                            order.time_in_force(),\n                            order.is_post_only(),\n                            order.is_reduce_only(),\n                            block_height,\n                            expire_time, // Uses default_short_term_expiry if configured\n                        )?;\n                        (msg, \"limit\")\n                    }\n                    // Conditional orders use their own expiration logic (not affected by default_short_term_expiry)\n                    // They are always stored on-chain with long-term semantics\n                    OrderType::StopMarket => {\n                        let trigger_price = order.trigger_price().ok_or_else(|| {\n                            anyhow::anyhow!(\"Stop market order missing trigger_price\")\n                        })?;\n                        let cond_expire = order.expire_time().map(nanos_to_secs_i64);\n                        let msg = order_builder.build_stop_market_order(\n                            instrument_id,\n                            client_id_u32,\n                            client_metadata,\n                            order.order_side(),\n                            trigger_price,\n                            order.quantity(),\n                            order.is_reduce_only(),\n                            cond_expire,\n                        )?;\n                        (msg, \"stop_market\")\n                    }\n                    OrderType::StopLimit => {\n                        let trigger_price = order.trigger_price().ok_or_else(|| {\n                            anyhow::anyhow!(\"Stop limit order missing trigger_price\")\n                        })?;","sourceCodeStart":1450,"sourceCodeEnd":1486,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/dydx/src/execution/mod.rs#L1450-L1486","documentation":"dYdX STOP_MARKET orders are conditional orders that require a trigger_price. The client reads order.trigger_price() when building the on-chain message and throws this error if it is None. Without a trigger the exchange could not evaluate when to activate the order.","triggerScenarios":"Submitting a StopMarket order where trigger_price was never set on the Nautilus order (factory call omitted trigger_price, or the order type was changed from a plain market order).","commonSituations":"Order factory call missing the trigger_price parameter; converting an existing market order to stop-market without adding a trigger; deserialized/edited orders missing the trigger field.","solutions":["Set trigger_price when creating the StopMarket order (order_factory.stop_market(..., trigger_price=...))","Validate trigger_price is present before submit","Confirm the order type mapping: Nautilus StopMarket requires a trigger on dYdX"],"exampleFix":"// before\nlet order = factory.stop_market(id, side, qty, None); // no trigger\n// after\nlet order = factory.stop_market(id, side, qty, Some(trigger_price));","handlingStrategy":"validation","validationCode":"if order.order_type() == OrderType::StopMarket && order.trigger_price().is_none() {\n    return Err(\"StopMarket order requires a trigger_price for dYdX\".into());\n}","typeGuard":"fn has_trigger(order: &OrderAny) -> bool { order.trigger_price().is_some() }","tryCatchPattern":"if let Err(e) = client.submit_order(order).await {\n    if e.to_string().contains(\"missing trigger_price\") {\n        // fix the order construction; retrying will not help\n    }\n}","preventionTips":["Set trigger_price in every conditional-order factory call","Maintain a checklist mapping Nautilus order types to dYdX required fields (Stop*/*IfTouched need triggers)","Validate order fields at strategy level before enqueueing submits"],"tags":["rust","orders","conditional-orders","dydx"],"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"}