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
- Use only Market or Limit orders for HIP-4 outcome instruments.
- Implement trigger logic in the strategy (monitor price and submit a plain market/limit order) for outcomes.
- 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
- Restrict outcome markets to Market/Limit orders
- Implement trigger logic in the strategy for outcomes
- Check product type before building conditional orders
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
- Unsupported order type for Hyperliquid: {order.order_type():
- Reduce-only is not supported for Hyperliquid HIP-4 outcomes:
- Outcome side token '{fee_token}' carried a non-zero fee {fee
- Unsupported OrderType for conditional orders: {value:?}
- Binance Futures does not support second-level kline interval
AI-assisted analysis of nautechsystems/nautilus_trader@18893faf8b (2026-09-08).
Data as JSON: /api/errors/265872f20bb7f332.
Report an issue: GitHub.