nautechsystems/nautilus_trader · error

{} orders do not have a STOP trigger price

Error message

{} orders do not have a STOP trigger price

What it means

modify_orders was given a trigger_price argument for an order whose type is not in STOP_ORDER_TYPES. Only stop-type orders (STOP, STOP_LIMIT, TRAILING variants) carry a trigger price, so passing trigger_price for e.g. a LIMIT or MARKET order bails naming the order type.

Source

Thrown at crates/trading/src/strategy/mod.rs:383

        let mut updating = false;

        if quantity.is_some_and(|q| q != order.quantity() || order.is_pending_update()) {
            updating = true;
        }

        if let Some(price) = price {
            if !LIMIT_ORDER_TYPES.contains(&order.order_type()) {
                anyhow::bail!("{} orders do not have a LIMIT price", order.order_type());
            }

            if Some(price) != order.price() {
                updating = true;
            }
        }

        if let Some(trigger_price) = trigger_price {
            if !STOP_ORDER_TYPES.contains(&order.order_type()) {
                anyhow::bail!(
                    "{} orders do not have a STOP trigger price",
                    order.order_type()
                );
            }

            if Some(trigger_price) != order.trigger_price() {
                updating = true;
            }
        }

        if !updating {
            log::error!(
                "Cannot create command ModifyOrder: quantity, price, and trigger were either None \
                or the same as existing values"
            );
            return Ok(());
        }

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Pass trigger_price only for STOP-type orders; use price for LIMIT-type orders.
  2. Check the order type via cache.order(client_order_id).order_type before choosing which field to amend.
  3. Omit trigger_price (pass None) for orders that have no trigger concept.

Example fix

// before
self.modify_order(order, price=px, trigger_price=tp)  # order is LIMIT

// after
if order.order_type in (OrderType.STOP, OrderType.STOP_LIMIT, OrderType.TRAILING_STOP, OrderType.TRAILING_STOP_LIMIT):
    self.modify_order(order, trigger_price=tp)
else:
    self.modify_order(order, price=px)
Defensive patterns

Strategy: type-guard

Validate before calling

STOP_TYPES = {OrderType.STOP, OrderType.STOP_LIMIT, OrderType.TRAILING_STOP, OrderType.TRAILING_STOP_LIMIT}
if trigger_price is not None and order.order_type not in STOP_TYPES:
    raise TypeError(f"{order.order_type} orders do not accept a trigger price")

Type guard

def accepts_trigger_price(order) -> bool:
    return order.order_type in {OrderType.STOP, OrderType.STOP_LIMIT, OrderType.TRAILING_STOP, OrderType.TRAILING_STOP_LIMIT}

Try / catch

try:
    self.modify_order(order, trigger_price=new_trigger)
except RuntimeError as e:
    if "do not have a STOP trigger price" in str(e):
        self.log.error("use price for limit-type orders")
    else:
        raise

Prevention

When it happens

Trigger: Calling strategy.modify_order/modify_orders with trigger_price=Some(...) on a LIMIT, MARKET, or other non-stop order type.

Common situations: A generic amend helper that always passes both price and trigger_price; confusing limit price with trigger price when modifying LIMIT orders; bulk updates applied to mixed open-order portfolios.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08). Data as JSON: /api/errors/429d8c9de4276757. Report an issue: GitHub.