nautechsystems/nautilus_trader · error · anyhow::Error

Trigger order types are not supported for Hyperliquid HIP-4

Error message

Trigger order types are not supported for Hyperliquid HIP-4 outcomes: {symbol} (received {order.order_type():?})

What it means

HIP-4 outcome tokens have no trigger machinery, so only plain Market and Limit orders are accepted for Outcome products. Any conditional/trigger order type (StopMarket, StopLimit, MarketIfTouched, LimitIfTouched) on an outcome is rejected with this error, including the received order type in the message.

Source

Thrown at crates/adapters/hyperliquid/src/execution.rs:2726

        | OrderType::StopMarket
        | OrderType::StopLimit
        | OrderType::MarketIfTouched
        | OrderType::LimitIfTouched => {}
        _ => anyhow::bail!(
            "Unsupported order type for Hyperliquid: {:?}",
            order.order_type()
        ),
    }

    // HIP-4 outcomes are fully-collateralized side tokens with no margin,
    // funding, or trigger machinery. Reject features that don't apply.
    if product_type == HyperliquidProductType::Outcome {
        if order.is_reduce_only() {
            anyhow::bail!("Reduce-only is not supported for Hyperliquid HIP-4 outcomes: {symbol}");
        }

        if !matches!(order.order_type(), OrderType::Market | OrderType::Limit) {
            anyhow::bail!(
                "Trigger order types are not supported for Hyperliquid HIP-4 outcomes: \
                 {symbol} (received {:?})",
                order.order_type()
            );
        }
    }

    if matches!(
        order.order_type(),
        OrderType::StopMarket
            | OrderType::StopLimit
            | OrderType::MarketIfTouched
            | OrderType::LimitIfTouched
    ) && order.trigger_price().is_none()
    {
        anyhow::bail!(
            "Conditional orders require a trigger price for Hyperliquid: {:?}",
            order.order_type()

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Use only Market or Limit orders for HIP-4 outcome instruments.
  2. Implement trigger logic in the strategy (monitor price and submit a plain market/limit order) for outcomes.
  3. Branch on the instrument's product type before submitting conditional order types.

Example fix

// before
let order = factory.stop_market(instrument_id, ...); // outcome instrument
exec_client.submit_order(&order).await?;
// after
if product_type == HyperliquidProductType::Outcome {
    let order = factory.limit(instrument_id, ...); // plain limit only
    exec_client.submit_order(&order).await?;
}
Defensive patterns

Strategy: validation

Validate before calling

fn outcome_allows_order_type(product_type: HyperliquidProductType, t: OrderType) -> bool {
    product_type != HyperliquidProductType::Outcome
        || matches!(t, OrderType::Market | OrderType::Limit)
}

Prevention

When it happens

Trigger: Submitting a stop or if-touched order whose instrument resolves to HyperliquidProductType::Outcome — order_type() not matching Market or Limit while product_type == Outcome.

Common situations: Strategies that place protective stops uniformly across all holdings, applied to outcome side tokens; copying perp order logic to outcome markets.

Related errors


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