v1.221.0
nautechsystems/nautilus_traderv1.221.0Oct 26, 2025by github-actions[bot]
AI Summary
Final Python 3.11 release with OrderBookDepth10 support, Renko bar aggregator, comprehensive BitMEX adapter, and initial Hyperliquid adapter. Major refactoring of statistics to Rust.
Key Highlights
- Added support for OrderBookDepth10 requests
- Added Renko bar aggregator
- Added initial BitMEX integration adapter
- Added initial Hyperliquid adapter
- Added OptionExerciseModule
- Added MarginModel for backtesting
- Added Polymarket native market orders support
Breaking Changes
- Removed nautilus_trader.analysis.statistics subpackage - all statistics now in Rust
- Removed partial bar functionality from bar aggregators
- Renamed nautilus-cli crate feature flag from hypersync to defi
- Polymarket execution client no longer accepts market BUY orders unless quote_quantity=True
New Features
- OrderBookDepth10 requests
- Renko bar aggregator
- BitMEX conditional orders and batch cancel
- Hyperliquid adapter (initial)
- OptionExerciseModule
- MarginModel for backtesting
- OKX conditional trigger orders and margin support
- subscribe_order_fills for Actor
- contingent order fields for reconciliation
Full Release Notes
# NautilusTrader 1.221.0 Beta Released on 26th October 2025 (UTC). This will be the final release with support for Python 3.11. ### Enhancements - Added support for `OrderBookDepth10` requests (#2955), thanks @faysou - Added support for quotes from book depths (#2977), thanks @faysou - Added support for quotes from order book deltas updates (#3106), thanks @faysou - Added execution engine rate limiting for single-order reconciliation queries - Added `subscribe_order_fills(...)` and `unsubscribe_order_fills(...)` for `Actor` allowing to subscribe to all fills for an instrument ID - Added `on_order_filled(...)` for `Actor` - Added Renko bar aggregator (#2941), thanks @faysou - Added `time_range_generator` for on-the-fly data data subscriptions (#2952), thanks @faysou - Added `__repr__` to `NewsEvent` (#2958), thanks @MK27MK - Added `convert_quote_qty_to_base` config option to `ExecEngineConfig` (default `True` to retain current behavior) allows adapters to keep quote-denominated sizes when needed - Added contingent order fields `parent_order_id` and `linked_order_ids` for `OrderStatusReport` and reconciliation - Added `fs_rust_storage_options` to Python catalog (#3008), thanks @faysou and @Johnkhk - Added matching engine fallback to default order book for custom fill models (#3039), thanks @Hamish-Leahy - Added filesystem parameter to parquet in the consolidate functions (#3097), thanks @huracosunah - Added azure support for az protocol (#3102), thanks @huracosunah - Added Binance BBO `price_match` parameter support for order submission - Added BitMEX conditional orders support - Added BitMEX batch cancel support - Added BitMEX contingent orders support (OCO, OTO, brackets) - Added BitMEX historical data requests (trades and bars) - Added BitMEX configurable `recv_window_ms` for signed HTTP request expiration - Added Bybit SPOT position reports with opt-in `use_spot_position_reports` config option for `BybitExecClientConfig` - Added Bybit `ignore_uncached_instrument_executions` config option for `BybitExecClientConfig` (default `False` to retain current behavior) - Added Databento CME sandbox example - Added Interactive Brokers cache config support for historical provider (#2942), thanks @ms32035 - Added Interactive Brokers support for fetching orders from all clients (#2948), thanks @dinana - Added Interactive Brokers order conditions (#2988), thanks @faysou - Added Interactive Brokers `generate_fill_reports` implementation (#2989), thanks @faysou - Added OKX conditional trigger orders support - Added OKX trade mode per order via `params` using `td_mode` key - Added OKX margin configuration and spot margin support - Added OKX demo account support - Added OKX batch cancel support - Added Polymarket native market orders support ### Breaking Changes - Removed `nautilus_trader.analysis.statistics` subpackage - all statistics are now implemented in Rust and must be imported from `nautilus_trader.analysis` (e.g., `from nautilus_trader.analysis import WinRate`) - Removed partial bar functionality from bar aggregators and subscription APIs (#3020), thanks @faysou - Renamed `nautilus-cli` crate feature flag from `hypersync` to `defi` (gates blockchain/DeFi commands) - Polymarket execution client no longer accepts market BUY orders unless `quote_quantity=True` ### Security - Fixed non-executable stack for Cython extensions to support hardened Linux systems - Fixed divide-by-zero and overflow bugs in model crate that could cause crashes - Fixed core arithmetic operations to reject NaN/Infinity values and improve overflow handling ### Fixes - Fixed reduce-only order panic when quantity exceeds position - Fixed position purge logic to prevent purging re-opened position - Fixed `Position.purge_events_for_order` to properly rebuild state from remaining order fills - Fixed cache index cleanup bugs in purge_order operations - Fixed order average price calculation that was double-counting current fill in weighted average - Fixed own order book cleanup for terminal orders and inflight handling - Fixed order book depth snapshot processing to avoid padding levels and metadata tracking for L1 top-of-book ticks - Fixed crypto instruments PyO3 -> Cython conversion for `lot_size` where it was not being passed through - Fixed `serialization` crate bugs and improve error handling - Fixed PyO3 interpreter lifecycle for async shutdown preventing edge case `"interpreter not initialized"` panics during shutdown - Fixed `RiskEngine` reduce-only cash exits (#2986), thanks for reporting @dennisnissle - Fixed `RiskEngine` quote quantity validation - Fixed `BacktestEngine` to retain instruments on reset (#3096), thanks for reporting @woung717 - Fixed overflow in `NautilusKernel` build time calculation due to negative duration (#2998), thanks for reporting @HaakonFlaaronning - Fixed handling of asyncio.CancelledError in execution reconciliation (#3073), thanks @dinana - Fixed edge case where rejected orders can remain in own order book - Fixed Currency registration to synchronize between Cython and PyO3 runtimes via new `register_currency()` helper - Fixed Databento CMBP-1/CBBO/TBBO symbology resolution - Fixed `on_load` called before strategy added bug (#2953), thanks @lisiyuan656 - Fixed filesystem usage in catalog for `isfile` and `isdir` (#2954), thanks @limx0 - Fixed `SandboxExecutionClient` instrument data handling - Fixed `AccountState` Arrow serialization (#3005), thanks for reporting @nikzasel - Fixed `CryptoOption` Arrow schema `option_kind` field to accept string values - Fixed `FuturesSpread` Arrow schema missing max/min quantity and price fields - Fixed `OptionSpread` Arrow schema missing max/min quantity and price fields - Fixed `Commodity` Arrow schema to match from_dict requirements - Fixed safe encoded symbols (#2964), thanks @ms32035 - Fixed msgspec encoding for type objects with qualified names - Fixed nautilus CLI macOS compatibility with regex unicode-perl feature (#2969), thanks @learnerLj - Fixed fuzzy candlesticks indicator bugs (#3021), thanks @benhaben - Fixed return type annotation for `ArrowSerializer.deserialize` (#3076), thanks @MK27MK - Fixed initializing of sqrt price setting flow when `Pool` profiling (#3100), thanks @filipmacek - Fixed Redis multi-stream consumer skipping messages (#3094), thanks for reporting @kirill-gr1 - Fixed Binance duplicate `OrderSubmitted` event generation for order lists (#2994), thanks @sunlei - Fixed Binance websocket fill message parsing for Binance US with extra fields (#3006), thanks for reporting @bmlquant - Fixed Binance order status parsing for external orders (#3006), thanks for reporting @bmlquant - Fixed Binance execution handling for self-trade prevention and liquidations (#3006), thanks for reporting @bmlquant - Fixed Binance trailing stop to use server-side activation price (#3056), thanks for reporting @hope2see - Fixed Binance Futures reconciliation duplicated position bug (#3067), thanks @lisiyuan656 - Fixed Binance `price_match` order price synchronization (#3074) - Fixed Binance Futures position risk query to use v3 API returning only symbols with positions or open orders (#3062), thanks for reporting @woung717 - Fixed Binance Futures liquidation and ADL fill handling - Fixed BitMEX testnet support - Fixed BitMEX instrument parsing of lot size - Fixed BitMEX order rejection handling and response parsing - Fixed Blockchain adapter out of gas RPC error in Multicall for problematic contracts (#3086), thanks @filipmacek - Fixed Bybit currency parsing from venue resulting in incorrectly low precision (e.g., USDT precision 4 rather than 8) - Fixed Bybit handling of `OrderModifyRejected` events from pending updates - Fixed Bybit account endpoint pagination handling - Fixed Coinbase Intx API credentials handling to allow passing explicitly - Fixed Databento MBO `Clear` actions and improve docs - Fixed Hyperliquid L1 signing with direct MessagePack serialization (#3087), thanks @nicolad - Fixed Interactive Brokers tick level historical data downloading (#2956), thanks @DracheShiki - Fixed Interactive Brokers instrument provider `TypeError` when load_ids/contracts are `None`, thanks for reporting @FGU1 - Fixed Interactive Brokers modify bracket order (#2979), thanks @faysou - Fixed Interactive Brokers historical bars resubscription failure after connection loss (#3002), thanks @Johnkhk - Fixed Interactive Brokers flat position reconciliation and instrument loading (#3023), thanks @idobz - Fixed Interactive Brokers bars response handling by removing partial bar (#3040), thanks @sunlei - Fixed Interactive Brokers account summary handling (#3052), thanks @shinhwasbiz02 - Fixed Interactive Brokers account balance calculation (#3064), thanks @sunlei - Fixed OKX spot margin quote quantity order handling - Fixed OKX API credentials handling to allow passing explicitly - Fixed OKX fee calculations to account for negative fees - Fixed OKX parsing for `tick_sz` across instrument types - Fixed OKX parsing for instruments `multiplier` field - Fixed OKX WebSocket heartbeat and standardize logging - Fixed Polymarket handling of one-sided quotes (#2950), thanks for reporting @thefabus - Fixed Polymarket websocket message handling (#2963, #2968), thanks @thefabus - Fixed Polymarket tick size change handling for quotes (#2980), thanks for reporting @santivazq - Fixed Polymarket market order submission to use native CLOB market orders (#2984), thanks for reporting @njkds - Fixed Polymarket maker fill order side inversion (#3077), thanks for reporting @DarioHett - Fixed Polymarket `neg_risk` order parameter handling - Fixed Tardis instruments `lot_size` mapping - Fixed Tardis adapter error handling and connection robustness - Fixed Tardis replay to use catalog-compatible filenames ### Internal Improvements - Added ARM64 support to Docker builds - Added BitMEX adapter integration tests - Added OKX adapter integration tests - Added turmoil network simulation testing to network crate - Added liquidity utilization rate to AMM pool profiler (#3107), thanks @filipmacek - Added `filter_sec_types` config to skip unsupported IB instrument types (#3108), thanks @sunlei - Ported `PortfolioAnalyzer` and all portfolio statistics to Rust - Introduced AMM Pool profiler with tickmaps and Uniswapv3 support (#3000, #3010, #3019, #3036), thanks @filipmacek - Introduced snapshot, analytics, and PSQL schema for PoolProfiler (#3048), thanks @filipmacek - Implemented consistency checking for AMM pool profiler with RPC state (#3030), thanks @filipmacek - Implemented `PoolFlash` event in blockchain adapter (#3055, #3058), thanks @filipmacek - Implemented Blockchain adapter pool profiler snapshot integration (#3090), thanks @filipmacek - Implemented BitMEX robust ping/pong handling - Implemented Hyperliquid adapter HTTP client (#2939), thanks @nicolad - Implemented Hyperliquid adapter scaffolding and examples (#2957), thanks @nicolad - Implemented Hyperliquid weighted rate limiter for REST API (#2960), thanks @nicolad - Implemented Hyperliquid L2 order book with tick-based pricing (#2967), thanks @nicolad - Implemented Hyperliquid data client and fix dependencies (#2975), thanks @nicolad - Implemented Hyperliquid REST API models for execution (#2983), thanks @nicolad - Implemented Hyperliquid `InstrumentProvider` / definitions parsing (#2992), thanks @nicolad - Implemented Hyperliquid DataClient in Python (#2996), thanks @nicolad - Implemented Hyperliquid DataClient in Rust (#2999), thanks @nicolad - Implemented Hyperliquid ExecutionClient in Python (#3003), thanks @nicolad - Implemented Hyperliquid ExecutionClient in Rust (#3013), thanks @nicolad - Implemented Hyperliquid websocket tester for streaming market data (#3018), thanks @nicolad - Implemented Hyperliquid basic market and limit orders (#3022), thanks @nicolad - Implemented Hyperliquid conditional / advanced orders (#3035), thanks @nicolad - Implemented Hyperliquid execution reconciliation (#3041), thanks @nicolad - Implemented Hyperliquid execution client order submission (#3050), thanks @nicolad - Implemented Hyperliquid LiveExecutionClientExt trait (#3075), thanks @nicolad - Implemented Hyperliquid typed enums and optimize WebSocket lookups (#3089), thanks @nicolad - Refactored Hyperliquid adapter to push complexity to Rust layer (#3063), thanks @nicolad - Refactored streaming writer to support per-bar-type persistence (#3078), thanks @faysou - Changed `Symbol`, `Currency`, and `InstrumentId` string validation from ASCII to UTF-8, fixing Binance compatibility with Chinese symbols - Changed `PositionId` validation check from ASCII to UTF-8, fixing Binance compatibility with Chinese symbols (#3105), thanks @Osub - Improved clock and timer thread safety and validations - Improved live timer lifecycle management by canceling existing timers with the same name - Improved `ActorExecutor` lifecycle and concurrency handling - Improved order book error handling, state integrity, and pprint/display - Improved order book handling of `NoOrderSide` deltas - Improved websocket reconnection sequence protections in stream mode - Improved socket reconnect sequence and tighten client setup and testing - Improved socket client URL parsing - Improved compatibility of Makefile for Windows git-bash (#3066), thanks @faysou - Improved Blockchain adapter shutdown with cancellation token - Improved Blockchain adapter `node_test` script (#3092), thanks @filipmacek - Improved and optimize AMM pool profiling (#3098), thanks @filipmacek - Improved Hyperliquid adapter patterns (#2972), thanks @nicolad - Improved BitMEX spot instruments quantity handling by scaling to correct fractional units - Improved BitMEX REST rate limits configuration - Improved BitMEX instrument cache error logging - Improved Binance, Bybit, OKX, BitMEX, and Coinbase International HTTP rate limiting to enforce documented per-endpoint quotas - Improved Binance fill handling when instrument not cached with clearer error log - Improved OKX trade mode detection and fee currency parsing - Improved OKX client connection reliability - Improved OKX liquidation and ADL fill handling and logging - Improved Tardis instrument requests to filter options by default - Standardized Binance order validations with proper order denied events to avoid "hanging" orders - Refined Renko bar aggregator and add tests (#2961), thanks @faysou - Refined setting of flags in Makefile (#3060), thanks @faysou - Refined Bybit balance parsing to use `Money.from_str` to ensure no rounding errors - Refined Interactive Brokers execution flows (#2993), thanks @faysou - Refined Interactive Brokers filtering of bars in IB adapter after disconnection (#3011), thanks @faysou and @Johnkhk - Refined Interactive Brokers account summary log to debug level (#3084), thanks @sunlei - Refined catalog `reset_data_file_names` method (#3071), thanks @adrianbeer and @faysou - Optimized `ExecutionEngine` hot path with topic caching and reduced cache lookups - Optimized rate limiter quota keys with string interning to avoid repeated allocations - Upgraded Rust (MSRV) to 1.90.0 - Upgraded Cython to v3.1.6 - Upgraded `databento` crate to v0.35.0 - Upgraded `datafusion` crate to v50.3.0 - Upgraded `pyo3` and `pyo3-async-runtimes` crates to v0.26.0 - Upgraded `redis` crate to v0.32.7 - Upgraded `tokio` crate to v1.48.0 - Upgraded `uvloop` to v0.22.1 (upgrades libuv to v1.49.0) ### Documentation Updates - Added quick-reference rate limit tables with links to official docs for Binance, Bybit, OKX, BitMEX, and Coinbase International - Updated cache concept guide with purging ops - Improved dark and light themes for readability - Improved clarity of implemented bar aggregations - Standardized consistent styling per docs style guide - Fixed some broken links ### Deprecations - Deprecated `convert_quote_qty_to_base`; disable (`False`) to maintain consistent behaviour going forwards. Automatic conversion will be removed in a future version.