Releases: nautechsystems/nautilus_trader
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...
NautilusTrader 1.220.0 Beta
NautilusTrader 1.220.0 Beta
Released on 9th September 2025 (UTC).
Enhancements
- Added initial BitMEX integration adapter
- Added
FundingRateUpdatedata type with caching support through data engine - Added
subscribe_funding_rates(...)andunsubscribe_funding_rates(...)methods for actors - Added
on_funding_rate(...)handler for actors - Added
funding_rate(...)andadd_funding_rate(...)forCache - Added
due_post_onlyfield forOrderRejectedevent, only properly populated for Binance and Bybit for now - Added
log_rejected_due_post_only_as_warningconfig option forStrategyConfig(defaultTrueto retain current behavior) - Added
log_rejected_due_post_only_as_warningconfig option forBinanceExecClientConfig(defaultTrueto retain current behavior) - Added
log_components_onlyconfig option for Logger (#2931), thanks @faysou - Added support for additional Databento schemas:
CMBP_1,CBBO_1S,CBBO_1M,TCBBO, andOHLCV_EOD - Added configurable schema parameters for Databento quote and trade subscriptions, allowing
TBBO/TCBBOfor efficient combined data feeds - Added support for option combos for Interactive Brokers (#2812), thanks @faysou
- Added support for execution of option spreads in backtesting (#2853), thanks @faysou
- Added support for option spread quotes in backtest (#2845), thanks @faysou
- Added loading of options chain from
request_instrumentsfor Interactive Brokers (#2809), thanks @faysou - Added
OptionExerciseModule(#2907), thanks @faysou - Added
MarginModelconcept, base models, config, and factory for backtesting (#2794), thanks @faysou and @stefansimik - Added additional built-in backtest fill models (#2795), thanks @faysou and @stefansimik
- Added
OrderBookDepth10DataWrangler(#2801), thanks @trylovetom - Added
group_sizeparameter for PyO3OrderBook.pprint(...)andOwnOrderBook.pprint(...) - Added custom error logging function support for
RetryManager - Added Bybit options support (#2821), thanks @Baerenstein
- Added Bybit
is_leverageorder parameter support - Added
persist_account_eventsconfig option forCacheConfig(defaultTrueto retain current behavior) - Added
query_accountmethod forStrategy - Added
QueryAccountexecution message - Added streaming methods for
TardisCSVDataLoader - Added stream iterators support for
BacktestEnginelow-level streaming API - Added
YEARaggregation and improved bar specification validation (#2771), thanks @stastnypremysl - Added support for requesting any number of historical bars for dYdX (#2766, #2777), thanks @DeirhX
- Added
use_hyphens_in_client_order_idsconfig option forStrategyConfig - Added
greeks_filterfunction toportfolio_greeks(#2756), thanks @faysou - Added time weighted and percent vega for
GreeksCalculator(#2817), thanks @faysou - Added
VERBOSEoption to common make targets (#2759), thanks @faysou - Added bulk key loading capability for Redis cache database adapter
- Added
multiplierfield forCurrencyPairinstrument (required for some crypto pairs) - Added
tick_scheme_namefield for instrument dictionary conversions - Added default
FixedTickScheme(s) for all valid precisions - Added PancakeSwapV3 pool parsing (#2829), thanks @filipmacek
- Added
PortfolioConfig.min_account_state_logging_interval_msconfig option for throttling account state logging - Added
allow_cash_borrowingconfig option forBacktestVenueConfigto enable negative balances in cash accounts - Added borrowing support for Bybit SPOT accounts, enabling margin trading with negative balances
- Added initial DEX Pool filtering configuration (#2842, #2887), thanks @filipmacek
- Added Arbitrum FluidDEX pool parsing (#2897), thanks @filipmacek
- Added a complete
.env.exampletemplate to guide environment configuration (#2877), thanks @NicolaD - Added Interactive Brokers OCA setting to order groups (#2899), thanks @faysou
- Added Interactive Brokers subscriptions for position updates (#2887), thanks @faysou
- Added support for running separate live and paper IB Gateway containers without port conflicts. Simplified container naming and made VNC optional.
- Added
avg_px_openfield toPositionStatusReportfor IB adapter (#2925), thanks @dinana - Added support for running separate live and paper IB Gateway containers simultaneously (#2937), thanks @Bshara23
- Added support for data deduplication on catalog consolidation (#2934), thanks @ms32035
Breaking Changes
- Added
multiplierfield forCurrencyPairArrow schema - Changed
startparameter to required forActordata request methods - Reverted implementation of
delete_account_eventfrom cache database that was too inefficient and is now a no-op pending redesign - Renamed
ParquetDataCatalog.reset_catalog_file_namestoreset_all_file_names - Renamed
BinanceAccountType.USDT_FUTUREtoUSDT_FUTURESfor more conventional terminology - Renamed
BinanceAccountType.COIN_FUTUREtoCOIN_FUTURESfor more conventional terminology - Renamed
InstrumentMiniInfotoTardisInstrumentMiniInfoto standardize adapter naming conventions - Removed the generic
cvec_dropFFI function, as it was unused and prone to misuse, potentially causing memory leaks - Removed redundant
managedparameter forActor.subscribe_book_at_interval(the book must be managed by theDataEngineto provide snapshots at intervals) - Consolidated
OwnBookgroup_bidsandgroup_asksmethods intobid_quantityandask_quantitywith optionaldepthandgroup_sizeparameters - Consolidated ~40 individual indicator modules into 6 files to reduce binary size
- Consolidated
backtest.exchangeintobacktest.engineto reduce binary size - Consolidated
backtest.matching_engineintobacktest.engineto reduce binary size - Changed indicator imports from nested modules to flat structure (e.g.,
from nautilus_trader.indicators.atr import AverageTrueRangebecomesfrom nautilus_trader.indicators import AverageTrueRange) - Changed
NAUTILUS_CATALOG_PATHtoNAUTILUS_PATHfor Tardis adapter (#2850), thanks @NicolaD - Simplified Binance environment variables for API credentials: removed separate variables for RSA/Ed25519 keys and consolidated mainnet spot/futures credentials
- Moved
Indicatorbase class fromnautilus_trader.indicators.base.indicatortonautilus_trader.indicators.base
Internal Improvements
- Refactored OKX adapter to Rust API clients
- Refactored
BacktestDataIterator(#2791) to consolidate data generator usage, thanks @faysou - Implemented
LogGuardreference counting for proper thread lifecycle management, ensuring all logs flushed before termination - Implemented live subscriptions for blockchain data client (#2832), thanks @filipmacek
- Implemented initial Hyperliquid adapter (#2912, #2916, #2922, #2935), thanks @NicolaD
- Introduced
SharedCell/WeakCellwrappers for ergonomic and safer handling ofRc<RefCell<T>>/Weak<RefCell<T>>pairs - Introduced efficient block syncing command in the
nautilus-cli(#2861), thanks @filipmacek - Introduced pool events syncing command in blockchain data client (#2920), thanks @filipmacek
- Added stream iterators support
BacktestDataIterator - Added serialization support for execution reports
- Added serialization support for execution report commands
- Added
DataTesterstandardized data testing actor for integration adapters - Added
startandstopto response data (#2748), thanks @stastnypremysl - Added integration test service management targets (#2765), thanks @stastnypremysl
- Added integration tests for dYdX bar-partitioning and large-history handling (#2773), thanks @NicolaD
- Added make build-debug-pyo3 (#2802), thanks @faysou
- Added pytest timer (#2834), thanks @faysou
- Added support for several instrument versions with
request_instrument(#2835), thanks @faysou - Added
_send_position_status_reportto base execution client (#2926), thanks @faysou - Added
passthrough_bar_typetoTimeBarAggregator(#2929), thanks @faysou - Added matching engine check to return early if
last_qtyis non-positive (#2930), thanks @GhostLee - Added
avg_pxpopulation in order filled events for Interactive Brokers adapter (#2938), thanks @dinana - Optimized identifiers hashing to avoid frequent recomputations using C strings
- Optimized data engine topic string caching for message bus publishing to avoid frequent f-string constructions
- Optimized Redis key scans to improve efficiency over a network
- Completed bar request implementation for OKX (#2789), thanks @NicolaD
- Continued
ExecutionEngineand testing in Rust (#2886), thanks @dakshbtc - Enabled parallel pytest tests with
pytest-xdist(#2808), thanks @stastnypremysl - Standardized DeFi chain name validation for
InstrumentId(#2826), thanks @filipmacek - Standardized
NAUTILUS_PATHenv var across Tardis integration (#2850), thanks @NicolaD - Standardized zero PnL as Money instead of None when exchange rate missing (#2880), thanks @NicolaD
- Refactored
SpreadQuoteAggregator(#2905), thanks @faysou - Refactored bar aggregators to use
ts_initinstead ofts_event(#2924), thanks @fayosu - Improved typing for all the DEX IDs with
DexTypeand add validation (#2827), thanks @filipmacek - Improved reconciliation handling of internally generated orders to align positions (now uses the
INTERNAL-DIFFstrategy ID) - Improved data client for blockchain adapter (#2787), thanks @filipmacek
- Improved DEX pool sync process in the blockchain adapter (#2796), thanks @filipmacek
- Improved efficiency of message bus external streams buffer flushing
- Improved
databento_test_request_barsexample (#2762), thanks @faysou - Improved zero-sized trades handling for Tardis CSV loader (will log a warning)
- Improved ergonomics of
TardisInstrumentProviderdatetime filter para...
NautilusTrader 1.219.0 Beta
NautilusTrader 1.219.0 Beta
Released on 5th July 2025 (UTC).
Enhancements
- Added
graceful_shutdown_on_exceptionconfig option for live engines (defaultFalseto retain intended hard crash on unexpected system exceptions) - Added
purge_from_databaseconfig option forLiveExecEngineConfigto support cache backing database management - Added support for data download during backtest (#2652), thanks @faysou
- Added delete data range to catalog (#2744), thanks @faysou
- Added consolidate catalog by period (#2727), thanks @faysou
- Added
fire_immediatelyflag parameter for timers where a time event will be fired at thestartinstant and then every interval thereafter (defaultFalseto retain current behavior) (#2600), thanks for the idea @stastnypremysl - Added
time_bars_build_delayconfig option forDataEngineConfig(#2676), thanks @faysou - Added immediate firing capability for time alerts and corresponding test (#2745), thanks @stastnypremysl
- Added missing serialization mappings for some instruments (#2702), thanks @faysou
- Added support for DEX swaps for blockchain adapter (#2683), thanks @filipmacek
- Added support for Pool liquidity updates for blockchain adapter (#2692), thanks @filipmacek
- Added fill report reconciliation warning when discrepancy with existing fill (#2706), thanks @faysou
- Added optional metadata function for custom data query (#2724), thanks @faysou
- Added support for order-list submission in the sandbox execution client (#2714), thanks @petioptrv
- Added hidden order support for IBKR (#2739), thanks @sunlei
- Added
subscribe_order_book_deltassupport for IBKR (#2749), thanks @sunlei - Added
bid_levelsandask_levelsforOrderBook.pprint - Added
accepted_buffer_nsfilter param forCache.own_bid_orders(...)andCache.own_ask_orders(...) - Added trailing stop orders
activation_pricesupport in Rust (#2750), thanks @NicolaD
Breaking Changes
- Renamed catalog
instrument_idsfilter param toidentifiersto more accurately describe strings which can represent either instrument IDs or bar types - Changed behavior of timers
allow_past=Falseto permitstarttimes in the past if the next event time is still in the future - Changed Databento DBN upgrade policy to default v3
- Removed problematic negative balance check for margin accounts (cash account negative balance check remains unchanged)
- Removed support for Databento DBN v1 schemas (migrate to DBN v2 or v3, see DBN Changelog)
Internal Improvements
- Added logging macros for custom component and color in Rust
- Added Cython-level parameter validation for timer operations to prevent Rust panics and provide clearer Python error messages
- Added property-based testing for
Price,Quantity,Moneyvalue types in Rust - Added property-based testing for
UnixNanosin Rust - Added property-based testing for
OrderBookin Rust - Added property-based testing for
TestTimerin Rust - Added property-based testing for
networkcrate in Rust - Added chaos testing with
turmoilfor socket clients in Rust - Added
check_positive_decimalcorrectness function and use for instrument validations (#2736), thanks @NicolaD - Added
check_positive_moneycorrectness function and use for instrument validations (#2738), thanks @NicolaD - Ported data catalog refactor to Rust (#2681, #2720), thanks @faysou
- Optimized
TardisCSVDataLoaderperformance (~90% memory usage reduction, ~60-70% faster) - Consolidated the clocks and timers v2 feature from @twitu
- Consolidated on pure Rust cryptography crates with no dependencies on native certs or openssl
- Consolidated on
aws-lc-rscryptography for FIPS compliance - Confirmed parity between Cython and Rust indicators (#2700, #2710, #2713), thanks @NicolaD
- Implemented
From<Pool>->CurrencyPair&InstrumentAny(#2693), thanks @NicolaD - Updated
Makefileto use new docker compose syntax (#2746), thanks @stastnypremysl - Updated Tardis exchange mappings
- Improved live engine message processing to ensure exceptions result in a crash rather than continuing without the queue processing messages
- Improved live reconciliation robustness and testing
- Improved listen key error handling and recovery for Binance
- Improved handling of negative balances in backtests (#2730), thanks @ms32035
- Improved robustness of cash and margin account locked balance calculations to avoid negative free balance
- Improved robustness of fill price parsing for Betfair
- Improved implementation, validations and testing for Rust instruments (#2723, #2733), thanks @NicolaD
- Improved
Currencyequality to usestrcmpto avoid C pointer comparison issues withustrstring interning - Improved unsubscribe cleanup(s) for Bybit adapter
- Improved
Makefileto be self-documenting (#2741), thanks @sunlei - Refactored IB adapter (#2647), thanks @faysou
- Refactored data catalog (#2652, #2740), thanks @faysou
- Refined Rust data catalog (#2734), thanks @faysou
- Refined logging subsystem lifecycle management and introduce global log sender
- Refined signal serialization and tests (#2705), thanks @faysou
- Refined CI/CD and build system (#2707), thanks @stastnypremysl
- Upgraded Rust (MSRV) to 1.88.0
- Upgraded Cython to v3.1.2
- Upgraded
databentocrate to v0.28.0 - Upgraded
datafusioncrate to v48.0.0 - Upgraded
pyo3andpyo3-async-runtimescrates to v0.25.1 - Upgraded
rediscrate to v0.32.3 - Upgraded
tokiocrate to v1.46.1 - Upgraded
tokio-tungstenitecrate to v0.27.0
Fixes
- Fixed
AccountBalancemutation inAccountStateevents (#2701), thanks for reporting @DeirhX - Fixed order book cache consistency in update and remove operations (found through property-based testing)
- Fixed order status report generation for Polymarket where
venue_order_idwas unbounded - Fixed data request identifier attribute access for
LiveDataClient - Fixed
generate_order_modify_rejectedtypo in Binance execution client (#2682), thanks for reporting @etiennepar - Fixed order book depth handling in subscriptions for Binance
- Fixed potential
IndexErrorwith empty bars requests for Binance - Fixed GTD-GTC time in force conversion for Binance
- Fixed incorrect logging of trigger type for Binance
- Fixed trade ticks unsubscribe for Binance which was not differentiating aggregated trades
- Fixed pending update hot cache cleanup for Betfair execution client
- Fixed invalid session information on account update for Betfair execution client
- Fixed order book snapshots unsubscribe for Tardis data client
- Fixed Arrow schema registration for
BinanceBar - Fixed gRPC server shutdown warning when running dYdX integration tests
- Fixed registration of encoder and decoder for
BinanceBar, thanks for reporting @miller-moore - Fixed spot and futures sandbox for Binance (#2687), thanks @petioptrv
- Fixed
cleananddistcleanmake targets entering.venvand corrupting the Python virtual env, thanks @faysou - Fixed catalog identifier matching to exact match (#2732), thanks @faysou
- Fixed last value updating for RSI indicator (#2703), thanks @bartlaw
- Fixed gateway/TWS reconnect process for IBKR (#2710), thanks @bartlaw
- Fixed Interactive Brokers options chain issue (#2711), thanks @FGU1
- Fixed partially filled bracket order and SL triggered for IBKR (#2704, #2717), thanks @bartlaw
- Fixed instrument message decoding when no
exchangevalue for Databento US equities - Fixed fetching single-instrument trading fees for
Binance, thanks @petioptrv - Fixed IB-TWS connection issue with international languages (#2726), thanks @DracheShiki
- Fixed bar requests for Bybit where pagination was incorrect which limited bars being returned
- Fixed Bybit Unknown Error (#2742), thanks @DeevsDeevs
- Fixed margin balance parsing for Bybit
- Restored task error logs for IBKR (#2716), thanks @bartlaw
Documentation Updates
- Updated IB adapter documentation (#2729), thanks @faysou
- Improved reconciliation docs in live concept guide
Deprecations
- Deprecated
Portfolio.set_specific_venue(...), to be removed in a future release; useCache.set_specific_venue(...)instead
NautilusTrader 1.218.0 Beta
NautilusTrader 1.218.0 Beta
Released on 31st May 2025 (UTC).
Enhancements
- Added convenience re-exports for Betfair adapter (constants, configs, factories, types)
- Added convenience re-exports for Binance adapter (constants, configs, factories, loaders, types)
- Added convenience re-exports for Bybit adapter (constants, configs, factories, loaders, types)
- Added convenience re-exports for Coinbase International adapter (constants, configs, factories)
- Added convenience re-exports for Databento adapter (constants, configs, factories, loaders, types)
- Added convenience re-exports for dYdX adapter (constants, configs, factories)
- Added convenience re-exports for Polymarket adapter (constants, configs, factories)
- Added convenience re-exports for Tardis adapter (constants, configs, factories, loaders)
- Added support for
FillModel,LatencyModelandFeeModelin BacktestNode (#2601), thanks @faysou - Added bars caching from
request_aggregated_bars(#2649), thanks @faysou - Added
BacktestDataIteratorto backtest engine to provide on-the-fly data loading (#2545), thanks @faysou - Added support for
MarkPriceUpdatestreaming from catalog (#2582), thanks @bartolootrit - Added support for Binance Futures margin type (#2660), thanks @bartolootrit
- Added support for mark price stream across all markets for Binance (#2670), thanks @sunlei
- Added
bars_timestamp_on_closeconfig option for Databento which defaults toTrueto consistently align with Nautilus conventions - Added
activation_pricesupport for trailing stop orders (#2610), thanks @hope2see - Added trailing stops for OrderFactory bracket orders (#2654), thanks @hope2see
- Added
raise_exceptionconfig option forBacktestRunConfig(defaultFalseto retain current behavior) which will raise exceptions to interrupt a nodes run process - Added
UnixNanos::is_zero()convenience method to check for a zero/epoch value - Added SQL schema, model, and query for
OrderCancelRejected - Added SQL schema, model, and query for
OrderModifyRejected - Added HyperSync client to blockchain adapter (#2606), thanks @filipmacek
- Added support for DEXs, pools, and tokens to blockchain adapter (#2638), thanks @filipmacek
Breaking Changes
- Changed trailing stops to use
activation_pricerather thantrigger_pricefor Binance to more closely match the Binance API conventions
Internal Improvements
- Added
activation_pricestr and repr tests for trailing stop orders (#2620), thanks @hope2see - Added condition check for order
contingency_typeandlinked_order_idswhere a contingency should have associated linked order IDs - Improved robustness of socket client reconnects and disconnects to avoid state race conditions
- Improved error handling for socket clients, will now raise Python exceptions on send errors rather than logging with
tracingonly - Improved error handling for Databento adapter by changing many unwraps to instead log or raise Python exceptions (where applicable)
- Improved error handling for Tardis adapter by changing many unwraps to instead log or raise Python exceptions (where applicable)
- Improved fill behavior for limit orders in
L1_MBPbooks, will now fill entire size when marketable asTAKERor market moves through limit asMAKER - Improved account state event generation for margin accounts, avoiding the generation of redundant intermediate account states for the same execution event
- Improved ergonomics of messaging topics, patterns, and endpoints in Rust (#2658), thanks @twitu
- Improved development debug builds with cranelift backend for Rust (#2640), thanks @twitu
- Improved validations for
LimitOrderin Rust (#2613), thanks @NicolaD - Improved validations for
LimitIfTouchedOrderin Rust (#2533), thanks @NicolaD - Improved validations for
MarketIfTouchedOrderin Rust (#2577), thanks @NicolaD - Improved validations for
MarketToLimitOrderin Rust (#2584), thanks @NicolaD - Improved validations for
StopLimitOrderin Rust (#2593), thanks @NicolaD - Improved validations for
StopMarketOrderin Rust (#2596), thanks @NicolaD - Improved validations for
TrailingStopMarketOrderin Rust (#2607), thanks @NicolaD - Improved orders initialize and display tests in Rust (#2617), thanks @NicolaD
- Improved testing for Rust orders module (#2578), thanks @dakshbtc
- Improved Cython-Rust indicator parity for
AdaptiveMovingAverage(AMA) (#2626), thanks @NicolaD - Improved Cython-Rust indicator parity for
DoubleExponentialMovingAverage(DEMA) (#2633), thanks @NicolaD - Improved Cython-Rust indicator parity for
ExponentialMovingAverage(EMA) (#2642), thanks @NicolaD - Improved Cython-Rust indicator parity for
HullMovingAverage(HMA) (#2648), thanks @NicolaD - Improved Cython-Rust indicator parity for
LinearRegression(#2651), thanks @NicolaD - Improved Cython-Rust indicator parity for
WilderMovingAverage(RMA) (#2653), thanks @NicolaD - Improved Cython-Rust indicator parity for
VariableIndexDynamicAverage(VIDYA) (#2659), thanks @NicolaD - Improved Cython-Rust indicator parity for
SimpleMovingAverage(SMA) (#2655), thanks @NicolaD - Improved Cython-Rust indicator parity for
VolumeWeightedAveragePrice(VWAP) (#2661), thanks @NicolaD - Improved Cython-Rust indicator parity for
WeightedMovingAverage(WMA) (#2662), thanks @NicolaD - Improved Cython-Rust indicator parity for
ArcherMovingAveragesTrends(AMAT) (#2669), thanks @NicolaD - Improved zero size trade logging for Binance Futures (#2588), thanks @bartolootrit
- Improved error handling on API key authentication errors for Polymarket
- Improved execution client debug logging for Polymarket
- Improved exception on deserializing order from cache database
- Improved
Nonecondition checks for value types, which now raise aTypeErrorinstead of an obscureAttributeError - Changed
VecDequefor fixed-capacityArrayDequein SMA indicator (#2666), thanks @NicolaD - Changed
VecDequefor fixed-capacityArrayDequein LinearRegression (#2667), thanks @NicolaD - Implemented remaining Display for orders in Rust (#2614), thanks @NicolaD
- Implemented
_subscribe_instrumentfor dYdX and Bybit (#2636), thanks @davidsblom - Untangled
ratelimiterquota frompythonflag (#2595), thanks @twitu - Refined
BacktestDataIteratorcorrectness (#2591), thanks @faysou - Refined formatting of IB adapter files (#2639), thanks @faysou
- Optimized message bus topic-matching logic in Rust by 100× (#2634), thanks @twitu
- Changed to faster message bus pattern matching logic from Rust (#2643), thanks @twitu
- Upgraded Rust (MSRV) to 1.87.0
- Upgraded Cython to v3.1.0 (now stable)
- Upgraded
databentocrate to v0.26.0 - Upgraded
rediscrate to v0.31.0 - Upgraded
sqlxcrate to v0.8.6 - Upgraded
tokiocrate to v1.45.1
Fixes
- Fixed portfolio account updates leading to incorrect balances (#2632, #2637), thanks for reporting @bartolootrit and @DeirhX
- Fixed portfolio handling of
OrderExpiredevents not updating state (margin requirements may change) - Fixed event handling for
ExecutionEngineso it fully updates thePortfoliobefore to publishing execution events (#2513), thanks for reporting @stastnypremysl - Fixed PnL calculation for margin account on position flip (#2657), thanks for reporting @Egisess
- Fixed notional value pre-trade risk check when order using quote quantity (#2628), thanks for reporting @DeevsDeevs
- Fixed position snapshot cache access for
ExecutionEngine - Fixed position snapshot
SystemErrorcallingcopy.deepcopy()by simply using apickleround trip to copy the position instance - Fixed event purging edge cases for account and position where at least one event must be guaranteed
- Fixed authentication for Redis when password provided with no username
- Fixed various numpy and pandas FutureWarning(s)
- Fixed sockets exponential backoff immediate reconnect value on reset (this prevented immediate reconnects on the next reconnect sequence)
- Fixed message bus subscription matching logic in Rust (#2646), thanks @twitu
- Fixed trailing stop market fill behavior when top-level exhausted to align with market orders (#2540), thanks for reporting @stastnypremysl
- Fixed stop limit fill behavior on initial trigger where the limit order was continuing to fill as a taker beyond available liquidity, thanks for reporting @hope2see
- Fixed matching engine trade processing when aggressor side is
NO_AGGRESSOR(we can still update the matching core) - Fixed modifying and updating trailing stop orders (#2619), thanks @hope2see
- Fixed processing activated trailing stop update when no trigger price, thanks for reporting @hope2see
- Fixed terminating backtest on
AccountErrorwhen streaming, the exception needed to be reraised to interrupt the streaming of chunks (#2546), thanks for reporting @stastnypremysl - Fixed HTTP batch order operations for Bybit (#2627), thanks @sunlei
- Fixed
reduce_onlyattribute access in batch place order for Bybit - Fixed quote tick parsing for one-sided books on Polymarket
- Fixed order fill handling for limit orders with
MAKERliquidity side on Polymarket - Fixed currency parsing for
BinaryOptionon Polymarket to consistently use USDC.e (PoS USDC on Polygon) - Fixed identity error handling during keep-alive for Betfair, will now reconnect
- Updated
BinanceFuturesEventTypeenum with additional variants, thanks for reporting @miller-moore
Documentation Updates
- Added capability matrices for integration guides
- Added content to Architecture concept guide
- Added content to Live Trading concept guide
- Added content to Developer Guide
- Added errors and panics docs for most crates
- Added errors and panics docs for most crates
- Improved the clarity of various concept guides
- Fixed several errors in concept guides
Deprecations
- Deprecated support for ...
NautilusTrader 1.217.0 Beta
NautilusTrader 1.217.0 Beta
Released on 30th April 2025 (UTC).
Enhancements
- Added processing of
OrderBookDepth10forBacktestEngineandOrderMatchingEngine(#2542), thanks @limx0 - Added
Actor.subscribe_order_book_depth(...)subscription method (#2555), thanks @limx0 - Added
Actor.unsubscribe_order_book_depth(...)subscription method - Added
Actor.on_order_book_depth(...)handler method (#2555), thanks @limx0 - Added
UnixNanos::max()convenience method for the maximum valid value - Added
available_offsetfilter parameter forTardisInstrumentProvider - Added
NAUTILUS_WORKER_THREADSenvironment variable for common tokio runtime builder - Added
Quantity::non_zero(...)method - Added
Quantity::non_zero_checked(...)method - Added
round_downparam forInstrument.make_qty(...)that isFalseby default to maintain current behavior - Added WebSocket batch order operations for Bybit (#2521), thanks @sunlei
- Added mark price subscription for Binance Futures (#2548), thanks @bartolootrit
- Added
Chainstruct to represent blockchain network (#2526), thanks @filipmacek - Added
Blockprimitive for blockchain domain model (#2535), thanks @filipmacek - Added
Transactionprimitive for blockchain domain model (#2551), thanks @filipmacek - Added initial blockchain adapter with live block subscription (#2557), thanks @filipmacek
Breaking Changes
- Removed fees from locked balance calculations for
CASHaccounts - Removed fees from margin calculations for
MARGINaccounts - Renamed
idconstructor parameter toinstrument_idacross all PyO3 instruments, aligning with equivalent Cython instrument constructors
Internal Improvements
- Implemented exponential backoff and jitter for the
RetryManager(#2518), thanks @davidsblom - Simplified default locked balance and margin calculations to not include fees
- Improved handling of time range and effective date filters for
TardisInstrumentProvider - Improved reconnection robustness for Bybit private/trading channels (#2520), thanks @sunlei
- Improved logger buffers flushing post backtest
- Improved validations for Tardis trades data
- Improved correctness of client registration and deregistration for
ExecutionEngine - Improved build time by only compiling libraries (#2539), thanks @twitu
- Improved logging flush (#2568), thanks @faysou
- Improved
clear_log_fileto happen for each kernel initialization (#2569), thanks @faysou - Refined
PriceandQuantityvalidations and correctness - Filter fill events if order is already filled for dYdX (#2547), thanks @davidsblom
- Fixed some clippy lints (#2517), thanks @twitu
- Upgraded
databentocrate to v0.24.0 - Upgraded
datafusioncrate to v47.0.0 - Upgraded
rediscrate to v0.30.0 - Upgraded
sqlxcrate to v0.8.5 - Upgraded
pyo3crate to v0.24.2
Fixes
- Fixed consistent ordering of execution events (#2513, #2554), thanks for reporting @stastnypremysl
- Fixed type error when generating an elapsed time for backtests with no elapsed time
- Fixed memory leak in
RetryManagerby simplifying the acquire-release pattern, avoiding the asynchronous context manager protocol that led to state sharing, thanks for reporting @DeevsDeevs - Fixed locked balance and initial margin calculations for reduce-only orders (#2505), thanks for reporting @stastnypremysl
- Fixed purging order events from position (these needed to be purged prior to removing cache index entry), thanks @DeevsDeevs
- Fixed
TypeErrorwhen formatting backtest post run timestamps which wereNone(#2514), thanks for reporting @stastnypremysl - Fixed handling of
BetfairSequenceCompletedas custom data - Fixed the instrument class of
IndexInstrument, changing toSPOTto correctly represent a spot index of underlying constituents - Fixed data range request
endhandling forDataEngine - Fixed unsubscribe instrument close for
DataEngine - Fixed network clients authentication for OKX (#2553), thanks for reporting @S3toGreen
- Fixed account balance calculation for dYdX (#2563), thanks @davidsblom
- Fixed
ts_initfor databento historical data (#2566), thanks @faysou - Fixed
RequestInstrumentinquery_catalog(#2567), thanks @faysou - Reverted removal of rotate log file on UTC date change (#2552), thanks @twitu
Documentation Updates
- Improved environment setup guide with recommended rust analyzer settings (#2538), thanks @twitu
- Fixed alignment with code for some
ExecutionEnginedocstrings
Deprecations
None