nautechsystems/nautilus_trader · error · anyhow::Error

batch_add requires at least one order

Error message

batch_add requires at least one order

What it means

Raised in `batch_add_via_ws` when the caller passes an empty order list: `orders.first()` is `None`, so the client rejects the batch with "batch_add requires at least one order". Kraken's batch add WS operation is only meaningful with at least one order, and the symbol is derived from the first order.

Source

Thrown at crates/adapters/kraken/src/execution/spot.rs:935

                            ts_event,
                            due_post_only,
                        );
                    }
                }
            }
            Ok(())
        });
    }

    fn batch_add_via_ws(&self, orders: &[OrderAny], leverage: Option<u16>) -> anyhow::Result<()> {
        let token = self
            .ws
            .auth_token_blocking()
            .ok_or_else(|| anyhow::anyhow!("missing WS auth token"))?;

        let first = orders
            .first()
            .ok_or_else(|| anyhow::anyhow!("batch_add requires at least one order"))?;
        let symbol = first.instrument_id().symbol.inner().to_string();

        let mut batch_orders = Vec::with_capacity(orders.len());
        let mut client_order_ids = Vec::with_capacity(orders.len());
        for order in orders {
            batch_orders.push(build_batch_order(order, leverage)?);
            client_order_ids.push(order.client_order_id());
        }
        let venue_order_ids = vec![None; orders.len()];

        let params = KrakenWsBatchAddParams {
            symbol,
            orders: batch_orders,
            token,
        };
        let identity = PendingRequest {
            operation: PendingOperation::BatchAdd,
            client_order_ids,

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Guard the caller: skip `submit_order_list` entirely when the order collection is empty.
  2. Fix batch-building logic so it either collects at least one order or does not submit.
  3. Filter out invalid/duplicate orders before batching and check the resulting count.
  4. If empty batches are expected, fall back to per-order submission only when non-empty.

Example fix

// before
exec_client.submit_order_list(batch)?; // batch may be empty

// after
if !batch.is_empty() {
    exec_client.submit_order_list(batch)?;
}
Defensive patterns

Strategy: validation

Validate before calling

// Rust
if orders.is_empty() {
    log::debug!("no orders in batch; skipping submit_order_list");
    return Ok(());
}

Try / catch

if !batch.orders.is_empty() {
    exec_client.submit_order_list(batch)?;
} else {
    log::debug!("empty batch suppressed");
}

Prevention

When it happens

Trigger: Calling `submit_order_list` with an empty slice/empty `OrderList` — e.g. a strategy that builds batches conditionally and submits an empty batch when no orders qualify.

Common situations: Batching logic with off-by-one or filtering that removes all orders; passing an uninitialized order collection during strategy warm-up; a data-driven flow where a signal produces zero orders.

Understand the failure class

Background: "must not be empty", "cannot be empty" — required-field validation errors across open-source libraries — this error's family across 41 libraries.

Related errors


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