nautechsystems/nautilus_trader · error

Invalid ask price for OrderBook::filtered_view

Error message

Invalid ask price for OrderBook::filtered_view

What it means

OrderBook::filtered_view builds synthetic Sell orders from the asks map and converts each ask price with Price::from_decimal(...).expect(...), panicking with this message when conversion fails. from_decimal fails for NaN, infinite, or precision/range-incompatible decimals, so an ask entry with such a price aborts the call.

Source

Thrown at crates/model/src/orderbook/book.rs:839

            let order = BookOrder::new(
                OrderSide::Buy,
                Price::from_decimal(price).expect("Invalid bid price for OrderBook::filtered_view"),
                Quantity::from_decimal(quantity)
                    .expect("Invalid bid quantity for OrderBook::filtered_view"),
                order_id,
            );
            order_id += 1;
            filtered_book.add(order, 0, sequence, ts_event);
        }

        for (price, quantity) in asks_map {
            if quantity <= Decimal::ZERO {
                continue;
            }

            let order = BookOrder::new(
                OrderSide::Sell,
                Price::from_decimal(price).expect("Invalid ask price for OrderBook::filtered_view"),
                Quantity::from_decimal(quantity)
                    .expect("Invalid ask quantity for OrderBook::filtered_view"),
                order_id,
            );
            order_id += 1;
            filtered_book.add(order, 0, sequence, ts_event);
        }

        Ok(filtered_book)
    }

    /// Groups bid quantities into price buckets, truncating to a maximum depth, excluding own orders.
    ///
    /// With `own_book`, subtracts own order sizes, filtered by `status` if provided.
    /// When `now` is provided, only subtracts orders whose acceptance time plus
    /// `accepted_buffer_ns` is at or before `now`. When `now` is `None`, acceptance-time
    /// filtering is disabled.
    ///

View on GitHub (pinned to 18893faf8b)

Solutions

  1. Pre-validate ask prices: finite, positive, and rounded to instrument price precision.
  2. Drop or clamp sentinel/invalid price entries when building the asks map.
  3. Normalize floats via Decimal carefully (from_f64_retain) and verify finiteness before conversion.
  4. Sanitize external data sources at parse time so invalid prices never reach filtered_view.
  5. Wrap your own map construction in a validator function shared by bid/ask paths to keep both sides consistent.

Example fix

// before
asks.insert(Price::from_raw(sentinel_raw), qty); // sentinel leaks into filtered_view
// after
let dec = price.as_decimal();
if dec.is_finite() && dec.is_sign_positive() {
    asks.insert(price, qty);
}
Defensive patterns

Strategy: validation

Validate before calling

fn valid_ask(p: &Price) -> bool {
    let d = p.as_decimal();
    d.is_finite() && d.is_sign_positive()
}
let asks: Vec<_> = map.iter().filter(|(p, _)| valid_ask(p)).collect();

Type guard

fn is_valid_price(p: &Price) -> bool {
    p.as_decimal().is_finite()
}

Try / catch

// Pre-validate ask prices; the library panics rather than returning Result. Python:
try:
    view = book.filtered_view(bids, asks, None)
except BaseException as e:
    log.warning("filtered_view failed: %s", e)

Prevention

When it happens

Trigger: Calling filtered_view / py_filtered_view with an asks map containing a NaN, infinite, or out-of-range price (e.g. sentinel values like u64::MAX converted to decimal, or f64 infinity from upstream math).

Common situations: Ask maps built from vendor feeds using invalid/no-price sentinels; NaN propagation from indicator calculations; precision mismatch with the instrument's price precision.

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


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