NautilusTrader 1.226.0 Beta
Released on 29th April 2026 (UTC).
Enhancements
- Added
Portfolio::mark_values,equity, andmissing_price_instrumentsqueries for Rust and Python - Added
instrument_status/instrument_statusescache queries and auto-caching in the data engine (#3858) - Added
environmentenum config for BitMEX, Deribit, dYdX, Hyperliquid, and OKX adapters - Added
BybitEnvironmenttoBybitDataClientConfigandBybitExecClientConfig - Added missing config values to
LiveExecEngineConfig(#3841), thanks @Javdu10 - Added
calculate_commissiontoExecutionClientfor venue-specific reconciliation fills - Added PyO3 bindings for
DataEngineConfig,ExecutionEngineConfig, andOrderEmulatorConfigso they can be constructed from Python - Added
cache,msgbus,data_engine,exec_engine, andportfoliokeyword arguments toBacktestEngineConfigPython constructor - Added
MarginAccount.margin_for_currency+margin_init/maint_for_currencyhelpers for cross-margin queries - Added
MarginAccount.total_margin_init(currency)/total_margin_maint(currency)summing both margin buckets - Added
MarginAccount.account_margins,account_margins_init/maint, andclear_account_marginaccessors - Added
transport-sockudofeature withTransportBackendruntime selector for the WebSocket transport (Rust) - Added
TransportBackendPyO3 enum andWebSocketConfig.backendkwarg for backend selection from Python - Added custom upgrade-header support on the sockudo backend so adapters carry the same
User-Agentand per-venue headers on both backends (#3932), thanks @sunlei - Added
WebSocketConfig.proxy_urlfor HTTPCONNECTproxy tunneling with basic-auth support - Added Betfair tiered tick scheme to
BettingInstrumentfor ladder-snapped pricing - Added Binance Futures
use_trade_liteconfig to opt into low-latencyTRADE_LITEfills (Rust, defaultFalse) - Added Binance
proxy_urlplumbing for market and user-data WS streams (#3937), thanks for reporting @huangqingchi - Added Bybit user-related endpoints (#3894), thanks @sunlei
- Added Bybit
BybitPositionIdxenum andbybit_resolve_position_idxPyO3 helper - Added Coinbase initial integration adapter (Rust)
- Added
DydxNetworkre-export on thenautilus_trader.adapters.dydxpackage - Added Hyperliquid historical funding rates via
fundingHistoryinfo endpoint - Added Hyperliquid configurable MARKET slippage (
market_order_slippage_bps) with per-order override - Added Hyperliquid
OrderBookDepth10subscription backed by thel2Bookfeed - Added Hyperliquid
nSigFigs/mantissaL2 precision controls viasubscribe_params - Added Interactive Brokers Rust adapter with PyO3 compatibility layer (#3864), thanks @faysou
- Added Kraken xStocks tokenized asset support for spot market data, order submission, and futures instruments
- Added OKX option greeks support for both Black-Scholes and price-adjusted conventions on every tick
- Added OKX
params["greeks_convention"](string or list) to narrow option greeks subscriptions - Added OKX
transport_backendconfig to switch websockets betweenTungsteniteandSockudobackends - Added Polymarket game_id and fee_schedule to instrument info (#3811), thanks @Javdu10
- Added Polymarket batch
SubmitOrderListviaPOST /ordersfor limit-order batches (Rust) - Added Polymarket WebSocket
idle_timeout_msfor zombie detection (#3908), thanks for reporting @camarigor - Added Polymarket WebSocket
proxy_urlplumbing - Added Polymarket
pUSDcollateral currency (Currency::pUSD()in Rust,pUSDin Python) for the CLOB V2 cutover - Added configurable
compressionfor Tardis Machine replay, defaulting tozstd - Added
ExecutionReport::OrderWithFillsandsend_order_with_fillsemitter for bundled status + fill reconciliation - Added ADL / liquidation detection and logging across Binance, Bybit, OKX, BitMEX, Hyperliquid, Deribit, and dYdX
- Added Binance Futures COIN-M
delivery_autoclose-prefix recognition for expiring contract auto-close events - Added Bybit
adlRankIndicatorwarning log when an open position is ranked 4 or higher (next to deleverage) - Added Hyperliquid liquidation metadata logging on fills and
userEvents.liquidationrouting - Added Hyperliquid
Auto-Deleveragingfill detection with warn logging on HTTP and WebSocket paths
Breaking Changes
- Added
Option<&AccountId>to RustPortfolio::unrealized_pnls,realized_pnls,total_pnls; passNoneto keep prior behavior - Added
backend: TransportBackendtoWebSocketConfig; struct-literal callers must add the field (Rust) - Added
proxy_url: Option<String>toWebSocketConfig; struct-literal callers must add the field (Rust) - Migrated Polymarket adapter to CLOB V2: new EIP-712 domain version
2, new exchange contract addresses,timestamp/metadata/builderorder fields replacetaker/nonce/feeRateBps, and pUSD replaces USDC.e as collateral; the Python adapter now usespy-clob-client-v2 - Consolidated adapter HTTP and WebSocket proxy plumbing onto a single
proxy_urlfield, replacing the priorhttp_proxy_url/ws_proxy_urlsplit across adapter Rust and Python configs - Removed
DockerizedIBGatewayConfig::from_env_or_defaults(Rust); use the bon builder orDefault::default, which still falls back toTWS_USERNAME/TWS_PASSWORD - Removed
OrderMatchingEngineConfig::newandwith_price_protection_points(Rust); useOrderMatchingEngineConfig::builder()instead - Removed
BlockchainDataClientConfig::new,BlockchainExecutionClientConfig::new, andDexPoolFilters::new(Rust); use the corresponding::builder()instead - Removed
DeribitExecClientConfig::newandHyperliquidExecClientConfig::newconvenience constructors (Rust); use the::builder()instead - Removed
DataEngineConfig::new12-arg positional constructor (Rust); useDataEngineConfig::builder()instead - Removed synthetic
ACCOUNT-*placeholders from margin adapters;MarginBalanceemits with currency only - Removed
nautilus_system::factoriesmodule; import factory traits fromnautilus_common::factories(Rust) - Removed
indicatorsfromnautilus-commondefault features; enable withfeatures = ["indicators"](Rust) - Renamed Python
DatabaseConfig.timeouttoconnection_timeoutandresponse_timeoutto match the Redis/PyO3 wire schema - Replaced
is_sandbox: boolwithenvironment: AxEnvironmentonAxDataClientConfigandAxExecClientConfig(Rust and Python), aligning with the Binance/Bybit/Kraken adapter pattern. Default isSandbox. - Changed
BacktestEngine::add_venueandSimulatedExchange::new(Rust) to takeSimulatedVenueConfig(bon builder) - Changed Interactive Brokers Rust configs to use bon builders:
InteractiveBrokersDataClientConfig,InteractiveBrokersExecClientConfig,InteractiveBrokersInstrumentProviderConfig, andDockerizedIBGatewayConfig - Changed
get_cached_bybit_http_clientsignature: replaceddemo/testnetbools withenvironment: BybitEnvironment - Changed
UnsubscribeBookSnapshotsto requireinterval_msfor exact snapshot interval unsubscribe (Rust) - Changed
OrderError::Invariantvariant to wrapCorrectnessErrorinstead ofanyhow::Error(Rust) - Changed
HyperliquidEip712Signer::new()to returnResultand take&EvmPrivateKey(Rust) - Changed
HyperliquidExchangeRequest::new/with_vaultto acceptHyperliquidSignaturedirectly (Rust) - Changed Binance USD-M Futures WebSocket URLs from
/wsto/market/wsand/private/ws - Changed Cap'n Proto and SBE wire formats to preserve
Optionstate (unstable, may change) - Changed Python and Serde-backed Rust config decoding to reject unknown fields, so stale or misspelled keys now fail fast during config parsing
- Changed
MarginBalance.instrument_idto optional;Nonemarks account-wide (cross margin) entries keyed by currency - Changed
MarginAccount.margins_init/margins_maintto per-instrument only; useaccount_margins_*for cross margin - Changed Binance Futures COIN-M to emit one
MarginBalanceper base coin (previously hardcoded USDT) - Changed matching-engine
TradeIdformat toT-{hash}-{count}from{venue}-{raw_id}-{count};ts_init-keyed - Changed
use_random_idsto no longer governTradeId; flag still affectsVenueOrderIdandPositionId - Changed workspace
nautilus-livetodefault-features = false; enablefeatures = ["node"]forLiveNode(Rust) - Changed adapter
LiveNodeexamples to require--features examplesto build (Rust) - Changed
ParquetDataCatalog::to_object_pathandto_object_path_parsedto returnanyhow::Resultso cross-store URIs surface as errors instead of silently rewriting against the catalog bucket (Rust) - Changed prefixed remote catalogs (
s3://bucket/base/path, etc.) to read and write under their declared URI prefix; data previously written to the bucket root by the prior buggy behavior will not be discovered after upgrading and must be moved into the prefix (#3930)
Security
- Hardened Binance Ed25519 credential detection so base64 HMAC secrets no longer pass as Ed25519 keys (Rust)
- Hardened Binance HTTP request signing by URL-encoding Ed25519 signatures in query strings (Rust)
- Replaced the third-party
urlencodingcrate with the in-treenautilus_core::urlencodingto shrink the supply-chain surface (Rust) - Bumped pinned SHAs for security-relevant GitHub Actions (
harden-runner,codeql-action,setup-uv,setup-rust-toolchain) to current upstream releases - Refreshed
cargo-denyandosv-scanneradvisory configuration; removed the stalepygmentsadvisory ignore now that upstream is patched
Fixes
- Fixed sockudo WebSocket backend dropping handshake leftover bytes when the server piggybacks the first frame on the 101 response (#3932), thanks @sunlei
- Fixed account state regeneration dropping account-wide margins on every fill across live and backtest paths
- Fixed
AccountStateto accept emptybalancesandmargins - Fixed
FillModeldeterminism viaIndexMapinOrderMatchingEngine(#3914), thanks for reporting @timkoopmans - Fixed quote midpoint raw arithmetic across precision modes (#3849), thanks @BurnOutTrader
- Fixed
quote_quantitypropagation in execution algorithm spawn orders (#3845), thanks @dxwil - Fixed streaming backtest shutdown determinism on
FORCE_STOP(#3920) - Fixed
mark_values/equitykeying by base currency when conversion is off; now keys by settlement currency - Fixed
PortfolioAnalyzerAttributeError onMaxDrawdown/CAGR/CalmarRatio(#3941), thanks for reporting @a1zb2yc3z - Fixed
stop_timerinTimeBarAggregator(#3822), thanks @faysou - Fixed
RiskEngineapplying basemin_quantity/max_quantitybounds to quote-denominated orders - Fixed backtest
OrderMatchingEnginetreatingquote_quantity=Trueorders as base quantity; the quote notional is now converted to a base quantity before fill simulation (#3873), thanks for reporting @fedoraiver - Fixed
subscribe_option_chainhanging on bootstrap in backtest (#3938), thanks for reporting @aaurix - Fixed backtest option expiry fills missing from cache and fills report (#3939), thanks for reporting @hotelmike
- Fixed backtest physical option assignment closing the option leg at the opening premium (#3948), thanks for reporting @hotelmike
- Fixed
DataBackendSessionGIL deadlock when streaming custom data types (#3847), thanks for reporting @GianC0 - Fixed
BacktestNodestreaming with mixed built-in and custom data types (#3853), thanks for reporting @GianC0 - Fixed
DataBackendSessionchunked streaming memory leak causing RSS growth (#3889), thanks for reporting @GianC0 - Fixed book snapshot subscriptions to preserve exact
(instrument_id, interval_ms)semantics for shared intervals and exact unsubscribe handling (Rust) (#3823), thanks for reporting @dwolfesberger - Fixed WebSocket auth state during reconnection for Bybit, OKX, and Deribit (#3820), thanks for reporting @KaizynX
- Fixed WebSocket
idle_timeout_msreset onPing/Pongkeep-alive frames (#3907), thanks for reporting @camarigor - Fixed
TradingNodeConfig.parsedropping importable live client configpathandfactoryfields during raw config decoding - Fixed
OrderTriggeredValueError on market-style stop orders (#3812), thanks for reporting @jindrichsirucek - Fixed
consolidate_data_by_periodpairwise merging on fragment-per-flush catalogs (#3857), thanks for reporting @M-Advis - Fixed
consolidate_data_by_perioddestroying data on repeat runs and when straddling files spanned the consolidation window, mirrored in the Rust catalog backend (#3883), thanks @M-Advis - Fixed
ParquetDataCatalog.get_intervals(identifier=None)on per-identifier data (#3903), thanks for reporting @GianC0 - Fixed
ParquetDataCatalog.consolidate_dataraisingIndexErrorwhen the start/end range did not overlap any files, andconsolidate_catalog_by_periodaborting the loop on the first unrecognized directory rather than skipping it (#3910), thanks for reporting @M-Advis - Fixed remote catalog object paths under URI prefix so writes and reads under
s3://bucket/base/path(and other remote schemes) no longer collapse to the bucket root (#3930), thanks @fedoraiver - Fixed S3-backed custom data queries and remote Feather discovery (#3931), thanks for reporting @fedoraiver
- Fixed
FeatherWriterwriting 0-precision metadata on leadingCLEARdelta (#3913), thanks for reporting @fedoraiver - Fixed empty error log on
TradingNodeclean shutdown fromCancelledError(#3862), thanks for reporting @jxstanford - Fixed
SymbolandPositionIddeserialize of non-ASCII escaped strings (#3893), thanks for reporting @volemont - Fixed execution engine ignoring user-supplied
position_idfromsubmit_order(Rust) - Fixed
ExecutionEngineleg-fill position events not publishing to subscribers (#3939) - Fixed cache load not repairing OTO contingent child
position_idafter a partial fill-time crash (Rust) - Fixed
TestDataGenerator.generate_trade_ticksusing random UUID4; now sequences deterministicT-{idx}IDs - Fixed reconciliation IDs non-deterministic across restarts (#3878), thanks for reporting @peanut-copilot
- Fixed reconciliation synthetic
OrderStatusReportnow propagates fill price toavg_pxfor downstream inferred fills - Fixed
reconcile_fill_reportdropping fills for unknown orders; now bootstraps external orders for venue closures - Fixed PyO3
InstrumentStatuspersistence and backtest streaming throughParquetDataCatalog(#3855) - Fixed PyO3
LiveNoderequest_bars()historical callbacks dropped during startup warmup (#3825), thanks @BurnOutTrader - Fixed PyO3
DataActormissingon_historical_funding_ratesandon_historical_dataforwardingNone - Fixed PyO3 crypto instrument
from_dictfor unregistered base/underlying codes (#3882), thanks for reporting @volemont - Fixed PyO3 catalog
instruments()failing on unregistered currencies (#3898), thanks for reporting @volemont - Fixed PyO3
from_dicton non-ASCII strings viaensure_ascii=Falseinjson.dumps(#3895), thanks @costajohnt - Fixed Betfair event order:
Instrumentnow emits beforeInstrumentStatus/InstrumentClosewithin each MCM - Fixed Betfair scratched runners (
Removed/RemovedVacant) emitting close only at market close; now fire immediately - Fixed Betfair non-snapshot book deltas emitting inline; now tailed after trades/tickers to match Python semantics
- Fixed Betfair BSP deltas emitting before book deltas; now tailed after book deltas within each MCM
- Fixed Betfair order rejection reason dropping instruction-level
errorMessagedetail - Fixed Betfair
query_orderto emit status reports viacustomer_order_refandbet_idlookups (Rust) - Fixed Binance user data stream not recovering after keepalive failure (#3861), thanks for reporting @KaizynX
- Fixed Binance Futures user data stream event loss during listen key rotation (#3861), thanks for reporting @KaizynX
- Fixed Binance Futures WebSocket trades by forcing
@aggTrade(#3861), thanks for reporting @KaizynX - Fixed Binance Futures exchange-generated fills losing real
trade_idandcommissionby bundling status + fill - Fixed Binance Ed25519 detector silently accepting base64 HMAC secrets as Ed25519 keys (Rust)
- Fixed Binance HTTP request Ed25519 signature URL-encoding in query strings (Rust)
- Fixed Binance Futures USD-M
cancel_all_orderssilently failing; routes through HTTP (WS API does not support it) - Fixed Binance Futures
TRADE_LITEuser data events logging "Unknown event type" warnings on every fill - Fixed Binance USD-M Futures WebSocket routing for
fstream-mmandfstream-authhosts - Fixed BitMEX trade ID fallback using random UUID4 when
trdMatchIDmissing; now hashed from trade fields - Fixed Bybit demo mode websocket data URLs (#3742), thanks for reporting @jindrichsirucek
- Fixed Bybit position deserialization for closed positions (#3836), thanks for reporting @pusteckiy
- Fixed Bybit perpetual instrument status to emit
PreClosewhen scheduled for delisting (#3829), thanks @dxwil - Fixed Bybit
load_all_asyncdroppingbase_coinfilter for options (#3865), thanks for reporting @Baerenstein - Fixed Bybit
InstrumentStatusmessages silently dropped instead of forwarded to the data engine - Fixed Bybit and Deribit option chain example
subscribe_option_chaincall (#3887), thanks @sunlei - Fixed Bybit margin missing for accounts with orders but no positions (#3725), thanks for reporting @marco-rigoni
- Fixed Bybit JSON pong websocket frames not being skipped before classification (#3936), thanks @sunlei
- Fixed Bybit hedge mode
positionIdxrejection whenposition_modeset (#3944), thanks for reporting @pusteckiy - Fixed Bybit execution client not applying configured leverage, position mode, or margin mode on connect (Rust)
- Fixed Databento CMBP1 and TCBBO trade IDs using random UUID4 instead of deterministic hash of trade fields
- Fixed Databento dropping
start_nsafter session start; now logs error (#3877), thanks for reporting @jxstanford - Fixed Deribit mark/index price subscriptions silently dropping data in Python (#3821), thanks for reporting @linimin
- Fixed Deribit
StopMarketOrderRejectedonmarket_priceprice field (#3925), thanks for reporting @marco-rigoni - Fixed dYdX
generate_order_status_reportfetching only the first order and missing later matches in the response - Fixed dYdX orderbook snapshots missing
F_SNAPSHOTflag on deltas; empty-book Clear now emitsF_SNAPSHOT | F_LAST - Fixed dYdX crossed-book resolution stripping
F_SNAPSHOTfrom synthetic uncrossing deltas and the terminator - Fixed dYdX trade-tick pagination dedup missing non-adjacent duplicates across page boundaries
- Fixed dYdX trade-tick pagination overshooting target
endblock from fixed block-time estimate - Fixed dYdX crossed-book size arithmetic using
f64subtraction; now usesDecimalat full precision - Fixed dYdX position reports overriding venue
sidefromsizesign; venue side now preserved end-to-end - Fixed dYdX
DydxAdapterConfigdefaulting to mainnet URLs regardless ofnetwork; addedfor_networkhelper - Fixed Hyperliquid
LiveNodebootstrap panic on HIP-3 instrument symbols containing*/?(e.g.dex:STREAMABCD****-USD-PERP) by substituting wildcard bytes withxinInstrumentId.symbolwhile preserving the venue-official name onraw_symbol(#3896), thanks for reporting @daiwanwei - Fixed Hyperliquid bracket order submission grouping (#3810), thanks for reporting @jindrichsirucek
- Fixed Hyperliquid modify cancel-replace emitting stale
OrderCanceled(#3827), thanks for reporting @P1YU5H-50N1 - Fixed Hyperliquid order status query for closed orders (#3879), thanks for reporting @pusteckiy
- Fixed Hyperliquid batch cancel silently dropping per-item errors (#3879), thanks for reporting @pusteckiy
- Fixed Hyperliquid Rust
query_orderhandler to emit status reports (#3879), thanks for reporting @pusteckiy - Fixed Hyperliquid
request_account_statediscarding parsed margins (#3725), thanks for reporting @marco-rigoni - Fixed Hyperliquid
cancel_all_ordersdropping per-order rejection events on partial or transport failure - Fixed Hyperliquid
request_tradessilently returning empty; now bails explicitly - Fixed Hyperliquid
Auto-Deleveragingfill direction deserialization (#3922), thanks for reporting @AlphaTraderK - Fixed IB Gateway Docker image failing on ARM64 hosts (#3813), thanks for reporting @Baki-0501
- Fixed Interactive Brokers rejecting negative average fill price on combo/spread net-credit fills (#3884), thanks @faysou
- Fixed Interactive Brokers position reconciliation
TypeErrorwhenpriceMagnifierisNone(#3885), thanks @davidsblom - Fixed Kraken Futures limit order
OrderUpdatedpanic from wirestop_price: 0.0treated as trigger price - Fixed Kraken Futures fast-fill market orders resolving as rejected during order status reconciliation (#3870), thanks for reporting @Stamppot82
- Fixed Kraken Futures margin-account balance parse violating the
AccountBalanceinvariant (total == locked + free) when Kraken'saffield and the derivedamount - afround independently at the currency precision - Fixed Kraken Spot quote-quantity orders never reaching terminal state from base/quote size mismatch
- Fixed Kraken Spot ticker
QuoteTick.ts_eventusing local init time instead of the exchangetimestampfield (#3926), thanks @ptzafos - Fixed Kraken trade dedup clearing the entire set at capacity instead of evicting the oldest entry
- Fixed Kraken Futures
AccountBalanceinvariant panic on margin parse (#3868), thanks @Stamppot82 - Fixed Kraken Futures WebSocket re-authentication deadlock on reconnect (#3871), thanks for reporting @Stamppot82
- Fixed OKX option greeks not forwarded due to inaccessible Cython
cdefsubscription attribute - Fixed OKX option greeks emitting
BlackScholesconvention regardless of subscribed greeks type - Fixed OKX order identity registration race during concurrent order submission (Rust)
- Fixed OKX algo orders missing from order status reconciliation reports
- Fixed OKX spot margin position reconciliation preferring
CurrencyPairwith USDT/USDC/USD quote over alternatives - Fixed OKX index-price subscription refcount leaking across reconnect and concurrent transitions
- Fixed OKX option summary subscription refcount not rolling back on subscribe failure
- Fixed OKX duplicate fills from empty
trade_idusing deterministic synthesized id instead of random UUID - Fixed OKX panics on unmapped
OrderStatusand emptyOptionTypevalues viaTryFromconversion (Rust) - Fixed OKX
InstrumentStatusmessages logged as unhandled instead of forwarded to the data engine - Fixed OKX
query_orderto emit status reports by merging regular and algo order lookups (Rust) - Fixed Polymarket commission formula and fee source for fills (#3838), thanks for reporting @santivazq
- Fixed Polymarket reconciliation fills using incorrect commission (#3860), thanks for reporting @fedoraiver
- Fixed Polymarket instrument
min_quantitydenying market orders via limit-order shares rule (#3874), thanks for reporting @fedoraiver - Fixed Polymarket
request_instrument(s)dropping WS via staletoken_meta(#3900), thanks for reporting @fedoraiver - Fixed Polymarket
parse_to_quote_ticksusing changed level as top of book (#3905), thanks for reporting @camarigor - Fixed Polymarket
parse_to_snapshotmissingF_SNAPSHOTflag on CLEAR and intermediate ADD deltas - Fixed Polymarket
parse_to_deltasflaggingF_LASTon every delta instead of only the final one - Fixed Polymarket
parse_to_trade_tickusinguuid.uuid4(), producing non-deterministic trade IDs - Fixed Tardis replay handling of sparse
book_snapshot_*levels (#3953), thanks for reporting @a1zb2yc3z - Fixed Tardis trade ID fallback using random UUID4 when venue
idmissing/empty (CSV and WebSocket parsers)
Internal Improvements
- Added
AccountBalance::from_total_and_lockedandAccountBalance::from_total_and_free, and migrated adapter balance parsing to preserve thetotal == locked + freeinvariant at currency precision (Rust) - Added typed
CorrectnessErrorenum to replaceanyhow::Errorincorrectnesshelpers (Rust) - Added
CorrectnessResultExt::expect_displayfor display-formatted panics on typed correctness errors (Rust) - Added deterministic simulation testing (DST) re-export module gated behind
simulationfeature (Rust) - Added
wall_clock_nowseam innautilus-corefor virtual time under simulation (Rust) - Added
biasedtotokio::select!blocks in network and live crates for deterministic poll order - Added
nautilus_network::transportmodule withMessage/TransportError/WsTransportfor future backend swap (Rust) - Added neutral
Message/TransportErrorre-exports onnautilus_networkto ease future backend swaps (Rust) - Added engine config methods on PyO3
LiveNodeBuilder(#3848), thanks @BurnOutTrader - Added read-only
params()accessor toSubscribeCommandandTradingCommand(#3846), thanks @faysou - Added
ShutdownSystemhandling viacommands.system.shutdownpub/sub topic, wired to kernel, backtest, and live (Rust) - Added PyO3
DataActorparity with v1 forpublish_data,publish_signal,subscribe_signal,unsubscribe_signal,add_synthetic, andupdate_synthetic(Rust) - Added per-currency account-wide margin storage to
MarginAccount, routing event margins byinstrument_idpresence - Added Architect AX unit and integration tests for execution, request filters, and WebSocket parsers
- Added dYdX debug logging to
generate_order_status_reportshowing filter scope andpage_fullonNoneresults - Added Polymarket
determine_trade_idhelper with FNV-1a (Rust) and blake2b (Python) deterministic hashing - Added Hyperliquid criterion benchmarks for L1 signing path
- Added Hyperliquid integration tests for funding rates, trades, cancel-all, and
handle_l2_bookrouting - Added Hyperliquid
minTradeSpotNtlRejectedorder status andUnknownliquidation method fallback - Added Binance unit tests for spot/futures dispatch dedup, post-only rejection, and value conversions
- Added
derive_trade_idFNV-1a helpers in BitMEX and Tardis common parse modules for deterministic fallback - Added
derive_cmbp_trade_idin Databento decode for schemas without a native trade ID - Added property-based tests for Databento trade ID derivation (stability and 16-hex format)
- Added Rust/Python parity tests pinning matching-engine
TradeIdformat across language bindings - Added
nodefeature tonautilus-livegatingbuilder,config,manager, andnodemodules (default on) - Added support for user-provided Tokio runtime in live module (#3918), thanks @filipmacek
- Added continuous futures support for bar requests and subscriptions (#3921), thanks @faysou
- Improved
nautilus-live/defito no longer pullLiveNodeorchestration deps - Improved CI uv cache via
setup-uvauto mode to skip GHA uploads on self-hosted runners (#3933), thanks @sunlei - Cleaned up unused dependencies (#3886), thanks @sunlei
- Improved CI cache hygiene on self-hosted runners with uv prune, prek auto-gate, and footprint summary
- Migrated
WebSocketClientonto theWsTransporttrait, decoupling reconnect/auth from tungstenite types (Rust) - Changed Polymarket
PolymarketQuote.best_bid/best_askto optional, matching the RustOption<String>schema - Ported Interactive Brokers Rust historical bar replay with Python parity fixes (#3892), thanks @faysou
- Standardized adapter example manifests and trading deps (#3891), thanks @sunlei
- Standardized margin emission convention across live derivatives adapters to use currency-keyed
MarginBalanceentries - Refactored
reconciliationmodule intotypes,ids,positions, andorderssubmodules (Rust) - Refactored Binance Futures user data stream dispatch and listen key recovery into dedicated modules (Rust)
- Refactored Binance Futures value conversions into a new
futures::conversionsmodule (Rust) - Replaced
AHashMap/AHashSetwithIndexMap/IndexSetinExecutionManagerfor deterministic ordering in simulations (Rust) - Refined
nautilus-systemto optional in adapter crates (gated bypython); default builds drop heavy transitive deps - Refined DST convention hook to enforce
IndexMapinOrderMatchingEngine - Refined make cargo-test to not include binaries for test harness builds (#3828), thanks @faysou
- Refined Interactive Brokers combo fill average price calculation (#3834), thanks @faysou
- Refined Kraken WebSocket execution dispatch to emit typed events for tracked orders via per-product modules
- Refined Kraken Spot WS auth via
AuthTrackerwithis_authenticated/wait_until_authenticatedPython APIs - Optimized Hyperliquid L1 signing by caching
PrivateKeySignerand EIP-712 domain (#3851) - Optimized
ClientOrderIdgeneration with cached prefix buffer (#3935), thanks @sunlei - Optimized
OrderListIdandPositionIdgeneration with cached prefix buffers (Rust) - Upgraded Rust (MSRV) to 1.95.0
- Upgraded Cap'n Proto to v1.4.0
- Upgraded
alloycrate to v2.0.1 - Upgraded
capnpcrate to v0.25.4 (regenerated schemas with 4-space indents and version headers) - Upgraded
databentocrate to v0.48.0 - Upgraded
datafusioncrate to v53.1.0 - Upgraded
msgspecto v0.21.1 - Upgraded
pyarrowto v24.0.0 - Upgraded
tokiocrate to v1.52.1
Documentation Updates
- Added Polymarket Python and Rust adapter config tables and updated rate limits
- Added ID determinism invariant to the reconciliation live and execution concept guides
- Added Trade ID derivation sections to Polymarket, Databento, BitMEX, and Tardis integration guides
- Added Trade ID derivation section to the backtesting concept guide
- Added "Equity and mark-to-market" section to the portfolio concept guide
- Added ADL / liquidation handling sections to the Binance, Bybit, OKX, BitMEX, Hyperliquid, Deribit, dYdX guides
- Added reconciliation reports section to the execution concept guide
- Refined docs to follow style guide for symbols and filler words (#3830), thanks @JKDasondee
- Refined Interactive Brokers documentation regarding UTC timestamps (#3826), thanks @faysou
- Refined dYdX integration guide config tables to match the Python API (
environment,subaccount,base_url_grpc) - Updated Hyperliquid integration guide with funding history, depth10, subscribe_params, and slippage
- Updated the configuration concept guide to define unknown-field rejection as the config standard in Python and Rust
Deprecations
- Deprecated
demo/testnetbools onBybitDataClientConfig/BybitExecClientConfig- useenvironment - Deprecated
is_demoonOKXDataClientConfig/OKXExecClientConfig- useenvironment - Deprecated
testnetonHyperliquidDataClientConfig/HyperliquidExecClientConfig- useenvironment - Deprecated
is_testnetonDeribitDataClientConfig/DeribitExecClientConfig- useenvironment - Deprecated
is_testnetonDydxDataClientConfig/DydxExecClientConfig- useenvironment - Deprecated
testnetonBitmexDataClientConfig/BitmexExecClientConfig- useenvironment