NautilusTrader 2.0.0rc6
Released on 4th October 2026 (UTC).
Enhancements
- Added
WebSocketConfig.max_message_size_bytesandmax_frame_size_bytesconfigurable inbound size limits - Added configurable
writer_capacitylimits for socket and WebSocket clients, defaulting to 1,024 messages - Added
NAUTILUS_HTTP2_ADAPTIVE_WINDOWenv var to restore adaptive HTTP/2 flow-control windows - Added same-venue execution client registration with explicit venue or default routing
- Added Rust
Cache::account_id_for_clientto resolve execution client accounts independent of issuers - Added Rust
Cache::client_id_for_venueto resolve the execution client that venue or default routing selects - Added Python
Cache.top_of_book()without cloning the resident book (#5011), thanks @youayouly - Added
RateOfChangeModefor configurable ROC output units (#5144), thanks @faysou - Added MACD
signalandhistogramoutputs (#5144), thanks @faysou - Added Bollinger Bands
stddevoutput (#5144), thanks @faysou - Added independent VIDYA
cmo_periodconfiguration (#5144), thanks @faysou - Added Ichimoku per-line readiness flags (#5144), thanks @faysou
- Added fallible Rust moving-average constructors and Python parameter validation (#5144), thanks @faysou
- Added period-1 support to
EfficiencyRatio(#5144), thanks @faysou - Added aggregate instrument fan-out across class directories to
list_parquet_files - Added custom data support to
StreamingFeatherWriter(#4759), thanks for reporting @mystic-io - Added recovery of unsealed Feather stream files left by a crashed writer (#5115), thanks @faysou
- Added streaming promotion into a separate, optionally remote,
StreamingConfig.catalog(#5115), thanks @faysou - Added
timezonetoRotationConfig.scheduled_dates, defaulting to UTC (#5115), thanks @faysou - Added shared-table
record/andinstrument/catalog paths for external catalog backends (#5115), thanks @faysou - Added Parquet catalog migration through
nautilus catalog migrate-parquet(#4959), thanks @faysou - Added
type_nameinference tomigrate-parquetfor legacy custom catalogs - Added typed
batch_size,compression, andmax_row_group_sizetoDataCatalogConfig(#5166), thanks @faysou - Added
submission_recovery_policyconfig for exhausted submission recovery (#5028), thanks @silarin - Added a live submission registry and exhaustion diagnostics for unresolved submissions (#5036), thanks @silarin
- Added a startup reconciliation warning for fills dropped without an order report or cached order
- Added
events.order_fill_declined.{instrument_id}topic republishing fills and voids the engine declines - Added position report metadata for FIFO and truncated venue entry averages (#5064), thanks for reporting @zhaow-de
- Added live binary option position settlement from
InstrumentClose(#4963), thanks for reporting @seungpyoson - Added
deserialize_decimal_tokenanddeserialize_optional_decimal_tokentonautilus_core - Added Rust
new_generic_spread_idandparse_generic_spread_id_legsidentifier functions (#5041), thanks @faysou - Added Python
new_generic_spread_idandgeneric_spread_id_to_list(#5041), thanks @faysou - Added strategy trigger price modification for trailing stop orders (#5041), thanks @faysou
- Added per-instrument
overrideson maker/taker fee models - Added Architect AX account margins and locked USD balance from
/risk-snapshot - Added Architect AX bounded mass-status window declaration for reconciliation lookbacks
- Added Architect AX post-only repricing metadata to HTTP and WebSocket order models
- Added Architect AX instrument schedules and estimated funding metadata to response models
- Added Architect AX
book_snapshot_timeout_secsoverride, honoring 0 as disabled - Added Betfair
book_snapshot_timeout_secsoverride, honoring 0 as disabled - Added Binance
book_snapshot_timeout_secsoverride, honoring 0 as disabled - Added typed Parquet catalog round trips for Binance futures custom data
- Added Bybit
book_snapshot_timeout_secsoverride, honoring 0 as disabled - Added
bars_timestamp_on_closetoBybitDataClientConfig, defaulting to close (#5160), thanks @folknor - Added
historical_base_urlandlive_gateway_addroverrides toDatabentoDataClientConfig - Added Hyperliquid
book_snapshot_timeout_secsoverride, honoring 0 as disabled - Added Kraken bounded mass-status window declaration for reconciliation lookbacks (#5043), thanks @zhaow-de
- Added Lighter support for 64-bit market IDs at and above 4095
- Added Lighter
book_snapshot_timeout_secsoverride, honoring 0 as disabled - Added Lighter
use_gtdto choose venue or local GTD expiry (#4997), thanks @graceyangfan - Added Lighter transport batching for batch cancellation and cancel-all requests (#4470)
- Added OKX error codes to order, modify, and cancel rejection reasons as
OKX error <code>: <message> - Added OKX scoped fee queries, instrument fee groups, and grouped fee responses (#5207), thanks @silarin
- Added Polymarket session signing and owner-operated session key authorization, listing, and revocation
- Added Polymarket book recovery with snapshot gating and stale-feed detection
- Added Polymarket settlement evidence registry with targeted REST trade resolution (#4876)
- Added Polymarket
MATCHED_NOT_BROADCASTEDtrade status - Added
tardis_http_urloverride toTardisDataClientConfigandTardisReplayConfig - Added Tardis full 25-level
OrderBookDepthforsnapshot25data - Migrated Polymarket trade and position history to Data API v2 with cursor pagination
Breaking Changes
- Removed the BitMEX adapter from Rust and Python following the exchange closure on 23 September 2026 (#4552)
- Removed
nautilus_trader.persistence.NautilusDataType- import fromnautilus_trader.model - Removed
NautilusDataType.OrderBookvariant and"OrderBook"/"order_book"spellings - Removed instrument
maker_feeandtaker_fee; set those rates on the venuefee_modelinstead - Removed
maker_feeandtaker_feefrom Arrow instrument schemas and the SQLinstrumenttable - Removed
nautilus_persistence::backend::catalog- import frombackend::parquet::{catalog, paths} - Removed
serialize_decimalandserialize_optional_decimal- usedecimal::serializeandserialize_optional - Removed Rust
InnerHttpClientDefaultimpl, which panicked on transport errors; useHttpClient::builder() - Removed Rust fixed-width Arrow decoders
decode_price,decode_quantity, andvalidate_precision_bytes - Removed OBV constructor
period; output is now cumulative signed volume (#5144), thanks @faysou - Removed KVO constructor
signal_period; requirefast_period < slow_period(#5144), thanks @faysou - Removed
DirectionalMovementconstructorma_type; use Wilder sums that skip the first bar (#5144), thanks @faysou - Removed VWAP
update_rawtimestamp; callreset()to start a new session (#5144), thanks @faysou - Removed Rust WMA
newweights argument; usewith_weightsfor custom weights (#5144), thanks @faysou - Removed the
instrument_idcolumn from funding rate, instrument status, and option Greeks Arrow files - Removed
StreamingFeatherWriterfs_protocolandfs_storage_options; pass a local path (#5115), thanks @faysou - Removed flat rotation arguments from
StreamingConfigandStreamingFeatherWriter(#5115), thanks @faysou - Removed Python
DataBackendSessionandDataQueryResult- useParquetDataCatalogqueries (#5115), thanks @faysou - Removed Rust
nautilus_persistence::backend::session- query throughParquetDataCatalog(#5115), thanks @faysou - Removed
to-jsonandto-parquetbinaries - usenautilus catalog migrate-parquet(#5115), thanks @faysou - Removed
nautilus_persistence::parquet- usebackend::parquet::io(#5115), thanks @faysou - Removed Rust
write_batch_to_parquetandwrite_batches_to_parquet- usewrite_batches_to_object_store - Removed Rust
combine_parquet_filesandmin_max_from_parquet_metadata- use their_object_storevariants - Removed
nautilus_persistence::backend::feather- usewriter::feather(#5115), thanks @faysou - Removed
nautilus_persistence::python::catalog- usepython::backend::parquet::catalog(#5115), thanks @faysou - Removed
nautilus_persistence::python::feather- usepython::backend::feather(#5115), thanks @faysou - Removed Rust
DataCatalogConfig::create_catalog- usecatalog::factory::create_catalog(#5115), thanks @faysou - Removed Rust
BybitWebSocketClientbar timestamp accessors; use the data config (#5160), thanks @folknor - Replaced Rust
flush_streamingwithclose_streaming_writerandreopen_streaming_writer(#5115), thanks @faysou - Replaced
StreamingConfigcatalog_pathandfs_protocolwithwriter_pathandcatalog(#5115), thanks @faysou - Replaced
StreamingConfigpromotionparamskeys with typed promotion fields (#5115), thanks @faysou - Replaced Parquet
DataCatalogConfig.paramssettings with typed fields;paramskeys now fail (#5166), thanks @faysou - Replaced
StreamingWriterbackendandstorage_optionswith an optionalcatalog(#5115), thanks @faysou - Replaced
convert_stream_to_datasubdirectorywith anEnvironmentargument (#5115), thanks @faysou - Replaced Rust
ParquetDataCatalog::query_typed_dataandquery_typedwithquery, which now returnsVec<T> - Renamed
OrderBookDepth10toOrderBookDepth, removing the alias andbook_depth10_to_arrow_record_batch_bytes - Renamed actor
subscribe_book_depth10/unsubscribe_book_depth10tosubscribe_book_depth/unsubscribe_book_depth - Renamed
OrderBookDepth10DataWranglertoOrderBookDepthDataWrangler - Renamed
SubscribeBookDepth10/UnsubscribeBookDepth10commands and their data client hooks, dropping the10suffix - Renamed Python persistence
NautilusDataType.OrderBookDepth10toNautilusDataType.OrderBookDepth - Renamed
ParquetDataCatalogmethodinstrument_idparameters toidentifier, matching v1 - Renamed Rust
TestClock/TestTimertoVirtualClock/VirtualTimerwithout compatibility aliases - Renamed Rust
extract_column_by_name_or_indextoextract_column_by_name, dropping the positional fallback - Renamed Databento
load_order_book_depth10andget_order_book_depth10, dropping the10suffix - Renamed the Databento publisher 142 venue from
DEFtoCDEF - Renamed Polymarket
SignatureTypetoPolymarketSignatureType - Renamed Tardis
*_tardis_depth10_from_snapshot*functions andTardisDepth10StreamIterator, dropping the10suffix - Changed custom fill-model hooks to receive optional best bid and ask prices
- Changed socket and WebSocket sends to return
SendError::BufferFullwhen writer capacity is exhausted - Changed
SocketClient::writer_txtoWriterSender; update explicit sender types and handleSendError - Changed
Strategy.modify_orderandExecutionAlgorithm.modify_orderto return errors for invalid no-change requests - Changed component lifecycle failures to propagate without logging; callers handle returned errors
- Changed EMA, Wilder, DEMA, and MACD to mean-seeded warmup (#5144), thanks @faysou
- Changed SMA and WMA to report zero until their windows are full (#5144), thanks @faysou
- Changed RSI to Wilder smoothing on [0, 100], with 50 for flat windows; rescale thresholds (#5144), thanks @faysou
- Changed CMO default smoothing to simple averages (#5144), thanks @faysou
- Changed MACD, Keltner, and KVO defaults to exponential averages, matching 1.x (#5098), thanks @nicoloangileri
- Changed VIDYA's CMO default to simple and Pressure's ATR to use the previous close (#5108), thanks @nicoloangileri
- Changed ATR, RVI, and Keltner ATR default smoothing to Wilder (#5144), thanks @faysou
- Changed RVI and ZScore to population deviation; ZScore is zero until its window is full (#5144), thanks @faysou
- Changed Stochastics %D to SMA of %K, with 50 for flat %K and %D windows (#5144), thanks @faysou
- Changed Bias and default ROC output to percentages; ROC looks back exactly
periodupdates (#5144), thanks @faysou - Changed Bollinger Bands to use close prices instead of typical prices (#5144), thanks @faysou
- Changed MACD constructors to take
signal_periodafterslow_period, defaulting to 9 (#5144), thanks @faysou - Changed MACD initialization to require signal warmup and reject
fast_period >= slow_period(#5144), thanks @faysou - Changed Keltner constructors to take
atr_periodafterk_multiplier(#5144), thanks @faysou - Changed WMA default weights to linear weights (#5144), thanks @faysou
- Changed linear regression intercept to use x = 0 (#5144), thanks @faysou
- Changed KVO to Klinger's volume force using daily high-low range and high+low+close trend (#5144), thanks @faysou
- Changed
VolatilityRatioto current true range over prior EMA, taking a singleperiod(#5144), thanks @faysou - Changed Ichimoku initialization to require all five lines (#5144), thanks @faysou
- Changed Ichimoku displaced lines to lag
displacement - 1bars (#5144), thanks @faysou - Changed Aroon outputs to retain full precision instead of rounding to 12 decimals (#5144), thanks @faysou
- Changed windowed indicator period limits to 16,777,216 (#5144), thanks @faysou
- Changed AMA warmup to
period_efficiency_ratio + 1inputs, seeded from the previous price (#5144), thanks @faysou - Changed backtest venues to require an explicit
fee_model, including an explicit zero-fee model - Changed fee models that read instrument fees to require explicit
maker_rateandtaker_rate - Changed account
calculate_commissionto require explicitmaker_rateandtaker_rate - Changed Rust
ExecutionEngine::register_clientto stop adding venue routes; live and backtest nodes are unaffected - Changed
Cache.account_for_venueandaccount_idto returnNonefor shared venues; look up by account ID - Changed Rust
Portfoliolocked-balance and margin queries to takeaccount_id; passNonefor venue lookup - Changed
ParquetDataCatalogfile methods to takedata_type, notdata_cls/type_name(#5027), thanks @faysou - Changed
ParquetDataCatalog.queryto take aNautilusDataType, not a directory name (#5027), thanks @faysou - Changed
ParquetDataCatalog.delete_data_rangeto take a non-instrumentNautilusDataType(#5027), thanks @faysou - Changed
BacktestDataConfig.data_typeto aNautilusDataType;Instrumentloads all classes (#5027), thanks @faysou - Changed Rust
OrderCore.eventsto read-onlyevents(); construct cores withOrderCore::new - Changed
reconciliation_startup_delay_secsto reject values above 86,400 seconds (one day) - Changed live node startup to fail when in-scope nonzero venue positions remain unrecovered
- Changed live shutdown to fail when retained submissions remain unresolved (#5156), thanks @silarin
- Changed Rust
calculate_reconciliation_priceandposition_prices_matchto take report average metadata - Changed same-thread
LiveNodereplacement to require dropping the previous node, even afterdispose() - Changed
RiskEngineto reject orders when accounts, prices, or required funding cannot be established - Changed
list_parquet_filesandconvert_stream_to_datato take typed selectors in place of strings - Changed streaming Feather output to one file per data type and per instrument class (#5115), thanks @faysou
- Changed streaming to stage Feather files on local paths only, rejecting remote paths (#5115), thanks @faysou
- Changed Feather flushes to append to the open
.feather.partialfile; closing seals it (#5115), thanks @faysou - Changed
StreamingFeatherWriterrotation time and file info to use catalog type selectors (#5115), thanks @faysou - Changed
StreamingFeatherWriter.include_typesand record filter keys to reject strings (#5115), thanks @faysou - Changed Rust
WriterRecordFilterto takeCatalogDataTypevalues in place of path prefixes (#5115), thanks @faysou - Changed
StreamingConfig.writer_backendto follow the catalog backend, elseFeather(#5115), thanks @faysou - Changed streaming to validate
StreamingConfigand reject zero rotation sizes or intervals (#5115), thanks @faysou - Changed Rust run manifests and Feather session sources to take
EnvironmentandRunStatus(#5115), thanks @faysou - Changed
ParquetDataCatalogto reject LZO and unknowncompressioncodes, not use Snappy (#5166), thanks @faysou - Changed catalog
lz4compression and code5to writeLZ4_RAW, withlz4_rawas an alias (#5166), thanks @faysou - Changed Rust
DataCatalogConfigbuilder to returnConfigResultand reject zero counts (#5166), thanks @faysou - Changed catalog storage options to reject unknown keys, including GCS
project_id(#5166), thanks @faysou - Changed Rust
DataCatalogConfigandBacktestDataConfigstorage option values toSecretString - Changed
StreamingConfigtype selectors andrecord_filterskeys to take enums only (#5115), thanks @faysou - Changed
ParquetDataCatalog.query_custom_datato take aNautilusDataType(#5115), thanks @faysou - Changed
ParquetDataCatalog.list_data_typesto return type enums in place of names (#5115), thanks @faysou - Changed
RotationConfig.modeto return aRotationModeenum (#5115), thanks @faysou - Changed Rust
CatalogCoverageRow.data_typeto aCatalogDataType(#5115), thanks @faysou - Changed Rust
CatalogBackendTypeandWriterBackendTypeto#[non_exhaustive] - Changed Postgres cache connect to require a trader ID and flush only that trader's rows (#5070), thanks @utx0
- Changed Postgres cache connect to fail until old account events are assigned (#5070), thanks @utx0
- Changed
Cache.flush_dbto return errors, so a failingflush_on_startstops node startup (#5070), thanks @utx0 - Changed logging init to fail on an unusable log file; lazy Rust init keeps console logging
- Changed Rust
FileWriter::newto returnanyhow::Resultinstead ofOption - Changed custom-data writes to require valid schemas; migrate legacy files with
nautilus catalog migrate-parquet - Changed catalog depth display to nested bid/ask lists with all levels and order IDs (#4959), thanks @faysou
- Changed Parquet prices, timestamps, enums, and JSON to the open Arrow format; migrate catalogs (#4959), thanks @faysou
- Changed custom data macros to separate model definitions from optional Arrow encoding (#4959), thanks @faysou
- Changed catalog Arrow files to name their type in
type_namemetadata, replacing instrumentclass - Changed instrument status and option Greeks Arrow conversions to reject batches mixing instruments
- Changed sandbox execution clients to require an explicit
fee_model, including a zero-fee model - Changed backtests to fail when a cash, betting, or wallet fill is rejected (#5077), thanks @abhijeetvichare76
- Changed a disposed
BacktestNodeto rejectrun()andbuild()(#5086), thanks @folknor - Changed DeFi pool
CurrencyPairbase and quote to follow token priority, matching swap trade info and execution - Changed Betfair, Binance, and Tardis crates to gate Arrow support behind an opt-in
arrowfeature - Changed Deribit
DeribitWebSocketClient::modify_orderto takeDeribitEditParams - Changed Deribit models to deserialize only from borrowed JSON, with
DeribitBookMsgborrowing its levels - Changed Python Hyperliquid data and execution client config parameter order to
base_url_httpbeforebase_url_ws - Changed Hyperliquid stale book-delta recovery to shared book recovery, which never requests a reconnect
- Changed Rust
parse_combined_account_balances_and_marginsto require account mode (#5187), thanks @XBeg9 - Changed Kraken legacy currency codes to standard codes; migrate stored currency data (#5155), thanks @zhaow-de
- Changed Kraken EUR/USD quote currencies, REST fees, and PnL to 2 decimals, and JPY to 0 (#5155), thanks @zhaow-de
- Changed Kraken futures balances to retain negative free amounts for wallet shortfalls (#5155), thanks @zhaow-de
- Changed Polymarket
polymarket_trade_sort_keyinputs to v2transaction_hashandtoken_idfields - Changed Polymarket stream
FAILEDtrades to quarantine until a targeted REST result voids applied fills - Changed Polymarket fills on orders from before a reconnect or restart to wait for a terminal REST result
- Changed Polymarket reconciliation reports to fail while trade settlement evidence is unresolved
- Changed Polymarket user-channel GTD expiry to
OrderExpired; earlier and REST cancels stayOrderCanceled - Changed Polymarket fee curves to exact decimal arithmetic, rejecting fractional fee exponents
- Changed Polymarket taker fees to read
info.fee_scheduleinstead of instrumenttaker_fee - Changed Tardis
book_snapshot_outputvalue"depth10"to"depth"(the legacy value remains accepted) - Changed Tardis derived trade IDs to hash decimal values, changing IDs for trades without venue IDs
- Changed Tardis
replayfeature to opt-in (no longer a default); it now enablesarrow
Security
- Fixed adapter HTTP redirect leaks of credentials and signed payloads, thanks for reporting @seungpyoson
- Fixed Parquet catalog storage errors read as missing files, which could delete data during period consolidation
- Fixed Parquet period consolidation stopping after 10,000 periods, duplicating rows or deleting unconsolidated data
- Fixed logging thread panics when stderr is a closed pipe, which aborted release builds
- Fixed Python float conversions of precision 17 and 18 prices, quantities, and money aborting release builds
- Fixed
Cache.pricemid prices of precision 16 quotes aborting greeks calculations in release builds - Fixed
Cache.pricemidpoints at the precision ceiling panicking the process (#5084), thanks @folknor - Fixed Python raw and pickle reconstruction of quotes, trades, bars, and price updates aborting release builds
- Fixed Python account balance queries, leverage setters, and
balance_impactaborting release builds - Fixed Redis connections leaking passwords to debug logs and panicking on some non-ASCII passwords
- Hardened HTTP and socket transport clients against URL credential leaks into logs, errors, and
Debugoutput - Hardened
DataCatalogConfigandBacktestDataConfigrepr()andDebugagainst storage option leaks - Hardened TLS
certs_dirloading by logging each trusted root at INFO with its SHA-256 fingerprint - Hardened TLS
certs_dirloading to fail on unreadable files instead of silently skipping them - Hardened WebSocket transport client close-reason logging against server-injected line breaks and terminal escapes
Fixes
- Fixed
StackStrhashing to support borrowedstrlookups in maps and sets - Fixed precision loss when deserializing exactly representable scientific
Decimalstrings - Fixed
from_pydictto raiseValueErrorfor integers outside the signed or unsigned 64-bit range - Fixed fills after order expiry being dropped instead of updating the order and position
- Fixed unnecessary Python borrow errors in default actor, strategy, and execution algorithm callbacks
- Fixed duplicate error logging for propagated order-command failures
- Fixed
RetainUnresolvedlocally closing unacknowledged orders after recovery exhaustion - Fixed
Strategy.cancel_all_ordersreturning only the first individual cancellation error - Fixed
Strategyignoringlog_rejected_due_post_only_as_warningfor post-only rejections - Fixed silent Python strategy/algorithm errors (#5039), thanks for reporting @logeid and for initial fix @costajohnt
- Fixed mass-status reconciliation ignoring filled-quantity decreases without fills, thanks for reporting @kta1kri
- Fixed startup reconciliation dropping real fills for external
AcceptedandTriggeredorders - Fixed overfill rejections leaving no warning (#5081), thanks @folknor
- Fixed
RiskEnginerisk-limit bypasses through single and batch order modifications, thanks for reporting @kta1kri - Fixed quote-quantity conversion overflow panics during order risk checks
- Fixed fill OMS resolution to use the owning execution client instead of venue or default routes
- Fixed venue account lookups depending on add order and index rebuilds when accounts share an issuer
- Fixed Python portfolio queries rejecting an explicit account when another account shares its issuer
- Fixed recorded portfolio snapshots latching stale missing-price flags (#5171), thanks @awss1i
- Fixed Python
AccountBalanceandMarginBalanceto_dictamounts losing digits through float formatting - Fixed Python
PositionStatusReport.to_dictomittingavg_px_open - Fixed
RiskEngineusing the venue account, not the routed client's (#4946), thanks for reporting @Artur-Sulej - Fixed
RiskEngineposition-reducing checks counting positions and open orders of other accounts - Fixed later submits denying or double-routing orders already sent to an execution client (#5020), thanks @s1amese2003
- Fixed overlapping mass-status snapshots reversing newer cached fills or fill voids
- Fixed strategy-scoped cancel-all skipping locally active orders (#5120), thanks @ngarid
- Fixed immediate-mode cancels leaving accepted orders open in the cache (#5120), thanks @ngarid
- Fixed immediate-mode OTO child cancellation and cleanup after entry rejection (#5120), thanks @ngarid
- Fixed trailing-stop orders already in the market being accepted despite
reject_stop_orders - Fixed trailing-stop modifies using touch checks instead of stop checks (#5147), thanks @abhijeetvichare76
- Fixed
OrderEmulatorpanic releasing a trailing stop limit before its limit price is calculated - Fixed
OrderEmulatorpanic modifying an emulated order from an order or position event handler - Fixed
OrderEmulatorpanic releasing a GTD order as a market order - Fixed
OrderEmulatorstranding an order whose limit release fails - Fixed
OrderEmulatortriggeringLAST_PRICEorders on quotes - Fixed trailing-stop activation duplicating order events in the cache database
- Fixed OUO order updates resizing the sibling to the leg's total instead of remaining quantity
- Fixed custom fill books falling back to historical liquidity or exceeding their available quantity
- Fixed
BestPriceFillModelnever filling limit orders at or inside the spread - Fixed fill model panic on probabilities within rounding error of 0 or 1
- Fixed Python
FillModelsubclasses rejecting constructor arguments - Fixed simulated slippage moving fill prices outside instrument price limits
- Fixed simulated trailing stop limits with a price filling before they trigger
- Fixed simulated cancels rejected for pending OTO children and partially filled market orders
- Fixed simulated venues accepting off-tick prices that could never fill
- Fixed simulated cash accounts allowing binary-option sells to open or increase short positions
- Fixed simulated OTO children left submitted after their parent is rejected
- Fixed simulated bar execution evaluating last-price triggers against the previous bar leg
- Fixed backtest rejection of lower-precision order fields within the same fixed-point scale
- Fixed oversized futures delivery in simulated physical option settlement, thanks for reporting @zakkvald
- Fixed simulated physical option exercise double counting intrinsic value from
InstrumentClose - Fixed backtest L1 fills stalling on repeated identical trades (#5017), thanks for reporting @GwangPyo
- Fixed backtest L1 queue estimates ignoring quote size reductions (#5016), thanks for reporting @GwangPyo
- Fixed stale backtest fills triggered by portfolio snapshot timers (#5054), thanks for reporting @frslvr
- Fixed
BacktestEngineruns afterresetfailing kernel startup and haltingshutdown_on_errorruns - Fixed Sandbox dropping
OrderAcceptedfor an immediately marketable limit IOC (#5102), thanks @graceyangfan - Fixed Sandbox restart leaving cache-open orders out of the matching engine (#5046), thanks @AmitKumarDeoghoria
- Fixed spread quote aggregation accepting signed leg ratios that flipped the leg sign (#5041), thanks @faysou
- Fixed
convert_stream_to_datasilently skipping staged custom data (#4607), thanks for reporting @mystic-io - Fixed typed catalog decode for kernel Feather streams of quotes, trades, bars, and related types
- Fixed migration of class-tagged Parquet instruments with
UInt64or UTC nanosecond timestamps - Fixed runtime catalog queries to reject legacy instrument schemas with explicit migration guidance
- Fixed streaming Feather writers sealing a new file on every flush (#5115), thanks @faysou
- Fixed Parquet promotion precision for an empty order book depth staged with populated ones (#5115), thanks @faysou
- Fixed a Feather writer panic when a mixed-instrument batch crossed the rotation size limit (#5115), thanks @faysou
- Fixed Parquet writers accepting run IDs that object-store paths encode, which skipped promotion
- Fixed Feather staging writes hanging when the staging worker panics
- Fixed unbounded Feather filename reservations and repeated directory scans during Parquet promotion
- Fixed Parquet promotion from writer paths containing spaces, non-ASCII, or reserved characters
- Fixed Parquet promotion and
convert_stream_to_dataof Feather files with non-ASCII identifiers - Fixed streaming
replace_existingemptying the run directory before rejecting an invalid catalog - Fixed reconciliation fills from venue fill reports not carrying the
reconciliationevent flag - Fixed live node startup panic on an excessively large
reconciliation_startup_delay_secs - Fixed live node startup succeeding with unrecovered venue positions
- Fixed replayed fills doubling positions reconciled from venue position reports (#5041), thanks @faysou
- Fixed startup reconciliation dropping fills that precede order acceptance (#5041), thanks @faysou
- Fixed refused fills stalling position reconciliation (#5041, #5060), thanks for reporting @chaneyka1; thanks @faysou
- Fixed duplicate
LiveNodebuilds replacing thread-local messaging (#5049), thanks for reporting @logeid - Fixed unqueryable Python custom-data writes (#4984), thanks for reporting @shanezilla
- Fixed
customdataclassnanosecond decoding without pandas (#4984), thanks for reporting @shanezilla - Fixed catalog interval-filename validation renaming files before rejecting them (#4647)
- Fixed catalog file-name resets overwriting files before validating the new names
- Fixed catalog file-name resets without an identifier moving files out of identifier directories
- Fixed catalog
write_to_jsonencoding Windows path separators into object keys - Fixed local catalog run and data-type listings treating directory read errors as empty
- Fixed catalog run and data-type listings returning percent-encoded names
- Fixed catalog consolidation, deletes, name resets, intervals, and remote queries of non-ASCII identifiers
- Fixed
ParquetDataCatalogaccepting a zerobatch_sizeormax_row_group_size - Fixed HTTP client omitting configured
User-Agentfrom proxyCONNECTrequests for HTTPS URLs - Fixed authenticated HTTP proxy requests failing after cross-origin redirects
- Fixed HTTP client adaptive HTTP/2 flow control triggering Cloudflare resets of large response bodies
- Fixed rate limiters admitting an extra request after idle periods
- Fixed TLS client config panicking on first use when ring is also enabled
- Fixed Sockudo handshake retries logged as errors, hiding reconnect recovery
- Fixed concurrent WebSocket authentication leaving the result and shared state inconsistent
- Fixed WebSocket sends skipping the reconnect replay buffer before authentication (#5128), thanks @Robin1987China
- Fixed dropping unfilled working orders when replacing a reconciliation lifecycle (#5003), thanks @abhijeetvichare76
- Fixed live reconciliation applying report-task results after shutdown (#4982), thanks @folknor
- Fixed backtest data-type and missing-engine errors to name the valid case (#4977), thanks @abhijeetvichare76
- Fixed unclear errors for missing local Parquet catalog paths (#4950), thanks for reporting @Artur-Sulej
- Fixed Windows drive-path catalog file URIs (#4646), thanks for reporting @autotrader2025
- Fixed catalog instrument listing ignoring
base_pathon remote stores such ass3://(#5052), thanks @xWaita - Fixed catalog-wide delete and consolidation skipping directories whose name prefixes a sibling directory
- Fixed catalog-wide delete and consolidation on remote catalogs whose base path contains a
datasegment - Fixed remote catalogs accepting base paths that object-store paths encode, which broke queries
- Fixed custom data queries matching identifiers by substring instead of the identifier directory
- Fixed bar queries dropping instrument ID identifiers listed alongside full bar types
- Fixed
filter_filesmatching bar types by name prefix instead of instrument ID - Fixed period consolidation panicking on a zero
period_nanos - Fixed catalog queries applying time bounds to only one side of an
ORwhere clause - Fixed catalog queries failing on directories whose files differ in precision (#5166), thanks @faysou
- Fixed HTTP catalogs ignoring storage options, which blocked plain
http://catalogs (#5166), thanks @faysou - Fixed
write_batches_to_object_storepanicking on an empty batch list - Fixed OrderBook warnings after sequence counter resets (#5015), thanks @dnouri
- Fixed AroonOscillator
MAX_PERIODwindow dropping the oldest extreme before rollover (#5037), thanks @wbizmo - Fixed
ArcherMovingAveragesTrendskeeping both trend flags after a reversal (#5125), thanks @wbizmo - Fixed
VerticalHorizontalFilterandRelativeVolatilityIndexreading NaN on flat prices (#5059), thanks @mkzung - Fixed indicators changing state on non-finite inputs or malformed candles (#5144), thanks @faysou
- Fixed linear regression R-squared returning NaN for non-flat, low-variance windows (#5144), thanks @faysou
- Fixed rolling indicator precision after large shifts in the window mean (#5144), thanks @faysou
- Fixed Python indicator enums hashing differently from equal integers (#5144), thanks for reporting @faysou
- Fixed option expiry settlement missing underlyings listed on another venue (#5035), thanks @AmitKumarDeoghoria
- Fixed
CryptoOptionapplying a one-contract minimum whenmin_quantityis unspecified - Fixed Postgres cache loading and overwriting another trader's orders, positions, and fills (#5070), thanks @utx0
- Fixed cached time bars replacing same timestamps and skipping older bars (#5109), thanks @dfjmax
- Fixed inverse option notional and PnL using
1 / pricevaluation (#5053), thanks for reporting @Kilvish25 - Fixed backtest inverse option cash settlement at quote-point intrinsic value (#5053), thanks for reporting @Kilvish25
- Fixed
TestDataProviderreadingdevelopdata in release wheels (#5087), thanks for reporting @bananaunderground - Fixed adapter JSON decimal and
UnixNanosparsing withserde_json/arbitrary_precision - Fixed log file rotation for trader IDs or file names containing dots
- Fixed failed log file rotations retrying with a disk sync on every line
- Fixed file logs lagging until the write buffer filled; lines now flush within about 100 ms
- Fixed
nautilusCLI dropping buffered log lines at exit - Fixed
OwnOrderBookghost orders after re-adding at a new price or a zero-size price update - Fixed
OrderBookgrouped filtered views overstating liquidity when own orders are better priced - Fixed own order books appearing with
manage_own_order_booksdisabled after a failed order event - Fixed
OrderBookfiltered views subtracting emulated orders, which never rest in the public book - Fixed own order books holding quote-quantity orders in quote units before conversion to base units
- Fixed own order book audit removals logging as errors, halting
shutdown_on_errornodes - Fixed
OrderBook.get_avg_px_qty_for_exposurequantities 100x too large for 18-decimal DeFi sizes - Fixed recoverable adapter conditions logging as errors, halting
shutdown_on_errornodes - Fixed quanto margin and balance locks to use the settlement currency (#5073), thanks @abhijeetvichare76
- Fixed margin and betting accounts reserving filled quantity after partial fills (#5130), thanks @abhijeetvichare76
- Fixed time bars stalling after an interval with no updates (#5082), thanks @faysou
- Fixed risk engine reset leaving a halted or reducing engine active without an event (#5085), thanks @folknor
- Fixed canceled FOK orders leaving book liquidity marked consumed (#5106), thanks @ngarid
- Fixed cash-account SELL checks for instruments without a base currency (#5112), thanks @yashwardhan-gautam
- Fixed non-ASCII symbols silently dropping positions (#5143), thanks @Yize9
- Fixed
nautilus-livefailing to compile without thenodefeature (#5177), thanks @zhaow-de - Fixed adapters logging routine events as warnings and duplicate failures twice
- Fixed Architect AX cancel-all requests ignoring
order_side(#4470), thanks for reporting @zurpet - Fixed Architect AX order status reports dropping venue reject reasons
- Fixed Architect AX market data subscriptions not resuming after an explicit reconnect
- Fixed Architect AX terminal order queries losing the original order quantity
- Fixed Architect AX order report parsing of post-only flags, timestamps, and terminal states
- Fixed Architect AX position entry prices to use cost basis when available
- Fixed Architect AX fills being dropped for unknown sibling order states
- Fixed Architect AX book recovery after missing snapshots, invalid frames, and reconnects
- Fixed Architect AX resubscribes racing an earlier unsubscribe and leaving the stream unsubscribed
- Fixed Betfair false fill voids and missing fills during reconciliation after price replacements
- Fixed Betfair false fill voids from inconsistent order and fill snapshots during reconciliation
- Fixed Betfair order quantities in replacement queries and quantity reduction recovery
- Fixed Betfair resting SP bets treated as closed before BSP reconciliation
- Fixed Betfair book recovery after unparsable runner changes, missing images, and changes before an image
- Fixed Betfair market images leaving stale levels on runners the image omits
- Fixed Betfair concurrent book subscriptions dropping markets from the stream subscription
- Fixed Binance order ID encoding for short alphanumeric tags (#5055), thanks for reporting @logeid
- Fixed Binance WebSocket subscribe bursts that closed sockets with 1008 (#5014), thanks @costajohnt
- Fixed historical
BinanceBarresponses never reaching Python (#5002), thanks @abhijeetvichare76 - Fixed Binance bulk non-trading instrument skips logged as warnings instead of debug
- Fixed Binance cancel-all requests ignoring
order_side - Fixed Binance Spot
batch_cancel_ordersusing a non-existent batch endpoint - Fixed Binance book recovery after sequence gaps, snapshot failures, and reconnects
- Fixed Binance Spot empty depth snapshots failing to clear the book
- Fixed Binance order book snapshots missing
F_SNAPSHOTon their price levels - Fixed Binance Futures panic on depth updates without price levels
- Fixed Binance depth snapshot bursts exceeding the venue request-weight limit
- Fixed Binance Spot book unsubscribe and resubscribe commands reaching the stream pool out of order
- Fixed Binance Rust data clients not registering
BinanceBarcustom data for persistence - Fixed Blockchain RPC WebSocket blocks missing their chain, panicking the data engine
- Fixed Blockchain swaps awaiting finality rejected by the in-flight check before their fill arrived
- Fixed Bybit cancel-all requests ignoring
order_side(#4470), thanks for reporting @zurpet - Fixed Bybit cursor pagination looping forever on repeated page cursors (#5019), thanks @Martingale42
- Fixed Bybit book recovery after update ID gaps, missing snapshots, and reconnects
- Fixed Bybit order book snapshots missing
F_SNAPSHOTon their price levels - Fixed Bybit data
is_connectedstaying true while a socket reconnects (#5162), thanks @folknor - Fixed Coinbase trade aggressor side inverted by using the reported maker side
- Fixed Databento live MBO subscriptions never emitting trades (#5095), thanks for reporting @invisiblebackhand
- Fixed DeFi position fees accruing on liquidity after a mint or burn instead of before
- Fixed DeFi swap replay dropping fees on input left at the swap's final price
- Fixed DeFi size-for-impact search never expanding its upper bound
- Fixed DeFi pool balance estimates adding raw fee growth to token amounts
- Fixed DeFi price impact and slippage reporting 0 bps beyond the
u32range - Fixed DeFi chain IDs and HyperSync URLs for 12 chains, including Unichain, Ink, and Hyperliquid
- Fixed DeFi
Pooldisplay repeating the fee label - Fixed DeFi swap replay advancing fees across a drifted tick partition (#5163), thanks @folknor
- Fixed DeFi pool utilization panics during partial-history replay
- Fixed DeFi mint panics above tick liquidity limits and state changes on rejected mints or burns
- Fixed DeFi size estimates overflowing near the maximum pool tick
- Fixed Deribit prices, sizes, balances, and fees losing digits through
f64JSON parsing - Fixed Deribit order and edit amounts and prices losing digits through
f64serialization - Fixed Deribit and Tardis Machine book parsing panicking on out-of-range prices
- Fixed Deribit order books going stale when a book message fails conversion
- Fixed Deribit book parsing panicking on amounts that round to zero at size precision
- Fixed Deribit orders and edits emitting no rejection when their values cannot serialize exactly
- Fixed Derive rejecting valid sub-minimum taker orders (#5045), thanks for reporting @Aviksaikat
- Fixed Derive instrument
infodropping fields from the venue response - Fixed Hyperliquid fill reconciliation failing for accounts with fills on settled HIP-4 outcomes
- Fixed Hyperliquid mass status failing on
outcomeSettledCanceledhistorical orders - Fixed Hyperliquid book recovery after missing snapshots, invalid frames, and reconnects
- Fixed Hyperliquid order book snapshots missing
F_SNAPSHOTand closing every level withF_LAST - Fixed Hyperliquid depth-only book subscriptions emitting order book deltas
- Fixed Hyperliquid fills and order updates missed while the execution WebSocket was disconnected
- Fixed Hyperliquid bracket order modification canceling contingent orders
- Fixed Hyperliquid orders left open when canceled while a modify of them was in flight
- Fixed Hyperliquid REST open orders reconciling stops and take-profits as limits (#5145), thanks @JulienKervarrec
- Fixed Hyperliquid historical stop reports losing trigger metadata and blocking fills (#5191), thanks @XBeg9
- Fixed Hyperliquid IOC canceled remainders reconciling as filled and staying open (#5191), thanks @XBeg9
- Fixed Hyperliquid reduce-only quantities in startup reports with complete fill history (#5192), thanks @XBeg9
- Fixed Hyperliquid unified and portfolio margin account balances to use spot collateral (#5187), thanks @XBeg9
- Fixed Interactive Brokers contract details conversion raising
ModuleNotFoundError(#5051), thanks @dfjmax - Fixed Kraken spot connect aborting when TradeVolume fails (#5005), thanks @zhaow-de
- Fixed Kraken spot reports spelled with the pair altname not resolving to instruments (#5034), thanks @zhaow-de
- Fixed Kraken spot cancel-all cancelling orders outside the requested instrument (#5044), thanks @zhaow-de
- Fixed Kraken spot report pagination continuing past 500 pages without reporting incomplete (#5062), thanks @zhaow-de
- Fixed Kraken spot startup reconciliation omitting orders closed while the node was down (#5110), thanks @zhaow-de
- Fixed Kraken spot margin reports omitting the surviving-lot entry average (#5065), thanks @zhaow-de
- Fixed Kraken spot position coverage and false flat reports for unreported holdings (#5185), thanks @zhaow-de
- Fixed Kraken scoped reads dropping altname pairs or returning every instrument (#5129), thanks @zhaow-de
- Fixed Kraken currency normalization corrupting XTZ, ZRX, and XAUT codes (#5155), thanks @zhaow-de
- Fixed Kraken fills booking fees in quote currency instead of the reported fee currency (#5155), thanks @zhaow-de
- Fixed Kraken futures balances overwriting holdings across wallets of the same currency (#5155), thanks @zhaow-de
- Fixed Kraken futures double-counting flex USD collateral and contract-symbol balances (#5155), thanks @zhaow-de
- Fixed Kraken futures flex USD portfolio balances using 2 instead of 8 decimals (#5155), thanks @zhaow-de
- Fixed Lighter cancel-all requests ignoring
order_side(#4470), thanks for reporting @zurpet - Fixed Lighter book recovery after missing snapshots, sequence gaps, and reconnects
- Fixed Lighter websocket subscription hangs on unparsable confirmations
- Fixed Lighter spot stats parsing for empty mid prices
- Fixed OKX order book snapshots retaining stale price levels after resubscription
- Fixed OKX book deltas missing the
F_LASTflag, stalling consumers withbuffer_deltasenabled - Fixed OKX account state always reporting
MARGIN, ignoring the configured account type - Fixed OKX fee and filled-quantity caches growing unbounded over long-running sessions
- Fixed OKX cancel-all requests ignoring
order_side(#4470), thanks for reporting @zurpet - Fixed OKX
close_fractionorders reconciling with zero quantity (#5068), thanks for reporting @victor-santana-hub - Fixed OKX filled spot market buys remaining
PARTIALLY_FILLED(#5105), thanks for reporting @BioxMech - Fixed OKX
activate_featurerate limit exceeding the published 5 requests per 2 seconds - Fixed OKX HTTP errors without
datahiding the venue error code, such as invalid API keys - Fixed OKX
open_onlyorder status reports fetching regular and spread order history - Fixed Polymarket order modifications blocked after a deferred cancel with an unresolved venue outcome
- Fixed Polymarket maker rebates and taker fees zeroing on incomplete schedules
- Fixed Polymarket submits with an unknown outcome staying
SUBMITTEDafter missed WebSocket updates - Fixed Polymarket reconciliation of resolved, unredeemed balances (#4963), thanks for reporting @seungpyoson
- Fixed Polymarket reconciliation closing auto-redeemed positions at the entry price before settlement
- Fixed Polymarket fills matched during a user WebSocket outage never applying after reconnect
- Fixed Polymarket unknown submissions being rejected locally after recovery exhaustion
- Fixed Polymarket late submit evidence repeating acceptance or fills and overwriting replacement order mappings
- Fixed Polymarket uncertain order recovery losing venue cancellation duties after local closure
- Fixed Polymarket BUY fills truncated to the order quantity; overfills now raise the order quantity
- Fixed Polymarket commissions rounding instead of flooring to five decimals like the venue charge
- Fixed Polymarket order quantity updates after a modify dropping fills from earlier venue orders
- Fixed Polymarket restarts replacing fills of closed orders with synthetic fills that lack commission
- Fixed Polymarket restarts failing for retained positions whose fills fall outside a bounded lookback
- Fixed Polymarket denying immediate FOK and FAK BUY orders whose maker amount is not an exact cent
- Fixed Polymarket opening an idle market WebSocket on connect, which the venue closed with code 1008
- Fixed Polymarket HTTP cancels emitting
OrderCanceledfor tracked orders or orders the response omits - Fixed Polymarket sub-tick settlement prices being rejected or emitted raw (#5176), thanks @yashwardhan-gautam
- Fixed Polymarket fill reports admitting trades that contradict retained settlement outcomes
- Fixed Polymarket order queries emitting events while settlement evidence is unresolved
- Fixed Polymarket bounded reconciliation reports inferring fills from pending settlement
- Fixed Polymarket report fill totals double-counting inferred fills or restoring voided quantities
- Fixed Tardis accepting stream requests and retrying connections for unsupported venues
- Fixed Tardis instrument filtering excluding the exact availability start timestamp
- Fixed Tardis instrument bootstrap failing on very large instrument lists such as Deribit
- Fixed Tardis options chain CSV conversion panicking on a missing catalog directory
- Fixed Tardis Machine bar and option summary decoding with
serde_json/arbitrary_precision - Fixed Tardis Machine prices, sizes, and funding rates losing digits through
f64parsing - Fixed Tardis CSV loaders applying book rows before the first snapshot (#5127), thanks @szpony
Internal Improvements
- Added shared catalog and streaming writer factories for backtest and live nodes (#4959), thanks @faysou
- Added
LiveNodeFeather streaming tests for typed routes, size rotation, and auto-flush - Added CRLF line relay routes to the shared book stress fault proxy
- Added
OrderBookfiltered view property tests against a reference model - Added Architect AX live book stress harness with fault injection and an independent book oracle
- Added Betfair live book stress harness with fault injection and an independent book oracle
- Added Binance live book stress harness with fault injection and independent book oracles
- Added Bybit live book stress harness with fault injection and an independent book oracle
- Added Hyperliquid live book stress harness with fault injection and an independent book oracle
- Standardized
DataandNautilusDataTypeordering withCustomfirst - Standardized Cap'n Proto
OrderBookDepth10schema toOrderBookDepth, pinning node IDs and field ordinals - Standardized network config field layouts across adapters: URL override block, then
proxy_url - Standardized book recovery ownership and retry handling across Lighter and OKX
- Standardized book snapshot timeouts on a shared 10s default across Lighter, OKX, and Polymarket
- Standardized adapter JSON decimal parsing on shared core parsers
- Standardized Architect AX book recovery on the shared recovery runner and 10s snapshot default
- Standardized Betfair book recovery on the shared recovery runner and 10s snapshot default
- Standardized Binance book recovery on the shared recovery runner and 10s snapshot default
- Standardized Bybit book recovery on the shared recovery runner and 10s snapshot default
- Standardized Hyperliquid book recovery on the shared recovery runner and 10s snapshot default
- Improved cache order query benchmark coverage
- Improved live and backtest callback drains at runtime-owned loop boundaries
- Improved Parquet catalog regression coverage for consolidation, promotion, and identifier matching
- Improved catalog worker, Arrow batch grouping, and
ts_initrange test coverage (#5115), thanks @faysou - Improved testkit data downloads with atomic checksum manifest writes and stale partial cleanup
- Improved order book and own order book regression coverage from mutation testing
- Improved the live test harness own book invariant to detect missing orders and stale entry fields
- Improved the canceled HTTP request test to accept a connection reset (#5138), thanks @faysou
- Improved WebSocket rate-limit tests to handshake on the real clock (#5146), thanks @faysou
- Improved execution engine tests by collecting functions nested in another test (#5158), thanks @abhijeetvichare76
- Improved unwritable log directory test portability on Windows and Linux (#5167), thanks @abhijeetvichare76
- Improved PyO3 docstring generation for one-line parameter attributes (#5115), thanks @faysou
- Improved Postgres connection string redaction test coverage
- Improved Architect AX protocol regression coverage with sanitized HTTP and WebSocket captures
- Improved Kraken futures scoped position and order read coverage (#5154), thanks @zhaow-de
- Improved OKX live-node submission recovery and unresolved-shutdown regression coverage (#5178), thanks @silarin
- Improved OKX fee response tests with canonical grouped-fee and instrument fixtures (#5212), thanks @silarin
- Improved OKX public and spread book recovery with bounded retries and cancellation-safe resubscription
- Improved OKX dispatch benchmarks with steady-state caches and WebSocket order-event coverage
- Extracted
CacheApiandCacheViewfrom the cache module - Normalized persistence path separators for Windows
- Refactored
RiskEnginevalidation, funding checks, and batch modification rate limiting - Refined persistence backend module layout and removed a duplicated Parquet I/O test module
- Refined persistence by removing the vendored k-merge, duplicate tests, and session bench (#5115), thanks @faysou
- Refined
SharedCellandWeakCellclones to useRc::cloneandWeak::clone(#5066), thanks @mirooon - Refined model ref-count clones to use
Arc::clone(#5076), thanks @mirooon - Refined risk engine ref-count clones to use
Rc::clone(#5089), thanks @mirooon - Refined portfolio ref-count clones to use
Rc::clone(#5131), thanks @mirooon - Refined serialization ref-count clones to use
Arc::clone(#5149), thanks @mirooon - Refined Windows persistence doc comments so Clippy
doc_markdownpasses (#5078), thanks @abhijeetvichare76 - Refined Windows logger test imports so Clippy passes (#5157), thanks @abhijeetvichare76
- Refined the copyright hook's temporary files and Bash 3.2 lookups (#5118), thanks @seungpyoson
- Refined blockchain ref-count clones to use
Arc::cloneandRc::clone(#5175), thanks @mirooon - Refined HyperSync stream calls to avoid redundant
Arcclones (#5206), thanks @mirooon - Refreshed Binance Spot WebSocket trading tests for SBE schema
3:5 - Optimized cache order queries and exchange rate lookups from bars
- Optimized average-price calculation for orders with many fills
- Optimized allocation overhead in Rust cache
ordersandorders_refsqueries - Optimized allocation overhead in Rust exchange rate calculations
- Optimized NETTING reopen and duplicate-fill checks to ignore replay-history length (#4999), thanks @folknor
- Optimized live reconciliation fill recovery and portfolio order-event updates (#5063), thanks for reporting @ligl
- Optimized staged Feather files to one dictionary-encoded record batch per flush (#5115), thanks @faysou
- Optimized Parquet catalog
ts_eventandts_initcolumns with delta encoding, thanks @Martingale42 - Optimized HTTP client construction by reusing loaded platform TLS roots across clients
- Optimized position replay duplicate-fill checks to use the trade ID set (#5096), thanks @mirooon
- Optimized per-order overhead in account balance updates, order matching, and event publishing
- Optimized Deribit WebSocket and HTTP decimal decoding
- Optimized OKX WebSocket frame decoding and per-message handler overhead
- Optimized OKX reconciliation report collection to reduce
LiveNodemain-thread stalls - Optimized Tardis Machine decimal decoding
- Upgraded
cargo-codspeedtool to v5.0.2 - Upgraded
cargo-nextesttool to v0.9.146 - Upgraded
markdownlint-cli2tool and pre-commit hook to v0.23.3 - Upgraded
osv-scannertool to v2.6.0 - Upgraded
prektool to v0.5.3 - Upgraded
uvtool and pre-commit hook to v0.12.19 - Upgraded
typospre-commit hook to v1.50.3 - Upgraded
alloycrate to v2.5.0 - Upgraded
clapcrate to v4.6.7 - Upgraded
codspeed-criterion-compatcrate to v5.0.2 - Upgraded
databentocrate to v0.62.0 - Upgraded
datafusioncrate to v55.1.0 - Upgraded
hyper-rustlscrate to v0.27.10 - Upgraded
jiffcrate to v0.2.37 - Upgraded
randcrate to v0.10.3 - Upgraded
rediscrate to v1.7.1 - Upgraded
redbcrate to v4.3.0 - Upgraded
ruintcrate to v1.20.1 - Upgraded
rustls-platform-verifiercrate to v0.7.1 - Upgraded
smallveccrate to v1.16.2 - Upgraded
sockudo-wscrate to v2.1.0 - Upgraded
syncrate to v3.0.6 - Upgraded
thiserrorcrate to v2.0.21 - Upgraded
pandaspackage to v3.0.6 - Upgraded
plotlypackage to v7.1.0 - Upgraded
polarspackage (test) to v1.44.2 - Upgraded
pytest-memraypackage (test) to v1.11.0 - Upgraded
ruffpackage (dev) and pre-commit hook to v0.16.9 - Upgraded
typackage (dev) to v0.0.83 - Upgraded
uvicornpackage (test) to v0.53.0
Documentation Updates
- Fixed
LiveNodeBuilder::with_streaming_configdocs, which saidbuild()rejects streaming (#5115), thanks @faysou - Fixed
get_avg_px_qty_for_exposuredocstring to name the last-touched price return value - Fixed
own_books_audit_interval_secsdescription to state which own-book orders the audit removes - Fixed
ParquetDataCatalogdocs to state the 10,000 batch size and ZSTD level 1 defaults (#5111), thanks @Martingale42 - Fixed
ParquetDataCatalog::list_parquet_filesdocs, which said subdirectories are not scanned - Fixed OKX USDC activation guidance to call
activate_featureonly after a54109order rejection - Documented the adapter config field layout convention in the developer guide
- Documented declined fill notification in the execution concepts guide
- Documented the order evidence adapters must give mass-status fill reports
- Documented own order book membership for emulated, quote-quantity, and external client orders
- Documented trader-scoped Postgres cache and the
assign-accountmigration (#5070), thanks @utx0 - Documented shared order book recovery ownership and Lighter recovery limits
- Documented shared book snapshot defaults and live validation levels
- Documented legacy custom data layout migration
- Documented verified Parquet migration sources, removed fee columns, and cutover limits
- Documented streaming into a separate catalog and
RotationConfigfile rotation (#5115), thanks @faysou - Documented v1
StreamingConfigmigration towriter_path,catalog, andRotationConfig(#5115), thanks @faysou - Documented HTTP client ambient proxy routing defaults and the
use_system_proxy(false)opt-out - Documented cache bars staying newest-first, with one time bar per timestamp (#5109), thanks @dfjmax
- Documented portfolio valuation of zero and negative prices the instrument allows (#5148), thanks @abhijeetvichare76
- Documented live shutdown reporting unresolved retained submissions (#5156), thanks @silarin
- Documented Architect AX repricing metadata, replacement recovery limits, and market data limitations
- Documented Architect AX order book recovery, snapshot deadlines, and the book stress harness
- Documented Betfair order book recovery, retry limits, and live recovery validation
- Documented Binance custom data catalog persistence
- Documented Binance side-filtered cancel-all selecting open orders only
- Documented Binance order book synchronization, recovery limits, and snapshot pacing
- Documented Bybit order book recovery, retry limits, and live recovery validation
- Documented Hyperliquid inferred-fill commissions as unset
- Documented Hyperliquid order book recovery, stale stream escalation, and the book stress harness
- Documented Hyperliquid reduce-only fill quantity clamps and fill history limits (#5203), thanks @XBeg9
- Documented Kraken spot cancel-all instrument scope and the 500-page report cap (#5044, #5062), thanks @zhaow-de
- Documented Kraken persisted currency migration and money precision changes (#5155), thanks @zhaow-de
- Documented that Kraken spot report requests warn at the page cap without marking incomplete (#5091), thanks @zhaow-de
- Documented Kraken scoped reads matching resolved instrument IDs (#5129), thanks @zhaow-de
- Documented Kraken spot margin entry averages as opening-only (#5065), thanks @zhaow-de
- Documented Kraken margin-only closed-lot reconciliation limits (#5185), thanks @zhaow-de
- Documented Lighter active and pending order limits by account tier
- Documented OKX order book recovery and retry limits
- Documented OKX opt-in submission retention and incomplete-recovery shutdown errors (#5178), thanks @silarin
- Documented OKX rejection reason format with venue error codes
- Documented Polymarket trade settlement, quarantine, and reconciliation precedence
- Documented Polymarket report settlement authority and fill-quantity caps
- Documented Polymarket GTD expiry mapping, immediate BUY cent budgets, and idle market sockets
- Documented Tardis CSV loaders skipping rows before the first snapshot (#5127), thanks @szpony
- Updated Databento and Tardis integration guides with new URL overrides
- Updated OKX Rust exec tester example to use cross margin
Artifact checksums
SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.
| Artifact | SHA256 |
|---|---|
| nautilus_trader-2.0.0rc6-cp312-cp312-macosx_11_0_arm64.whl | ca2aa24e790ef2a4251f7efced1ca8e3c8408d23b69af949a0467d6d5ae33618 |
| nautilus_trader-2.0.0rc6-cp312-cp312-manylinux_2_34_aarch64.whl | c4409a4544ce2b4cd9c9014da62b9202740a455cc5a8baba4fec5f127e3cbfa3 |
| nautilus_trader-2.0.0rc6-cp312-cp312-manylinux_2_34_x86_64.whl | 9b4002a7bf5e6399c51073039b740ccf3ca7a1e2584ff72c7d479f03eaa9658d |
| nautilus_trader-2.0.0rc6-cp312-cp312-win_amd64.whl | 34aa33d832beff98af3f82a9ab6f001b05e1b12838db3ab456fbf3dcbdd67527 |
| nautilus_trader-2.0.0rc6-cp313-cp313-macosx_11_0_arm64.whl | ec1a777efd507bb4834d641d88779407957e6323a40eaec78610738aa2646cf2 |
| nautilus_trader-2.0.0rc6-cp313-cp313-manylinux_2_34_aarch64.whl | 3e8dcebcc6a62d2694bff8f41f7d07e3bc9de5fc9457218320d49c2ac47ab4d8 |
| nautilus_trader-2.0.0rc6-cp313-cp313-manylinux_2_34_x86_64.whl | 224739eb3b56e966b9de3aa43e236707b72eec9e3dab886467c5e61990cbb565 |
| nautilus_trader-2.0.0rc6-cp313-cp313-win_amd64.whl | af7e2b4e7851decadcc6988190d348906c89238c60040d1e170586fc3e185686 |
| nautilus_trader-2.0.0rc6-cp314-cp314-macosx_11_0_arm64.whl | 465c056d57925b371b9c8bd694bee10aa853d0c42ccd51ff51e2122e97ff4b34 |
| nautilus_trader-2.0.0rc6-cp314-cp314-manylinux_2_34_aarch64.whl | 274060a97b8a4a9d18609bc979bd381bf0de7051621ac44ad2d0720268ab5fd1 |
| nautilus_trader-2.0.0rc6-cp314-cp314-manylinux_2_34_x86_64.whl | 863bc4ffd54e47488f1ac951ee3c9359715e7dd4268cc18b0f1172fa9db6874b |
| nautilus_trader-2.0.0rc6-cp314-cp314-win_amd64.whl | 1caf6c13119b6848bd1c28ee969c0cd9b2ac4bb7c616df0a20d93aacf0b7a613 |
| nautilus_trader-2.0.0rc6.tar.gz | 947ff476a5a8c04ad7a4b61b284736d630035c76ff5e9c247bf1f8bdfefa9829 |
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