{"record":{"id":"35e3447b994da650","repo":"nautechsystems/nautilus_trader","slug":"market-if-touched-orders-require-a-trigger-price","errorCode":null,"errorMessage":"Market-if-touched orders require a trigger price","messagePattern":"Market-if-touched orders require a trigger price","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/adapters/hyperliquid/src/common/parse.rs","lineNumber":614,"sourceCode":"            }\n        }\n        OrderType::MarketIfTouched => {\n            if let Some(trigger_price) = order.trigger_price() {\n                let raw = trigger_price.as_decimal();\n                let trigger_price_decimal = if should_normalize_prices {\n                    normalize_price(raw, price_decimals).normalize()\n                } else {\n                    raw.normalize()\n                };\n                HyperliquidExchangeOrderKind::Trigger {\n                    trigger: HyperliquidExchangeTriggerParams {\n                        is_market: true,\n                        trigger_px: trigger_price_decimal,\n                        tpsl: HyperliquidExchangeTpSl::Tp,\n                    },\n                }\n            } else {\n                anyhow::bail!(\"Market-if-touched orders require a trigger price\")\n            }\n        }\n        OrderType::LimitIfTouched => {\n            if let Some(trigger_price) = order.trigger_price() {\n                let raw = trigger_price.as_decimal();\n                let trigger_price_decimal = if should_normalize_prices {\n                    normalize_price(raw, price_decimals).normalize()\n                } else {\n                    raw.normalize()\n                };\n                HyperliquidExchangeOrderKind::Trigger {\n                    trigger: HyperliquidExchangeTriggerParams {\n                        is_market: false,\n                        trigger_px: trigger_price_decimal,\n                        tpsl: HyperliquidExchangeTpSl::Tp,\n                    },\n                }\n            } else {","sourceCodeStart":596,"sourceCodeEnd":632,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/hyperliquid/src/common/parse.rs#L596-L632","documentation":"Hyperliquid requires that Market-if-Touched (MIT) orders carry a trigger price, because on the exchange an MIT order is represented as a trigger order with is_market=true. The adapter converts Nautilus OrderType::MarketIfTouched into a Hyperliquid trigger request, and if the order's trigger_price() is None it cannot build a valid request, so it aborts with this anyhow::bail! instead of sending a malformed order.","triggerScenarios":"Calling submit_order/modify_order/order_request with an OrderType::MarketIfTouched order whose trigger_price() returns None — e.g. a MarketIfTouchedOrder was constructed without a trigger_price parameter.","commonSituations":"Building orders programmatically from strategies where the trigger price is optional in the internal order model; migrating code from venues where market orders don't need triggers; copying a Market order factory call and changing the type to MarketIfTouched without adding trigger_price.","solutions":["Set a trigger price when creating the order via OrderFactory::market_if_touched(... trigger_price=...) so order.trigger_price() is Some.","Validate the order in the strategy before submitting: check order.trigger_price().is_some() for MIT order types.","If the intent was an immediate market order, use OrderType::Market instead of MarketIfTouched."],"exampleFix":"// before\nlet order = self.order_factory.market_if_touched(\n    instrument_id, OrderSide::Buy, quantity, None, TimeInForce::Gtc,\n);\n// after\nlet order = self.order_factory.market_if_touched(\n    instrument_id, OrderSide::Buy, quantity, Some(trigger_price), TimeInForce::Gtc,\n);","handlingStrategy":"validation","validationCode":"if matches!(order.order_type(), OrderType::MarketIfTouched) && order.trigger_price().is_none() {\n    return Err(\"MIT order submitted to Hyperliquid without trigger price\");\n}","typeGuard":"fn has_trigger(order: &OrderAny) -> bool { order.trigger_price().is_some() }","tryCatchPattern":null,"preventionTips":["Always pass trigger_price to market_if_touched factory calls.","Add an assertion in the strategy's order-submission helper for trigger-bearing order types.","Document per-venue order-type requirements in strategy config."],"tags":["order-submission","missing-parameter","hyperliquid","validation"],"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"}