nautechsystems/nautilus_trader · warning
Cannot modify order in place: no parameters differ from curr
Error message
Cannot modify order in place: no parameters differ from current values
What it means
modify_order_in_place requires at least one supplied parameter (quantity, price, or trigger price) to actually differ from the order's current value. If nothing would change, the call bails to avoid emitting a pointless OrderUpdated event.
Source
Thrown at crates/trading/src/algorithm/mod.rs:1043
"Cannot modify order in place: {} orders do not have a LIMIT price",
order.order_type()
);
}
if trigger_price.is_some() && order.trigger_price().is_none() {
anyhow::bail!(
"Cannot modify order in place: {} orders do not have a STOP trigger price",
order.order_type()
);
}
// Check if any value would actually change
let qty_changing = quantity.is_some_and(|q| q != order.quantity());
let price_changing = price.is_some() && price != order.price();
let trigger_changing = trigger_price.is_some() && trigger_price != order.trigger_price();
if !qty_changing && !price_changing && !trigger_changing {
anyhow::bail!("Cannot modify order in place: no parameters differ from current values");
}
let core = ExecutionAlgorithmNative::exec_algorithm_core_mut(self);
let ts_now = core.clock_mut().timestamp_ns();
let updated = OrderUpdated::new(
order.trader_id(),
order.strategy_id(),
order.instrument_id(),
order.client_order_id(),
quantity.unwrap_or_else(|| order.quantity()),
UUID4::new(),
ts_now,
ts_now,
false, // reconciliation
order.venue_order_id(),
order.account_id(),
price,View on GitHub (pinned to 18893faf8b)
Solutions
- Compare the new values against order.quantity()/price()/trigger_price() before calling, and skip the call when equal
- Track whether parameters actually changed in the calling algorithm and only modify on change
- Handle the no-op case as a benign condition rather than retrying the call
Example fix
// before
algo.modify_order_in_place(&mut order, Some(qty), None, None)?;
// after
if qty != order.quantity() {
algo.modify_order_in_place(&mut order, Some(qty), None, None)?;
} Defensive patterns
Strategy: validation
Validate before calling
let changed = quantity.is_some_and(|q| q != order.quantity()) || price.is_some() && price != order.price() || trigger_price.is_some() && trigger_price != order.trigger_price();
Try / catch
if let Err(e) = algo.modify_order_in_place(&mut order, q, p, t) { if !e.to_string().contains("no parameters differ") { return Err(e); } /* treat as no-op */ } Prevention
- Compare new values against current order values before modifying
- Treat identical-value modifications as benign no-ops in calling code
When it happens
Trigger: Calling modify_order_in_place with values identical to the order's current quantity/price/trigger_price, e.g. recomputing the same slice quantity in a TWAP/VWAP loop.
Common situations: Algorithm re-invoked with cached/computed values that haven't changed; rounding producing the same quantity; a retry after a previous successful modification.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/65ec51309bcd577d.
Report an issue: GitHub.