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
- Pass trigger_price only for STOP-type orders; use price for LIMIT-type orders.
- Check the order type via cache.order(client_order_id).order_type before choosing which field to amend.
- 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
- Only amend trigger_price on stop-type orders; check order.order_type first
- Do not blindly pass both price and trigger_price in generic amend wrappers
- Keep a shared ORDER_TYPE→amendable-fields map used by all modify helpers
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
- {} orders do not have a LIMIT price
- Unsupported OrderType for conditional orders: {value:?}
- Conditional order types must use OKXAlgoOrderType
- Invalid `OrderType` cannot be represented on OKX: {value:?}
- Unsupported order type for Binance Spot: {order_type:?}
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/429d8c9de4276757.
Report an issue: GitHub.