{"record":{"id":"951721ca19ce24d2","repo":"nautechsystems/nautilus_trader","slug":"limit-if-touched-orders-require-a-trigger-price","errorCode":null,"errorMessage":"Limit-if-touched orders require a trigger price","messagePattern":"Limit-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":633,"sourceCode":"            }\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 {\n                anyhow::bail!(\"Limit-if-touched orders require a trigger price\")\n            }\n        }\n        _ => anyhow::bail!(\"Unsupported order type for Hyperliquid: {order_type:?}\"),\n    };\n\n    Ok(HyperliquidExchangePlaceOrderRequest {\n        asset,\n        is_buy,\n        price: price_decimal,\n        size: size_decimal,\n        reduce_only,\n        kind,\n        cloid,\n    })\n}\n\n/// Default slippage buffer in basis points for MARKET orders.\npub const DEFAULT_MARKET_SLIPPAGE_BPS: u32 = 50;","sourceCodeStart":615,"sourceCodeEnd":651,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/hyperliquid/src/common/parse.rs#L615-L651","documentation":"Hyperliquid Limit-if-Touched (LIT) orders are trigger orders with is_market=false, so a trigger price is mandatory on the exchange. When the adapter maps OrderType::LimitIfTouched and finds order.trigger_price() is None, it cannot populate the trigger_px field and fails with this bail! before any request reaches the venue.","triggerScenarios":"Submitting or modifying an OrderType::LimitIfTouched order via submit_order/modify_order/order_request where the order was built without a trigger price.","commonSituations":"Constructing a limit_if_touched order from a factory call omitting the trigger_price argument; orders deserialized or restored from persistence losing their trigger price; porting strategies from venues where LIT trigger is derived implicitly.","solutions":["Pass a trigger_price when creating the LimitIfTouchedOrder (OrderFactory::limit_if_touched).","Pre-validate that order.trigger_price().is_some() for LimitIfTouched orders before calling submit_order.","If no trigger is wanted, submit a plain OrderType::Limit order instead."],"exampleFix":"// before\nlet order = self.order_factory.limit_if_touched(\n    instrument_id, OrderSide::Sell, quantity, limit_price, None, TimeInForce::Gtc,\n);\n// after\nlet order = self.order_factory.limit_if_touched(\n    instrument_id, OrderSide::Sell, quantity, limit_price, Some(trigger_price), TimeInForce::Gtc,\n);","handlingStrategy":"validation","validationCode":"if matches!(order.order_type(), OrderType::LimitIfTouched) && order.trigger_price().is_none() {\n    return Err(\"LIT order submitted to Hyperliquid without trigger price\");\n}","typeGuard":"fn lit_has_trigger(order: &OrderAny) -> bool {\n    !matches!(order.order_type(), OrderType::LimitIfTouched) || order.trigger_price().is_some()\n}","tryCatchPattern":null,"preventionTips":["Provide both price and trigger_price when building limit_if_touched orders.","Validate order completeness in a shared submit wrapper.","Prefer plain Limit orders when no trigger is intended."],"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"}