nautechsystems/nautilus_trader · error

missing trigger price for Derive trigger order {}

Error message

missing trigger price for Derive trigger order {}

What it means

Derive trigger (conditional) orders require a trigger price, but the OrderRequestTrigger order passed to the payload builder has none. validate_trigger_order_support and type conversion run first; the trigger price is then extracted via order.trigger_price() and this error is thrown when it is None.

Source

Thrown at crates/adapters/derive/src/http/query.rs:536

    wallet: Address,
    signer: &PrivateKeySigner,
    nonce: u64,
    signature_expiry_sec: i64,
    module_address: Address,
    domain_separator: B256,
    action_typehash: B256,
    max_fee: Decimal,
    explicit_price: Option<Decimal>,
    conn_id: impl Into<String>,
    order_id: impl Into<String>,
) -> anyhow::Result<DeriveTriggerOrderParams> {
    validate_trigger_order_support(order)?;
    let limit_price = resolve_limit_price(order, explicit_price)?;
    let amount = order.quantity().as_decimal();
    let order_type = trigger_order_type_to_derive(order.order_type())?;
    let time_in_force = time_in_force_to_derive(order.time_in_force(), order.is_post_only())?;
    let trigger_price = order.trigger_price().ok_or_else(|| {
        anyhow::anyhow!(
            "missing trigger price for Derive trigger order {}",
            order.client_order_id()
        )
    })?;
    let trigger_fields = DeriveTriggerFields {
        trigger_price: trigger_price.as_decimal(),
        trigger_price_type: trigger_price_type_to_derive(order.trigger_type())?,
        trigger_type: trigger_type_to_derive(order.order_type())?,
    };
    let order = build_signed_order_params(
        order,
        instrument,
        subaccount_id,
        wallet,
        signer,
        nonce,
        signature_expiry_sec,
        module_address,

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Set trigger_price on the order before submitting it to Derive
  2. Ensure the order is built as a TriggerOrder type and not a plain Limit/Market order mislabeled
  3. Check the order-submission path so stop-distance values are converted into an absolute trigger price

Example fix

// before
let order = OrderRequestTrigger::builder().order_type(OrderType::StopMarket).quantity(qty).build();
// after
let order = OrderRequestTrigger::builder()
    .order_type(OrderType::StopMarket)
    .quantity(qty)
    .trigger_price(Price::from("2500.00"))
    .build();
Defensive patterns

Strategy: validation

Validate before calling

if let Some(order) = order.as_trigger() { assert!(order.trigger_price().is_some(), "trigger order {} missing trigger_price", order.client_order_id()); }

Type guard

fn has_trigger_price(order: &OrderRequestTrigger) -> bool { order.trigger_price().is_some() }

Try / catch

match submit(order) { Err(e) if e.to_string().contains("missing trigger price") => requeue_with_trigger_price(order), Err(e) => return Err(e) }

Prevention

When it happens

Trigger: Submitting a trigger/stop order to Derive where the request's trigger_price field was never set — e.g. building a TriggerOrder without trigger_price, or an order that lost its trigger through an amendment or conversion.

Common situations: Order builders that only set trigger_price conditionally; translating orders from another venue that models stops differently (e.g. stop-distance instead of stop-price); stale order state after partial rejection.

Understand the failure class

Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.

Related errors


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