Releases: nautechsystems/nautilus_trader
Release list
NautilusTrader 1.230.0 Beta
NautilusTrader 1.230.0 Beta
Released on 29th June 2026 (UTC).
Enhancements
- Added v2 Python visualization (tearsheet) support with a
visualizationextra - 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
LiveNodeshutdown path (Rust) - Added
with_clock_factoryfor 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_storeformat; beta v1.227-v1.229 stores must be regenerated (#4330), thanks @folknor - Changed
Throttlerrate limit fields to non-zero accessors instead of public fields (Rust) - Renamed Bybit data config
instrument_status_poll_secstoinstrument_poll_interval_secs
Security
- Fixed unbounded HTTP response buffering that could exhaust memory (#4332), thanks @AlaeddineMessadi
- Removed direct
bincodeuse fromevent_storeon-disk envelopes (#4330), thanks @folknor
Fixes
- Fixed
LiveTimertasks leaking after clock drop or component teardown (#4322), thanks @filipmacek - Fixed Strategy order-list cache visibility for live handlers (Rust)
- Fixed Rust strategy
oms_typeregistration for custom HEDGING position IDs (#4327), thanks for reporting @dxwil - Fixed duplicate realized PnLs in post-run analysis (#4344), thanks for reporting @a1zb2yc3z
- Fixed
RateOfChangeperiod window and log calculation (#4326), thanks @Martingale42 - Fixed
VerticalHorizontalFilterandOnBalanceVolumeperiod 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_HALTcontract 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
OrderMatchingEnginepost-match actions to avoid cloning resting orders (Rust) - Optimized
OrderMatchingEngineno-match GTD and trailing-order paths (Rust) - Optimized Databento adapter decode and loader paths (Rust)
- Optimized
Throttlerhot 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_barscallback 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
Artifact checksums
SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.
| Artifact | SHA256 |
|---|---|
| nautilus_trader-1.230.0-cp312-cp312-macosx_15_0_arm64.whl | 033f6207d1c52095d64a7644f43b90cab939c2038044db70a4165f2acef3d079 |
| nautilus_trader-1.230.0-cp312-cp312-manylinux_2_35_aarch64.whl | de69df04918ad52095dca2e462f2e1e7755a53e74df13f35de9631ef71513beb |
| nautilus_trader-1.230.0-cp312-cp312-manylinux_2_35_x86_64.whl | 8f4ff2e8af10e93ed643496eb62999b00558085f0e0bff17fc76e08809ba91b9 |
| nautilus_trader-1.230.0-cp312-cp312-win_amd64.whl | 9420b151e92a504841b7fc768ba937dc7f3bffe387096215f39b83c6fcda27e8 |
| nautilus_trader-1.230.0-cp313-cp313-macosx_15_0_arm64.whl | af8a83f7cabb91460dcf5b966259eab1f4edee7f5bba965119e70c06a876e997 |
| nautilus_trader-1.230.0-cp313-cp313-manylinux_2_35_aarch64.whl | 8143907c667fda91bb6466c02ff2ec9f6389aa2fcc35fb0843e75a2ab4e4bfa8 |
| nautilus_trader-1.230.0-cp313-cp313-manylinux_2_35_x86_64.whl | b5755ae5057b260827404aef23c3051969107d6724dd8c525f17301c9c5b24c0 |
| nautilus_trader-1.230.0-cp313-cp313-win_amd64.whl | 8817c46dc34e0aafc606948aacf1dd0fbbe1a31273c8a2f20983cf4ab2ddeef1 |
| nautilus_trader-1.230.0-cp314-cp314-macosx_15_0_arm64.whl | 4163833dc3b930d3f8a6f769eb2e7d6422c144d0db748d63ac0e5fdb1f4842b5 |
| nautilus_trader-1.230.0-cp314-cp314-manylinux_2_35_aarch64.whl | 94b0e9180a4e023f80c3e000f2039976d346387fff40987cb3525e6c11873e3f |
| nautilus_trader-1.230.0-cp314-cp314-manylinux_2_35_x86_64.whl | 2178899b700050f931d94ab11a23bcbc4d506b200b387827431e7d6eb0cd1e44 |
| nautilus_trader-1.230.0-cp314-cp314-win_amd64.whl | 57f814d13947169538f8cedc881db72e7dc4320626c5a3f37b9ce36ed5527720 |
| nautilus_trader-1.230.0.tar.gz | cc7eaa247e640e46588094fcca44f34f4b6330eeec41e9247068f2500921757d |
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.comNautilusTrader 1.229.0 Beta
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_currencywithCurrencyLookupErrorfor typed missing-currency lookups (Rust) - Added
Cache::try_instrumentwithInstrumentLookupErrorfor typed missing-instrument lookups (Rust) - Added
Cache::try_orderwithOrderLookupErrorfor typed missing-order lookups (Rust) - Added negative price support for
Commodityinstruments 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-dexvalidation that fails before sync for unsupported DEXes - Added
ProbabilityPriceFeeModeland configurable sandbox fee models (#4262), thanks @graceyangfan - Added SEC1 EC private key support to socket TLS configuration (Rust)
- Added
order_position_indexPostgres table for the order-position index; runmake init-dbto migrate - Added
add_native_exec_algorithmandExecutionAlgorithmConfigbindings to the Python v2 backtest engine - Added
Order::to_order_status_reportconversion in Rust - Added
with_msgbus_publisherfor 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, andRedisMessageBusConfigfor Rust factories - Added Python v2
Strategy.order_factoryaccessor and validatingOrderFactorybindings - Added PyO3 cache purge APIs (#4249), thanks @graceyangfan
- Added PyO3 instrument
tick_schemefields with Arrow persistence - Added Binance Futures
bnfcr_currencyconfig for Credits Trading Mode - Added Binance Futures funding-rate history support in Rust
- Added Binance Futures
MIN_NOTIONALparsing formin_notional(#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
standpsfields (Python and Rust) - Added
BitmexInstrumentState::Unknownto 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
venue_dataset_mapto 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_chainCSV loading, streaming, and catalog conversion - Added Uniswap V3
SetFeeProtocolindexing so replayed snapshots carry the correctfee_protocol; runmake init-db - Added Uniswap V3
CollectProtocolindexing so pool snapshots track protocol-fee balances; runmake init-db
Breaking Changes
- Changed backtest config builders to validate on
build()and returnConfigResult(Rust) - Changed
BacktestDataConfigto require aninstrument_id,instrument_ids, orbar_typestarget - Changed example strategy and actor configs to use bon
builder()instead ofnew()/with_*(Rust) - Changed Rust actor
self.clock()to returnClockApi; call methods directly instead of borrowing - Changed Rust actor/strategy core access; use macros or native traits instead of
Deref - Changed PyO3
DataActor/Strategyhistorical requeststart/endto require UTC datetimes - Changed Python
NautilusDataTypeenum order to putOptionGreeksbeforeInstrumentStatus - Changed cache database and message bus backing construction to use factory-owned config structs (Rust)
- Changed
CacheDatabaseAdapter::load_index_order_positionto 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
SerializationEncodingrepr order toJson=0,MsgPack=1,Capnp=2,Sbe=3 - Changed Cap'n Proto
DataAnyordinals to putOptionGreeksbefore instrument schemas - Changed SBE
DataAnyvariants and template IDs to putOptionGreeksbefore instrument schemas - Changed
Currency::from_strandCurrency::is_*to returnCurrencyLookupErrorinstead ofanyhow::Error(Rust) - Changed
InstrumentIdandOptionSeriesIdstring constructors to return typed errors (Rust) - Changed
OrderAny::from_eventsto returnOrderReplayErrorinstead ofanyhow::Error(Rust) - Changed
OrderList::validateto returnOrderListValidationErrorinstead ofanyhow::Error(Rust) - Changed
SyntheticInstrumentfallible methods to returnSyntheticInstrumentErrorinstead ofanyhow::Error(Rust) - Changed tick scheme constructors and parsing to return
TickSchemeErrorinstead ofanyhow::Error(Rust) - Changed Parquet catalog write APIs to take borrowed slices instead of owned
Vec(Rust) (#4296), thanks @sunlei - Changed WebSocket and socket
reconnect_timeout_msto bound only connection establishment (Rust) - Changed plug-in loader to reject build mismatches by default; opt out with
set_allow_build_mismatch(Rust) - Changed Binance Spot SBE WebSocket API schema to version 3:4, matching generated codecs (Rust)
- Changed Blockchain
PoolProfiler.price_sqrt_ratio_x96to returnintinstead ofstr - Changed Bybit
BybitHttpClient::submit_orderto take trailing native TP/SL params; PyO3 defaults toNone - Removed
CacheConfig.databaseandMessageBusConfig.backing; pass adapters separately - Removed common
DatabaseConfigandMessageBusBackingConfig; use Redis/Postgres configs - Renamed message bus database terminology to backing in Rust message bus APIs
- Renamed
add_native_actortoadd_builtin_actorfor bundled example actors - Renamed
add_native_strategytoadd_builtin_strategyfor bundled example strategies - Renamed Rust/PyO3 instrument
tick_scheme_nametotick_scheme; Cython keepstick_scheme_name - Renamed
BitmexInstrumentType::StockPerpetualtoTradFiPerpetual(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
Panicerrors instead of aborting the node on engine panics (Rust) - Fixed plug-in
create,clone_handle, anddrop_handlepanics 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
dlcloseinitialized 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 account-currency PnL stats for NETTING accounts reusing a
PositionIdacross cycles (#4294), thanks @faysou - Fixed account-currency trade PnL stats for foreign-currency instruments (#4211), thanks @faysou
- Fixed blocking Python HTTP functions holding the GIL for the full request duration
- Fixed custom
DataTypemetadata ordering and shared custom-data unsubscribes (Rust) - Fixed data option-chain delta warmup
- Fixed
DataEnginesynthetic bar subscriptions with multiple venue clients (#4279), thanks for reporting @HSGartley - Fixed DeFi pool profiler swap replay diverging from on-chain state at MIN/MAX-tick boundary swaps (Rust)
- Fixed DeFi replay bootstrap gaps in
PoolSwappayload exposure, block timestamp units, and actor IDs (Rust) - Fixed
DonchianChannelperiod window (#4239), thanks @KaizynX - Fixed event-store boot recovery to repair hard-crashed run files and skip damaged ones instead of failing (Rust)
- Fixed event-store capture duplicating order events, commands, and account states across dispatch hops (Rust)
- Fixed event-store snapshot-anchor validation across the verifier, retention, and restore paths (Rust)
- Fixed event-store replay, scan, marker, and halt-signal edge cases around skipped events, gaps, and reruns (Rust)
- Fixed HTTP client errors discarding the underlying cause from the reqwest source chain (Rust)
- Fixed
HttpClientrejecting invalid response header keys instead of silently dropping them (Rust) - Fixed
Instrumentrejecting negativemin_price, preventing spread instruments from loading in Python - Fixed live external order claim registration in Rust
- Fixed live reconciliation logging below-cached fill mismatches as errors, halting
shutdown_on_errornodes (Rust) - Fixed live reconciliation logging transient venue report-query failures as errors (Rust)
- Fixed live reconciliation synthesizing phantom cancels on cancel-replace venues (#4288), thanks @filipmacek
- Fixed local catalog queries and backtests for non-ASCII i...
NautilusTrader 1.228.0 Beta
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...
NautilusTrader 1.227.0 Beta
NautilusTrader 1.227.0 Beta
Released on 18th May 2026 (UTC).
Enhancements
- Added continuous futures support for aggregated bars (#3921), thanks @faysou
- Added
purge_instrumentcache method for trimming unused instruments (#3945), thanks for reporting @fedoraiver - Added
LoggerConfig.file_configandclear_log_filesupport to the RustLiveNoderuntime (#3955), thanks @filipmacek - Added
LoggerConfigPython constructor for direct construction withoutfrom_spec(#3955), thanks @filipmacek - Added
limit_aggressiveandtest_modify_rejectedflags toExecTesterConfigfor marketable/modify-rejection tests - Added
CompositeMarketMakerexample strategy with book-mid quoting and synthetic-signal skew (Rust) - Added
#[custom_data_field(json)]for JSON-backed Arrow Serde fields and PyO3IndexMap/HashMapdict conversion (#4003), thanks @faysou - Added
priorityparameter toDataActor.subscribe_signalfor ordered dispatch between subscribers (Rust and PyO3) - Added
Cache::order_ownedreturning an ownedOrderAnysnapshot for boundary handover (Rust) - Added
Cache::account_mut,account_owned,account_for_venue_ownedwithAccountRefMut/AccountAnyreturns (Rust) - Added
Cache::position_mutandposition_ownedwithPositionRefMut/Positionreturns (Rust) - Added
PortfolioSnapshotevent for per-account mark-to-market emission, gated bysnapshot_interval_ms(Rust) - Added
Portfolio::build_snapshotandPortfolio::snapshotsaccessors with a bounded per-account ring (Rust) - Added
subscribe_portfolio_snapshotandpublish_portfolio_snapshotmessage bus API onevents.portfolio(Rust) - Added
subscribe_positionsmessage bus function (Rust) - Added
InstrumentId::parse_parent_componentsandInstrumentClassparent suffix conversion methods, exposed via PyO3 (Rust) - Added serde
Deserializesupport forLiveNodeConfigand adapter client configs to enable loading from TOML - Added Betfair Rust adapter post-reconnect mass-status reconciliation that halts submits via
STREAM_RECONCILING - Added Betfair Rust adapter
stream_gap_recovery_lookback_minsconfig for the reconciliation lookback window - Added Binance Spot
expiryReasonfield capture on schema 3:4 SBE order responses (Rust) - Added Binance Spot
serverShutdownevent handling on market-data and trading WebSocket streams (Rust) - Added Binance USDM mark price moving average (
ap) field onBinanceFuturesMarkPriceMsg(Rust) - Added Bybit hedge-mode venue position IDs for order, position, and fill events
- Added Bybit BBO order support for linear and inverse limit-style orders
- Added Bybit
flattenbinary that cancels working orders and flattens Linear/Inverse positions - Added Bybit instrument-info
symbolId,symbolType(withxstocks/stock/forex/commodity), and spotxstockMultiplierfields (Rust) - Added Bybit position
openTimefield on RESTBybitPositionand WSBybitWsAccountPosition(Rust) - Added Bybit
execution.fastprivate WebSocket channel support with slim payload struct andFillReportdispatch (Rust) - Added Coinbase liquidation/ADL warning on forced-close order events
- Added Coinbase CFM liquidation buffer warning when buffer drops below 20%
- Added Databento
set_price_precisionandget_price_precisionsmethods on the data loader and historical client - Added Deribit
auto_load_missing_instrumentsconfig flag to lazy-load uncached instruments on subscribe - Added Deribit DVOL custom data subscriptions (#4069), thanks @graceyangfan
- Added dYdX historical funding rate requests via the
request_funding_ratesHTTP method and PyO3 binding - Added Hyperliquid HIP-4 outcome instruments:
+E/#Eencoding, USDH settlement, and per-side BinaryOption modeling - Added Hyperliquid HIP-4 outcome reconciliation via spot balances;
outcomeMetasettlement dispatch on the Rust client - Added Hyperliquid HIP-4
userOutcomeactions (split, merge, mergeQuestion, negate) and venueSettlementfill parsing - Added Hyperliquid
allMidscustom data subscriptions with optional dex metadata (#4067), thanks @graceyangfan - Added Kraken Spot margin trading support (#3965), thanks @mcgrj
- Added Kraken Spot L3 order book support via WebSocket v2 (#4041), thanks @mcgrj
- Added Kraken Spot WebSocket v2 order submission (#4007), thanks @mcgrj
- Added OKX X-Perp (
ruleType=xperp) futures support with funding-rate subscriptions - Added OKX
slippagePctparameter for market orders via theslippage_pctorder param - Added OKX event contracts support
- Added Polymarket
OrderStatusReport.filled_qtydust snap at terminalFilledstatus to absorb venue truncation - Added Polymarket
PolymarketFeeModelbacktest fee model with maker-rebate inference - Added Polymarket
PolymarketDataLoader.sanitize_infoflag to strip resolution fields on resolved markets
Breaking Changes
- Removed legacy adapter environment flags per previous deprecation; use
environmentenum - Removed
From<OrderInitialized>for order types; useTryFromto surface invariant errors viatry_from/try_into - Removed Polymarket
SNAP_UNDERFILL_ULPSandSNAP_OVERFILL_ULPS; reverting to singleDUST_SNAP_THRESHOLDconstant - Removed stale Tardis
crypto-com-derivativesexchange variant - Renamed Binance and Kraken environments from
Mainnet/MAINNETtoLive/LIVE - Renamed
time_bars_originsconfig param totime_bars_origin_offsetinDataEngineConfig/LiveDataEngineConfig(Rust) - Renamed
Cache::mut_ordertoorder_mut; takes&mut Cacheand returnsOrderRefMut<'_>(Rust) - Changed
Cache::orderandorders_*to returnOrderRef<'_>(newtype borrow, was&OrderAny) (Rust) - Changed
Cache::account,account_for_venue,accountsto returnAccountRef<'_>(was&AccountAny) (Rust) - Changed
Cache::position,position_for_order,positions_*to returnPositionRef<'_>(was&Position) (Rust) - Changed
Cache::take_accountto move the account out of its cell and panic on alias instead of cloning (Rust) - Changed to deny
submit_order/submit_order_listwith a customposition_idunderNETTINGOMS; useHEDGINGfor custom position IDs - Changed JSON log file extension from
.jsonto.jsonl; update log shippers watching.json(#3955), thanks @filipmacek - Changed Python order
create()methods to raiseValueErroron invalidOrderInitializedinstead of panicking - Changed default
TransportBackendtoSockudo; setbackend = Tungsteniteto keep the previous default - Changed
nautilus-networkdefault Cargo features to includetransport-sockudo - Changed
nautilus-modelarrowto an optional feature; enablearrow(orpython-arrow) for prior behavior (#4008), thanks @sunlei - Changed
OrderMatchingEngineConfigdefaults to match the Cython per-engine constructor (Rust) - Changed
Strategyorder methods to takeOption<Params>to avoid unnecessaryIndexMapallocations (Rust); useNoneorSome(params) - Changed
Strategy::cancel_orderandmodify_orderto takeClientOrderIdinstead ofOrderAny(Rust v2) - Changed
Strategy::cancel_ordersto takeVec<ClientOrderId>instead ofVec<OrderAny>(Rust v2) - Changed Rust strategy registration to append
order_id_tagto explicit strategy IDs, matching Cython - Changed Binance Futures to prefer
DEMOendpoints for simulated trading - Changed Databento data loaders to error on unresolved precision; pass
price_precisionor callset_price_precision - Changed Kraken Spot to reject
DEMO; demo remains Futures-only - Changed
nautilus_core::from_pydictfromPy<PyDict>to&Py<PyDict>to avoid moving the input dict (Rust) (#4003), thanks @faysou - Changed
DataActor::subscribe_signalto takepriority: Option<u32>; existing callers must passNone(Rust) - Changed message bus subscription
priorityfromu8tou32to match Cythonint priorityparity (Rust) - Changed
OrderFactory::bracketto abonbuilder with per-legentry_*/tp_*/sl_*setters; usefactory.bracket()...call()(Rust)
Security
- Added Sigstore SBOM attestation for Docker container images at the published digest
- Added CI smoke tests verifying wheel, sdist, and Docker image signatures after publish
- Removed long-lived
PACKAGES_TOKENPAT in favor of per-job GHCRGITHUB_TOKEN - Hardened CI release signing chain: pinned cosign tooling,
harden-runneron merge jobs - Hardened nightly-merge auth by storing token in git extraheader rather than remote URL
- Hardened PyPI publishing with OIDC trusted publishing, eliminating long-lived API tokens
- Hardened Python deps: pinned every third-party package in
[tool.uv].no-build-packageso lost wheels failuv locknot build sdist - Upgraded
urllib3to v2.7.0 (GHSA-mf9v-mfxr-j63j decompression-bomb bypass, GHSA-qccp-gfcp-xxvc cross-host proxy header leak) - Fixed
DatabaseConfigrepr to fully redact passwords (#4028), thanks @faysou - Documented Sigstore signature and SBOM verification commands in
SECURITY.md
Fixes
- Fixed
RefCellreentrancy panic inExecutionEngine::handle_order_fillfor OTO parent fills (#3981), thanks for reporting @GreatLandmark - Fixed
RefCellreentrancy inExecutionEngine::load_cachenestedborrow_mutcalls - Fixed
RefCelldouble-borrow panic inPortfolio::update_positionwhencalculate_account_stateis true - Fixed identifier deserialization inside
#[serde(tag = "type")]enums andserde_json::ValueviaCow<'de, str>owned-string support - Fixed
AccountsManager::update_balancesdiscarding recalculated balances by mutating a dropped clone - Fixed margin account balance not applying realized price PnL on close and reversal fills (#4056), thanks @faysou
- Fixed Rust portfolio account event clone overhead (#4004), thanks for reporting @magnified103
- Fixed margin
AccountStateevents emitting empty balance...
NautilusTrader 1.226.0 Beta
NautilusTrader 1.226.0 Beta
Released on 29th April 2026 (UTC).
Enhancements
- Added
Portfolio::mark_values,equity, andmissing_price_instrumentsqueries for Rust and Python - Added
instrument_status/instrument_statusescache queries and auto-caching in the data engine (#3858) - Added
environmentenum config for BitMEX, Deribit, dYdX, Hyperliquid, and OKX adapters - Added
BybitEnvironmenttoBybitDataClientConfigandBybitExecClientConfig - Added missing config values to
LiveExecEngineConfig(#3841), thanks @Javdu10 - Added
calculate_commissiontoExecutionClientfor venue-specific reconciliation fills - Added PyO3 bindings for
DataEngineConfig,ExecutionEngineConfig, andOrderEmulatorConfigso they can be constructed from Python - Added
cache,msgbus,data_engine,exec_engine, andportfoliokeyword arguments toBacktestEngineConfigPython constructor - Added
MarginAccount.margin_for_currency+margin_init/maint_for_currencyhelpers for cross-margin queries - Added
MarginAccount.total_margin_init(currency)/total_margin_maint(currency)summing both margin buckets - Added
MarginAccount.account_margins,account_margins_init/maint, andclear_account_marginaccessors - Added
transport-sockudofeature withTransportBackendruntime selector for the WebSocket transport (Rust) - Added
TransportBackendPyO3 enum andWebSocketConfig.backendkwarg for backend selection from Python - Added custom upgrade-header support on the sockudo backend so adapters carry the same
User-Agentand per-venue headers on both backends (#3932), thanks @sunlei - Added
WebSocketConfig.proxy_urlfor HTTPCONNECTproxy tunneling with basic-auth support - Added Betfair tiered tick scheme to
BettingInstrumentfor ladder-snapped pricing - Added Binance Futures
use_trade_liteconfig to opt into low-latencyTRADE_LITEfills (Rust, defaultFalse) - Added Binance
proxy_urlplumbing for market and user-data WS streams (#3937), thanks for reporting @huangqingchi - Added Bybit user-related endpoints (#3894), thanks @sunlei
- Added Bybit
BybitPositionIdxenum andbybit_resolve_position_idxPyO3 helper - Added Coinbase initial integration adapter (Rust)
- Added
DydxNetworkre-export on thenautilus_trader.adapters.dydxpackage - Added Hyperliquid historical funding rates via
fundingHistoryinfo endpoint - Added Hyperliquid configurable MARKET slippage (
market_order_slippage_bps) with per-order override - Added Hyperliquid
OrderBookDepth10subscription backed by thel2Bookfeed - Added Hyperliquid
nSigFigs/mantissaL2 precision controls viasubscribe_params - Added Interactive Brokers Rust adapter with PyO3 compatibility layer (#3864), thanks @faysou
- Added Kraken xStocks tokenized asset support for spot market data, order submission, and futures instruments
- Added OKX option greeks support for both Black-Scholes and price-adjusted conventions on every tick
- Added OKX
params["greeks_convention"](string or list) to narrow option greeks subscriptions - Added OKX
transport_backendconfig to switch websockets betweenTungsteniteandSockudobackends - Added Polymarket game_id and fee_schedule to instrument info (#3811), thanks @Javdu10
- Added Polymarket batch
SubmitOrderListviaPOST /ordersfor limit-order batches (Rust) - Added Polymarket WebSocket
idle_timeout_msfor zombie detection (#3908), thanks for reporting @camarigor - Added Polymarket WebSocket
proxy_urlplumbing - Added Polymarket
pUSDcollateral currency (Currency::pUSD()in Rust,pUSDin Python) for the CLOB V2 cutover - Added configurable
compressionfor Tardis Machine replay, defaulting tozstd - Added
ExecutionReport::OrderWithFillsandsend_order_with_fillsemitter for bundled status + fill reconciliation - Added ADL / liquidation detection and logging across Binance, Bybit, OKX, BitMEX, Hyperliquid, Deribit, and dYdX
- Added Binance Futures COIN-M
delivery_autoclose-prefix recognition for expiring contract auto-close events - Added Bybit
adlRankIndicatorwarning log when an open position is ranked 4 or higher (next to deleverage) - Added Hyperliquid liquidation metadata logging on fills and
userEvents.liquidationrouting - Added Hyperliquid
Auto-Deleveragingfill detection with warn logging on HTTP and WebSocket paths
Breaking Changes
- Added
Option<&AccountId>to RustPortfolio::unrealized_pnls,realized_pnls,total_pnls; passNoneto keep prior behavior - Added
backend: TransportBackendtoWebSocketConfig; struct-literal callers must add the field (Rust) - Added
proxy_url: Option<String>toWebSocketConfig; struct-literal callers must add the field (Rust) - Migrated Polymarket adapter to CLOB V2: new EIP-712 domain version
2, new exchange contract addresses,timestamp/metadata/builderorder fields replacetaker/nonce/feeRateBps, and pUSD replaces USDC.e as collateral; the Python adapter now usespy-clob-client-v2 - Consolidated adapter HTTP and WebSocket proxy plumbing onto a single
proxy_urlfield, replacing the priorhttp_proxy_url/ws_proxy_urlsplit across adapter Rust and Python configs - Removed
DockerizedIBGatewayConfig::from_env_or_defaults(Rust); use the bon builder orDefault::default, which still falls back toTWS_USERNAME/TWS_PASSWORD - Removed
OrderMatchingEngineConfig::newandwith_price_protection_points(Rust); useOrderMatchingEngineConfig::builder()instead - Removed
BlockchainDataClientConfig::new,BlockchainExecutionClientConfig::new, andDexPoolFilters::new(Rust); use the corresponding::builder()instead - Removed
DeribitExecClientConfig::newandHyperliquidExecClientConfig::newconvenience constructors (Rust); use the::builder()instead - Removed
DataEngineConfig::new12-arg positional constructor (Rust); useDataEngineConfig::builder()instead - Removed synthetic
ACCOUNT-*placeholders from margin adapters;MarginBalanceemits with currency only - Removed
nautilus_system::factoriesmodule; import factory traits fromnautilus_common::factories(Rust) - Removed
indicatorsfromnautilus-commondefault features; enable withfeatures = ["indicators"](Rust) - Renamed Python
DatabaseConfig.timeouttoconnection_timeoutandresponse_timeoutto match the Redis/PyO3 wire schema - Replaced
is_sandbox: boolwithenvironment: AxEnvironmentonAxDataClientConfigandAxExecClientConfig(Rust and Python), aligning with the Binance/Bybit/Kraken adapter pattern. Default isSandbox. - Changed
BacktestEngine::add_venueandSimulatedExchange::new(Rust) to takeSimulatedVenueConfig(bon builder) - Changed Interactive Brokers Rust configs to use bon builders:
InteractiveBrokersDataClientConfig,InteractiveBrokersExecClientConfig,InteractiveBrokersInstrumentProviderConfig, andDockerizedIBGatewayConfig - Changed
get_cached_bybit_http_clientsignature: replaceddemo/testnetbools withenvironment: BybitEnvironment - Changed
UnsubscribeBookSnapshotsto requireinterval_msfor exact snapshot interval unsubscribe (Rust) - Changed
OrderError::Invariantvariant to wrapCorrectnessErrorinstead ofanyhow::Error(Rust) - Changed
HyperliquidEip712Signer::new()to returnResultand take&EvmPrivateKey(Rust) - Changed
HyperliquidExchangeRequest::new/with_vaultto acceptHyperliquidSignaturedirectly (Rust) - Changed Binance USD-M Futures WebSocket URLs from
/wsto/market/wsand/private/ws - Changed Cap'n Proto and SBE wire formats to preserve
Optionstate (unstable, may change) - Changed Python and Serde-backed Rust config decoding to reject unknown fields, so stale or misspelled keys now fail fast during config parsing
- Changed
MarginBalance.instrument_idto optional;Nonemarks account-wide (cross margin) entries keyed by currency - Changed
MarginAccount.margins_init/margins_maintto per-instrument only; useaccount_margins_*for cross margin - Changed Binance Futures COIN-M to emit one
MarginBalanceper base coin (previously hardcoded USDT) - Changed matching-engine
TradeIdformat toT-{hash}-{count}from{venue}-{raw_id}-{count};ts_init-keyed - Changed
use_random_idsto no longer governTradeId; flag still affectsVenueOrderIdandPositionId - Changed workspace
nautilus-livetodefault-features = false; enablefeatures = ["node"]forLiveNode(Rust) - Changed adapter
LiveNodeexamples to require--features examplesto build (Rust) - Changed
ParquetDataCatalog::to_object_pathandto_object_path_parsedto returnanyhow::Resultso cross-store URIs surface as errors instead of silently rewriting against the catalog bucket (Rust) - Changed prefixed remote catalogs (
s3://bucket/base/path, etc.) to read and write under their declared URI prefix; data previously written to the bucket root by the prior buggy behavior will not be discovered after upgrading and must be moved into the prefix (#3930)
Security
- Hardened Binance Ed25519 credential detection so base64 HMAC secrets no longer pass as Ed25519 keys (Rust)
- Hardened Binance HTTP request signing by URL-encoding Ed25519 signatures in query strings (Rust)
- Replaced the third-party
urlencodingcrate with the in-treenautilus_core::urlencodingto shrink the supply-chain surface (Rust) - Bumped pinned SHAs for security-relevant GitHub Actions (
harden-runner,codeql-action,setup-uv,setup-rust-toolchain) to current upstream releases - Refreshed
cargo-denyandosv-scanneradvisory configuration; removed the stalepygmentsadvisory ignore now that upstream is patched
Fixes
NautilusTrader 1.225.0 Beta
NautilusTrader 1.225.0 Beta
Released on 6th April 2026 (UTC).
Enhancements
- Added option chains and greeks in Rust (#3637), thanks @filipmacek
- Added option chains and greeks in Python (#3677), thanks @filipmacek
- Added cached futures-spread support to
GreeksCalculator(#3792), thanks @faysou - Added custom data registration, persistence, and routing in Rust (#3542), thanks @faysou
- Added
nautilus_actor!macro innautilus_commonforDeref/DerefMutboilerplate on actor types (Rust) - Added
nautilus_strategy!macro innautilus_tradingforDeref/DerefMutandStrategytrait boilerplate on strategy types, with optional block for hook overrides (Rust) - Added
cache.orders_active_local(...)function in Rust (#3716), thanks @Javdu10 - Added
intervalfield toFundingRateUpdate(#3694), thanks @dxwil - Added
BookImbalanceActorexample actor for order book quoted volume imbalance in Rust - Added
ExecTesterConfig.test_reject_post_onlyimplicitly settingpost_onlyon orders without requiringuse_post_only(Python and Rust) - Added
TieredTickSchemeandTickScheme::Tieredfor price-dependent tick sizes (Rust) - Added
TokenizedAssetinstrument type with configurableasset_classfield for tokenized equities, ETFs, commodities, and other real-world assets - Added Betfair backtest example streaming raw
.gzdata throughBacktestEngine(Rust) - Added Binance
decode_binance_spot_client_order_idanddecode_binance_futures_client_order_idutility functions for decoding Link & Trade encodedclientOrderIdvalues from raw Binance API responses - Added Binance Futures
subscribe_funding_ratesandunsubscribe_funding_rateswithFundingRateUpdateemission via the mark price stream (Rust) - Added Binance Futures exchange-generated order handling for liquidation, ADL, and settlement fills with client order ID prefix detection and
FillReport/OrderStatusReportemission (Rust) - Added Binance Futures
use_position_idsconfig for hedging position IDs derived from instrument and position side on exchange-generated fills (Rust) - Added Binance Futures
default_taker_feeconfig with commission fallback estimation for exchange-generated fills when venue omits commission fields (Rust, USD-M only) - Added Binance
NewAdl,NewInsurance, andPendingNewvariants toBinanceOrderStatus(Rust) - Added Binance
Rpitime-in-force,PreSettle/Settling/Closecontract statuses,None/Decrement/TransferSTP modes, and income type variants (Rust) - Added Binance instrument status polling in Rust
- Added Arrow schema support for
BinanceBarandBinanceFuturesMarkPriceUpdate(#3749), thanks @twitu - Added Binance Futures
close_positionparameter for algo stop orders to close an entire position at trigger price (Python and Rust) (#3751), thanks for reporting @dodge-basic - Added Bybit native TP/SL params for order placement (#3754), thanks @jindrichsirucek
- Added Bybit instrument status polling and subscription (#3738), thanks @filipmacek
- Added Bybit options trade subscriptions using
baseCointopic with per-instrument filtering - Added Bybit option instrument fee rate population from
/v5/account/fee-rate - Added Bybit
submit_order_listvia WebSocket batch API with TP/SL support and HTTP demo fallback (Rust) - Added Bybit
query_ordervia HTTP with open order and history fallback (Rust) - Added Databento Arrow serialization for imbalance and statistics (#3689), thanks for reporting @GianC0
- Added Deribit
LimitIfTouchedandMarketIfTouchedorder type support (take_limit/take_market) - Added Hyperliquid agent wallet support (#3668), thanks @oh92
- Added Hyperliquid product type config for live clients (#3783), thanks @lisiyuan656
- Added Kraken FOK,
LimitIfTouchedorders, and batch submit - Added Kraken tokenized equity (xStocks) support via
aclass_base=tokenized_assetwith automatic dual-fetch on instrument loading (#3455), thanks for reporting @jilongjia - Added Kraken
request_book_snapshotfor spot and futures via HTTP depth endpoints - Added Kraken
request_funding_ratesfor futures with client-side start/end/limit filtering - Added Kraken
subscribe_instrument_statusfor spot and futures (polling-based detection) - Added Kraken spot trailing stop and trailing stop limit order submission with
trailing_offsetandlimit_offsetfields - Added Kraken spot
triggerparameter for conditional orders (lastorindexprice reference) - Added Kraken spot quote quantity orders via
viqcorder flag - Added Kraken spot iceberg orders via
displayvolparameter - Added OKX
submit_order_listvia WebSocket batch endpoint for regular GTC orders - Added OKX support for bracket order submission with attached TP/SL (#3701), thanks @Nickonomic
- Added OKX
subscribe_option_greeksfor venue-provided Greeks via theopt-summaryWebSocket channel - Added OKX configurable
ws_auth_timeout_secsfor WebSocket authentication (#3727), thanks for reporting @Stamppot82 - Added OKX
fwdPx(forward price) toOKXOptionSummaryMsgand mapped tounderlying_priceonOptionGreeksfor ATM tracking - Added OKX
request_orderbook_snapshotandrequest_funding_ratesto Python data client via PyO3 bindings - Added OKX options trading execution with limit orders,
px_usd/px_volpricing modes,OpFokorder type, andMarketToLimit/conditional order rejection - Added OKX options position-level Black-Scholes Greeks (
delta_bs,gamma_bs,theta_bs,vega_bs) to position data - Added OKX
determine_order_type_with_altfor correct order type classification when options use alternative pricing fields - Added
DeltaNeutralVolstrategy strangle entry viapx_vollimit orders with configurable IV offset, time-in-force, and cache-based re-entry guard - Added OKX missing WebSocket message fields across all channel structs
- Added Polymarket instrument provider and filters in Rust (#3708), thanks @filipmacek
- Added Polymarket strategy-driven data subscriptions (#3806), thanks @Javdu10
- Added Tardis
MarkPriceUpdateandIndexPriceUpdateparsing fromderivative_tickermessages in Rust - Added Tardis
DerivativeTickerCachefor deduplicating unchanged funding rate, mark price, and index price updates - Added Tardis
TardisDataTypeenum for normalized Tardis Machine data type identifiers - Added Tardis live streaming support via
stream_optionsconfig with automatic reconnection and exponential backoff - Added Tardis raw provider metadata to
Instrument.info(#3730), thanks for reporting @volemont
Breaking Changes
- Removed deprecated
convert_quote_qty_to_basefromExecEngineConfigandLiveExecEngineConfig; adapters now handle quote-to-base conversion directly - Removed
TARDIS_BASE_URLconstant fromnautilus_tardis::http- usenautilus_tardis::common::urls::TARDIS_HTTP_BASE_URL - Removed Hyperliquid
revoke_hyperliquid_builder_feefunction and builder fee revoke scripts - Removed
DatabentoLiveClient.keyproperty (Python) - Renamed
OrderEvent.kind()totype_name()in Rust - Renamed instrument
type_strPyO3 getter totype_name - Renamed
DatabentoHistoricalClient.keyproperty toapi_key(Python) - Renamed
ParquetDataCatalogV2toParquetDataCatalogandStreamingFeatherWriterV2toStreamingFeatherWriter(PyO3 persistence classes) - Changed Tardis HTTP client from
reqwest::Clienttonautilus_network::http::HttpClientwith rate limiting - Changed
ExecutionEngine.register_clientto error when a venue is already routed to another client (Rust) - Changed
ExecutionEngine.register_venue_routingto error when re-routing a venue to a different client (Rust) - Changed collection-cloning PyO3 getters to methods:
Position.events(),adjustments(),client_order_ids(),venue_order_ids(),trade_ids(); andevents()on all order types - Changed config structs to use
bon::Builderdefaults as single source of truth;Defaultimpls now delegate toSelf::builder().build() - Changed config fields that always had a sensible default from
Option<T>to plainTwith#[builder(default)]across all adapter, live, and engine configs (Rust) - Changed
Option<T>fields retained only whereNonecarries distinct meaning (feature disabled, unbounded, etc.)
Security
- Hardened Docker Compose to bind all ports to localhost and add
no-new-privilegesto all services - Hardened CI egress policy to block by default and fall back to
auditmode for fork pull requests - Upgraded all
nautilustrader.ioURLs from HTTP to HTTPS (#3686), thanks @04cb - Documented
aws-lc-rsnon-FIPS mode rationale (FIPS 140-3 module requires Go toolchain)
Fixes
- Fixed
OrderBookL1 stale event mutation corrupting bid/ask (#3790), thanks for reporting @linimin - Fixed position index blob pollution in
update_position(#3791), thanks @YeeTsai - Fixed
purge_orderKeyErrorfor position/exec_algorithm index access (#3799) - Fixed strategy receiving historical events during startup reconciliation (#3793), thanks @filipmacek
- Fixed
Trader::add_exec_algorithmnot registering the{id}.executemsgbus endpoint, causing orders withexec_algorithm_idto be silently dropped - Fixed
Trader::clear_exec_algorithmsanddispose_componentsnot deregistering{id}.executemsgbus endpoints for removed algorithms - Fixed
TopicRouterstale index cache panic when unsubscribing one pattern invalidated indices for unrelated cached topics (#3755), thanks for reporting @Javdu10 - Fixed
PRICE_UNDEFpanic inOrderBookDelta.to_pyo3_listCython conversion (#3697), thanks @zshuang15 - Fixed
ExecutionEnginesilently droppingSubmitOrderandSubmitOrderListcommands when no execution client can be resolved; now emitsOrderDenied(Rust) - Fixed
RiskEngineRefCell re-entrancy panic on order denial (#3680), thanks @husariancom - Fixed reconciliation when trigger_price is set for non-conditional orders (#3673), thanks @husariancom
- Fixed `s...
NautilusTrader 1.224.0 Beta
NautilusTrader 1.224.0 Beta
Released on 3rd March 2026 (UTC).
Enhancements
- Added matching engine L1 quote-based queue position tracking for backtests
- Added
fill_limit_inside_spreadtoFillModelandMatchingCorefor at-or-inside-spread limit fill control - Added synthetic book support for binary markets (#3495), thanks @Javdu10
- Added
get_target_px_for_quantitymethod onOrderBook(#3627), thanks @Javdu10 - Added Betfair batch submit and cancel order support
- Added BitMEX dead man's switch (cancelAllAfter) support (Rust and Python)
- Added BitMEX grid market maker example (Rust)
- Added BitMEX instrument status subscription support (Rust and Python)
- Added Bybit book snapshot and funding rate request support (Rust)
- Added Databento
skip_on_errorflag forload_instrumentsto skip unparsable definitions (#3657), thanks for reporting @davidsblom - Added Deribit instrument status subscription support (Rust and Python)
- Added dYdX instrument status subscription support (Rust and Python)
- Added Hyperliquid order modify support (Rust and Python)
- Added OKX trailing stop market order support (Rust and Python)
- Added OKX algo order amend support (Rust and Python)
- Added OKX instrument status updates from WebSocket instruments channel (Rust)
- Added OKX index price subscriptions with base-pair remapping to derivatives (Rust)
- Added OKX book snapshot and funding rate request support (Rust)
- Removed Hyperliquid builder fee charges (builder-fee approval no longer required)
Breaking Changes
- Removed Coinbase International (
COINBASE_INTX) adapter, see RFC (#3555) - Removed Binance
BINANCE_ED25519_*env vars for Spot/Margin (useBINANCE_API_KEY/BINANCE_API_SECRET; Futures deprecated with warning) - Removed Hyperliquid
builder_fee_refresh_minsconfig option (builder fees no longer charged) - Removed Polymarket
fetch_orderbook_history,load_orderbook_snapshots,fetch_price_historyand related methods (endpoints decommissioned, #3635)
Security
- Added
pip-auditto security audit pipeline - Added Docker image cosign signing and SBOM generation
- Standardized credential zeroization across all adapters (
Ustrreplaced withBox<str>for API keys) - Standardized secret redaction in
Debugimpls across all adapter credentials - Updated
SECURITY.mdwith expanded scope, reporting guidelines, and responsible disclosure policy - Bumped all eligible GitHub Actions pinned SHAs to latest versions (2-week release policy)
Fixes
- Fixed matching engine applying order book deltas for L1 books (#3615), thanks @maksym-mikheienko
- Fixed streaming backtest producing dummy bars past batch data exhaustion (#3628), thanks for reporting @cauta
- Fixed
OrderEmulatortrailing stop activation ignoringLAST_PRICEtrigger type (#3629), thanks for reporting @HaakonFlaaronning - Fixed
LiveExecEngineposition reconciliation infinite loop when venue reports flat (#3622), thanks for reporting @mrbaron3 - Fixed
CryptoOptioninstrument pyo3 transform for (#3626), thanks @davidsblom - Fixed
StreamingFeatherWriterduplicate events from multiple message bus topics (#3625), thanks for reporting @fomotoshi - Fixed
VolumeImbalanceBarAggregatorandVolumeRunsBarAggregatorinteger overflow for step >= 923 in high-precision mode (#3658), thanks for reporting @honvl - Fixed
InstrumentProviderload_ids_asyncloading all instruments instead of filtering to requested IDs (affected dYdX, Kraken, AX, Hyperliquid) - Fixed Python WS callbacks running off asyncio event-loop thread in Rust adapters (#3653), thanks for reporting @camilorodegheri
- Fixed Binance Futures algo order serde field renames for WS and HTTP parsing (#3624), thanks for reporting @qu1zzyboy
- Fixed Binance silent HMAC fallback when using encrypted Ed25519 PEM keys (now warns)
- Fixed BinanceSymbol COIN-M perpetual symbol conversion (#3641), thanks @YeeTsai
- Fixed Binance algo order cancellation parsing (#3646), thanks @qu1zzyboy
- Fixed Binance Spot testnet WebSocket API URL (#3661), thanks @penguinwokrs
- Fixed Hyperliquid stop/trigger order price derivation (#3611), thanks for reporting @h-tsun3
- Fixed Hyperliquid price normalization and inner error detection (#3612), thanks for reporting @h-tsun3
- Fixed Interactive Brokers BarType/str comparison in get_historical_bars (#3616), thanks @powerseed
- Fixed Interactive Brokers historical bar processing crash (#3619), thanks @shzhng
- Fixed Interactive Brokers contract details parsing (#3638), thanks @davidsblom
- Fixed Kraken Spot and Futures execution clients not loading instruments during connect (#3644), thanks for reporting @husariancom
- Fixed Kraken Spot execution client HTTP client created without credentials (#3650), thanks for reporting @husariancom
- Fixed Kraken sequential
ClientOrderIdexceedingcl_ord_id18-char free-text limit (#3651), thanks for reporting @husariancom - Fixed Kraken missing account state registration during connect (#3652), thanks for reporting @husariancom
- Fixed Polymarket Gamma API
load_idspath skipping sibling tokens (#3654), thanks for reporting @likenji - Fixed Polymarket loader to use Data API trades instead of decommissioned orderbook/price history endpoints (#3635), thanks for reporting @JSai23
- Fixed Binance Spot testnet WebSocket API URL (legacy URL removed by Binance in May 2025) (#3660)
- Fixed pre-commit hooks portability for Windows (#3617), thanks for reporting @powerseed
- Fixed
LiveNodestartupRefCellpanic when execution reports arrive duringconnect() - Fixed dYdX new instrument discovery flooding logs with inactive/delisted markets
- Fixed dYdX fills and orders API requests missing required
marketTypeparameter
Internal Improvements
- Added catalog deduplication functionality (#3613), thanks @ms32035
- Extracted common SBE decoder to
nautilus-serializationcrate - Implemented
BacktestNodewith catalog streaming in Rust - Improved
OrderBookImbalanceexample strategy - Improved
BestPriceFillModelto fill inside bid ask spread (#3428), thanks @faysou - Standardized use of atomic clock across adapters
- Standardized adapter credentials handling and testing
- Refined build script for Windows (#3636), thanks @faysou
- Optimized matching engine
_seed_trade_consumptionto use range-bounded FFI queries for deep books - Optimized backtest engine settle loop to avoid Python list allocation on idle ticks
- Optimized
MatchingCore.iterateto avoid list concatenation on every call - Upgraded
databentocrate to v0.42.0 - Upgraded
datafusioncrate to v52.2.0
Documentation Updates
- Added AX Exchange gold perps book imbalance tutorial
- Added AX Exchange spot FX bars mean reversion tutorial
- Added BitMEX grid market maker tutorial
- Added adapter data and execution testing specifications
- Added order book concepts documentation
- Improved backtesting mermaid diagram and tutorial formatting
NautilusTrader 1.223.0 Beta
NautilusTrader 1.223.0 Beta
Released on 21st February 2026 (UTC).
Enhancements
- Added
bulk_read_batch_sizeoption toCacheConfigfor batched Redis bulk reads, thanks @shzhng - Added sandbox execution adapter in Rust
- Added multi-account execution support (#3194), thanks @faysou
- Added Nasdaq ITCH 5.0 parser
- Added grid market maker example strategy in Rust
- Added
OrderBookDeltashistorical request support (#3438), thanks @faysou - Added
market_exit()method forStrategywith configurablemarket_exit_time_in_forceandmarket_exit_reduce_onlyoptions (supports venues requiring IOC for market orders) - Added
manage_stopconfig option toStrategyConfigfor automatic market exit on stop - Added matching engine
queue_positiontracking heuristic for backtests - Added matching engine trade consumption seeding for L2/L3 book backtests
- Added tracing subscriber for external Rust library logs (
use_tracing=TrueinLoggingConfig, filter withRUST_LOGenv var) - Added
use_market_order_acksvenue config option to generateOrderAcceptedevents for market orders before filling (mimics behavior of venues like Binance) - Added
oto_trigger_modevenue config option to control whether OTO child orders activate on partial fills (PARTIAL) or only after full fill (FULL) (default PARTIAL) (#3454), thanks @godnight10061 - Added
request_funding_ratesandFundingRateUpdateArrow serialization (#3467), thanks @dxwil - Added
optimize_file_loadingas BacktestDataConfig parameter (#3518), thanks @faysou - Added
bulk_read_batch_sizeoption toCacheConfigfor batched Redis bulk reads (#3535), thanks @shzhng - Added
PerpetualContractinstrument for asset-class agnostic perpetual swaps - Added Ichimoku Cloud indicator (#3552), thanks @faysou
- Added Betfair RCM parsing for TPD race data
- Added Betfair race stream subscription via
subscribe_race_dataconfig - Added Betfair market version price protection for orders
- Added Betfair
BetfairOrderVoidedcustom data type for VAR voids - Added
BetfairOrderVoidedcustom data type for VAR voids - Added Binance
BinanceEnvironmentenum withLIVE,TESTNET,DEMOvariants for explicit environment selection - Added Binance
environmentconfig field toBinanceDataClientConfigandBinanceExecClientConfig - Added Binance Demo environment support with
BINANCE_DEMO_API_KEY/BINANCE_DEMO_API_SECRETenv vars - Added BitMEX trailing stop support
- Added BitMEX pegged order (BBO) support via params
- Added Bybit mark price subscriptions support
- Added Bybit index price subscriptions support
- Added Databento bulk subscription and historical request support (#3490), thanks @shzhng
- Added Databento support for conversion of OPRA venues (#3605), thanks @faysou
- Added Interactive Brokers subscribe index price functionality (#3514), thanks @Murph24
- Added Interactive Brokers
TotalCashValueto account summaryinfodict, exposing actual cash balance (#3567), thanks @shzhng - Added Interactive Brokers
request_timeout_secsconfig toInteractiveBrokersExecClientConfigand consolidated all IB request timeouts into a single configurable value (#3602), thanks @shzhng - Added OKX batch cancel support for conditional (algo) orders
- Added Polymarket data loader event-level API support (#3484), thanks @jsemldonado
- Added Polymarket
event_slug_buildersupport (#3501), thanks @jsemldonado - Added Polymarket batch order support (#3506), thanks @loafer-19
- Added Tardis data client with factory in Rust
- Improved tearsheet with dynamic Nautilus version and refined run info table (#3396), thanks @KaulSe
Breaking Changes
- Removed dYdX v3 (legacy) Python adapter (the v3 exchange was decommissioned at end of 2024)
- Removed
dydxoptional install extra (the v4 Rust-backed adapter has no additional Python dependencies) - Renamed
nautilus_trader.adapters.dydx_v4module tonautilus_trader.adapters.dydxand standardized class names toDydxprefix (e.g.DydxDataClientConfig,DydxLiveDataClientFactory) - Removed dead
subscribe_order_book_snapshotsandunsubscribe_order_book_snapshotsmethods fromLiveMarketDataClient(were never called by the data engine) - Removed OKX URL environment variable overrides (
OKX_BASE_URL_HTTP,OKX_BASE_URL_WS_*,OKX_DEMO_BASE_URL_WS_*); use configbase_url_*fields instead - Removed deprecated
get_ws_base_urlfunction from OKX Rust adapter; useget_ws_base_url_privateorget_ws_base_url_publicinstead - Removed
AddAssign,SubAssign,MulAssigntrait implementations fromPrice,Quantity, andMoneytypes (Rust); usex = x + yinstead ofx += y - Removed
add_assignandsub_assigncdef methods fromPrice,Quantity, andMoneytypes (Cython); usex = x + yinstead - Renamed
subscribed_order_book_snapshotstosubscribed_order_book_depthfor consistency with data engine routing - Removed
listen_key_ping_max_failuresfromBinanceExecClientConfig(listenKey flow replaced by WebSocket API) - Changed
Price,Quantity, andMoneyarithmetic to use max precision instead of panicking on precision mismatch - Changed
Quantity + Quantity,Quantity - Quantity,Price + Price,Price - Price,Money + Money, andMoney - MoneyPython operators to return the same type instead ofDecimal(Quantity - QuantityraisesValueErrorif result would be negative) - Changed
trade_executiondefault fromFalsetoTruefor consistency withbar_execution; users who want to isolate execution to L1 book data only must now explicitly settrade_execution=False - Changed price-protected market orders to no longer emit
OrderAcceptedby default; setuse_market_order_acks=Trueto restore previous behavior - Changed adapter implementations should now override
_subscribe_order_book_depthand_unsubscribe_order_book_depthforOrderBookDepth10subscriptions - Changed Binance execution clients now use WebSocket API authentication instead of listenKey REST API; both HMAC and Ed25519 keys are auto-detected from the
api_secretformat (nokey_typeconfig needed). Note: Futures with HMAC keys automatically fall back to REST listenKey management (Binance Futures WS API only supports Ed25519 forsession.logon) - Changed Binance execution clients now source credentials from the standard
BINANCE_API_KEY/BINANCE_API_SECRETenvironment variables (or testnet equivalents) - Changed Polymarket instrument provider config from
instrument_providertoinstrument_configonPolymarketDataClientConfigandPolymarketExecClientConfig; usePolymarketInstrumentProviderConfiginstead ofInstrumentProviderConfig
Security
- Upgraded
arc-swapto 1.8.1 fixing potential use-after-free in debt mechanism (memory ordering fix) - Fixed
CVec::empty()to use dangling pointer instead of null, avoiding undefined behavior inVec::from_raw_parts - Fixed credential and auth header leaks in trace logging
- Masked Binance listen keys in execution client logs
- Refactored supply chain security checks and update dependencies
- Improved TLS cert loading and socket suffix validation
- Hardened Postgres SQL and credential security
Fixes
- Fixed matching engine liquidity consumption using cumulative book quantity
- Fixed matching engine liquidity consumption tracking for MAKER fills
- Fixed matching engine trade execution fills discarded with
liquidity_consumption - Fixed matching engine trade execution fill model and FOK/IOC handling
- Fixed matching engine trade ticks updating L1 book and triggering fills when
trade_execution=False - Fixed matching engine MAKER limit orders over-filling on L1 books when
liquidity_consumption=True - Fixed inverse instrument
base_currencyaccess across accounting - Fixed logic and control flow bugs in core platform (#3585), thanks for reporting @pandashark
- Fixed cache reset and missing f-string prefixes (#3585), thanks for reporting @pandashark
- Fixed missing raise and divide-by-zero guards (#3598), thanks @pandashark
- Fixed account balance rounding mismatch for zero-precision currencies (#3579), thanks for reporting @penguinwokrs
- Fixed
Positionspot base currency commission sign (#3546), thanks for reporting @gaye746560359 - Fixed
Positionflat detection for floating-point edge cases - Fixed
UnsubscribeInstrumentClosemessage handler routing - Fixed order cancel not releasing locked balance in backtest (#3525), thanks for reporting @dennisnissle
- Fixed remaining
F_LASTflag checks to use proper bitmask comparison - Fixed
MarketIfTouchedOrder(MIT) filling at bar extremes instead of trigger price during backtesting (#3461, #3462), thanks @HaakonFlaaronning - Fixed OTO child order sizing with rapid parent fills (#3435), thanks for reporting @dxwil
- Fixed
ExecAlgorithmspawn quantity accounting (will now restore quantity from denied/rejected spawned orders) - Fixed
GreeksCalculatorto use index price for index instruments (#3541), thanks @shzhng - Fixed
GreeksCalculatormin->max DTE clamping (#3582), thanks @pandashark - Fixed
itm_probcalculation to use N(d2) instead of normalized delta (#3554), thanks @shzhng - Fixed reconciliation
venue_order_idindexing and validation - Fixed analyzer epoch timestamp from empty shell positions
- Fixed backtest clock monotonicity with time alerts (#3384), thanks @draphi
- Fixed order updated panic during reconciliation (#3380), thanks for reporting @santivazq
- Fixed missing currency registration when adding instruments to cache (#3400), thanks @filipmacek
- Fixed trailing stops default price type (#3379), thanks @KaulSe
- Fixed typo in
OrderBook.simulate_fillserror message (#3405), thanks @Johnkhk - Fixed registering msgbus with OptionExerciseModule (#3383), thanks @davidsblom
- Fixed directory URI handling in ParquetDataCatalog for S3 and cloud storage (#3378),...
NautilusTrader 1.222.0 Beta
NautilusTrader 1.222.0 Beta
Released on 1st January 2026 (UTC).
This release adds support for Python 3.14 with the following limitations:
- dYdX adapter extras (
[dydx]) unavailable due to upstreamcoincurvecompatibility (available on Python 3.12-3.13) - Interactive Brokers adapter extras (
[ib]) unavailable due to upstreamnautilus-ibapicompatibility (available on Python 3.12-3.13)
Enhancements
- Added support for Python 3.14
- Added Kraken integration adapter
- Added Cap'n Proto (
capnp) serialization for efficient zero-copy data interchange (opt-in viacapnpfeature flag innautilus-serializationcrate) - Added initial backtest visualization tearsheets with plotly
- Added matching engine
liquidity_consumptionconfig option to track per-level consumption and prevent overfilling displayed book liquidity (defaultFalseto retain current behavior) - Added matching engine trade consumption tracking (when
liquidity_consumption=Trueandtrade_execution=True) to prevent multiple orders matching the same trade tick from collectively overfilling - Added theme support to
bars_with_fillschart (#3329), thanks @faysou - Added price protection support for market orders (#3065), thanks @Antifrajz
- Added
Quantity.from_decimalconstructor (#3189), thanks @faysou - Added
Price.from_decimalconstructor - Added
Money.from_decimalconstructor - Added
create_bars_with_fillsto Tearsheet (#3137), thanks @faysou - Added
proxy_urlsupport for HTTP clients - Added
CAGRportfolio statistic - Added
CalmarRatioportfolio statistic - Added
MaxDrawdownportfolio statistic - Added
quote_quantityparameter forclose_position(...)andclose_all_positions(...)strategy methods - Added remaining bar aggregation methods:
TICK_IMBALANCE,TICK_RUNS,VOLUME_IMBALANCE,VOLUME_RUNS,VALUE_IMBALANCE,VALUE_RUNS(#3217), thanks @NicolaD - Added
ParquetDataCatalog.query_first_timestamp(#3253), thanks @MK27MK - Added
PolymarketDataLoaderfor loading historical data with docs and example - Added Binance accurate commission rates per symbol (#3208), thanks @delusionpig
- Added Binance cross-margin info to
AccountState - Added
BinanceInstrumentProviderConfigto support thequery_commission_ratesconfig option - Added Bybit spot margin auto-borrow and auto-repay with
auto_repay_spot_borrowsconfig option - Added Bybit spot margin manual operations (
BybitMarginAction) for strategy-controlled borrow/repay viaquery_account - Added Bybit HTTP request_tickers support (#3241), thanks @TaiShanQ
- Added Databento subscription acknowledgement handling (#3337), thanks @shzhng
- Added Databento historical client consolidated schema support (#3338), thanks @shzhng
- Added Interactive Brokers optional exchange param for spread contracts (#3319), thanks @faysou
- Added Polymarket Gamma API support for instrument loading (#3141), thanks @DeirhX
- Added OKX historical trades requests
- Added Tardis
book_snapshot_outputconfig option for tardis machine replays (defaultdeltasto retain current behavior) - Added
allow_overfillsconfig option toExecEngineConfig(defaultFalse) to handle order fills exceeding order quantity with warning instead of raising - Added
overfill_qtyfield to orders for tracking fill quantities exceeding original order quantity - Introduced
PositionAdjustedevents for tracking quantity/PnL changes outside normal order fills (base currency commissions, funding payments, manual adjustments) - Upgraded continuous reconciliation for execution engine using position reports to detect missed fills
Breaking Changes
-
Dropped support for Python 3.11
-
Removed
prob_fill_on_stopparameter fromFillModelandFillModelConfig(stop orders have no queue position to simulate as triggers are deterministic when price reaches the trigger level) -
Removed
use_ws_trade_apiconfig option from Bybit execution client (using WebSocket trade API only) -
Renamed
parse_instrumenttoparse_polymarket_instrumentin Polymarket adapter for clarity -
Renamed
ExecTesterConfig.enable_buystoenable_limit_buys -
Renamed
ExecTesterConfig.enable_sellstoenable_limit_sells -
Changed
ParquetDataCatalog.register_datato now treatfiles=[]as registering no files; passfiles=None(default) to include all files -
Standardized data catalog directory naming: Order book data directory names now use plural forms to align with the Rust catalog and Tardis Machine conventions; this ensures data written by the Python
StreamingFeatherWritercan be read by the Rust catalogorder_book_delta/→order_book_deltas/order_book_depth10/→order_book_depths/
Migration: Rename existing data directories to use plural forms:
# If you have existing order book data, rename the directories: mv <your_data_path>/order_book_delta <your_data_path>/order_book_deltas mv <your_data_path>/order_book_depth10 <your_data_path>/order_book_depths
Security
- Added
osv-scannerfor Python dependency vulnerability scanning in pre-commit - Added
cargo-vetfor Rust supply chain security auditing - Hardened unsafe code with runtime checks and
#![deny(unsafe_op_in_unsafe_fn)]lint - Hardened datetime conversions with overflow protection
- Hardened CI workflows by pinning Docker images to SHA digests
- Improved actor/component registry safety with
ActorRefguards and runtime borrow tracking - Fixed code scanning security alerts
Fixes
- Fixed
uint64_ttruncation bug indetermine_trade_fill_qtyfor trade execution withhigh-precisionmode - Fixed stop market order fill price in
L1_MBPmode - Fixed cache dropped same-timestamp market data on insert
- Fixed race condition in InstrumentProvider causing duplicate instrument initialization in shared providers
- Fixed portfolio statistics various bugs and edge cases
- Fixed SyntheticInstrument formula error during parsing with hyphened InstrumentId (#3257), thanks @Javdu10
- Fixed balance recalculation to use raw fixed-point (#3356), thanks @kirill-gr1
- Fixed matching engine GTD order expiry key mismatch (#3272), thanks for reporting @linimin
- Fixed matching engine order modification for partial fills
- Fixed matching engine L2/L3 partial fill quantity calculation on subsequent book updates
- Fixed NETTING position flip snapshots and cache index cleanup (#3081), thanks @SarunasSS
- Fixed incorrect handling of data responses in msgbus (#3310), thanks @filipmacek
- Fixed data engine to use separate aggregators for historical data (#3326), thanks @faysou
- Fixed bar execution generating fractional fill quantities (#3352), thanks @Johnkhk
- Fixed
BacktestResult.total_positionsto match tearsheet count (#3148), thanks for reporting @2-5 - Fixed risk engine negative price handling for spread instruments (#3136), thanks for reporting @q351941406
- Fixed risk engine trailing stop order risk validations (#3160), thanks for reporting @GianC0
- Fixed risk engine balance checks for cash borrowing
- Fixed risk engine balance checks for position-reducing SELL orders (#3256), thanks for reporting @GianC0
- Fixed spawned order client_id caching in
ExecAlgorithm(#3122), thanks for reporting @kirill-gr1 - Fixed parse_dates parameter in CSV loaders (#3132), thanks @maomao9-0
- Fixed
GreeksCalculatorhandling of missing price data (#3116), thanks for reporting @q351941406 - Fixed
StreamingFeatherWriter_setup_streamingwithreplace_existingconfig (#3234), thanks @cauta - Fixed conversion of streamed instruments to catalog (#3235), thanks @faysou
- Fixed active liquidity calculation Pool profiler simulation (#3165), thanks @filipmacek
- Fixed duplicate
on_instrumentcallback in request flow for Python adapters (#3323), thanks @filipmacek - Fixed Redis index key parsing with
use_instance_id - Fixed Betfair datetime encoding error in order status reports
- Fixed Betfair login race condition during concurrent connections
- Fixed Betfair parsing errors for undocumented codes
- Fixed Betfair duplicate fills on startup/reconnect
- Fixed Binance instrument info dict JSON serialization (#3128), thanks for reporting @woung717
- Fixed Binance ADL orders with TRADE execution type
- Fixed Binance Futures Algo Order API for conditional orders (#3287), thanks for reporting @KaizynX
- Fixed Bybit historical bars requests partial (unclosed) bar filtering
- Fixed Bybit WebSocket bars to respect
timestamp_on_closeconfig - Fixed
BybitHttpClienttype stub pyi signatures (#3238), thanks @sunlei - Fixed Databento historical client to support consolidated schemas (
cmbp-1,cbbo-1s,cbbo-1m) in quote requests - Fixed Databento MBO data decoding when
PRICE_UNDEFappears with non-zero precision - Fixed Databento Arrow serialization for
PRICE_UNDEF(#3183), thanks for reporting @marloncalvo - Fixed Databento quote decoding with undefined bid/ask prices
- Fixed Interactive Brokers quote tick subscriptions to use tick-by-tick data (#3135), thanks for reporting @genliusrocks
- Fixed Interactive Brokers serialization of
IBContractDetails(#3181), thanks @faysou - Fixed Interactive Brokers parsing of invalid prices (#3246), thanks @faysou
- Fixed OKX pre-open instrument parsing and standardize enum usage (#3134), thanks for reporting @3wtz
- Fixed OKX
request_barspagination halting prematurely in Range mode (#3145), thanks for reporting @3wtz - Fixed OKX
request_barspagination using correct backwards API semantics (#3145), thanks for reporting @3wtz - Fixed OKX FOK/IOC order type preservation across parsers (#3182), thanks @CuBeof
- Fixed OKX fee rate sign convention for backtesting (#3260), thanks @GhostLee
- Fixed Polymarket maker fill order side inversion (#3126), thanks for reporting @santivazq
- Fixed Polymarket instrument provider market filtering (#3133), thanks @MisterMM23
- Fixed Polymarket websocket client cancellation on concurrent subscriptions (#3169), thanks @DeirhX
- Fixed Polymark...
NautilusTrader 1.221.0 Beta
NautilusTrader 1.221.0 Beta
Released on 26th October 2025 (UTC).
This will be the final release with support for Python 3.11.
Enhancements
- Added support for
OrderBookDepth10requests (#2955), thanks @faysou - Added support for quotes from book depths (#2977), thanks @faysou
- Added support for quotes from order book deltas updates (#3106), thanks @faysou
- Added execution engine rate limiting for single-order reconciliation queries
- Added
subscribe_order_fills(...)andunsubscribe_order_fills(...)forActorallowing to subscribe to all fills for an instrument ID - Added
on_order_filled(...)forActor - Added Renko bar aggregator (#2941), thanks @faysou
- Added
time_range_generatorfor on-the-fly data data subscriptions (#2952), thanks @faysou - Added
__repr__toNewsEvent(#2958), thanks @MK27MK - Added
convert_quote_qty_to_baseconfig option toExecEngineConfig(defaultTrueto retain current behavior) allows adapters to keep quote-denominated sizes when needed - Added contingent order fields
parent_order_idandlinked_order_idsforOrderStatusReportand reconciliation - Added
fs_rust_storage_optionsto Python catalog (#3008), thanks @faysou and @Johnkhk - Added matching engine fallback to default order book for custom fill models (#3039), thanks @Hamish-Leahy
- Added filesystem parameter to parquet in the consolidate functions (#3097), thanks @huracosunah
- Added azure support for az protocol (#3102), thanks @huracosunah
- Added Binance BBO
price_matchparameter support for order submission - Added BitMEX conditional orders support
- Added BitMEX batch cancel support
- Added BitMEX contingent orders support (OCO, OTO, brackets)
- Added BitMEX historical data requests (trades and bars)
- Added BitMEX configurable
recv_window_msfor signed HTTP request expiration - Added Bybit SPOT position reports with opt-in
use_spot_position_reportsconfig option forBybitExecClientConfig - Added Bybit
ignore_uncached_instrument_executionsconfig option forBybitExecClientConfig(defaultFalseto retain current behavior) - Added Databento CME sandbox example
- Added Interactive Brokers cache config support for historical provider (#2942), thanks @ms32035
- Added Interactive Brokers support for fetching orders from all clients (#2948), thanks @dinana
- Added Interactive Brokers order conditions (#2988), thanks @faysou
- Added Interactive Brokers
generate_fill_reportsimplementation (#2989), thanks @faysou - Added OKX conditional trigger orders support
- Added OKX trade mode per order via
paramsusingtd_modekey - Added OKX margin configuration and spot margin support
- Added OKX demo account support
- Added OKX batch cancel support
- Added Polymarket native market orders support
Breaking Changes
- Removed
nautilus_trader.analysis.statisticssubpackage - all statistics are now implemented in Rust and must be imported fromnautilus_trader.analysis(e.g.,from nautilus_trader.analysis import WinRate) - Removed partial bar functionality from bar aggregators and subscription APIs (#3020), thanks @faysou
- Renamed
nautilus-clicrate feature flag fromhypersynctodefi(gates blockchain/DeFi commands) - Polymarket execution client no longer accepts market BUY orders unless
quote_quantity=True
Security
- Fixed non-executable stack for Cython extensions to support hardened Linux systems
- Fixed divide-by-zero and overflow bugs in model crate that could cause crashes
- Fixed core arithmetic operations to reject NaN/Infinity values and improve overflow handling
Fixes
- Fixed reduce-only order panic when quantity exceeds position
- Fixed position purge logic to prevent purging re-opened position
- Fixed
Position.purge_events_for_orderto properly rebuild state from remaining order fills - Fixed cache index cleanup bugs in purge_order operations
- Fixed order average price calculation that was double-counting current fill in weighted average
- Fixed own order book cleanup for terminal orders and inflight handling
- Fixed order book depth snapshot processing to avoid padding levels and metadata tracking for L1 top-of-book ticks
- Fixed crypto instruments PyO3 -> Cython conversion for
lot_sizewhere it was not being passed through - Fixed
serializationcrate bugs and improve error handling - Fixed PyO3 interpreter lifecycle for async shutdown preventing edge case
"interpreter not initialized"panics during shutdown - Fixed
RiskEnginereduce-only cash exits (#2986), thanks for reporting @dennisnissle - Fixed
RiskEnginequote quantity validation - Fixed
BacktestEngineto retain instruments on reset (#3096), thanks for reporting @woung717 - Fixed overflow in
NautilusKernelbuild time calculation due to negative duration (#2998), thanks for reporting @HaakonFlaaronning - Fixed handling of asyncio.CancelledError in execution reconciliation (#3073), thanks @dinana
- Fixed edge case where rejected orders can remain in own order book
- Fixed Currency registration to synchronize between Cython and PyO3 runtimes via new
register_currency()helper - Fixed Databento CMBP-1/CBBO/TBBO symbology resolution
- Fixed
on_loadcalled before strategy added bug (#2953), thanks @lisiyuan656 - Fixed filesystem usage in catalog for
isfileandisdir(#2954), thanks @limx0 - Fixed
SandboxExecutionClientinstrument data handling - Fixed
AccountStateArrow serialization (#3005), thanks for reporting @nikzasel - Fixed
CryptoOptionArrow schemaoption_kindfield to accept string values - Fixed
FuturesSpreadArrow schema missing max/min quantity and price fields - Fixed
OptionSpreadArrow schema missing max/min quantity and price fields - Fixed
CommodityArrow schema to match from_dict requirements - Fixed safe encoded symbols (#2964), thanks @ms32035
- Fixed msgspec encoding for type objects with qualified names
- Fixed nautilus CLI macOS compatibility with regex unicode-perl feature (#2969), thanks @learnerLj
- Fixed fuzzy candlesticks indicator bugs (#3021), thanks @benhaben
- Fixed return type annotation for
ArrowSerializer.deserialize(#3076), thanks @MK27MK - Fixed initializing of sqrt price setting flow when
Poolprofiling (#3100), thanks @filipmacek - Fixed Redis multi-stream consumer skipping messages (#3094), thanks for reporting @kirill-gr1
- Fixed Binance duplicate
OrderSubmittedevent generation for order lists (#2994), thanks @sunlei - Fixed Binance websocket fill message parsing for Binance US with extra fields (#3006), thanks for reporting @bmlquant
- Fixed Binance order status parsing for external orders (#3006), thanks for reporting @bmlquant
- Fixed Binance execution handling for self-trade prevention and liquidations (#3006), thanks for reporting @bmlquant
- Fixed Binance trailing stop to use server-side activation price (#3056), thanks for reporting @hope2see
- Fixed Binance Futures reconciliation duplicated position bug (#3067), thanks @lisiyuan656
- Fixed Binance
price_matchorder price synchronization (#3074) - Fixed Binance Futures position risk query to use v3 API returning only symbols with positions or open orders (#3062), thanks for reporting @woung717
- Fixed Binance Futures liquidation and ADL fill handling
- Fixed BitMEX testnet support
- Fixed BitMEX instrument parsing of lot size
- Fixed BitMEX order rejection handling and response parsing
- Fixed Blockchain adapter out of gas RPC error in Multicall for problematic contracts (#3086), thanks @filipmacek
- Fixed Bybit currency parsing from venue resulting in incorrectly low precision (e.g., USDT precision 4 rather than 8)
- Fixed Bybit handling of
OrderModifyRejectedevents from pending updates - Fixed Bybit account endpoint pagination handling
- Fixed Coinbase Intx API credentials handling to allow passing explicitly
- Fixed Databento MBO
Clearactions and improve docs - Fixed Hyperliquid L1 signing with direct MessagePack serialization (#3087), thanks @NicolaD
- Fixed Interactive Brokers tick level historical data downloading (#2956), thanks @DracheShiki
- Fixed Interactive Brokers instrument provider
TypeErrorwhen load_ids/contracts areNone, thanks for reporting @FGU1 - Fixed Interactive Brokers modify bracket order (#2979), thanks @faysou
- Fixed Interactive Brokers historical bars resubscription failure after connection loss (#3002), thanks @Johnkhk
- Fixed Interactive Brokers flat position reconciliation and instrument loading (#3023), thanks @idobz
- Fixed Interactive Brokers bars response handling by removing partial bar (#3040), thanks @sunlei
- Fixed Interactive Brokers account summary handling (#3052), thanks @shinhwasbiz02
- Fixed Interactive Brokers account balance calculation (#3064), thanks @sunlei
- Fixed OKX spot margin quote quantity order handling
- Fixed OKX API credentials handling to allow passing explicitly
- Fixed OKX fee calculations to account for negative fees
- Fixed OKX parsing for
tick_szacross instrument types - Fixed OKX parsing for instruments
multiplierfield - Fixed OKX WebSocket heartbeat and standardize logging
- Fixed Polymarket handling of one-sided quotes (#2950), thanks for reporting @thefabus
- Fixed Polymarket websocket message handling (#2963, #2968), thanks @thefabus
- Fixed Polymarket tick size change handling for quotes (#2980), thanks for reporting @santivazq
- Fixed Polymarket market order submission to use native CLOB market orders (#2984), thanks for reporting @njkds
- Fixed Polymarket maker fill order side inversion (#3077), thanks for reporting @DarioHett
- Fixed Polymarket
neg_riskorder parameter handling - Fixed Tardis instruments
lot_sizemapping - Fixed Tardis adapter error handling and connection robustness
- Fixed Tardis replay to use catalog-compatible filenames
Internal Improvements
- Added ARM64 support to Docker builds
- Added BitMEX adapter integration tests
- Added OKX adapter integration tests
- Added turmoil network simulation testing to network crate
- Adde...