{"record":{"id":"7080474492907495","repo":"nautechsystems/nautilus_trader","slug":"trigger-price-not-set","errorCode":null,"errorMessage":"Trigger price not set","messagePattern":"Trigger price not set","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/model/src/orders/builder.rs","lineNumber":206,"sourceCode":"\n    // ----------- Price ----------\n    pub fn price(&mut self, price: Price) -> &mut Self {\n        self.price = Some(price);\n        self\n    }\n\n    fn get_price(&self) -> Price {\n        self.price.expect(\"Price not set\")\n    }\n\n    // ----------- TriggerPrice ----------\n    pub fn trigger_price(&mut self, trigger_price: Price) -> &mut Self {\n        self.trigger_price = Some(trigger_price);\n        self\n    }\n\n    fn get_trigger_price(&self) -> Price {\n        self.trigger_price.expect(\"Trigger price not set\")\n    }\n\n    // ----------- ActivationPrice ----------\n    pub fn activation_price(&mut self, activation_price: Price) -> &mut Self {\n        self.activation_price = Some(activation_price);\n        self\n    }\n\n    fn get_activation_price(&self) -> Option<Price> {\n        self.activation_price\n    }\n\n    // ----------- TriggerType ----------\n    pub fn trigger_type(&mut self, trigger_type: TriggerType) -> &mut Self {\n        self.trigger_type = Some(trigger_type);\n        self\n    }\n","sourceCodeStart":188,"sourceCodeEnd":224,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/model/src/orders/builder.rs#L188-L224","documentation":"OrderTestBuilder::get_trigger_price unwraps Option<Price> set via .trigger_price(...). build() for trigger-based order types (StopMarket, StopLimit, TrailingStop*) panics with 'Trigger price not set' when absent.","triggerScenarios":"Building a stop/trailing order type via OrderTestBuilder without chaining .trigger_price(Price) before build().","commonSituations":"Adding stop-order coverage to an existing limit-order test and forgetting the trigger_price line, or a data-driven test missing the trigger field for the stop variants.","solutions":["Add .trigger_price(Price::from(...)) to the builder chain before build().","Only omit trigger_price for non-trigger order types.","Match trigger_price to the instrument's price precision to avoid later validation failures."],"exampleFix":"// before\nlet order = OrderTestBuilder::new(OrderType::StopMarket).instrument_id(id).quantity(qty).build();\n// after\nlet order = OrderTestBuilder::new(OrderType::StopMarket)\n    .instrument_id(id)\n    .quantity(qty)\n    .trigger_price(Price::from(\"49500.00\"))\n    .build();","handlingStrategy":"validation","validationCode":"if matches!(order_type, OrderType::StopMarket | OrderType::StopLimit | OrderType::TrailingStopMarket | OrderType::TrailingStopLimit) {\n    assert!(trigger_price.is_some(), \"trigger_price required for {:?}\", order_type);\n}\nbuilder.trigger_price(trigger_price.unwrap()).build();","typeGuard":"fn order_type_needs_trigger(t: OrderType) -> bool {\n    matches!(t, OrderType::StopMarket | OrderType::StopLimit | OrderType::TrailingStopMarket | OrderType::TrailingStopLimit)\n}","tryCatchPattern":"// validate trigger presence for trigger-based types before build\nassert!(trigger_price.is_some() || !order_type_needs_trigger(order_type));","preventionTips":["Always set .trigger_price(...) for stop and trailing order types.","Align trigger price precision with the instrument definition.","Use a trigger-order fixture to avoid repeating required fields."],"tags":["rust","panic","builder","missing-field","testing"],"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"}