github nautechsystems/nautilus_trader v2.0.0rc9
NautilusTrader 2.0.0rc9

pre-release25 minutes ago

NautilusTrader 2.0.0rc9

Released on 10th November 2026 (UTC).

Note

This release adds support for Python 3.15.

Enhancements

  • Added Kalshi initial adapter with market data, limit-order execution, and account reconciliation
  • Added FinFeedAPI prediction market data adapter with REST access, paginated historical requests, and polling
  • Added bracket exit reduce-only options (#5563), thanks @programskillforverification
  • Added indexed, count, and presence accessors for cached prices and funding rates (#5560), thanks @dxwil
  • Added Python Parquet funding rate write and query methods (#5555), thanks @chaneyka1
  • Added WebSocketClient::send_bytes_on_connection (#5539), thanks @madebymlai
  • Added warnings for bounded startup fills without position coverage (#5541), thanks @zhaow-de
  • Added checked StrikeRange::atm_percent and StrikeRange::delta constructors
  • Added BacktestNodeBuilder with custom catalog factories for instrument loading and replay
  • Added Cache lazy instrument and synthetic loads, saved component-state deletion, and explicit heartbeat writes
  • Added DataEngine processing and managed books for external data clients (#5520), thanks @nicezic
  • Added custom data support for GreeksData and PortfolioGreeks, including catalog storage and replay, thanks @faysou
  • Added LiveExecutionEngineConfig.purge_from_database support in Python and live nodes
  • Added HttpClient certificate support through certs_dir
  • Added Postgres cache support for actor and strategy state, synthetics, heartbeat writes, and entity deletion
  • Added OrderModifyDenied and OrderCancelDenied events and strategy and execution algorithm callbacks
  • Added OrderPriorityResetPolicy for sandbox and backtests (#5503), thanks for reporting @todorkolev
  • Added FromStr parsing for model identifiers with checked constructor validation
  • Added Python ParquetDataCatalog.query_instrument_statuses and query_instrument_closes
  • Added Betfair certificate login through certs_dir
  • Added Bybit raw HTTP withdrawal and withdrawal history methods (#5458), thanks @dxwil
  • Added CoinAPI flat-file support for numeric book update codes
  • Added CoinApiDataLoader with cached instrument definitions for file and REST ingestion
  • Added Deribit load_ids so a scoped node can omit other instruments during reconciliation
  • Added Deribit routed spot metadata and local order and market data capability checks
  • Added Lighter accountOrders targeted lookup, trades filters, and remaining_send_tx responses
  • Added OKX Python contract filters, execution families, and spot margin configuration
  • Added OKX history request coverage for catalog write-back (#5501), thanks @akarazhev
  • Added OKX instrument request completion for catalog write-back (#5564), thanks @madebymlai
  • Added Polymarket Protocol V2 market data, execution, account reporting, and resolution support
  • Added Polymarket Protocol V2 split, merge, and redemption support for Deposit Wallets
  • Added sandbox execution matching against OrderBookDepth snapshots (#5436), thanks @graceyangfan

Breaking Changes

  • Removed Python RedisCacheDatabase and PostgresCacheDatabase; configure cache persistence through node factories
  • Removed Python RedisMessageBusBacking; configure external message bus backing through node factories
  • Removed BookImbalanceActor and its config; use OrderBookImbalance and OrderBookImbalanceConfig
  • Removed native GreeksData and PortfolioGreeks records; use CustomData for catalog writes and replay
  • Removed CoinAPI ingestion free functions and CoinApiOhlcvLoader; register definitions with CoinApiDataLoader
  • Changed Parquet consolidation to reject gaps by default; pass ensure_contiguous_files=False to allow gaps
  • Changed BaseAccount.events to Arc<Vec<AccountState>>; use Arc::make_mut to edit (#5496), thanks @mi-netizen007
  • Changed DataEngine::connect and ExecutionEngine::connect to return Result; handle connection errors
  • Changed NautilusKernel::connect_data_clients and connect_exec_clients to return Result; handle errors
  • Changed Redis message retries to at-least-once delivery; deduplicate messages (#5491), thanks @Dworf
  • Changed SubscribeOptionChain::new to return Result; propagate validation errors
  • Changed DataActor::subscribe_option_chain and DataActorCore::subscribe_option_chain to return Result
  • Changed custom_data to require ts_event and ts_init last, in that order, thanks @faysou
  • Changed simulated spread execution to require encoded leg IDs; use new_generic_spread_id
  • Changed simulated spreads to reject liquidity_consumption=true and cancel multi-candidate FOK orders
  • Changed simulated cash spreads to bypass equity and binary-option short-sale checks; avoid these legs
  • Changed OrderMatchingEngineConfig literals; add order_priority_reset_policy: Default::default()
  • Changed SimulatedVenueConfig literals; add order_priority_reset_policy: Default::default()
  • Changed BacktestEngine::reset to return trader reset errors; run the engine before resetting
  • Changed local modify/cancel refusals to denied events; handle on_order_modify_denied and on_order_cancel_denied
  • Changed modify/cancel rejection emitters and factories to take causation_id; pass the command ID or None
  • Changed ExecutionAlgorithm::spawn_* to return Result; propagate construction errors
  • Changed native strategy startup to call Strategy::on_start; remove explicit calls from DataActor::on_start
  • Changed Strategy::mark_order_pending_update and mark_order_pending_cancel to take the command's UUID
  • Changed Strategy::generate_order_pending_update and generate_order_pending_cancel to take the command's UUID
  • Changed SBE to require matching precision modes and reject version 0; upgrade readers and writers together
  • Changed PostgresCacheDatabase::connect to take PostgresCacheConfig; replace individual connection arguments
  • Changed Rust Cache order/position/account purges to return Result; pass false for memory only
  • Changed CacheDatabaseAdapter Greek and yield-curve defaults to errors; override supported reads and writes
  • Changed Cache::cache_all to replace preloaded Greeks and yield curves; add transient values after loading
  • Changed raw Price and Quantity construction and decoding to reject digits beyond precision; rescale or round first
  • Changed Price.from_decimal and Quantity.from_decimal to round excess decimal places half even
  • Changed protection_price_calculate to return ProtectionPriceError; update explicit error types
  • Changed precision_from_str to return CorrectnessResult<u8>; propagate malformed-exponent errors
  • Changed bytes_to_string_vec and optional_bytes_to_* to return Result; handle JSON decoding errors
  • Changed trailing_stop_calculate* to return TrailingStopError; use MissingLast for missing last/mark prices
  • Changed Postgres cache startup to require greeks and yield_curve tables; run nautilus database init
  • Changed Redis Greek and yield-curve persistence to log errors; disable save_market_data or use Postgres
  • Changed Postgres cache schema in defi builds; run nautilus database init
  • Changed ordinary cache persistence failures to log and continue; use ERROR logs or runtime shutdown_on_error
  • Changed Architect AX AxWhoAmI.is_onboarded and is_frozen to Option<bool>; handle missing flags as None
  • Changed Binance non-GET REST requests to fail at quota gates; retry RateLimitBlocked when quota is available
  • Changed Binance HTTP error enums to add RateLimitBlocked; update exhaustive matches
  • Changed Binance REST to block on 418 without Retry-After; confirm the ban has ended before restarting
  • Changed blockchain ERC-20 currency codes to SYMBOL@CHAIN
  • Changed Bybit HTTP modify_order to take trigger_price; pass None when unchanged
  • Changed CoinAPI OHLCV fields and APIs to OhlcvPeriod; convert string literals with .into()
  • Changed CoinAPI symbol type and taker side APIs to SymbolType and TakerSide; use enum variants
  • Changed Coinbase live fills to use polled REST history; raise retry_delay_max_ms to reduce REST usage
  • Changed Databento and Interactive Brokers futures year settings to FuturesYearDigits; Python keeps 1/2
  • Changed Databento futures IDs to two-digit years by default; futures_year_digits=1 keeps old IDs, thanks @faysou
  • Changed Databento futures-option IDs and underlyings to match futures_year_digits
  • Changed Databento and Interactive Brokers catalog/cache IDs; rebuild stored data when adopting two-digit years
  • Changed Databento definition decoders to preserve native raw_symbol; supply msg.raw_symbol
  • Changed Databento decode_nautilus_instrument_id; pass year mode, definitions, and optional request hints
  • Changed Databento get_nautilus_instrument_id_for_record; pass year mode, definitions, venues, and request hints
  • Changed Databento decode_optional_price and decode_price_or_undef to return Result; handle errors
  • Changed Databento live precision overrides to take precedence; omit them to use definitions
  • Changed Databento statistics to use at least nine decimal places
  • Changed Databento market decoding to reject extra price digits, including sub-penny equity trades and bars
  • Changed Deribit orders to require cached instruments; include traded product types in execution product_types
  • Changed Deribit reconciliation to fail on uncached in-scope records; set load_ids to limit scope
  • Changed Deribit spot orders to reject GTD; use GTC, IOC, or FOK
  • Changed DeribitInstrument literals; add is_cbe_routed: None and is_csr: None
  • Changed Derive endpoint overrides to SecretString; pass strings to builders or use .into() in struct literals
  • Changed Interactive Brokers futures IDs to two-digit years by default; use futures_year_digits=1, thanks @faysou
  • Changed Interactive Brokers futures-option IDs and underlyings to match futures_year_digits
  • Changed Interactive Brokers provider config literals; add futures_year_digits: FuturesYearDigits::Two
  • Changed Kraken FuturesEditStatus literals; add order_id_snake_case: None (#5567), thanks @zhaow-de
  • Changed Lighter WebSocket enums with account transaction variants; update exhaustive matches
  • Changed Lighter execution to reject readonly=true URLs; use only a data client for read-only access
  • Changed Lighter proxy_url to require http:// or https://; replace SOCKS proxy URLs
  • Changed Lighter slippage settings and overrides to require integers in [0, 10_000); lower larger values
  • Changed OKX options to require non-blank families; set instrument_families before connecting
  • Changed OKX filtered EVENTS and derivatives to require separate clients
  • Changed OKX VIP4+ data configs to require complete API credentials
  • Changed OKX retry delays to require 0 < initial <= max in configs and HTTP clients
  • Changed OKXRawHttpClient constructors to anyhow::Result; use downcasts for typed error handling
  • Changed OKX use_mm_mass_cancel to reject true; use ordinary cancellation for non-MMP orders
  • Changed OKX WebSocket batch order tuples; add quote_quantity after reduce_only
  • Changed OKX spot reduce-only orders to local denials; pass reduce_only=False for spot closes
  • Changed Polymarket AssetType with ConditionalV2; update exhaustive matches
  • Changed Polymarket build_limit_order expiry to Option<UnixNanos>; pass None for no expiry
  • Changed Polymarket reports to require instruments for in-scope V2 orders and positions; set load_ids
  • Changed Polymarket data/execution credentials and funders to reject blanks; omit them for environment fallback
  • Changed Polymarket execution examples to dry run by default; disable DRY_RUN for live orders
  • Changed Polymarket GammaMarket literals; add position_ids and resolution_status fields
  • Changed Polymarket loaders to use Gamma outcome order; require matching Gamma/CLOB IDs and labels
  • Changed SandboxExecutionClientConfig literals; add order_priority_reset_policy: Default::default()

Security

  • Fixed HTTP default header debug redaction and WebSocket connection error log redaction
  • Fixed Parquet consolidation hiding gaps, misordering rows, and duplicating data after cleanup errors
  • Fixed Parquet consolidation moving instrument data outside its partitions
  • Fixed Throttler timer deadline overflow that could panic during order submission or modification
  • Improved R2 publishing credential handling to avoid writing keys to disk
  • Fixed CoinAPI WebSocket diagnostics logging API keys from malformed frames
  • Fixed Derive configs and HTTP client exposing endpoint credentials in Debug output

Fixes

  • Fixed DeltaNeutralVol hedging with stale exposure after fill voids
  • Fixed calculated daily theta to use a 365-day divisor instead of 365.25
  • Fixed remote Parquet instrument queries under catalog prefixes containing a data segment
  • Fixed execution algorithm submissions using stale quantities and prices (#5609), thanks @chaneyka1
  • Fixed historical bar requests losing aggregation after live unsubscribe (#5597), thanks @Tickwhiz
  • Fixed L1 slippage exceeding limit and protection prices (#5612), thanks @chaneyka1
  • Fixed L1 trade-only matching using stale passive-side prices (#5573), thanks @chaneyka1
  • Fixed relative catalog paths with the file protocol (#5562), thanks @madebymlai
  • Fixed simulated order modifications filling while markets are not open (#5610), thanks @chaneyka1
  • Fixed unmatched triggered limit-style IOC and FOK orders resting on the book (#5608), thanks @ngarid
  • Fixed backtest funding settlement for single-currency accounts (#5581), thanks @chaneyka1
  • Fixed Python open_check_lookback_mins=None ignoring unbounded lookback (#5540), thanks @SoYuCry
  • Fixed orders losing the initialization event's reconciliation flag (#5523), thanks @costajohnt
  • Fixed binary option expiry revisions during replay (#5511), thanks @imbolc
  • Fixed matching engines retaining stale instrument definitions during replay (#5505), thanks @imbolc
  • Fixed catalog write-back failures not reaching the data requester (#5494), thanks @madebymlai
  • Fixed Redis message publishing stopping after retryable write errors (#5491), thanks @Dworf
  • Fixed live data disrupting historical bar aggregator warm-up (#5469), thanks @mahimn01
  • Fixed pending orders reusing closing position quantity before venue acknowledgement
  • Fixed negative-price cash disposal funding and balance locks across reducing orders, lists, and modifications
  • Fixed negative-price cash buys crediting unreceived proceeds toward pending order funding
  • Fixed cash order lists reusing one currency for both sale inventory and purchase funding
  • Fixed betting order lists and batched modifications checking each side against the same free balance
  • Fixed FixedRiskSizer exceeding risk and quantity limits; sub-increment sizes now raise errors
  • Fixed FixedRiskSizer using linear PnL for inverse futures, perpetuals, and futures spreads
  • Fixed cache persistence failures interrupting memory updates, order submission, and event processing
  • Fixed data and execution client connection failures waiting for timeouts instead of aborting node startup
  • Fixed Postgres cache panicking on order-book additions with save_market_data
  • Fixed TWAP slice persistence failures interrupting dispatch or skipping quantity
  • Fixed execution algorithm spawns panicking on invalid parameters and reducing the primary before validation
  • Fixed Python execution algorithm modify/cancel and strategy query_order using stale order snapshots
  • Fixed FFI synthetic_instrument_is_valid_formula aborting on invalid component JSON
  • Fixed StrikeRange and option-chain subscriptions accepting invalid ranges or zero snapshot intervals
  • Fixed Portfolio reservations remaining locked after rejected LIT and trailing stop limit orders
  • Fixed Portfolio skipping restored-order reservations when instrument, account, or price data arrives after startup
  • Fixed Portfolio venue-wide margin equity reusing stale PnL after price or exchange rate changes
  • Fixed partial totals from Portfolio venue valuation queries and account snapshots on Money overflow
  • Fixed native strategy startup skipping GTD timer reactivation and expired-order cancellation for cached orders
  • Fixed canonical backtest checks failing on float rounding (#5576), thanks for reporting @petarstamenov
  • Fixed stale bundled execution reports incorrectly voiding newer fills
  • Fixed simulated spread fills not creating leg positions or booking leg commissions (#4329), thanks @faysou
  • Fixed emulated orders sharing a trigger instrument triggering from the wrong quote or trade source
  • Fixed resting GTD orders filling after expiry in backtests and sandbox execution
  • Fixed Trader shutdown skipping later components after stop errors and leaving degraded components active
  • Fixed dynamically added backtest components starting at epoch time and missing timer deadlines
  • Fixed native component registration overwriting another component kind with the same ID
  • Fixed automatic strategy order ID tags colliding after removals or with explicit tags
  • Fixed Strategy::market_exit skipping emulated and active-local orders during cancellation and completion
  • Fixed bounded reconciliation leaving retained positions open after explicit closing fills
  • Fixed Arrow trade tick decoding panicking on malformed trade IDs
  • Fixed shutdown drains opening new data subscriptions (#5435), thanks @imbolc
  • Fixed catalog display queries failing on clear-book deltas with no order side
  • Fixed closed-order and position purges ignoring purge_from_database in execution timers
  • Fixed Redis order and position deletion leaving routine snapshots and restoring purged positions
  • Fixed built-in Redis cache records ignoring timestamps_as_iso8601; disabled now writes nanosecond strings
  • Fixed external message bus payloads ignoring timestamps_as_iso8601
  • Fixed HTTP timeout overflow panicking instead of returning an error for excessive timeouts
  • Fixed Redis cache bulk loads ignoring bulk_read_batch_size
  • Fixed Redis cache decoding of v1 Cython currencies, instruments, accounts, and component state
  • Fixed Redis cache replay of v1 Cython order and position histories, including transformed orders
  • Fixed Cache indexing closed positions as open and excluding them from purging after insertion
  • Fixed NETTING realized PnL for cycles with equal PnL and after fill voids (#5534), thanks @d0ra-1h3-3xpl0ra
  • Fixed managed order book subscriptions reusing a cached book of a different type
  • Fixed managed order book quotes using event time for ts_init
  • Fixed command refusals clearing unrelated pending operations or rolling back later order state
  • Fixed duplicate order submission overwriting non-local cached orders in strategies and execution algorithms
  • Fixed execution algorithms skipping spawn accounting for order events while stopped
  • Fixed mixed-key market data batches being cached under the first row's instrument or bar type
  • Fixed historical time bar boundary assignment for ticks sharing a timestamp
  • Fixed composite time bars closing before their final source bar at a shared deadline
  • Fixed queued timer callbacks logging missing-actor errors or targeting reused actor IDs after retirement
  • Fixed backtest timer cancellation across data gaps and tail flushes
  • Fixed backtest liquidation on bar and trade data (#5538), thanks @stooq1
  • Fixed BacktestEngine reset hiding component reset failures
  • Fixed EmaCross and DeltaNeutralVol retaining runtime state on engine reset
  • Fixed streaming backtests failing to resume when the first batch has only data before the start time
  • Fixed Python ForexSession.__repr__ identifying sessions as PositionSide
  • Fixed ExecTester panicking on unsupported GTD brackets
  • Fixed ExecTester stop replacements exceeding remaining quantity after partial fills
  • Fixed ExecTester losing order quantity precision and dropping batch order parameters
  • Fixed ExecTester retaining data subscriptions on stop in dry-run mode or after cache-miss startup
  • Fixed test data downloads ignoring configured retry deadlines and skipping later retry delays with immediate_first
  • Fixed Postgres cache not persisting or restoring Greeks and yield curves with save_market_data
  • Fixed exchange-rate conversions failing on overflow despite a representable route or returning zero on underflow
  • Fixed Sockudo WebSocket timeouts overriding the client heartbeat and idle policy
  • Fixed false WebSocket heartbeat timeouts while receiving fragmented messages
  • Fixed startup reconciliation failing when execution clients publish recovered instruments
  • Fixed reconciliation double-counting order-report fills already covered by venue positions
  • Fixed startup margin calculations overwriting reported account balances
  • Fixed Architect AX clients failing to connect when /whoami omits onboarding and frozen states
  • Fixed Architect AX order history and fill report requests panicking on timestamps beyond i64::MAX nanoseconds
  • Fixed Binance perpetual test fixture lot size (#5499), thanks @Milchstrassse
  • Fixed Binance Futures initial margin underestimation (#5531), thanks for reporting @wangzengzhi
  • Fixed Binance startup reconciliation omitting closed orders from selected instruments
  • Fixed Binance Futures instrument ts_event and ts_init defaulting to zero
  • Fixed Binance REST requests ignoring 429 and 418 cooldowns from other requests
  • Fixed Binance cancellations and COIN-M modifications consuming order-count quota
  • Fixed Binance snapshot HTTP retries bypassing request-weight pacing
  • Fixed Binance REST pacing ignoring endpoint weights and USD-M funding and open-interest limits
  • Fixed Binance Futures sided cancel-all selecting other accounts' orders (#5467), thanks @Milchstrassse
  • Fixed Binance Spot position checks incorrectly treating missing reports as flat (#5478), thanks @Milchstrassse
  • Fixed blockchain currency collisions and missing token definitions during Redis/Postgres recovery
  • Fixed blockchain event parsers panicking on short fields or misreading oversized topics
  • Fixed blockchain execution retries after host clock errors
  • Fixed blockchain pool events carrying a superseded block hash and timestamp after reorgs
  • Fixed Bybit batch modify orders not using the trade WebSocket batch amend
  • Fixed Bybit data client ignoring environment credentials when config credentials are omitted
  • Fixed Bybit execution client omitting trigger prices from HTTP and WebSocket amendments
  • Fixed Bybit demo cancels remaining pending cancel without an order stream update
  • Fixed Bybit HTTP order reports dropping venue reject reasons and due_post_only
  • Fixed Bybit HTTP writes being retried after a possible transmission
  • Fixed Bybit HTTP rate limits rejecting orders that may have been sent
  • Fixed Bybit 10006 and 10429 responses rejecting in-flight order commands
  • Fixed Bybit option instrument loading and status updates covering only BTC instead of all listed base coins
  • Fixed Bybit option order book subscriptions defaulting to unsupported depth 50 and rejecting depths 25 and 100
  • Fixed Bybit instruments dropped on oversized maxOrderQty (#5592), thanks @abhijeetvichare76
  • Fixed CoinAPI dropping first book snapshots before subscription writes complete
  • Fixed CoinAPI L2 flat-file book loaders accepting unknown update types
  • Fixed CoinAPI OHLCV pagination stopping before the record limit after filtering leading periods
  • Fixed Coinbase and OKX checks closing positions outside report scope (#5280), thanks for reporting @chaneyka1
  • Fixed Coinbase live fill IDs differing from REST reconciliation
  • Fixed Coinbase quote-sized fills being interpreted as base quantities
  • Fixed Databento statistics decoding with insufficient precision for VWAP, volatility, and delta
  • Fixed Databento statistics Arrow encoding accepting mixed instruments or precisions
  • Fixed Databento MBO decode errors delaying buffered book events at F_LAST boundaries
  • Fixed Databento option strikes rejecting values finer than the strike currency precision
  • Fixed Databento price scaling at explicitly selected 17- and 18-decimal precision
  • Fixed Deribit instrument loading panicking on invalid spot definitions
  • Fixed Deribit instrument loading panicking on invalid derivative and combo definitions
  • Fixed Deribit single-order recovery treating failed lookups as missing orders
  • Fixed Deribit unsent order commands staying unresolved and uncertain venue errors becoming rejections
  • Fixed Deribit fill report requests returning partial results when a required trade fails to parse
  • Fixed Deribit reconciliation omitting in-scope orders, fills, and positions when the instrument is not cached
  • Fixed Deribit rejected order results emitting OrderAccepted
  • Fixed Deribit delayed submit acknowledgements reactivating tracking for terminal orders
  • Fixed Deribit post-terminal fills emitting OrderFilled instead of fill reports
  • Fixed Deribit instrument refresh ignoring its configured interval (#5465), thanks @d0ra-1h3-3xpl0ra
  • Fixed Derive option recovery rejecting startup or replacing real fills due to fee-inclusive averages
  • Fixed Derive trade and funding history returning events outside requested nanosecond time bounds
  • Fixed Derive historical trade responses accepting trades for a different instrument
  • Fixed Derive order status reports treating another instrument or a request without order IDs as a missing order
  • Fixed Derive reconciliation failing on excluded instruments when load_ids defines the scope
  • Fixed Hyperliquid account state staying stale after fills (#5449), thanks for reporting @dxwil
  • Fixed Hyperliquid instrument caching stalling node startup (#5354), thanks for reporting @Karrenbelt
  • Fixed Hyperliquid startup reconciliation failing on truncated entry prices (#5530), thanks for reporting @mark1lah
  • Fixed Hyperliquid perpetual quote currency differing from collateral (#5542), thanks @dxwil
  • Fixed Interactive Brokers position recovery rejecting rounded average costs (#5430), thanks @TylerGriffin99
  • Fixed Interactive Brokers canceled orders reported as partially filled (#5507), thanks @Milchstrassse
  • Fixed Interactive Brokers account summaries stopping after reconnects (#5525), thanks @TylerGriffin99
  • Fixed Interactive Brokers historical tick ts_init differing from ts_event (#5558), thanks @y1lan
  • Fixed Interactive Brokers gateway startup returning before login (#5565), thanks @madebymlai
  • Fixed Kalshi local denials blocking account recovery (#5630), thanks for reporting @wangschien
  • Fixed Kraken Futures history skipping unreadable rows and using stale states (#5559), thanks @zhaow-de
  • Fixed Kraken Futures order-update cancellations closing tracked orders before their fills arrive
  • Fixed Kraken Spot startup recovery for emptied wallet balances (#5527), thanks @zhaow-de
  • Fixed Kraken panics on malformed venue order IDs (#5567), thanks @zhaow-de
  • Fixed Kraken Futures edits reporting missing order IDs after success (#5567), thanks @zhaow-de
  • Fixed Kraken Futures open-order IOC and post-only reporting (#5571), thanks @zhaow-de
  • Fixed Lighter modification confirmation delay (#5517), thanks for reporting @AlphaTraderK
  • Fixed Lighter slippage overrides silently accepting invalid types and overflowing integers
  • Fixed Lighter public data startup failing on unused malformed credentials
  • Fixed Lighter execution config credential checks ignoring environment fallback
  • Fixed Lighter free collateral ignoring venue availability (#5578), thanks for reporting @AlphaTraderK
  • Fixed OKX TIF, RPI, and event parameter failures emitting OrderRejected instead of OrderDenied
  • Fixed OKX VIP4+ book subscriptions failing without public WebSocket login
  • Fixed OKX HTTP retries ignoring http_timeout_secs
  • Fixed OKX algo and spread cancels retrying after ambiguous HTTP failures
  • Fixed OKX rejected WebSocket logins waiting for the authentication timeout
  • Fixed OKX private updates being dropped when their instrument definitions are missing
  • Fixed OKX empty execution discovery failures omitting the selected scope from startup logs
  • Fixed OKX MARGIN selection using cash accounting and spot order trade mode
  • Fixed OKX event orders following derivative margin mode instead of using isolated mode
  • Fixed OKX execution discovery ignoring contract_types
  • Fixed OKX filtered execution missing active instruments and their WebSocket order identifiers
  • Fixed OKX order status reports accepting incomplete active coverage and discarding valid partial history
  • Fixed OKX order commands rejected before being written during WebSocket reconnects
  • Fixed OKX repeated logins preventing authentication recovery after interrupted reconnects
  • Fixed OKX spot market base/quote sizing for margin-mode accounts and batch submissions
  • Fixed OKX instrument and book fetch failures leaving requests incomplete
  • Fixed OKX reconnects dropping subscriptions after rejected unsubscriptions
  • Fixed OKX empty order refusals leaving orders unresolved (#5529), thanks @Milchstrassse
  • Fixed Polymarket accepting invalid funders, malformed load_ids, and unsafe retry delays
  • Fixed Polymarket settled BUY spend staying locked when collateral credits offset balance decreases
  • Fixed Polymarket explicit event slugs being ignored when an event-slug builder is configured
  • Fixed Polymarket data-client builder defaults disabling the 60-minute instrument refresh
  • Fixed Polymarket open-order checks failing while an admitted fill awaits application
  • Fixed Polymarket Gamma requests not retrying transient HTTP failures (#5508), thanks @imbolc
  • Fixed Polymarket Gamma condition_ids lookups failing with HTTP 414 (#5433), thanks for reporting @gingeard
  • Fixed Polymarket immediate BUY share rounding and unsafe signed prices (#5582), thanks @SoYuCry
  • Fixed Polymarket recovery and targeted reports rejecting fractional fills (#5616), thanks @SoYuCry
  • Fixed Sandbox open-order checks rejecting resting orders (#5366), thanks for reporting @awss1i
  • Fixed Sandbox execution panic on non-time bars (#5271), thanks for reporting @chaneyka1

Internal Improvements

  • Added shared field definitions for model and Arrow codec generation, thanks @faysou
  • Added NETTING startup reconciliation scenarios for flat accounts and recovered positions
  • Added debug logs for live node shutdown drain progress (#5572), thanks @imbolc
  • Fixed locale-dependent inventory comparisons in pre-commit hooks (#5514), thanks @Tickwhiz
  • Fixed Python submodule checks ignoring comparison failures (#5515), thanks @Tickwhiz
  • Improved Docker publishing with temporary digest directories isolated per job
  • Standardized module ordering checks to place unconditional modules before cfg-gated modules
  • Optimized Architect AX market data trade parsing and reduced allocations
  • Improved Bybit book stress comparisons with a separate public order book connection
  • Standardized Deribit report generation with HTTP collection on runtime workers (#5216)
  • Standardized Derive report generation with HTTP collection on runtime workers (#5216)
  • Refined Polymarket limit submit responses and venue order ID lookup
  • Standardized Polymarket report generation with HTTP collection on runtime workers (#5216)
  • Optimized Polymarket startup instrument lookup updates (#5561), thanks @imbolc
  • Optimized account cloning by sharing event histories (#5496), thanks @mi-netizen007
  • Optimized custom data Arrow encoding, decoding, and string buffer allocation, thanks @faysou
  • Optimized deserialize_decimal_from_str and deserialize_decimal_or_zero to avoid intermediate string copies
  • Optimized empty command-queue drains and L1 order-book quote replacement
  • Upgraded cargo-binstall tool to v1.26.2
  • Upgraded cargo-codspeed tool to v6.0.0
  • Upgraded cargo-hawk tool to v0.1.17
  • Upgraded cargo-nextest tool to v0.9.150
  • Upgraded prek tool to v0.5.9
  • Upgraded socket-cli tool to v1.11.1
  • Upgraded uv tool to v0.13.6
  • Upgraded uv pre-commit hook to v0.13.6
  • Upgraded arrow and parquet crates to v59.3.2
  • Upgraded aws-lc-rs crate to v1.19.0
  • Upgraded hypersync-client crate to v2.0.0
  • Upgraded log crate to v0.4.35
  • Upgraded redis crate to v1.8.1
  • Upgraded sysinfo crate to v0.40.1
  • Upgraded pytest package (test) to v9.2.0
  • Upgraded pytest-asyncio package (test) to v1.4.1
  • Upgraded ruff package (dev) to v0.17.3
  • Upgraded ty package (dev) to v0.0.92

Documentation Updates

  • Fixed WebSocket module documentation for backend proxy support and SOCKS fallback
  • Clarified Parquet migration coverage and CLEAR snapshot promotion limits
  • Clarified WebSocket and raw TCP socket retry attempts, reconnect disabling, and send-wait timeouts
  • Fixed Kalshi Rust execution tester example hardcoding shard 0 (#5631), thanks for reporting @wangschien
  • Clarified Kraken margin recovery limits and manual reconciliation (#5470), thanks @zhaow-de
  • Updated Kraken Futures Maker Protection rollout and split-amendment guidance
  • Added Python tutorial for backtesting Lighter ANTHROPIC pre-IPO order books from CoinAPI Flat Files
  • Added OKX history coverage and catalog write-back guidance (#5533), thanks @akarazhev
  • Improved Polymarket setup, configuration troubleshooting, and cancel-replace recovery guidance
  • Updated Python Polymarket examples with scoped reconciliation, risk checks, and 30-second shutdown waits

Artifact checksums

SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.

Artifact SHA256
nautilus_trader-2.0.0rc9-cp313-cp313-macosx_11_0_arm64.whl d78b65db7f92ece16144d9936dc4551b61d16034d1662b8572b2f9e40643502a
nautilus_trader-2.0.0rc9-cp313-cp313-manylinux_2_34_aarch64.whl 6a2ef16cb975336d1133bb06061edee735b4ced1d7819e375b723ca314779b87
nautilus_trader-2.0.0rc9-cp313-cp313-manylinux_2_34_x86_64.whl 3adcf277e693657e9a7586b0b21590f29eeeebc46897b3b289afafab63654c8d
nautilus_trader-2.0.0rc9-cp313-cp313-win_amd64.whl f921e8b7bdd5613207b0021c84f234d47d597b385e21fbd4ec8f6d3bb2135f9d
nautilus_trader-2.0.0rc9-cp314-cp314-macosx_11_0_arm64.whl dd6788f0ec45fcc682d1c94c130ed406ae31223962b2ee59da423442ac3c335c
nautilus_trader-2.0.0rc9-cp314-cp314-manylinux_2_34_aarch64.whl 6cafb2438a26aa955a3e933b371bba877562833e2e617dce35d090cf1672a3cb
nautilus_trader-2.0.0rc9-cp314-cp314-manylinux_2_34_x86_64.whl 653ef16662a0d9f93127598f56cc0f52426c6206f947c3ab76ffc28c8c1d5779
nautilus_trader-2.0.0rc9-cp314-cp314-win_amd64.whl 8d41539720ad30ef8f58c5b1074086ca875a13a220881ef11fac09180edc1bb4
nautilus_trader-2.0.0rc9-cp315-cp315-macosx_11_0_arm64.whl 48b0d03b6f2ead897120277a2d649ead155413ddf4d8010f486405155329a51f
nautilus_trader-2.0.0rc9-cp315-cp315-manylinux_2_34_aarch64.whl 9f9490cc5ce7c74dc29ac0006e75941e9f6eb2f6635f2bb2eb0432d34f0a2db1
nautilus_trader-2.0.0rc9-cp315-cp315-manylinux_2_34_x86_64.whl 239c0fb11cec5a8d3e64f93b90fffa8a3f407ba5120d6c9d94f2f7ceb7eff52e
nautilus_trader-2.0.0rc9-cp315-cp315-win_amd64.whl f7204799b08606c77951fd3c08ae099fb605d1309a576a855c3ca60b8b78e28a
nautilus_trader-2.0.0rc9.tar.gz 83635baed8cc99c0712247f5747f3251f1476916b96697462d4ef7f3d7e4cf6a

Verify provenance

After downloading an artifact, verify its GitHub artifact attestation:

gh attestation verify <artifact> \
  --repo nautechsystems/nautilus_trader \
  --cert-identity "https://github.com/nautechsystems/nautilus_trader/.github/workflows/build.yml@refs/heads/master" \
  --cert-oidc-issuer https://token.actions.githubusercontent.com

Don't miss a new nautilus_trader release

NewReleases is sending notifications on new releases.