NautilusTrader 1.228.0 Beta
Released on 8th June 2026 (UTC).
Enhancements
- Added BSC chain support to blockchain adapter with
UniswapV3andPancakeSwapV3DEX registrations - Added Aerodrome Slipstream pool-event signatures and parsers for bootstrap and replay on Base
- Added Blockchain adapter
analyze-poolsCLI for batch DeFi pool snapshot hydration - Added structured
PoolProfilerErrorcarrying pool id, block, transaction/log index, and event kind - Added DeFi data (
DefiData) replay through the data and backtest engines as a first-classDatavariant - Added
BacktestEngine.add_defi_datafor replaying DeFi block, pool, and pool-event data in backtests - Added funding-rate catalog replay and
FundingSettlementhandling for backtests (Rust) - Added generic structured key-value fields to
LogLine(#4090), thanks @filipmacek - Added
correlation_idfield to trading and system command structs for request tracing (Rust) - Added checked mantissa/exponent constructors for
PriceandQuantity(Rust) - Added Cap'n Proto and adapter split propagation of trading command
correlation_id - Added
nautilus-plugincrate for loading separately compiled Rust cdylibs at live-node startup (Rust) - Added custom-data plug point via
PluginCustomDatatrait andnautilus_plugin!macro (Rust) - Added actor plug point via
PluginActortrait with lifecycle and data callbacks (Rust) - Added strategy plug point via
PluginStrategytrait withHostVTableorder-command surface (Rust) - Added plug-in
HostVTablecallbacks for cache, subscriptions, msgbus, and timers (Rust) - Added
PluginActorAdapterandPluginStrategyAdapterwrapping plug-in cdylibs as hostDataActor/Strategy(Rust) - Added
PluginLoader::with_hostso the live node can install a customHostVTablefor order-command routing (Rust) - Added
host_vtableandplugin_loaderhelpers binding submit/cancel/modify order to the strategy adapter (Rust) - Added
register_custom_data_from_manifestto register plug-in custom data withDataRegistryat load time (Rust) - Added
config_jsonargument to plug-increatethunks andPluginActor::new/PluginStrategy::new(Rust) - Added
DataEnginecontinuous futures historical bar requests and live bar subscriptions (Rust) - Added
DataEngineresponse bounds-trim and request-pipeline fan-in withRequestJoinsupport (Rust) - Added
DataEnginecatalog / client response-side request splitting (Rust) - Added
DataEnginecatalog orchestration for funding rates, custom data, and instruments (Rust) - Added
DataEnginetime-range pipeline support for long historical requests (Rust) - Added
DataEngineorder book deltas request and response with catalog/client split (Rust) - Added
DataEnginehistorical order book snapshot replay at UTC day boundaries (Rust) - Added support for mixed-instrument
OrderLists at the same venue (e.g. pairs, calendar spreads, multi-leg legs) - Added
OrderList.is_uniform_instrumentandOrderList.instrument_idshelpers (Python) - Added deny guard for mixed-instrument order lists submitted with a
position_id - Added portfolio PyO3 bindings and
Strategy.portfolioaccess (#4085), thanks @ms32035 - Added beta-weighted vega greeks against volatility index instruments (#4097), thanks @faysou
- Added native
OptionGreekspersistence and backtest replay support (#4132), thanks @Jonah-Chan - Added
StrikeRange.delta(...)to select option-chain strikes by target delta - Added deterministic liquidation engine for backtests (#4077), thanks @abhishektang
- Added configurable logging IO policies (#4158), thanks @sunlei
- Added Binance Futures liquidation custom data subscriptions (#4095), thanks @graceyangfan
- Added Binance Futures open interest request custom data (Rust) (#4109), thanks @graceyangfan
- Added Binance Spot JSON public market data mode (#4178), thanks @graceyangfan
- Added pending-resolution settlement pipeline for binary options (Rust) (#4101), thanks @graceyangfan
- Added
Serialize/Deserializederives forPositionEvent(#4199), thanks @filipmacek - Added Coinbase WebSocket
statuschannel subscription emittingInstrumentStatusevents - Added Coinbase Python v2 factory bindings and tester examples
- Added
CryptoFuturesSpreadandCryptoOptionSpreadinstrument types mirroringCryptoFuture/CryptoOption - Added Deribit
option_comboandfuture_comboparsing asCryptoOptionSpread/CryptoFuturesSpreadinstruments - Added Deribit combo trade leg parsing (
legs[],combo_id,combo_trade_id) on public trade messages - Added Deribit
get_last_trades_by_currencyHTTP endpoint for combo trade backfill - Added Deribit
get_expirationsHTTP endpoint for traded option-chain expirations - Added Deribit public
TradeIdprovenance prefix (RFQ-/BLK-/COMBO-) for block, RFQ, and combo trades - Added Deribit
subscribe_combo_legsopt-in for combo leg trade streams - Added Derive initial adapter (on-chain spot, perps, options)
- Added Derive WebSocket trading API support for submit, cancel, modify, and cancel-all actions
- Added Hyperliquid WebSocket trading API support for submit, cancel, modify, and cancel-all actions
- Added Hyperliquid HIP-4 outcome
BinaryOption.infowith parsed venue description and question metadata - Added Hyperliquid
HYPERLIQUID_ACCOUNT_ADDRESSenv var fallback forHyperliquidExecClientConfig.account_address - Added Hyperliquid live open interest custom data from
activeAssetCtx(Rust) (#4120), thanks @graceyangfan - Added Hyperliquid
allDexsAssetCtxscustom data subscriptions (#4136), thanks @graceyangfan - Added Kraken WebSocket rate limiting (#4093), thanks @filipmacek
- Added Lighter initial adapter (DEX: spot, perps)
- Added OKX
on_instrumentwrite-through so data-client instrument updates refresh exec caches without restart - Added OKX spread instrument discovery as
CryptoFuturesSpreadinstruments (Rust) - Added OKX Nitro spread order execution and reconciliation support (Rust)
- Added Polymarket adapter bounded-retry auto-load with
auto_load_max_retriesand exponential backoff with jitter (Rust) - Added Polymarket condition-level resolution for expired markets (#4164), thanks @graceyangfan
- Added Polymarket
new_marketfetch dedupe and bounded concurrency (#4185), thanks @graceyangfan - Added Polymarket
POLY_1271deposit-wallet signing support (#4053), thanks for reporting @sumuzhao and @sophyphilo - Added
shutdown_on_errorto stop Rust backtests and live nodes after error logs - Added Tardis option greeks ingestion to the catalog for backtest replay
- Added Tardis
extract_bbo_as_quotesto emitQuoteTickfromoption_summaryBBO fields
Breaking Changes
- Renamed custom-data field marker
jsontoserde(#4133), thanks @faysou - Removed live engine
graceful_shutdown_on_error; use node-levelshutdown_on_errorinstead - Changed
nautilus_pyo3.get_exchange_rateto returndecimal.Decimalinstead offloat - Changed DeFi pool-event and snapshot types to require
ts_event/ts_inittimestamps (was optionaltimestamp) - Changed
PoolProfiler::initializeandcheck_if_initializedto returnResultrather than assert - Changed command
newconstructors to acceptcorrelation_id: Option<UUID4>, passNonefor old behavior (Rust) - Changed
CVecto no longer implementSend; use typed wrappers for thread transfer (Rust) - Changed Hyperliquid HIP-4 outcome
InstrumentIdto{outcome_index}-{YES|NO}-OUTCOME.HYPERLIQUID - Changed Deribit
DeribitWebSocketClient.with_credentialsto acceptapi_key/api_secretafterenvironment - Changed order event
reconciliationanddue_post_onlyfromu8tobool(changes JSON/Arrow schemas) - Changed Deribit combos to land as
CryptoOptionSpread/CryptoFuturesSpreadinstead ofOptionSpread/FuturesSpread;FuturesSpread/OptionSpreadonce again guarantee whole-contract sizing - Changed
NautilusKernelConfig.timeout_connectiondefault from 120 to 60 seconds (#4179)
Security
- Added OpenSSF Scorecard workflow (#4187), thanks @pushkarm029
- Fixed DataFFI PyCapsules to reject mismatched types and prevent repeated
CVecdrops - Fixed thread-local registry access to avoid exposing global-lifetime actor and component refs
- Fixed
OrderBookDepth10FFI constructor to avoid unwinding across C ABI boundaries - Fixed
StackStr::from_c_ptr_checkedto returnNonefor null C string pointers
Fixes
- Fixed matching engine panic on mark price bars in Rust (#4189), thanks @po4yka
- Fixed raw value boundary constants in Rust (#4188), thanks @po4yka
- Fixed unbounded Cache
VecDequememory leak (Rust) (#4107), thanks @filipmacek - Fixed
Throttlersilently dropping buffered messages in buffer mode (Python v1) (#4221), thanks @santatic - Fixed
Cache.resetclearing FX rate lookup for retained instruments (#4159), thanks for reporting @dfjmax - Fixed
BacktestEngineoption positions remaining open when data stops before expiry - Fixed
BacktestEnginelosing latency-deferred commands at shutdown (Rust) (#4062), thanks for reporting @zhanghaoda - Fixed
BacktestEngineduplicate account state events on reset, thanks for reporting @dfjmax - Fixed calculated account state flag for cash and margin accounts (#4218), thanks @faysou
- Fixed
PortfolioStatistic.downsample_to_daily_binsto compound sub-daily returns (#4141), thanks @mahimn01 - Fixed missing
PortfolioStatistictrait methods returningNone(#4174), thanks @mahimn01 - Fixed matching engine not canceling unmatched IOC/FOK limit orders (Rust) (#4112), thanks for reporting @Jonah-Chan
- Fixed matching engine L1 slip-through for market orders exhausting top-of-book volume (Rust)
- Fixed multi-currency balance update violating
total == locked + free(#4165), thanks for reporting @qaxayuan - Fixed NETTING reconciliation opening phantom reduce-only positions (#4106), thanks for reporting @M-at-ti-a
- Fixed HEDGING margin scaling with fill count instead of net exposure (#4110), thanks for reporting @qaxayuan
- Fixed live reconciliation filtering for unclaimed external venue orders (Rust)
- Fixed
ExecTesteron_stop leaving INITIALIZED orders and bracket legs live across all cancel modes (Rust) - Fixed Aerodrome Slipstream
AmmTypefromStableSwaptoCLAMM - Fixed
PoolProfiler::update_positionto pre-validate active liquidity so failures leave pool state unchanged - Fixed
DefiDataEngineexposing zero-state pool profiler during snapshot bootstrap - Fixed pool profiler
AlreadyInitializederror when hypersync replay revisitsInitializeafter snapshot restore - Fixed deterministic catalog directory registration order (#4208), thanks @faysou
- Fixed
LiveNodesignal handling during startup connection wait (#4102), thanks @filipmacek - Fixed
NautilusKernelConfig.timeout_connectiondefault at 60 seconds (#4179), thanks for reporting @triyys - Fixed quarter bar volume precision (#4201), thanks @HaakonFlaaronning
- Fixed Python
ShutdownSystemdict serialization to round-tripcorrelation_id(was previously dropped) - Fixed Python v2 live trading deadlocks from timer callbacks and kept Polymarket instrument refreshes Rust-only
- Fixed Python v2 order-book wranglers writing raw fixed-point bytes in big-endian (needed little-endian) (#4111), thanks for reporting @fabz1
- Fixed Python v2 type stub generation failing to locate
libpythonunder uv-managed interpreters - Fixed Betfair adapter snapshot book deltas emitting zero-volume
Addentries (Rust) - Fixed Betfair adapter traded volume cache to handle bet voids and non-runner adjustments (Rust)
- Fixed Betfair adapter RCM custom data
ts_initparity between live and historical streams (Rust) - Fixed Betfair adapter overfill checks for rounded stream matched sizes (Rust)
- Fixed Betfair adapter unsupported unsubscribe commands logging above debug (Rust)
- Fixed Binance Futures algo params for trailing stops/reduce-only (#4192), thanks for reporting @luckykefu
- Fixed Binance Futures execution symbol format (#4182), thanks for reporting @luckykefu
- Fixed Binance Futures full-depth book startup after snapshot retries
- Fixed Binance Spot full-depth book startup after snapshot retries (#4181), thanks for reporting @graceyangfan
- Fixed Binance Spot full-depth books to seed diffs from REST snapshots
- Fixed Binance Spot JSON full-depth books to use REST-synced diff streams (#4181), thanks @graceyangfan
- Fixed Binance Spot SBE numeric parsing to reject invalid price and quantity values
- Fixed Binance status-unknown submits emitting phantom rejections (#4215), thanks for reporting @Centaur-pub
- Fixed BitMEX startup handling for crypto futures spreads, duplicate subscriptions,
USYCmargins, and account ID discovery - Fixed BitMEX order submission to deny unsupported GTD time-in-force locally
- Fixed BitMEX mark/index price updates on altcoin perps (#4147), thanks @filipmacek
- Fixed Blockchain adapter
analyze-pool --to-blockbounds during snapshot replay - Fixed Blockchain adapter caching a half-initialized
PoolProfilerwheninitializereturnsInitialTickMismatch - Fixed Blockchain adapter Multicall validation chunking and flash-event resume bounds
- Fixed Bybit linear/inverse
minNotionalValueparsing (#4216), thanks @filipmacek - Fixed Coinbase book snapshot deltas missing
F_SNAPSHOTflag in REST and WebSocket parsers - Fixed
CurrencyPair.asset_classfor crypto pairs (#4175), thanks @filipmacek - Fixed Deribit
DeribitExecutionClientnot forwarding config credentials to the WebSocket client - Fixed dYdX rate limiter being skipped due to missing keys (#4091), thanks @filipmacek
- Fixed Hyperliquid
Alolimit order status reports being parsed as trigger orders - Fixed Hyperliquid account balances for zeroed perp summaries (#4207), thanks @jungsooyun
- Fixed Hyperliquid balances preserving negative
totalRawUsd(#4177), thanks for reporting @jzheng2017 - Fixed Hyperliquid cancel-replace modify overfill on an in-flight fill (#4154), thanks for reporting @AlphaTraderK
- Fixed Interactive Brokers order submit to guard on client readiness (#4100), thanks @honvl
- Fixed Interactive Brokers order requests to guard on client readiness (Rust) (#4125), thanks @faysou
- Fixed Interactive Brokers Python
request_instrumentscache leakage (#4099), thanks @mahimn01 - Fixed Interactive Brokers
request_instrumentsreturning cumulative cache (Rust) (#4114), thanks @faysou - Fixed Interactive Brokers Rust orders routing to exchange MIC venues (#4129), thanks @faysou
- Fixed Interactive Brokers live bar reconnect tracking cleanup (#4169), thanks @faysou
- Fixed Interactive Brokers warmup
last_disconnection_ns(#4173), thanks @HKOWL - Fixed Kraken Futures
feeScheduleUiddeserialization to tolerate absence ahead of the 2026-06-22 Fee Schedules deprecation - Fixed Kraken Spot L2 snapshots and subscribed-depth pruning
- Fixed OKX
OKXExecutionClientnot forwarding config credentials to WebSocket clients (#4115), thanks @pusteckiy - Fixed OKX adapter to validate
clOrdIdrules before submission (#4116), thanks for reporting @pusteckiy - Fixed Polymarket adapter dropping auto-load batches on Gamma chunk failures (Rust)
- Fixed Polymarket Gamma market lookups to send repeated list query params (Rust)
- Fixed Polymarket adapter treating encoded-empty
clob_token_idsas terminal instead of transient (Rust) - Fixed Polymarket PyO3 bootstrap to honor
instrument_config(#4127), thanks @graceyangfan - Fixed sandbox cached account config after initial
AccountState(#4191), thanks @graceyangfan - Fixed Tardis CSV delta loaders missing book resets between consecutive snapshots
Internal Improvements
- Added
cargo machetepre-commit hook to detect unused workspace dependencies - Added cargo conventions check for stale
[package.metadata.cargo-machete]ignored entries - Added default log color signature (#4202), thanks @HaakonFlaaronning
- Added
try_liquidity_math_addreturning structuredLiquidityMathErroralongside the panicking variant - Added structured-error coverage tests for
PoolProfileroverflow/underflow paths and Display formats - Added round-trip tests for
correlation_idin Cap'n Proto, Arrow, and msgpack serialization - Added DEX event-signature/parser parity tests across all registered chains
- Added Derive fuzz targets
- Added option chain backtest replay tests for slice assembly and snapshot cadence
- Added Hyperliquid
flattenbinary that cancels working orders and closes perpetual positions - Added Hyperliquid Criterion bench groups for inbound pipeline, exec pipeline, and dispatch (Rust)
- Added OKX Criterion bench groups for inbound pipeline, exec pipeline, dispatch, and HTTP signing (Rust)
- Added Polymarket
auto_load_retry_delayhelper with exponential backoff and jitter (Rust) - Added Polymarket Criterion bench groups for inbound pipeline, exec pipeline, and signing (Rust)
- Enabled
unreachable_pubrustc lint workspace-wide to prevent dead public surface - Implemented OKX
DataClient::unsubscribe_instrumentoverride to silence missing-handler warning at teardown - Improved Portfolio calculations with
Decimalarithmetic (Rust) - Improved
RiskEngineper-order pre-trade checks to resolve each order's own instrument in mixed-instrument lists - Improved
ExecutionEngineto route own-order-book inserts per order for mixed-instrument lists - Improved Binance Spot SBE missing credentials error message (#4092), thanks @filipmacek
- Improved Coinbase
avg_priceparsing to validate viaDecimalbeforef64conversion - Aligned Derive and Lighter configs with workspace conventions (#4183), thanks @filipmacek
- Refined
OptionSpread/FuturesSpreadtrait accessors to readsize_precision/size_incrementfields - Refined Rust data engine to match Cython behavior (#4219), thanks @faysou
- Refined Hyperliquid adapter hot paths in WebSocket handler, parse, and signing modules
- Refined Interactive Brokers
nautilus-execution/nautilus-networkdeps behindexecutionfeature - Refined OKX adapter hot paths in WebSocket frame deserializer, book10 parse, and fee currency lookup
- Removed dead Hyperliquid WebSocket codec module
- Removed unused
async-streamandindexmapfromnautilus-interactive-brokersdependencies - Optimized common logging hot paths (#4150), thanks @sunlei
- Optimized datetime and UUID formatting (#4161), thanks @sunlei
- Optimized
AtomicMapsnapshot borrowing (#4162), thanks @sunlei - Optimized Derive signing and hot paths with benchmark report
- Optimized Hyperliquid signing and hot paths with benchmark report
- Optimized OKX hot paths with benchmark report
- Optimized portfolio
update_positionto avoid per-eventPositionclones (#4197), thanks @po4yka - Upgraded Rust (MSRV) to 1.96.0
- Upgraded Cython to v3.2.5
- Upgraded
databentocrate to v0.53.0 - Upgraded
rediscrate to v1.2.2 - Upgraded
sqlxcrate to v0.9.0
Documentation Updates
- Added plug-in concept guide covering the C-ABI boundary, manifest, lifecycle, and live-node integration
- Added event-sourcing concept guide covering capture, replay, snapshot recovery, and verifier behaviour
- Added concept-guide section on mixed-instrument order lists covering downstream caveats and OMS guards
- Added backtesting guide notes for funding settlement flows
- Added FFI and Rust unsafe-code guidance for
PyCapsuleownership and scoped TLS access - Added Polymarket integration guide notes for
POLY_1271deposit wallets - Refined
BacktestEngineshutdown notes withon_stopvenue-latency ordering and pre-stop fill caveats - Refined Coinbase integration guide for instrument-status, funding rate backlog, and order rejection wording
- Refined OKX integration guide with product capabilities and Nitro spread order notes
- Fixed
NautilusKernelConfigstate flag default docs (#4144), thanks for reporting @trikafi - Fixed
LatencyModelConfigbase latency unit comment (1 second) (#4170), thanks for reporting @phx000 - Fixed Polymarket crate README labelling separate Gamma and Data API endpoints
- Fixed Polymarket integration guide inaccuracies (Gamma vs Data API split,
determine_trade_idhash by adapter)
Deprecations
None
Artifact checksums
SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.
| Artifact | SHA256 |
|---|---|
| nautilus_trader-1.228.0-cp312-cp312-macosx_15_0_arm64.whl | e14cecd5480efb1b33f8a0faeb66bcc690e4f4d71baad3f205a8872fc6986f63 |
| nautilus_trader-1.228.0-cp312-cp312-manylinux_2_35_aarch64.whl | 949b77e8854988096ac3bf11a766bdb239332e1df3c86ac0c3518d62c7271682 |
| nautilus_trader-1.228.0-cp312-cp312-manylinux_2_35_x86_64.whl | 46bd4f8d719a960f3062b68ab8328be88e796f5bd102e79ea002cabe1e526d2b |
| nautilus_trader-1.228.0-cp312-cp312-win_amd64.whl | cfbba976a0ac882396a93b1c5a89a67392c6e98bfb888c54fb604cc61f7d9ba2 |
| nautilus_trader-1.228.0-cp313-cp313-macosx_15_0_arm64.whl | 281795b998278affc16a134e132c7cd9d3dcdf6a2ef0c9e24c22d34e61e0eff6 |
| nautilus_trader-1.228.0-cp313-cp313-manylinux_2_35_aarch64.whl | 232859bd16ff8e2c3e24b074189d62fbb0876db74008b6b7b18621a1587fc506 |
| nautilus_trader-1.228.0-cp313-cp313-manylinux_2_35_x86_64.whl | 997608689f5f87e8e08e18a9ab29fd20d468c2d5783a38106ff3a27fbc58c6c7 |
| nautilus_trader-1.228.0-cp313-cp313-win_amd64.whl | 3f5d86b873c648253b2f25e75f359ea4cd1a2f97c0d7de89efab9c8a1519c541 |
| nautilus_trader-1.228.0-cp314-cp314-macosx_15_0_arm64.whl | 9d599000940fbdacb18ba0f2baf1cc9254eadfa6bf14da63ead13e5c6efc92d0 |
| nautilus_trader-1.228.0-cp314-cp314-manylinux_2_35_aarch64.whl | 0e5cf89eeeb9ca00ebc11c43c7911c0f17ec197378ada603eb2ac84dffd07b15 |
| nautilus_trader-1.228.0-cp314-cp314-manylinux_2_35_x86_64.whl | 78bba92b73eba716bd894023ac161b4a4174aa5fc1346ae8ed21c5d01fb313ee |
| nautilus_trader-1.228.0-cp314-cp314-win_amd64.whl | 8a7df87fada86bc3e5055a57957b4c276194c00975e9c6815760859edf2cd3de |
| nautilus_trader-1.228.0.tar.gz | 1708eec65aa57135883720cd53643a2d36cc186802a91d1e725bd36d283fc7a7 |
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.comRelease completion note
The automated publish-release-integrity job did not complete for this release. Cargo crate publishing was recovered after manually publishing these crates with a short-lived crates.io token: nautilus-analysis, nautilus-common, nautilus-execution, nautilus-lighter, nautilus-network, nautilus-portfolio, nautilus-testkit, and nautilus-trading. Those crate versions therefore show crates.io published_by metadata rather than Trusted Publishing metadata. The final integrity assets, including crates-manifest.json and attestation sibling files, were attached manually after PyPI/Sigstore verification continued to fail on CI despite the affected wheel verifying locally.