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_percentandStrikeRange::deltaconstructors - Added
BacktestNodeBuilderwith custom catalog factories for instrument loading and replay - Added
Cachelazy instrument and synthetic loads, saved component-state deletion, and explicit heartbeat writes - Added
DataEngineprocessing and managed books for external data clients (#5520), thanks @nicezic - Added custom data support for
GreeksDataandPortfolioGreeks, including catalog storage and replay, thanks @faysou - Added
LiveExecutionEngineConfig.purge_from_databasesupport in Python and live nodes - Added
HttpClientcertificate support throughcerts_dir - Added Postgres cache support for actor and strategy state, synthetics, heartbeat writes, and entity deletion
- Added
OrderModifyDeniedandOrderCancelDeniedevents and strategy and execution algorithm callbacks - Added
OrderPriorityResetPolicyfor sandbox and backtests (#5503), thanks for reporting @todorkolev - Added
FromStrparsing for model identifiers with checked constructor validation - Added Python
ParquetDataCatalog.query_instrument_statusesandquery_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
CoinApiDataLoaderwith cached instrument definitions for file and REST ingestion - Added Deribit
load_idsso a scoped node can omit other instruments during reconciliation - Added Deribit routed spot metadata and local order and market data capability checks
- Added Lighter
accountOrderstargeted lookup,tradesfilters, andremaining_send_txresponses - 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
OrderBookDepthsnapshots (#5436), thanks @graceyangfan
Breaking Changes
- Removed Python
RedisCacheDatabaseandPostgresCacheDatabase; configure cache persistence through node factories - Removed Python
RedisMessageBusBacking; configure external message bus backing through node factories - Removed
BookImbalanceActorand its config; useOrderBookImbalanceandOrderBookImbalanceConfig - Removed native
GreeksDataandPortfolioGreeksrecords; useCustomDatafor catalog writes and replay - Removed CoinAPI ingestion free functions and
CoinApiOhlcvLoader; register definitions withCoinApiDataLoader - Changed Parquet consolidation to reject gaps by default; pass
ensure_contiguous_files=Falseto allow gaps - Changed
BaseAccount.eventstoArc<Vec<AccountState>>; useArc::make_mutto edit (#5496), thanks @mi-netizen007 - Changed
DataEngine::connectandExecutionEngine::connectto returnResult; handle connection errors - Changed
NautilusKernel::connect_data_clientsandconnect_exec_clientsto returnResult; handle errors - Changed Redis message retries to at-least-once delivery; deduplicate messages (#5491), thanks @Dworf
- Changed
SubscribeOptionChain::newto returnResult; propagate validation errors - Changed
DataActor::subscribe_option_chainandDataActorCore::subscribe_option_chainto returnResult - Changed
custom_datato requirets_eventandts_initlast, 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=trueand cancel multi-candidateFOKorders - Changed simulated cash spreads to bypass equity and binary-option short-sale checks; avoid these legs
- Changed
OrderMatchingEngineConfigliterals; addorder_priority_reset_policy: Default::default() - Changed
SimulatedVenueConfigliterals; addorder_priority_reset_policy: Default::default() - Changed
BacktestEngine::resetto return trader reset errors; run the engine before resetting - Changed local modify/cancel refusals to denied events; handle
on_order_modify_deniedandon_order_cancel_denied - Changed modify/cancel rejection emitters and factories to take
causation_id; pass the command ID orNone - Changed
ExecutionAlgorithm::spawn_*to returnResult; propagate construction errors - Changed native strategy startup to call
Strategy::on_start; remove explicit calls fromDataActor::on_start - Changed
Strategy::mark_order_pending_updateandmark_order_pending_cancelto take the command's UUID - Changed
Strategy::generate_order_pending_updateandgenerate_order_pending_cancelto take the command's UUID - Changed SBE to require matching precision modes and reject version 0; upgrade readers and writers together
- Changed
PostgresCacheDatabase::connectto takePostgresCacheConfig; replace individual connection arguments - Changed Rust
Cacheorder/position/account purges to returnResult; passfalsefor memory only - Changed
CacheDatabaseAdapterGreek and yield-curve defaults to errors; override supported reads and writes - Changed
Cache::cache_allto replace preloaded Greeks and yield curves; add transient values after loading - Changed raw
PriceandQuantityconstruction and decoding to reject digits beyond precision; rescale or round first - Changed
Price.from_decimalandQuantity.from_decimalto round excess decimal places half even - Changed
protection_price_calculateto returnProtectionPriceError; update explicit error types - Changed
precision_from_strto returnCorrectnessResult<u8>; propagate malformed-exponent errors - Changed
bytes_to_string_vecandoptional_bytes_to_*to returnResult; handle JSON decoding errors - Changed
trailing_stop_calculate*to returnTrailingStopError; useMissingLastfor missing last/mark prices - Changed Postgres cache startup to require
greeksandyield_curvetables; runnautilus database init - Changed Redis Greek and yield-curve persistence to log errors; disable
save_market_dataor use Postgres - Changed Postgres cache schema in
defibuilds; runnautilus database init - Changed ordinary cache persistence failures to log and continue; use
ERRORlogs or runtimeshutdown_on_error - Changed Architect AX
AxWhoAmI.is_onboardedandis_frozentoOption<bool>; handle missing flags asNone - Changed Binance non-GET REST requests to fail at quota gates; retry
RateLimitBlockedwhen 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_orderto taketrigger_price; passNonewhen unchanged - Changed CoinAPI OHLCV fields and APIs to
OhlcvPeriod; convert string literals with.into() - Changed CoinAPI symbol type and taker side APIs to
SymbolTypeandTakerSide; use enum variants - Changed Coinbase live fills to use polled REST history; raise
retry_delay_max_msto reduce REST usage - Changed Databento and Interactive Brokers futures year settings to
FuturesYearDigits; Python keeps1/2 - Changed Databento futures IDs to two-digit years by default;
futures_year_digits=1keeps 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; supplymsg.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_priceanddecode_price_or_undefto returnResult; 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_idsto limit scope - Changed Deribit spot orders to reject
GTD; useGTC,IOC, orFOK - Changed
DeribitInstrumentliterals; addis_cbe_routed: Noneandis_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
FuturesEditStatusliterals; addorder_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=trueURLs; use only a data client for read-only access - Changed Lighter
proxy_urlto requirehttp://orhttps://; 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_familiesbefore connecting - Changed OKX filtered
EVENTSand derivatives to require separate clients - Changed OKX VIP4+ data configs to require complete API credentials
- Changed OKX retry delays to require
0 < initial <= maxin configs and HTTP clients - Changed
OKXRawHttpClientconstructors toanyhow::Result; use downcasts for typed error handling - Changed OKX
use_mm_mass_cancelto rejecttrue; use ordinary cancellation for non-MMP orders - Changed OKX WebSocket batch order tuples; add
quote_quantityafterreduce_only - Changed OKX spot reduce-only orders to local denials; pass
reduce_only=Falsefor spot closes - Changed Polymarket
AssetTypewithConditionalV2; update exhaustive matches - Changed Polymarket
build_limit_orderexpiry toOption<UnixNanos>; passNonefor 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_RUNfor live orders - Changed Polymarket
GammaMarketliterals; addposition_idsandresolution_statusfields - Changed Polymarket loaders to use Gamma outcome order; require matching Gamma/CLOB IDs and labels
- Changed
SandboxExecutionClientConfigliterals; addorder_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
Throttlertimer 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
Debugoutput
Fixes
- Fixed
DeltaNeutralVolhedging 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
datasegment - 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
fileprotocol (#5562), thanks @madebymlai - Fixed simulated order modifications filling while markets are not open (#5610), thanks @chaneyka1
- Fixed unmatched triggered limit-style
IOCandFOKorders resting on the book (#5608), thanks @ngarid - Fixed backtest funding settlement for single-currency accounts (#5581), thanks @chaneyka1
- Fixed Python
open_check_lookback_mins=Noneignoring 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
FixedRiskSizerexceeding risk and quantity limits; sub-increment sizes now raise errors - Fixed
FixedRiskSizerusing 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_orderusing stale order snapshots - Fixed FFI
synthetic_instrument_is_valid_formulaaborting on invalid component JSON - Fixed
StrikeRangeand option-chain subscriptions accepting invalid ranges or zero snapshot intervals - Fixed
Portfolioreservations remaining locked after rejected LIT and trailing stop limit orders - Fixed
Portfolioskipping restored-order reservations when instrument, account, or price data arrives after startup - Fixed
Portfoliovenue-wide margin equity reusing stale PnL after price or exchange rate changes - Fixed partial totals from
Portfoliovenue valuation queries and account snapshots onMoneyoverflow - 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
Tradershutdown 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_exitskipping 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_databasein 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
Cacheindexing 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
BacktestEnginereset hiding component reset failures - Fixed
EmaCrossandDeltaNeutralVolretaining 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 asPositionSide - Fixed
ExecTesterpanicking on unsupportedGTDbrackets - Fixed
ExecTesterstop replacements exceeding remaining quantity after partial fills - Fixed
ExecTesterlosing order quantity precision and dropping batch order parameters - Fixed
ExecTesterretaining 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
/whoamiomits onboarding and frozen states - Fixed Architect AX order history and fill report requests panicking on timestamps beyond
i64::MAXnanoseconds - 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_eventandts_initdefaulting 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
10006and10429responses 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_LASTboundaries - 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
OrderFilledinstead 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_idsdefines 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_initdiffering fromts_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
IOCand 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
OrderRejectedinstead ofOrderDenied - 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
MARGINselection 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_idslookups 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_stranddeserialize_decimal_or_zeroto avoid intermediate string copies - Optimized empty command-queue drains and L1 order-book quote replacement
- Upgraded
cargo-binstalltool to v1.26.2 - Upgraded
cargo-codspeedtool to v6.0.0 - Upgraded
cargo-hawktool to v0.1.17 - Upgraded
cargo-nextesttool to v0.9.150 - Upgraded
prektool to v0.5.9 - Upgraded
socket-clitool to v1.11.1 - Upgraded
uvtool to v0.13.6 - Upgraded
uvpre-commit hook to v0.13.6 - Upgraded
arrowandparquetcrates to v59.3.2 - Upgraded
aws-lc-rscrate to v1.19.0 - Upgraded
hypersync-clientcrate to v2.0.0 - Upgraded
logcrate to v0.4.35 - Upgraded
rediscrate to v1.8.1 - Upgraded
sysinfocrate to v0.40.1 - Upgraded
pytestpackage (test) to v9.2.0 - Upgraded
pytest-asynciopackage (test) to v1.4.1 - Upgraded
ruffpackage (dev) to v0.17.3 - Upgraded
typackage (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