Skip to content

NautilusTrader 2.0.0rc4

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 02 Sep 03:26
· 10 commits to develop since this release
Immutable release. Only release title and notes can be modified.
a040025

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 best_bid_ask 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.cancel_all_orders 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.manage_contingent_orders 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 generate_missing_orders=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 subscriptions racing instrument cache updates
  • Fixed Derive CancelAllOrders to use cached orders without refreshing venue state
  • Fixed Hyperliquid execution disconnect cleanup
  • Fixed Hyperliquid market order prices in order list submits
  • Fixed Interactive Brokers adaptive limit orders parsed as market orders (#4830), thanks @mameikagou
  • Fixed Interactive Brokers restored-order cancel callback routing (#4852), thanks @gapurov
  • Fixed L2/L3 matching against deleted book touches (#4819), thanks @SoYuCry
  • Fixed Lighter Plus and Premium quota metadata to match deployed account-tier limits
  • Fixed Lighter Testnet orders by omitting mainnet-only integrator attribution (#4834), thanks @Buff2out
  • Fixed OKX WebSocket submissions omitting reduceOnly (#4827), thanks for reporting @silarin
  • Fixed OKX ambiguous submissions, subscription recovery, and triggered child reconciliation
  • Fixed OKX conditional order identity, replay deduplication, and post-trigger cancellation
  • Fixed Polymarket user WebSocket subscriptions to cover all account orders and trades
  • Fixed Polymarket CancelAllOrders handling for empty caches and cross-strategy, instrument, and side scopes
  • Fixed Polymarket FAK no-match batch responses missing OrderRejected events
  • Fixed Polymarket market WebSocket heartbeats before initial subscription (#4864), thanks for reporting @mystic-io
  • Fixed Polymarket position pagination returning incomplete results at the offset limit (#4811), thanks @seungpyoson
  • Fixed Polymarket stale tick refreshes and mixed price precision (#4896), thanks for reporting @mystic-io
  • Fixed Tardis incremental L2 batches ending on exchange timestamps (#4872), thanks for reporting @szpony

Internal Improvements

  • Added Python memory leak checks for backtest, live node, model, and persistence lifecycles
  • Added strict Clippy audit tooling
  • Allowed DataActor implementations without native Component state
  • Improved model type boundary regression coverage
  • Improved nightly Clippy compatibility across Rust workspace checks
  • Improved OrderBook regression coverage
  • Improved Python Position lifecycle validation to raise ValueError for invalid fills
  • Improved Architect AX and Bybit initial WebSocket retries and cancellation (#4867), thanks @folknor
  • Improved Betfair stream lifecycle test synchronization (#4849), thanks @folknor
  • Improved dYdX retry timeout test coverage (#4835), thanks @folknor
  • Improved Lighter async task ownership across execution and WebSocket reconnects
  • Improved Polymarket auto-load and data task ownership across reconnects
  • Improved Polymarket reconciliation regression coverage (#4855), thanks @seungpyoson
  • Refined model fixed-point validation and wallet scaling
  • Refined OrderBook validation, snapshots, quotes, and display paths
  • Refined Python actor setup across runtime paths
  • Standardized Rust blocking locks on parking_lot
  • Optimized BacktestEngine processing when simulation modules and liquidation are disabled
  • Optimized IdsGenerator trade ID formatting
  • Optimized MatchingEngine L1 pending order queue scans
  • Optimized OrderMatchingEngine queue tracking and liquidity consumption
  • Optimized OrderBook L1 level reuse
  • Optimized risk, execution, and portfolio processing for accounts and positions with long histories
  • Optimized Betfair subscription test teardown (#4837), thanks @folknor
  • Optimized Hyperliquid startup reconciliation to skip inactive dexes (#4861), thanks for reporting @nah294
  • Optimized Polymarket quote parsing across WebSocket inputs
  • Upgraded Rust (MSRV) to 1.98.0
  • Upgraded Miri to nightly-2026-08-23
  • Upgraded cargo-hawk to v0.1.13
  • Upgraded shellcheck-py pre-commit hook to v0.11.0.1-1
  • Upgraded alloy crate to v2.4.1
  • Upgraded alloy-primitives crate to v1.7.1
  • Upgraded arrow crate to v59.2.0
  • Upgraded arrow-row crate to v59.2.0
  • Upgraded blake3 crate to v1.8.7
  • Upgraded databento crate to v0.60.0
  • Upgraded datafusion crate to v55.0.0
  • Upgraded either crate to v1.18.0
  • Upgraded log crate to v0.4.34
  • Upgraded parquet crate to v59.2.0
  • Upgraded uuid crate to v1.26.0
  • Upgraded maturin build backend and package (dev) to v1.15.0
  • Upgraded ruff package (dev) and pre-commit hook to v0.16.4
  • Upgraded simplejson package (visualization) to v4.1.1
  • Upgraded ty package (dev) to v0.0.74
  • Upgraded uvicorn package (dev) to v0.52.4

Documentation Updates

  • Updated maintained examples and tutorials for current APIs and removed unsupported variants
  • Documented behavioral model dispatch and native model extension boundaries
  • Documented Lighter Testnet account and API key setup
  • Documented OKX instrument cache reconciliation and WebSocket update behavior
  • Documented Polymarket quote sources and order book feed interaction
  • Documented Polymarket RTDS crypto TWAP delivery, reconnect, and conflict handling
  • Fixed broken OMS configuration link (#4877), thanks for reporting @aarushkandukoori

Artifact checksums

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

Artifact SHA256
nautilus_trader-2.0.0rc4-cp312-cp312-macosx_11_0_arm64.whl e3ce6445a6061882b24f300deac1f215559deb5e74607236436a307b2d2cd2fb
nautilus_trader-2.0.0rc4-cp312-cp312-manylinux_2_34_aarch64.whl 8a9f83521d90a6e7a994d040780523aa5e6c3a02ee2e7f239787e96f6ed59d10
nautilus_trader-2.0.0rc4-cp312-cp312-manylinux_2_34_x86_64.whl 8d3591aa4d86c7133be2115b1037ffadafb36449214d9973d496bdc80e21ad93
nautilus_trader-2.0.0rc4-cp312-cp312-win_amd64.whl b3374312d359af1d5e48e486645d895146079076dd79e052943ce447e5922602
nautilus_trader-2.0.0rc4-cp313-cp313-macosx_11_0_arm64.whl d9a6a87baa5132d7b898b117e5e0ae5e00d7b3d96da6731091335ae6a76ea0cf
nautilus_trader-2.0.0rc4-cp313-cp313-manylinux_2_34_aarch64.whl 5586de18c1626c77affce191319338f9064813cb8717a1f206c93cb6e9972bbb
nautilus_trader-2.0.0rc4-cp313-cp313-manylinux_2_34_x86_64.whl 0c97c4385d55833fc3cce4934ca48a2a5fa0ea1d69d0a775b88c2bbf6fb79005
nautilus_trader-2.0.0rc4-cp313-cp313-win_amd64.whl 2abdf7bf6c65c4c4e55835288507998c8102cdf6b9636ae5bb3ab585bd7576c2
nautilus_trader-2.0.0rc4-cp314-cp314-macosx_11_0_arm64.whl f0768d57ffef9491787330fa1890528c9c377b753bcd7369a87fbefea773679e
nautilus_trader-2.0.0rc4-cp314-cp314-manylinux_2_34_aarch64.whl ca778173a35a00294369dc905b0955dfe99455029695340e41ad690e72520969
nautilus_trader-2.0.0rc4-cp314-cp314-manylinux_2_34_x86_64.whl 4b6ea797edc8caadacc551356f07234e48b9a2c8d1ea57e5bde2dd3ecb35b106
nautilus_trader-2.0.0rc4-cp314-cp314-win_amd64.whl aa791350a57cc90aa5d17fa1623e5b4824c301c8d86bb56d74a16407159f0302
nautilus_trader-2.0.0rc4.tar.gz 090e325e4ee1e7b33b72f68e9a05f295ba10c3fafc4a8e6302e2af2e34cd8ba1

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