NautilusTrader 2.0.0rc9预发布2026-11-10
NautilusTrader 2.0.0rc9 发布,新增 Python 3.15 支持。
交易所与数据源覆盖面大幅扩展:Kalshi、FinFeedAPI、Polymarket Protocol V2 三套新适配器到位,后者覆盖行情、交易、账户报表与拆分合并赎回;OKX、Bybit、Betfair、CoinAPI、Deribit、Lighter 各自补齐了合约过滤、历史回写、证书登录、定向订单查询等能力。功能上新增括号平仓只减仓选项、Parquet 资金费率读写、缓存价格与资金费率的索引访问、BacktestNodeBuilder 自定义目录工厂、OrderModifyDenied/OrderCancelDenied 事件回调,以及基于 OrderBookDepth 快照的沙盒撮合。
升级需注意破坏性改动:Python 端 RedisCacheDatabase、PostgresCacheDatabase、RedisMessageBusBacking 已移除,持久化与外部消息总线改由节点工厂配置;BookImbalanceActor 与原生 GreeksData 记录一并删除,改用 OrderBookImbalance 和 CustomData;Parquet 合并默认拒绝存在空隙的文件,需要容忍空隙时传 ensurecontiguousfiles=False;DataEngine::connect 与 ExecutionEngine::connect 现返回 Result,连接错误须自行处理。
NautilusTrader 2.0.0rc8预发布2026-10-29
NautilusTrader 2.0.0rc8(2026 年 10 月 28 日发布)重心在数据请求链路和 Python 嵌入能力:历史行情请求支持批量订阅、批量拉取与分组完成回调,新增 DataActor::requestgroup、requestjoin 及结果回写;策略与执行算法可直接通过配置嵌入 LiveNode,并新增 registerembeddedmodule。金额处理上,Money::fromdecimalexact 等接口打通了 JSON、MessagePack、Arrow、PostgreSQL 的精确往返,手续费累计也能超出币种精度。交易所适配方面,Binance、Derive、Hyperliquid、Interactive Brokers、Lighter、OKX 均有新增配置与接口,沙盒环境可自定义费率、成交与保证金模型。
需要注意的破坏性变更:Cap'n Proto 编码被彻底移除,原生消息改用 JSON 或 MessagePack;Params 不再允许原地修改,需构造 IndexMap 后传入,且 Params::new() 更名为 empty();BacktestDataConfig 的扁平目录字段改为 catalog: DataCatalogConfig;ExecutionReportTask.result 换成同步 finish,需先 join 收集线程。升级前请对照迁移。
NautilusTrader 2.0.0rc7预发布2026-10-15
NautilusTrader 2.0.0rc7
Released on 15th October 2026 (UTC).
> [!NOTE]
> This release removes support for Python 3.12 and supports Python 3.13 and 3.14 (#4676).
Enhancements
- Added negative price support for futures, except inverse futures (#5190), thanks @DeLuke84
- Added Clock.settimerzoned and CalendarSchedule for local calendar recurrence, thanks @faysou
- Added timebarstimezone and timezone overrides for local calendar bars, thanks @faysou
- Added BacktestDataConfig.batch_deltas for batched book delta replay (#5215), thanks for reporting @nicezic
- Added candidate option IDs for supported CME Globex and OSI equity/index contracts, thanks @faysou
- Added reference instruments to OptionSeriesId with compatible derived-reference serialization, thanks @faysou
- Added OptionSideFilter and StrikeSearchProfile model types for option selection, thanks @faysou
- Added tick scheme registration, thanks @faysou
- Added WebSocket peer-close callbacks to control automatic reconnection
- Added Rust QuoteTick::hassamebid_ask to compare prices and sizes independently of instrument IDs and timestamps
- Added YieldCurve custom data for catalog storage and backtest replay, including Python, thanks @faysou
- Added HttpClient builder redact_url to omit the request origin from client-added diagnostics
- Added Bybit public liquidation custom data for linear and inverse contracts (#5152), thanks @Martingale42
- Added Databento live bars, book depth, statistics, and imbalance subscriptions (#5201), thanks @faysou
- Added Derive adapter support for API v3
- Added Derive order book recovery for missing and stale snapshots
- Added Interactive Brokers subscription idle events (#5041), thanks @faysou
- Added Kraken Spot L2 checksum validation and resync on mismatch (#5219), thanks @zhaow-de
- Added Lighter native transaction batching with automatic splitting for order lists and batch operations
- Added Lighter native OTO, OCO, and OTOCO order groups with normalized Nautilus relationships
Breaking Changes
- Removed HttpClient::requestwithurlredacted; use request with builder redacturl(true)
- Removed HttpClient::requestwithparamsurlredacted; use requestwithparams with builder redact_url(true)
- Removed TickSchemeError::TickNotFinite; remove this arm from tick error matches
- Removed Interactive Brokers connection wrappers; use ibapi::Client (#5041), thanks @faysou
- Removed Interactive Brokers ErrorCategory and InteractiveBrokersErrorKind exports (#5041), thanks @faysou
- Removed Polymarket 30-second TWAP support; use window_seconds=60 (#5296)
- Renamed YieldCurveData to YieldCurve
- Renamed Polymarket reference-price types to drop Rtds, without aliases (#5296)
- Renamed Polymarket baseurlrtds to baseurlreference_prices (#5296)
- Replaced Interactive Brokers symbology functions with Symbology methods (#5041), thanks @faysou
- Changed BacktestNode to batch book deltas by default, so fills can differ; set batch_deltas=False to opt out
- Changed batched BacktestNode replay to reject deltas without a closing FLAST; batchdeltas=False opts out
- Changed VirtualTimer/LiveTimer: interval_ns -> interval: TimerInterval; match TimerInterval::Fixed
- Changed DataEngineConfig/LiveDataEngineConfig: add timebarstime_zone; use None for UTC alignment
- Changed TimeBarAggregator::new to require jiff::tz::TimeZone; pass TimeZone::UTC for UTC bars
- Changed Order to require nonreopenedvoided_qty (#5133), thanks @abhijeetvichare76
- Changed ReconciliationResult literals; add empty orderonlyfill_keys (#5114), thanks @zhaow-de
- Changed PortfolioGreeks::from(GreeksData) to apply the contract multiplier
- Changed GreeksData::new, PortfolioGreeks::new, and YieldCurve::new to take tsevent and tsinit last
- Changed calculated Greeks topics to data.GreeksData.underlying={underlying}.instrumentid={instrumentid}
- Changed GreeksCalculator::subscribegreeks to match underlying symbols exactly; pass "", not "", for all
- Changed registercustomdata_class to raise ValueError for another class using a PyO3 Rust type's name
- Changed OptionSeriesId::new to require a reference instrument; use new_derived to derive it
- Changed OptionSeriesId::fromexpiry and fromexpiry_ns; pass None as the final argument to derive a reference
- Changed OptionSeriesId::fromcryptooption and struct literals to require underlyinginstrumentid
- Changed OptionSeriesId equality, hashing, and ordering to include the reference instrument
- Changed OptionSeriesId strings with fractional expiries, including topics and handler IDs, to retain nanoseconds
- Changed OptionSeriesId to reject empty or whitespace-only underlying symbols when deriving a reference
- Changed FixedTickScheme::new to accept Price; use Price::from("0.05") instead of a float
- Changed FixedTickSchemeRounder::new to accept Price; use Price::from("0.05") instead of a float
- Changed TickSchemeError::TickNotPositive.tick to Price and added variants; update exhaustive matches
- Changed fixed tick navigation to return None for incompatible precision; choose one that represents the tick
- Changed Deribit position leverage to Option<Decimal> (#5240), thanks @abhijeetvichare76
- Changed DeriveDataClientConfig: booksnapshottimeoutsecs/bookstalethresholdsecs or ..Default::default()
- Changed DeriveWsMessage to include BookSubscription; update exhaustive matches
- Changed Interactive Brokers contract and security filters to reject unknown values (#5041), thanks @faysou
- Changed Interactive Brokers provider loaders; use loadwithreturn_async (#5041), thanks @faysou
- Changed KrakenDataClientConfig literals; add validatel2checksum: true (#5219), thanks @zhaow-de
- Changed Kraken futures edit request literals; add qty_mode: None (#5314), thanks @zhaow-de
- Changed OKXAmendAlgoOrderRequest literals to require newtriggerpx_type; use None to omit it
- Changed Polymarket reference prices to PolyBolt; configure CLOB L2 credentials (#5296), thanks @yashwardhan-gautam
- Changed Polymarket crypto reference symbols to lowercase USD pairs such as btcusd (#5296)
- Changed Polymarket reference prices to exact decimals with source; equity drops fullaccuracyvalue (#5296)
Security
- Fixed provider text and URL secret exposure in client diagnostics, thanks for reporting @Strategizm
- Fixed Interactive Brokers gateway passwords appearing in debug and serialized output (#5041), thanks @faysou
- Fixed Kraken Spot L3 malformed WebSocket messages aborting the process (#5319), thanks @zifulifufu
Fixes
- Fixed non-reopened voided quantity returning to working leaves after updates (#5133), thanks @abhijeetvichare76
- Fixed maker/taker commission sign at negative prices
- Fixed Python indicator constructors aborting the process on invalid periods or oversized capacities
- Fixed cached custom currencies and their dependents missing after Redis restart (#5195), thanks @zhaow-de
- Fixed cache open-order queries retaining submitted orders after cancel or modify rejections
- Fixed instrument purging hiding order and position history and breaking PnL queries (#5304), thanks @imbolc
- Fixed Parquet catalog row order for equal ts_init timestamps (#5267), thanks @ragen1337
- Fixed streaming Parquet promotion of OrderBookDelta.clear() snapshots (#5268), thanks for reporting @hellow-star
- Fixed monthly time bars drifting after a clamped month-end origin offset
- Fixed queued time-bar callbacks affecting aggregation after a stop or restart
- Fixed released emulated orders sending stale order initialization (#5169), thanks @jrile018
- Fixed cancel rejection delivery for active orders while preserving their state (#5270), thanks @riven314
- Fixed late modify rejection delivery for submitted orders without reverting amended terms
- Fixed r
NautilusTrader 2.0.0rc6预发布2026-10-05
NautilusTrader 2.0.0rc6
Released on 4th October 2026 (UTC).
Enhancements
- Added WebSocketConfig.maxmessagesizebytes and maxframesizebytes configurable inbound size limits
- Added configurable writer_capacity limits for socket and WebSocket clients, defaulting to 1,024 messages
- Added NAUTILUSHTTP2ADAPTIVE_WINDOW env var to restore adaptive HTTP/2 flow-control windows
- Added same-venue execution client registration with explicit venue or default routing
- Added Rust Cache::accountidfor_client to resolve execution client accounts independent of issuers
- Added Rust Cache::clientidfor_venue to resolve the execution client that venue or default routing selects
- Added Python Cache.topofbook() without cloning the resident book (#5011), thanks @youayouly
- Added RateOfChangeMode for configurable ROC output units (#5144), thanks @faysou
- Added MACD signal and histogram outputs (#5144), thanks @faysou
- Added Bollinger Bands stddev output (#5144), thanks @faysou
- Added independent VIDYA cmo_period configuration (#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 listparquetfiles
- 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 timezone to RotationConfig.scheduled_dates, defaulting to UTC (#5115), thanks @faysou
- Added shared-table record/ and instrument/ catalog paths for external catalog backends (#5115), thanks @faysou
- Added Parquet catalog migration through nautilus catalog migrate-parquet (#4959), thanks @faysou
- Added type_name inference to migrate-parquet for legacy custom catalogs
- Added typed batchsize, compression, and maxrowgroupsize to DataCatalogConfig (#5166), thanks @faysou
- Added submissionrecoverypolicy config 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.orderfilldeclined.{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 deserializedecimaltoken and deserializeoptionaldecimaltoken to nautiluscore
- Added Rust newgenericspreadid and parsegenericspreadid_legs identifier functions (#5041), thanks @faysou
- Added Python newgenericspreadid and genericspreadidto_list (#5041), thanks @faysou
- Added strategy trigger price modification for trailing stop orders (#5041), thanks @faysou
- Added per-instrument overrides on 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 booksnapshottimeout_secs override, honoring 0 as disabled
- Added Betfair booksnapshottimeout_secs override, honoring 0 as disabled
- Added Binance booksnapshottimeout_secs override, honoring 0 as disabled
- Added typed Parquet catalog round trips for Binance futures custom data
- Added Bybit booksnapshottimeout_secs override, honoring 0 as disabled
- Added barstimestampon_close to BybitDataClientConfig, defaulting to close (#5160), thanks @folknor
- Added historicalbaseurl and livegatewayaddr overrides to DatabentoDataClientConfig
- Added Hyperliquid booksnapshottimeout_secs override, 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 booksnapshottimeout_secs override, honoring 0 as disabled
- Added Lighter use_gtd to 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 MATCHEDNOTBROADCASTED trade status
- Added tardishttpurl override to TardisDataClientConfig and TardisReplayConfig
- Added Tardis full 25-level OrderBookDepth for snapshot25 data
- 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 nautilustrader.persistence.NautilusDataType - import from nautilustrader.model
- Removed NautilusDataType.OrderBook variant and "OrderBook"/"order_book" spellings
- Removed instrument makerfee and takerfee; set those rates on the venue fee_model instead
- Removed makerfee and takerfee from Arrow instrument schemas and the SQL instrument table
- Removed nautilus_persistence::backend::catalog - import from backend::parquet::{catalog, paths}
- Removed serializedecimal and serializeoptionaldecimal - use decimal::serialize and serializeoptional
- Removed Rust InnerHttpClient Default impl, which panicked on transport errors; use HttpClient::builder()
- Removed Rust fixed-width Arrow decoders decodeprice, decodequantity, and validateprecisionbytes
- Removed OBV constructor period; output is now cumulative signed volume (#5144), thanks @faysou
- Removed KVO constructor signalperiod; require fastperiod < slow_period (#5144), thanks @faysou
- Removed DirectionalMovement constructor ma_type; use Wilder sums that skip the first bar (#5144), thanks @faysou
- Removed VWAP update_raw timestamp; call reset() to start a new session (#5144), thanks @faysou
- Removed Rust WMA new weights argument; use with_weights for custom weights (#5144), thanks @faysou
- Removed the instrument_id column from funding rate, instrument status, and option Greeks Arrow files
- Removed StreamingFeatherWriter fsprotocol and fsstorage_options; pass a local path (#5115), thanks @faysou
- Removed flat rotation arguments from StreamingConfig and StreamingFeatherWriter (#5115), thanks @faysou
- Removed Python DataBackendSession and DataQueryResult - use ParquetDataCatalog queries (#5115), thanks @faysou
- Removed Rust nautilus_persistence::backend::session - query through ParquetDataCatalog (#5115), thanks @faysou
- Removed to-json and to-parquet binaries - use nautilus catalog migrate-parquet (#5115), thanks @faysou
- Removed nautilus_persistence::parquet - use backend::parquet::io (#5115), thanks @faysou
- Removed Rust writebatchtoparquet and writebatchestoparquet - use writebatchestoobjectstore
- Removed Rust `combineparquetfiles
NautilusTrader 2.0.0rc5预发布2026-09-15
NautilusTrader 2.0.0rc5
Released on 15th September 2026 (UTC).
Enhancements
- Added clientid and endpoint filters to actor subscribesocket_state
- Added a channel filter to actor subscribequeuestate
- Added HttpClient::get_stream and HttpResponseStream for HTTP bodies consumed without full buffering
- Added publishmessage(...), subscribetopic(...), and unsubscribe_topic(...) for Python DataActor, Strategy, and ExecutionAlgorithm
- Added Cache APIs and Redis/PostgreSQL persistence for InstrumentClose data
- Added avg_px and report window fields to persisted execution reports
- Added optional BinaryOption.event_id with Python and Arrow support
- Added a causationid property to every order event, and a protectionprice property to OrderUpdated
- Added duepostonly to the OrderRejected constructor, defaulting to false
- Added remote resolution for TestDataProvider CSV loaders so they work from an installed wheel
- Added user-defined portfolio statistics via Portfolio.register_statistic() and Python PortfolioStatistic
- Added rolling ZScore indicator for Rust and Python (#4868), thanks @graceyangfan
- Added named task identity and lifecycle observation to live TaskGroup
- Added typed external MessageBus streaming for control, execution, and reconciliation messages
- Added public ExecutionEventEmitter.trysendaccount_state(...) (#4907), thanks @folknor
- Added cache-backed claims that route external orders, fills, and reconciliation activity to the strategy
- Added inbound latency modeling to sandbox execution client (#4865), thanks @ChrisAB
- Added SubscribeOptionChain.correlation_id and UnsubscribeOptionChain.params for tracking edits across client routes
- Added UnixNanos::saturatingdurationsince for non-negative time differences
- Added BacktestEngine::adddatabatch for typed data batches that replay without per-item Data values, thanks @faysou
- Added Python enum surface (from_str, name, value, variants) to BarIntervalType
- Added Python component direct messaging preserving objects across synchronous topic publication
- Added Python OrderBook.todeltas(...) and OrderBook.getallcrossedlevels(...)
- Added Python OrderBook pickle and deep-copy support and BookLevel comparisons
- Added Python OrderBookDelta.isadd, isupdate, isdelete, isclear, and OrderBookDeltas.is_snapshot
- Added Python activationutc and expirationutc properties to expiring instruments
- Added Python symbol and venue properties to regular and synthetic instruments
- Added Python bindings for subscription, execution, and historical data messages
- Added Cap'n Proto serialization for all instrument types and InstrumentAny
- Added Binance USD-M Futures RPI order support (#4927), thanks @AlphaTraderK
- Added Binance USD-M weekly delivery contract support
- Added Bybit self-match prevention, set with smp_type on the execution client config or per order
- Added Hyperliquid definite rejection events for submit, modify, and cancel command paths
- Added Hyperliquid local denial of over-decimal order prices when normalize_prices is disabled
- Added Kraken Futures makerProtectionMillis decoding for Maker Protection markets
- Added Kraken execution max_retries configuration (#4902), thanks @folknor
- Added OKX raw HTTP account configuration queries (#4943), thanks @silarin
- Added OKX USD-to-USDC spot migration support with spottradequoteccy and activatefeature
- Added OKX smarticeberg algo order type and autoconversion order category decoding
- Added Polymarket collateral-sized limit BUY orders with exact limit price preservation
- Added Polymarket Deposit Wallet split, merge, and redeem position operations
- Added Polymarket limit order modification support
- Added Polymarket parent event IDs and raw Gamma market and event metadata
- Added Polymarket resolution subscriptions for data-only clients (#4895), thanks @mystic-io
Breaking Changes
- Removed Rust Response and ReqwestError exports from nautilus_network::http
- Removed InnerHttpClient::toresponse and fromreqwest error conversions; use HttpClientError
- Added the required Rust Instrument::info method; custom implementations must return their metadata or None
- Removed Coinbase CreateOrderRequest.reduce_only; reduce-only orders are rejected before submission
- Removed the dormant PortfolioStatistic::calculatefromorders trait method; no analyzer supplied order data to statistics
- Removed public Rust and Python ForwardPrice APIs; option chains now fetch reference prices internally
- Removed the unused OKX enums OKXAccountMode and OKXTakeProfitKind, which mapped no venue field
- Replaced RetryManager.executewithretry* methods with invocation(...).execute().await
- Replaced the Rust DurationNanos u64 alias with a newtype; use constructors and accessors
- Replaced OKXHttpError::JsonError and generic HTTP errors with typed transport and response failures
- Renamed nautilus-serialization Cargo feature display to arrow-display
- Renamed blockchain log parsing modules to hypersync::log and rpc::log; update Rust imports
- Renamed Cargo binary targets to kebab-case, including tojson to to-json, toparquet to to-parquet, and node_wallet to node-wallet; update any cargo run --bin invocation to the new name
- Renamed Rust Data::Delta, Data::Deltas, and Data::Depth10 variants to Data::BookDelta, Data::BookDeltas, and Data::BookDepth10; JSON and SBE wire formats are unchanged
- Renamed StrategyConfig.externalorderclaims to externalorderinstrumentids; use Strategy.setexternalorderinstrument_ids() after registration to replace active claims
- Changed actor state subscription signatures; pass filters before priority, or use priority= in Python
- Changed Rust state unsubscribe methods to require filters; pass None for unfiltered subscriptions
- Changed QueueStateChanged and SocketStateChanged topics; use actor filters or switchboard patterns
- Changed Rust ExecutionClientFactory::create to require the node's clock after the cache argument
- Changed Rust mixed-scale addition/subtraction to panic; use checkedadd/checkedsub for fallible handling
- Changed Rust BinaryOption constructors to require an event_id argument; pass None when unknown
- Changed OrderCanceled::new to require an optional cancellation reason (#4903), thanks @folknor
- Changed FFI orderbookdeltasissnapshot to use FSNAPSHOT instead of the first delta action
- Changed PortfolioAnalyzer.realized_pnls() to return records in ascending event-time order rather than position-derived records followed by recorded ones
- Changed registered PnL statistics to run on every analyzed currency, including runs that closed no trades, where they receive an empty list; Win Rate and its peers now report NaN for such runs rather than being absent
- Changed OKX response decoding failures in Python from ValueError to RuntimeError
- Changed TradingState to ACTIVE=1, REDUCING=2, and HALTED=3; update numeric and Cap'n Proto consumers
- Changed REDUCING to allow only eligible reduce-only submissions, cancellations, and queries
- Changed execution clients to reject reduce_only without an enforcing venue instruction (#4761), thanks @folknor
- Changed backtest and sandbox venues to reject reduce-only orders when usereduceonly=false
- Changed PostgreSQL instrument storage to preserve info; run nautilus database init to add the column before starting the cache
- Changed PostgreSQL cache startup to require the instrument_close table; run nautilus database init
- Changed PostgreSQL orderevent and positionevent tables to carry the order event fields that were previously dropped; run nautilus database init to add the columns, as cache startup now fails fast when they are missing. OrderReleased and `Orde
NautilusTrader 2.0.0rc4预发布2026-09-02
NautilusTrader 2.0.0rc4
Released on 2nd September 2026 (UTC).
> [!NOTE]
> The OrderSide, PositionSide, ContingencyType, TrailingOffsetType, and TriggerType changes
> are broad because their zero-valued NO_* variants came from constraints in the former Cython and
> FFI design. With Cython removed, compatibility representations can remain at serialization and FFI
> boundaries instead of shaping the Rust and Python domain enums, while preserving legacy formats and
> the existing C API.
Enhancements
- Added error reporting for strategies left running after a backtest ends (#4803), thanks @folknor
- Added client order ID options to Python GridMarketMakerConfig (#4822), thanks @mameikagou
- Added custom Python fee model support to simulation configs (#4806), thanks for reporting @gtalknitin
- Added instrument-scoped order fill-voided event topics
- Added Rust model handles for custom backtest margin and latency implementations
- Added live socket state events and targeted reconnect controls across adapters
- Added warnings for open orders excluded by the reconciliation lookback window (#4847), thanks @folknor
- Added Serializable support to OrderBookDeltas (#4889), thanks @abhijeetvichare76
- Added Lighter support for Robinhood Chain with deployment-specific venues and credentials
- Added OKX instrument cache reconciliation and WebSocket instrument updates
- Added Polymarket market descriptions to instrument.info (#4840), thanks for reporting @mystic-io
- Added Polymarket quote ticks from bestbidask market events
- Added Polymarket RTDS crypto TWAP custom data (#4843), thanks @seungpyoson
- Added matching engine controls to sandbox execution configs (#4813), thanks @graceyangfan
Breaking Changes
- Removed BitmexExecFactoryConfig; pass BitmexExecutionClientConfig directly to the factory
- Removed DatabentoLiveClientConfig; pass DatabentoDataClientConfig directly to the factory
- Removed DeriveExecFactoryConfig; pass DeriveExecutionClientConfig directly to the factory
- Removed HyperliquidExecFactoryConfig; pass HyperliquidExecutionClientConfig directly to the factory
- Removed trader_id from adapter execution client configs and factory construction
- Removed backtest settlement_prices configuration and setters; use InstrumentClose expiry data
- Removed low-level Python WebSocket clients and their dedicated request, error, and channel-control types from adapters
- Replaced Rust HttpClient, WebSocketClient, and SocketClient constructor overloads with builder APIs
- Renamed ImportableExecAlgorithmConfig to ImportableExecutionAlgorithmConfig
- Renamed LiveDataClientConfig to DataClientConfig
- Renamed LiveExecClientConfig to ExecutionClientConfig
- Renamed LiveExecEngineConfig to LiveExecutionEngineConfig
- Renamed ExecFactoryExtractor to ExecutionFactoryExtractor
- Renamed SimExecFactoryExtractor to SimulatedExecutionFactoryExtractor
- Renamed ExecClientConfig types to ExecutionClientConfig
- Renamed BetfairDataConfig to BetfairDataClientConfig
- Renamed BetfairExecConfig to BetfairExecutionClientConfig
- Changed Rust OrderSide to BUY or SELL; removed OrderSideSpecified; use Option if needed
- Changed Rust PositionSide to FLAT, LONG, or SHORT; removed PositionSideSpecified; use Option if needed
- Changed Rust ContingencyType, TrailingOffsetType, and TriggerType to use Option for absence
- Changed Rust backtest margin parameters to MarginModelHandle
- Changed Rust backtest latency parameters to LatencyModelHandle
- Changed contract expiry to use InstrumentClose.close_price for futures, binary contracts, and option close legs
- Changed omitted backtest leverage to 10x for margin and 1x for cash; set default_leverage=1 for prior behavior
- Changed Rust MarginModel implementations to require Send + Sync and name()
- Changed ExecutionManager::new to validate lookback bounds and return ConfigResult (#4809), thanks @folknor
- Changed Strategy.cancelallorders to associated orders by default (#4470), thanks for reporting @zurpet
- Changed ExecutionClientFactory::create to receive the node's TraderId
- Changed SimulatedExecutionClientFactory::create to receive the node's TraderId
- Changed adapter execution account configs to use account_id instead of factory arguments
- Changed adapter execution factories to use no-argument constructors
- Changed Lighter client configs (Rust); complete struct literals must add deployment and venue or use builders
- Changed Polymarket Gamma models to expose resolution metadata (#4842), thanks @seungpyoson
- Changed Polymarket REST reconciliation to reject unbound or invalid reports (#4831), thanks @seungpyoson
Security
- Added fail-closed Cargo dependency cooldown checks and transactional repair for both lockfiles,
with portable GNU and BSD date handling
- Fixed foreign-instrument fills corrupting cached position state (#4802), thanks @folknor
Fixes
- Fixed active-local order modifications bypassing their execution algorithm (#4793), thanks @folknor
- Fixed execution algorithms submitting spawned orders with live emulation triggers (#4881), thanks @folknor
- Fixed trigger-carrying order modifications bypassing the order emulator (#4848), thanks @folknor
- Fixed Efficiency Ratio windowing and invalid Python input handling (#4807), thanks for reporting @staffordjh
- Fixed indicator string representations reporting fields out of order (#4816), thanks @s1amese2003
- Fixed own order book audits removing active-local orders
- Fixed stale order slippage after fill-void corrections
- Fixed StrategyConfig.managecontingentorders for open, non-active-local OTO, OCO, and OUO orders
- Fixed native strategy timers bypassing managed time-event routing (#4888), thanks for reporting @silarin
- Fixed rate-limit requests consuming quota before all applicable limits were available
- Fixed reconnect-buffered socket messages stalling or being overtaken by newer messages
- Fixed Python factory re-entry through LiveNodeBuilder causing process aborts
- Fixed live order snapshots not being persisted to PostgreSQL
- Fixed live position snapshots not being persisted to PostgreSQL
- Fixed partial late fills reopening canceled orders
- Fixed cloned execution event emitters dropping events after sender initialization (#4874), thanks @folknor
- Fixed BacktestEngine delayed orders using unrelated instrument prices (#4891), thanks for reporting @mdou7
- Fixed generatemissingorders=False creating synthetic orders and fills (#4739), thanks for reporting @hashtagdenis
- Fixed Betfair CancelAllOrders side filters and large batch cancellation
- Fixed Betfair order and fill reconciliation with more than 250 market IDs
- Fixed Betfair stream readiness, liveness, subscription replay, and reconnect reconciliation
- Fixed Betfair modify recovery after ambiguous REST outcomes and instruction failures
- Fixed Betfair terminal order identity across reconnects, late fills, void corrections, and replacements
- Fixed Binance Futures fill reconciliation treating history outside venue retention as complete
- Fixed Binance Futures hedge-mode position reconciliation across REST snapshots and partial WebSocket fills
- Fixed Binance Futures whole-position exits denied by placeholder bounds (#4746), thanks for reporting @hashtagdenis
- Fixed Binance Spot and Futures execution reconciliation when no data client is configured
- Fixed Bybit option batch limits and WebSocket batch amend payloads
- Fixed Bybit rate limiting causing expired requests, venue rejections, and inconsistent order state
- Fixed Bybit scoped SPOT position reports and wallet balance fan-out (#4844), thanks @folknor
- Fixed Bybit WebSocket order book depth validation (#4823), thanks @Centaur-pub
- Fixed Deribit lazy-load subsc
NautilusTrader 2.0.0rc3预发布2026-08-21
NautilusTrader 2.0.0rc3
Released on 20th August 2026 (UTC).
> [!NOTE]
> Some renames in this release, such as AggressorSide Buyer/Seller becoming Buy/Sell, restore
> the most correct naming conventions. The Cython-era C API shared one enum namespace across types,
> which ruled out these names; since the removal of Cython, that limitation no longer applies.
Enhancements
- Added dead-peer detection to every transport with a configured heartbeat, reconnecting when the peer stops sending
- Added TCP keepalive and Linux TCPUSERTIMEOUT to all outbound connections, detecting half-open sockets in ~1 min
- Added HTTP CONNECT proxy support to the Sockudo WebSocket backend
- Added WebSocketConfig.heartbeattimeoutsecs so every connect entry point can set a liveness window
- Added a one‑second floor on flapping reconnect attempts, keeping clients under venue connection‑rate limits
- Added WalletAccount for native and token balances with local reservations
- Added PositionOpened realized PnL
- Added AccountState venue metadata
- Added canonical Rust backtest results with normalized projections, content digests, and stable ordering
- Added full Rust config parity for the Python testkit ExecTesterConfig
- Added Sum iterator support for owned and borrowed Quantity values (#4720), thanks @faysou
- Added Python v2 Redis message bus backing for LiveNode (#4630), thanks for reporting @davidgreyme
- Added Python v2 cache database backing for LiveNode (#4634), thanks for reporting @AlphaTraderK
- Added Python v2 LiveNode.run_async(), LiveNodeHandle, and NodeState for caller-owned event loops
- Added direct message bus backing installation through RedisMessageBusConfig
- Added LiveNode.start() warning when external message bus ingress requires run()
- Added trader start warning when loadstate or savestate is enabled without a cache database backing
- Added runtime external‑order claim registration and removal to Rust LiveNode (#4620), thanks @folknor
- Added INFO logs for socket and WebSocket connection loss and recovery (#4621), thanks @folknor
- Added Rust and Python SocketStateChanged events for Binance Futures, Lighter, and Polymarket live clients
- Added Coinbase heartbeat counter gap warnings, resetting after reconnect
- Added Deribit book summaries as requestable custom data (#4576), thanks @graceyangfan
- Added Derive fixed-window rate limits for global and per-instrument matching requests
- Added Hyperliquid socket-state reporting and reconnect_socket on data and execution WebSockets
- Added Hyperliquid user TWAP history and slice fills as opt‑in custom data (#4674), thanks @graceyangfan
- Added Interactive Brokers support for canonical 21‑character OPRA option IDs (#4774), thanks @xxxxxx-oss
- Added Lighter inbound liveness timeout and socket-state reporting on data and execution WebSockets
- Added Polymarket computeeffectivedeltas config option to emit net changes for book snapshots (default False)
- Added Polymarket series_ids instrument provider scoping for Gamma market families (#4650), thanks @mystic-io
- Added Polymarket instrument bootstrap from a filters map or a registered InstrumentFilter without load_all
- Added Polymarket backtest fee model with per-market taker fees and maker credits
Breaking Changes
- Removed legacy v1 Cython package and root build path; use the Rust + PyO3 package
- Removed nautilustrader.core.ispycapsule; use normal Python type checks on model objects
- Removed model aspycapsule methods and OrderBookDeltas.frompycapsule; pass typed model objects directly
- Removed FFI features and static libraries outside nautilus-core and nautilus-model; use Rust or PyO3 APIs
- Removed cython-compat, Cython cbindgen configs, and dropcvecpycapsule; use PyO3 APIs
- Removed generic Python clients and support APIs from nautilus_trader.network; use adapter APIs or nautilus-network
- Removed LiveNode.poll() and Python LiveNode.start(); use hosted runwithmode(...) or run_async()
- Removed nautilustrader.data.OptionChainManager; use subscribeoption_chain and handle OptionChainSlice
- Removed Cache.actorids(), which always returned an empty set; use Rust Trader::actorids()
- Removed WebSocketClient::connectwithheartbeattimeout; set WebSocketConfig.heartbeattimeout_secs instead
- Removed duck-typed object conversion from BacktestEngine.add_data; pass model objects directly
- Removed unused Rust SocketClient and WebSocketClient connection callbacks; use message or epoch handlers
- Removed Rust nautilusexecution::matchingengine::adapter::OrderEngineAdapter; use OrderMatchingEngine
- Removed Rust frompyobject constructors from nautilusmodel data types; use Bound::extract for the target type
- Removed Rust nautilus_core::CleanDrop and its drop module; implement Drop directly
- Removed Databento loadaspycapsule methods; use the corresponding load_* methods
- Removed the trailing heartbeat_timeout parameter from the epoch-handler connect; set it on the config
- Replaced Rust nautilusmodel::python::data::datatopycapsule with datato_pyobject
- Renamed Portfolio.marginsinit to instrumentinitial_margins
- Renamed Portfolio.marginsmaint to instrumentmaintenance_margins
- Renamed Portfolio.isflat to isnet_flat
- Renamed Portfolio.iscompletelyflat to iscompletelynet_flat
- Renamed AggressorSide Buyer/Seller variants to Buy/Sell and BUYER/SELLER members to BUY/SELL
- Renamed Cap'n Proto AggressorSide symbols to buy/sell, preserving ordinals
- Renamed PostgreSQL AGGRESSOR_SIDE labels to BUY/SELL; migrate with ALTER TYPE ... RENAME VALUE
- Changed Rust OrderMatchingEngine import to nautilusexecution::matchingengine::OrderMatchingEngine
- Changed Rust QueryResult and DataQueryResult to iterate Result items carrying a new QueryError
- Changed DataQueryResult iteration to return Python object lists instead of DataFFI capsules
- Changed adapter callbacks to receive typed model objects instead of PyCapsule objects
- Changed cache actor APIs to ActorId from ComponentId, covering CacheDatabaseAdapter actor state methods
- Changed Interactive Brokers historical tick responses and Tardis batch streams to provide typed model objects
- Changed portfolio statistic calculatefrompositions to require Position objects instead of duck-typed ones
- Changed AggressorSide string output from BUYER/SELLER to BUY/SELL for display, serde, and SQL encoding
- Changed WebSocketConfig.heartbeat to heartbeatintervalsecs and heartbeatmsg to heartbeatpayload
- Changed WebSocketConfig.reconnecttimeoutms to connecttimeoutms, which also bounds the initial dial
- Changed SocketConfig.heartbeat from a tuple to Option<SocketHeartbeat> with interval_secs and payload
- Changed SocketConfig.idletimeoutms to heartbeattimeoutsecs, matching the inbound silence it always detected
- Changed a configured heartbeat to imply dead-peer detection, defaulting heartbeattimeoutsecs to three intervals
- Changed the Sockudo backend to tunnel through a configured proxy_url instead of silently falling back to Tungstenite
- Changed WebSocket and socket clients to validate config on connect, so an invalid config now fails at startup
- Changed custom cache database adapters to require indexorderclients for live orders (#4797), thanks @xxxxxx-oss
- Changed Betfair streamheartbeatms to streamheartbeatsecs, now seconds rather than milliseconds (default 5)
- Changed Betfair streamidletimeoutms to streamheartbeattimeoutsecs, now seconds (default 60)
- Changed Binance spot and futures WebSocket API trading clients to send a keepalive, which they previously omitted
- Changed Bybit bybitbarspectointerval to take a BarAggregation instead of an integer
- Changed Bybit execution
NautilusTrader 1.231.0 Beta2026-08-02
NautilusTrader 1.231.0 Beta
Released on 2nd August 2026 (UTC).
NautilusTrader v2 transition notice
This release is intended to be the final NautilusTrader 1.x release with support for the legacy Cython v1 core. If final validation finds a serious blocker, maintainers may take another 1.x release rather than force the cutover.
The v2 Rust + PyO3 runtime has reached the release-candidate stage for the supported workflows: Python strategy authoring, backtesting, live operation, core risk and execution, portfolio/accounting, data catalog usage, and the current adapter set. Some lower-use and newer surfaces remain deferred, and those are tracked in the v2 roadmap rather than treated as blockers for the cutover.
After this release, develop will move to v2-only. The legacy v1 core will move to a develop_v1 branch, where maintainers will accept critical security backports for approximately three months after the v2 cutover.
New feature work will now target v2.
The paired 2.0.0rc2 wheels are being released alongside 1.231.0 for community testing with normal --pre installation. Follow‑up 2.0.0rcN wheels are likely to ship at a higher cadence than normal releases as feedback arrives, before the final 2.0.0 release.
Migration contracts
The v2 cutover makes the Rust + PyO3 package the primary path for new installs and source builds. In the current checkout it lives under python/ and uses python/.venv; the root package and root .venv still provide the legacy v1 Cython environment. Both packages import as nautilus_trader, so test the migration in a separate virtual environment. See Migrate from v1 to v2 for the current imports and build commands.
The accepted v2 contract differences are native CustomData without v1 wrapper semantics, OptionGreeks cache writes, no Python Bar.isrevision, and a cross-zero Position.apply entry price that resets to the flipping fill. V2 also prefers mark prices by default. Catalog order-event data written before activationprice and OrderFilled.info were added is not readable with the new schema and must be regenerated or migrated before an in-place upgrade. OrderFillVoided replay requires the referenced fill locally before reopening and treats VOIDED as terminal. Regenerate v2 order streams that contain a reopened correction before its referenced fill, or a cancel or update after VOIDED.
The migration guide includes the v1-to-v2 identifier, collection, lifecycle, callback, subscription, historical-batch, and removed-hook mappings. Typed historical requests use batch callbacks; generic custom data continues through onhistoricaldata.
Cutover limits
The supported cutover workflows cover Python strategies, actors, backtests, live nodes, core risk and execution, portfolio/accounting, data catalogs, reports, tearsheets, and the current Rust-backed adapter set.
The following limits remain deferred:
- Python request callbacks omit v1 joined‑response, pending cleanup, and late or duplicate delivery conveniences.
- Direct Python LiveNode injection for Redis cache databases and external message-bus backing.
- SQL cache position and synthetic loads, state persistence, and heartbeat.
- External message-bus publication of serialized order and position snapshots.
- V1 StreamingConfig and DataCatalogConfig iterator wiring on the v2 BacktestNode.
- V1 adapter instrument-provider filters; Hyperliquid v2 loads the configured universe.
- Published tutorials still use v1; generated v2 stubs and python/examples/ show the current API.
- Static typing does not cover three Kraken batch methods or adapter wire DTO runtime attributes.
Enhancements
- Added v2 OrderFillVoided, OrderStatus.VOIDED, terminal voiding, and strategy and algorithm callbacks
- Added v2 Decimal order fill pricing; Order.avg_px and Order.slippage no longer round through f64
- Added v2 info fill metadata to OrderFilled
- Added v2 order-event activation_price persistence through event and dictionary reconstruction
- Added v2 Cap'n Proto and SQL persistence for order-event activation prices and fill info
- Added v2 trailing stops that activate at market and set prices from the first update
- Added v2 replay state carryover across NETTING close/reopen cycles (#4546), thanks @HungNgo4444
- Added v2 actor and strategy state persistence across live and backtest lifecycles
- Added v2 OrderBookDepth10 subscriptions and callbacks for Rust and Python actors and strategies (#4439)
- Added Rust and Python v2 cache introspection for market‑data histories (#4586), thanks @Kenneth-zh
- Added makeqtyfromdecimal / makepricefromdecimal on the Instrument trait
- Added LiveNodeBuilder.with_controller for runtime controller configuration (#4427), thanks @bebop23
- Added returns skewness and kurtosis portfolio statistics (#4334), thanks @Martingale42
- Added Up/Down Capture ratio portfolio statistics (#4354), thanks @mahimn01
- Added Ulcer Index, Omega Ratio, VaR, and Expected Shortfall portfolio statistics (#4352), thanks @Martingale42
- Added Tail Ratio portfolio statistic (#4341), thanks @Martingale42
- Added Python v2 historical book-delta and depth batch callbacks for actors and strategies
- Added Python v2 subclassable execution algorithms for routed orders
- Added Python v2 execution algorithm config subclassing and importable config export
- Added Python v2 ExecutionAlgorithm.deny_order with terminal denial of invalid TWAP inputs
- Added Python v2 ExecutionAlgorithm portfolio, lifecycle, signals, and constructed live registration
- Added Python v2 controller subclassing and importable controller configs for backtest/live
- Added Python v2 BacktestNode post-run cache, portfolio, statistics, and report inspection
- Added Python v2 tearsheet support for BacktestResult input (#4563), thanks @faysou
- Added Python v2 FeeModel and FillModel subclass support for custom backtest models
- Added Python v2 nautilus_trader.config convenience imports for core configuration types
- Added Python v2 Strategy.shutdown_system() and LiveNode.dispose() bindings
- Added Python v2 LiveNode cache and portfolio inspection with bounded host-loop polling
- Added Python v2 LiveNode.add_strategy for constructed strategy instances (#4487), thanks @dfjmax
- Added Python v2 PositionSizer and FixedRiskSizer bindings (#4573), thanks @dfjmax
- Added Python v2 EfficiencyRatio and RelativeStrengthIndex methods (#4420), thanks @a1zb2yc3z
- Added Python v2 portfolio snapshot access with base-currency equity and stale/unpriced metadata
- Added Python v2 ExecTesterConfig controls for UUID order IDs, quote quantity, and stop-time cancels
- Added Python v2 ExecTesterConfig.closepositionsqty_precision for venue‑fillable stop‑time closes
- Added Rust LiveNode runner metrics snapshots
- Added opt-in mimalloc allocator feature, enabled by default for Python wheels (#4358), thanks @ivannp
- Added v2 MessageBusConfig.autotrim_maxlen for Redis stream count retention (#4433), thanks for reporting @gtalknitin
- Added WebSocket transport backend selection for Python and PyO3 configs (#4342), thanks @graceyangfan
- Added adapter config readback in Python v2 while keeping credentials and nested configs private
- Added Architect AX dated futures parsing and configurable WebSocket heartbeat and disconnect cancellation
- Added Architect AX funding-slot schedule requests via GET /funding-slots
- Added Architect AX Python v2 data and execution client factory bindings
- Added Binance Futures and OKX trailing-stop activation prices to v2 execution reports
- Added Binance GTD expiry support for USD-M and local expiry mapping for Spot and COIN-M
- Added Binance v2 extended bars, bounded history, snapshots, tickers, estimated
NautilusTrader 1.230.0 Beta2026-06-29
NautilusTrader 1.230.0 Beta
Released on 29th June 2026 (UTC).
Enhancements
- Added v2 Python visualization (tearsheet) support with a visualization extra
- Added non-compounding returns option for monthly and yearly tearsheet charts via compounding
- Added spread quote vega-pricing fallback controls for missing greeks (#4328), thanks @faysou
- Added Unix SIGTERM handling to the v2 LiveNode shutdown path (Rust)
- Added withclockfactory for Rust live and sandbox nodes (#4331), thanks @folknor
- Added Betfair cricket match stream data subscriptions (Rust and Python)
- Added Bybit instrument subscription support via instrument-info polling (#4305), thanks @dxwil
- Added OKX region support for global, EEA, and US endpoints (#4318), thanks @dxwil
Breaking Changes
- Changed event_store format; beta v1.227-v1.229 stores must be regenerated (#4330), thanks @folknor
- Changed Throttler rate limit fields to non-zero accessors instead of public fields (Rust)
- Renamed Bybit data config instrumentstatuspollsecs to instrumentpollintervalsecs
Security
- Fixed unbounded HTTP response buffering that could exhaust memory (#4332), thanks @AlaeddineMessadi
- Removed direct bincode use from event_store on-disk envelopes (#4330), thanks @folknor
Fixes
- Fixed LiveTimer tasks leaking after clock drop or component teardown (#4322), thanks @filipmacek
- Fixed Strategy order-list cache visibility for live handlers (Rust)
- Fixed Rust strategy oms_type registration for custom HEDGING position IDs (#4327), thanks for reporting @dxwil
- Fixed duplicate realized PnLs in post-run analysis (#4344), thanks for reporting @a1zb2yc3z
- Fixed RateOfChange period window and log calculation (#4326), thanks @Martingale42
- Fixed VerticalHorizontalFilter and OnBalanceVolume period windows (#4333), thanks @Martingale42
- Fixed Architect AX execution reconciliation for open positions and fills
- Fixed Architect AX to deny unsupported order types and times in force locally
- Fixed Architect AX to report unfilled IOC/FOK orders as canceled and flag post-only rejections
- Fixed Architect AX market data for null ticker prices and order book snapshot requests
- Fixed Databento adapter historical request edge cases and live state cleanup (Rust and Python)
- Fixed Binance Futures TRADING_HALT contract status handling (Rust and Python) (#4320), thanks @YeeTsai
- Fixed Bybit submit rejection classification and batch amend/cancel request builders (Rust)
- Fixed Databento OPRA option expirations stamped at midnight UTC (#4321), thanks for reporting @pjlegato
- Fixed Hyperliquid fill report decoding for new venue fill directions (#4325), thanks for reporting @magnified103
- Fixed Interactive Brokers stock contract resolution for non-USD and cross-listed symbols (#4337), thanks @dfjmax
- Fixed Interactive Brokers crypto quote-quantity SELL order sizing (#4309), thanks @bebop23
- Fixed Lighter stop-market and market-if-touched order modification rejected for a missing price
- Fixed Polymarket reconciliation producing out-of-range fill prices
- Fixed Polymarket RTDS duplicate snapshot replay and incremental batching (#4319), thanks @graceyangfan
Internal Improvements
- Expanded API facade surface coverage for Cache, Clock, Order, and Portfolio reads (Rust)
- Hardened plugin ABI surface to reject manifest ABI mismatches (Rust)
- Hardened CI release provenance checks with provenance refetch and transient 404 retries
- Improved default Rust builds to avoid abandoned proc-macro-error2 (#4315), thanks for reporting @folknor
- Standardized data subscription logging with a single canonical confirmation and reduced adapter log noise (Rust)
- Optimized OrderMatchingEngine post-match actions to avoid cloning resting orders (Rust)
- Optimized OrderMatchingEngine no-match GTD and trailing-order paths (Rust)
- Optimized Databento adapter decode and loader paths (Rust)
- Optimized Throttler hot paths and added Criterion benches (Rust)
- Upgraded Cython to v3.2.6
Documentation Updates
- Added a Lighter Rust quickstart and get-started guide
- Standardized the request_bars callback pattern for live bar warmup (#4311), thanks @dfjmax
- Refined Databento dataset configuration docs for schema limits and symbology inference
- Refined event sourcing marker sidecar docs to match the shipped markers module
- Refined Polymarket integration guide for Rust config fields and order behavior
<!-- release-checksums:start -->
Artifact checksums
SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.
| Artifact | SHA256 |
| --- | --- |
| nautilustrader-1.230.0-cp312-cp312-macosx150arm64.whl | 033f6207d1c52095d64a7644f43b90cab939c2038044db70a4165f2acef3d079 |
| nautilustrader-1.230.0-cp312-cp312-manylinux235aarch64.whl | de69df04918ad52095dca2e462f2e1e7755a53e74df13f35de9631ef71513beb |
| nautilustrader-1.230.0-cp312-cp312-manylinux235x86_64.whl | 8f4ff2e8af10e93ed643496eb62999b00558085f0e0bff17fc76e08809ba91b9 |
| nautilustrader-1.230.0-cp312-cp312-winamd64.whl | 9420b151e92a504841b7fc768ba937dc7f3bffe387096215f39b83c6fcda27e8 |
| nautilustrader-1.230.0-cp313-cp313-macosx150arm64.whl | af8a83f7cabb91460dcf5b966259eab1f4edee7f5bba965119e70c06a876e997 |
| nautilustrader-1.230.0-cp313-cp313-manylinux235aarch64.whl | 8143907c667fda91bb6466c02ff2ec9f6389aa2fcc35fb0843e75a2ab4e4bfa8 |
| nautilustrader-1.230.0-cp313-cp313-manylinux235x86_64.whl | b5755ae5057b260827404aef23c3051969107d6724dd8c525f17301c9c5b24c0 |
| nautilustrader-1.230.0-cp313-cp313-winamd64.whl | 8817c46dc34e0aafc606948aacf1dd0fbbe1a31273c8a2f20983cf4ab2ddeef1 |
| nautilustrader-1.230.0-cp314-cp314-macosx150arm64.whl | 4163833dc3b930d3f8a6f769eb2e7d6422c144d0db748d63ac0e5fdb1f4842b5 |
| nautilustrader-1.230.0-cp314-cp314-manylinux235aarch64.whl | 94b0e9180a4e023f80c3e000f2039976d346387fff40987cb3525e6c11873e3f |
| nautilustrader-1.230.0-cp314-cp314-manylinux235x86_64.whl | 2178899b700050f931d94ab11a23bcbc4d506b200b387827431e7d6eb0cd1e44 |
| nautilustrader-1.230.0-cp314-cp314-winamd64.whl | 57f814d13947169538f8cedc881db72e7dc4320626c5a3f37b9ce36ed5527720 |
| [nautilustrader-1.230.0.tar.gz](https://github.com/nautechsystems/nautilustrader/releases/download/v1.230.0/nautilus_tra
NautilusTrader 1.229.0 Beta2026-06-26
NautilusTrader 1.229.0 Beta
Released on 25th June 2026 (UTC).
This release includes many breaking changes across the user-facing Python and Rust v2 APIs.
Enhancements
- Added Cache::try_currency with CurrencyLookupError for typed missing-currency lookups (Rust)
- Added Cache::try_instrument with InstrumentLookupError for typed missing-instrument lookups (Rust)
- Added Cache::try_order with OrderLookupError for typed missing-order lookups (Rust)
- Added negative price support for Commodity instruments in risk checks (#2330), thanks for reporting @fabz1
- Added cache order index crash-recovery restore for Redis and Postgres adapters (Rust)
- Added capability-aware analyze-pool(s)/sync-dex validation that fails before sync for unsupported DEXes
- Added ProbabilityPriceFeeModel and configurable sandbox fee models (#4262), thanks @graceyangfan
- Added SEC1 EC private key support to socket TLS configuration (Rust)
- Added orderpositionindex Postgres table for the order-position index; run make init-db to migrate
- Added addnativeexec_algorithm and ExecutionAlgorithmConfig bindings to the Python v2 backtest engine
- Added Order::toorderstatus_report conversion in Rust
- Added withmsgbuspublisher for Rust live-node and kernel builders
- Added benchmark-relative portfolio stats (#4251), thanks @mahimn01
- Added SBE and Cap'n Proto encodings for Rust-native message bus publishers
- Added SBE and Cap'n Proto support for OptionGreeks
- Added Postgres cache position event-log persistence and restart recovery (Rust)
- Added Redis cache adapter order, position, and order-index write persistence (Rust)
- Added RedisCacheConfig, PostgresCacheConfig, and RedisMessageBusConfig for Rust factories
- Added Python v2 Strategy.order_factory accessor and validating OrderFactory bindings
- Added PyO3 cache purge APIs (#4249), thanks @graceyangfan
- Added PyO3 instrument tick_scheme fields with Arrow persistence
- Added Binance Futures bnfcr_currency config for Credits Trading Mode
- Added Binance Futures funding-rate history support in Rust
- Added Binance Futures MINNOTIONAL parsing for minnotional (#4280), thanks @filipmacek
- Added Binance Futures ticker data support in Rust
- Added Binance order-list submission in Rust
- Added Binance market-data WebSocket fixtures for CM-UM st and ps fields (Python and Rust)
- Added BitmexInstrumentState::Unknown to tolerate unrecognized venue states without bootstrap failure
- Added BitMEX legacy futures, spreads, and reference basket instrument parsing
- Added Blockchain CLI help for discoverable and snapshot-capable DEXes per chain
- Added Databento venuedatasetmap to override the default venue-to-dataset mappings
- Added Hyperliquid builder attribution opt-out
- Added Hyperliquid historical trade requests
- Added Hyperliquid minimum notional handling
- Added Interactive Brokers trailing stop basis-point offset support (#4292), thanks @faysou
- Added Lighter NVDA composite market maker Python v2 example
- Added PancakeSwap V3 on-chain snapshot validation via the Uniswap V3 pool reads
- Added PancakeSwap V3 pool-event parsers on BSC, Base, Arbitrum, and Ethereum
- Added Polymarket RTDS custom data subscriptions (#4214), thanks @graceyangfan
- Added Tardis Lighter venue mapping
- Added Tardis options_chain CSV loading, streaming, and catalog conversion
- Added Uniswap V3 SetFeeProtocol indexing so replayed snapshots carry the correct fee_protocol; run make init-db
- Added Uniswap V3 CollectProtocol indexing so pool snapshots track protocol-fee balances; run make init-db
Breaking Changes
- Changed backtest config builders to validate on build() and return ConfigResult (Rust)
- Changed BacktestDataConfig to require an instrumentid, instrumentids, or bar_types target
- Changed example strategy and actor configs to use bon builder() instead of new()/with_* (Rust)
- Changed Rust actor self.clock() to return ClockApi; call methods directly instead of borrowing
- Changed Rust actor/strategy core access; use macros or native traits instead of Deref
- Changed PyO3 DataActor/Strategy historical request start/end to require UTC datetimes
- Changed Python NautilusDataType enum order to put OptionGreeks before InstrumentStatus
- Changed cache database and message bus backing construction to use factory-owned config structs (Rust)
- Changed CacheDatabaseAdapter::loadindexorder_position to return position IDs instead of positions (Rust)
- Changed default message bus/cache encoding to JSON; set encoding="msgpack" for MessagePack
- Changed Redis cache account/order/position storage to event logs; clear old typed state (Rust)
- Changed Rust message bus subscriber-count and presence queries to return invalid-topic errors instead of panicking
- Changed SerializationEncoding repr order to Json=0, MsgPack=1, Capnp=2, Sbe=3
- Changed Cap'n Proto DataAny ordinals to put OptionGreeks before instrument schemas
- Changed SBE DataAny variants and template IDs to put OptionGreeks before instrument schemas
- Changed Currency::fromstr and Currency::is to return CurrencyLookupError instead of anyhow::Error (Rust)
- Changed InstrumentId and OptionSeriesId string constructors to return typed errors (Rust)
- Changed OrderAny::from_events to return OrderReplayError instead of anyhow::Error (Rust)
- Changed OrderList::validate to return OrderListValidationError instead of anyhow::Error (Rust)
- Changed SyntheticInstrument fallible methods to return SyntheticInstrumentError instead of anyhow::Error (Rust)
- Changed tick scheme constructors and parsing to return TickSchemeError instead of anyhow::Error (Rust)
- Changed Parquet catalog write APIs to take borrowed slices instead of owned Vec (Rust) (#4296), thanks @sunlei
- Changed WebSocket and socket reconnecttimeoutms to bound only connection establishment (Rust)
- Changed plug-in loader to reject build mismatches by default; opt out with setallowbuild_mismatch (Rust)
- Changed Binance Spot SBE WebSocket API schema to version 3:4, matching generated codecs (Rust)
- Changed Blockchain PoolProfiler.pricesqrtratio_x96 to return int instead of str
- Changed Bybit BybitHttpClient::submit_order to take trailing native TP/SL params; PyO3 defaults to None
- Removed CacheConfig.database and MessageBusConfig.backing; pass adapters separately
- Removed common DatabaseConfig and MessageBusBackingConfig; use Redis/Postgres configs
- Renamed message bus database terminology to backing in Rust message bus APIs
- Renamed addnativeactor to addbuiltinactor for bundled example actors
- Renamed addnativestrategy to addbuiltinstrategy for bundled example strategies
- Renamed Rust/PyO3 instrument tickschemename to tickscheme; Cython keeps tickscheme_name
- Renamed BitmexInstrumentType::StockPerpetual to TradFiPerpetual (covers equities, FX, and commodities)
Security
- Hardened Docker toolchain pins
- Fixed instrument base quantity calculation panic on zero last price (Rust)
- Fixed tick scheme navigation panics on NaN, infinite, and out-of-range prices (Rust)
- Fixed domain value conversions to reject invalid numeric inputs instead of panicking (Rust)
- Fixed plug-in host callbacks to return Panic errors instead of aborting the node on engine panics (Rust)
- Fixed plug-in create, clonehandle, and drophandle panics to recover instead of aborting the process (Rust)
- Fixed plug-in host thunks to validate UTF-8 on plug-in strings instead of assuming it (Rust)
- Fixed plug-in loader rejection paths to cap diagnostic reads and never dlclose initialized cdylibs (Rust)
- Fixed event-store replay panic on captured fills carrying an invalid order side (Rust)
- Fixed Interactive Brokers disconnect reconciliation corrupting position state (#4230), thanks @HKOWL
Fixes
- Fixed acc