{"record":{"id":"b03f959c16f0e82b","repo":"nautechsystems/nautilus_trader","slug":"trigger-price-new-trigger-rounds-to-0-ticks","errorCode":null,"errorMessage":"trigger_price `{new_trigger:?}` rounds to 0 ticks at precision {price_precision}","messagePattern":"trigger_price `(.+?)` rounds to 0 ticks at precision (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/adapters/lighter/src/execution.rs","lineNumber":1997,"sourceCode":"        let base_amount = quantity_to_ticks(&new_qty, instrument.size_precision())?;\n        anyhow::ensure!(\n            base_amount > 0,\n            \"quantity `{new_qty}` rounds to 0 ticks at size_precision {}\",\n            instrument.size_precision(),\n        );\n        let trigger_price_ticks = match new_trigger {\n            Some(trigger) if trigger.raw != 0 => price_to_ticks(&trigger, price_precision)?,\n            _ => 0,\n        };\n\n        if matches!(\n            order.order_type(),\n            OrderType::StopMarket\n                | OrderType::StopLimit\n                | OrderType::MarketIfTouched\n                | OrderType::LimitIfTouched\n        ) {\n            anyhow::ensure!(\n                trigger_price_ticks > 0,\n                \"trigger_price `{new_trigger:?}` rounds to 0 ticks at precision {price_precision}\",\n            );\n        }\n        validate_order_amount(&instrument, new_qty, price_ticks, price_precision)?;\n\n        let ReservedTxContext {\n            context,\n            send_reservation,\n        } = self.build_tx_context(credential)?;\n\n        let captured_nonce = context.nonce;\n        let captured_api_key_index = context.api_key_index;\n\n        let mut rollback_guard =\n            TxDispatchGuard::new(self.dispatch.clone(), credential, None, captured_nonce);\n\n        let tx = ModifyOrderTxInfo {","sourceCodeStart":1979,"sourceCodeEnd":2015,"githubUrl":"https://github.com/nautechsystems/nautilus_trader/blob/18893faf8b356be3320add8de2f861b0b647cf06/crates/adapters/lighter/src/execution.rs#L1979-L2015","documentation":"For trigger-type orders (StopMarket, StopLimit, MarketIfTouched, LimitIfTouched) the trigger price must convert to a positive tick count at the price_precision. A trigger of zero or one so small it rounds to 0 ticks is invalid, so the adapter ensures trigger_price_ticks > 0 before validating amounts.","triggerScenarios":"prepare_signed_modify_order computes trigger_price_ticks from new_trigger, and for one of the four trigger order types the value is <= 0 — e.g. trigger_price of 0 on the command, or an extremely low price below one tick at the instrument's price precision.","commonSituations":"Uninitialized/placeholder trigger (0) passed in a ModifyOrder; price-precision mismatch after switching markets (e.g. tick size 0.01 vs trigger 0.004); Decimal parsing yielding 0 from a malformed string.","solutions":["Supply a real trigger_price above one tick at price_precision for trigger order types.","Verify the instrument's price_precision/price_increment and express the trigger in those units.","Guard the command: reject trigger prices <= price_increment before calling modify."],"exampleFix":"// before\nlet cmd = ModifyOrder { trigger_price: Some(Price::from(0)), ..cmd };\n// after\nif trigger.as_decimal() <= instrument.price_increment().as_decimal() {\n    return Err(anyhow!(\"trigger {} below one tick\", trigger));\n}\nlet cmd = ModifyOrder { trigger_price: Some(trigger), ..cmd };","handlingStrategy":"validation","validationCode":"if let Some(t) = cmd.trigger_price {\n    if t.as_decimal() < instrument.price_increment().as_decimal() {\n        return Err(\"trigger_price below one tick\".into());\n    }\n}","typeGuard":null,"tryCatchPattern":"if let Err(e) = client.modify_order(&cmd).await {\n    if e.to_string().contains(\"trigger_price\") && e.to_string().contains(\"0 ticks\") {\n        // fix trigger or cancel/re-place with a valid trigger\n    }\n}","preventionTips":["Never allow placeholder (0) trigger prices into modify commands.","Validate trigger >= price_increment for all trigger order types.","Re-derive triggers from instrument precision when switching markets."],"tags":["trigger-price","tick-rounding","stop-order","lighter"],"backgroundTag":"value-out-of-range","analyzedSha":"18893faf8b356be3320add8de2f861b0b647cf06","analyzedAt":"2026-09-08T20:49:34.690Z","contentChangedAt":"2026-09-08T20:49:34.690Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}