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

  1. Compare the new values against order.quantity()/price()/trigger_price() before calling, and skip the call when equal
  2. Track whether parameters actually changed in the calling algorithm and only modify on change
  3. 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

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.