NautilusTrader 2.0.0rc5
September 2, 2026 · View on GitHub
Released on TBD (UTC).
Enhancements
Breaking Changes
Security
Fixes
Internal Improvements
- Upgraded
flate2crate to v1.1.10 - Upgraded
indexmapcrate to v2.14.1 - Upgraded
rcgencrate to v0.14.10 - Upgraded
linkify-it-pypackage to v2.1.1
Documentation Updates
Deprecations
NautilusTrader 2.0.0rc4
Released on 2nd September 2026 (UTC).
Note
The OrderSide, PositionSide, ContingencyType, TrailingOffsetType, and TriggerType changes
are broad because their zero-valued NO_* variants came from constraints in the former Cython and
FFI design. With Cython removed, compatibility representations can remain at serialization and FFI
boundaries instead of shaping the Rust and Python domain enums, while preserving legacy formats and
the existing C API.
Enhancements
- Added error reporting for strategies left running after a backtest ends (#4803), thanks @folknor
- Added client order ID options to Python
GridMarketMakerConfig(#4822), thanks @mameikagou - Added custom Python fee model support to simulation configs (#4806), thanks for reporting @gtalknitin
- Added instrument-scoped order fill-voided event topics
- Added Rust model handles for custom backtest margin and latency implementations
- Added live socket state events and targeted reconnect controls across adapters
- Added warnings for open orders excluded by the reconciliation lookback window (#4847), thanks @folknor
- Added
Serializablesupport toOrderBookDeltas(#4889), thanks @abhijeetvichare76 - Added Lighter support for Robinhood Chain with deployment-specific venues and credentials
- Added OKX instrument cache reconciliation and WebSocket instrument updates
- Added Polymarket market descriptions to
instrument.info(#4840), thanks for reporting @mystic-io - Added Polymarket quote ticks from
best_bid_askmarket events - Added Polymarket RTDS crypto TWAP custom data (#4843), thanks @seungpyoson
- Added matching engine controls to sandbox execution configs (#4813), thanks @graceyangfan
Breaking Changes
- Removed
BitmexExecFactoryConfig; passBitmexExecutionClientConfigdirectly to the factory - Removed
DatabentoLiveClientConfig; passDatabentoDataClientConfigdirectly to the factory - Removed
DeriveExecFactoryConfig; passDeriveExecutionClientConfigdirectly to the factory - Removed
HyperliquidExecFactoryConfig; passHyperliquidExecutionClientConfigdirectly to the factory - Removed
trader_idfrom adapter execution client configs and factory construction - Removed backtest
settlement_pricesconfiguration and setters; useInstrumentCloseexpiry data - Removed low-level Python WebSocket clients and their dedicated request, error, and channel-control types from adapters
- Replaced Rust
HttpClient,WebSocketClient, andSocketClientconstructor overloads with builder APIs - Renamed
ImportableExecAlgorithmConfigtoImportableExecutionAlgorithmConfig - Renamed
LiveDataClientConfigtoDataClientConfig - Renamed
LiveExecClientConfigtoExecutionClientConfig - Renamed
LiveExecEngineConfigtoLiveExecutionEngineConfig - Renamed
ExecFactoryExtractortoExecutionFactoryExtractor - Renamed
SimExecFactoryExtractortoSimulatedExecutionFactoryExtractor - Renamed
*ExecClientConfigtypes to*ExecutionClientConfig - Renamed
BetfairDataConfigtoBetfairDataClientConfig - Renamed
BetfairExecConfigtoBetfairExecutionClientConfig - Changed Rust
OrderSidetoBUYorSELL; removedOrderSideSpecified; useOptionif needed - Changed Rust
PositionSidetoFLAT,LONG, orSHORT; removedPositionSideSpecified; useOptionif needed - Changed Rust
ContingencyType,TrailingOffsetType, andTriggerTypeto useOptionfor absence - Changed Rust backtest margin parameters to
MarginModelHandle - Changed Rust backtest latency parameters to
LatencyModelHandle - Changed contract expiry to use
InstrumentClose.close_pricefor futures, binary contracts, and option close legs - Changed omitted backtest leverage to 10x for margin and 1x for cash; set
default_leverage=1for prior behavior - Changed Rust
MarginModelimplementations to requireSend + Syncandname() - Changed
ExecutionManager::newto validate lookback bounds and returnConfigResult(#4809), thanks @folknor - Changed
Strategy.cancel_all_ordersto associated orders by default (#4470), thanks for reporting @zurpet - Changed
ExecutionClientFactory::createto receive the node'sTraderId - Changed
SimulatedExecutionClientFactory::createto receive the node'sTraderId - Changed adapter execution account configs to use
account_idinstead of factory arguments - Changed adapter execution factories to use no-argument constructors
- Changed Lighter client configs (Rust); complete struct literals must add
deploymentandvenueor use builders - Changed Polymarket Gamma models to expose resolution metadata (#4842), thanks @seungpyoson
- Changed Polymarket REST reconciliation to reject unbound or invalid reports (#4831), thanks @seungpyoson
Security
- Added fail-closed Cargo dependency cooldown checks and transactional repair for both lockfiles, with portable GNU and BSD date handling
- Fixed foreign-instrument fills corrupting cached position state (#4802), thanks @folknor
Fixes
- Fixed active-local order modifications bypassing their execution algorithm (#4793), thanks @folknor
- Fixed execution algorithms submitting spawned orders with live emulation triggers (#4881), thanks @folknor
- Fixed trigger-carrying order modifications bypassing the order emulator (#4848), thanks @folknor
- Fixed Efficiency Ratio windowing and invalid Python input handling (#4807), thanks for reporting @staffordjh
- Fixed indicator string representations reporting fields out of order (#4816), thanks @s1amese2003
- Fixed own order book audits removing active-local orders
- Fixed stale order slippage after fill-void corrections
- Fixed
StrategyConfig.manage_contingent_ordersfor open, non-active-local OTO, OCO, and OUO orders - Fixed native strategy timers bypassing managed time-event routing (#4888), thanks for reporting @silarin
- Fixed rate-limit requests consuming quota before all applicable limits were available
- Fixed reconnect-buffered socket messages stalling or being overtaken by newer messages
- Fixed Python factory re-entry through
LiveNodeBuildercausing process aborts - Fixed live order snapshots not being persisted to PostgreSQL
- Fixed live position snapshots not being persisted to PostgreSQL
- Fixed partial late fills reopening canceled orders
- Fixed cloned execution event emitters dropping events after sender initialization (#4874), thanks @folknor
- Fixed BacktestEngine delayed orders using unrelated instrument prices (#4891), thanks for reporting @mdou7
- Fixed
generate_missing_orders=Falsecreating synthetic orders and fills (#4739), thanks for reporting @hashtagdenis - Fixed Betfair
CancelAllOrdersside filters and large batch cancellation - Fixed Betfair order and fill reconciliation with more than 250 market IDs
- Fixed Betfair stream readiness, liveness, subscription replay, and reconnect reconciliation
- Fixed Betfair modify recovery after ambiguous REST outcomes and instruction failures
- Fixed Betfair terminal order identity across reconnects, late fills, void corrections, and replacements
- Fixed Binance Futures fill reconciliation treating history outside venue retention as complete
- Fixed Binance Futures hedge-mode position reconciliation across REST snapshots and partial WebSocket fills
- Fixed Binance Futures whole-position exits denied by placeholder bounds (#4746), thanks for reporting @hashtagdenis
- Fixed Binance Spot and Futures execution reconciliation when no data client is configured
- Fixed Bybit option batch limits and WebSocket batch amend payloads
- Fixed Bybit rate limiting causing expired requests, venue rejections, and inconsistent order state
- Fixed Bybit scoped SPOT position reports and wallet balance fan-out (#4844), thanks @folknor
- Fixed Bybit WebSocket order book depth validation (#4823), thanks @Centaur-pub
- Fixed Deribit lazy-load subscriptions racing instrument cache updates
- Fixed Derive
CancelAllOrdersto use cached orders without refreshing venue state - Fixed Hyperliquid execution disconnect cleanup
- Fixed Hyperliquid market order prices in order list submits
- Fixed Interactive Brokers adaptive limit orders parsed as market orders (#4830), thanks @mameikagou
- Fixed Interactive Brokers restored-order cancel callback routing (#4852), thanks @gapurov
- Fixed L2/L3 matching against deleted book touches (#4819), thanks @SoYuCry
- Fixed Lighter Plus and Premium quota metadata to match deployed account-tier limits
- Fixed Lighter Testnet orders by omitting mainnet-only integrator attribution (#4834), thanks @Buff2out
- Fixed OKX WebSocket submissions omitting
reduceOnly(#4827), thanks for reporting @silarin - Fixed OKX ambiguous submissions, subscription recovery, and triggered child reconciliation
- Fixed OKX conditional order identity, replay deduplication, and post-trigger cancellation
- Fixed Polymarket user WebSocket subscriptions to cover all account orders and trades
- Fixed Polymarket
CancelAllOrdershandling for empty caches and cross-strategy, instrument, and side scopes - Fixed Polymarket FAK no-match batch responses missing
OrderRejectedevents - Fixed Polymarket market WebSocket heartbeats before initial subscription (#4864), thanks for reporting @mystic-io
- Fixed Polymarket position pagination returning incomplete results at the offset limit (#4811), thanks @seungpyoson
- Fixed Polymarket stale tick refreshes and mixed price precision (#4896), thanks for reporting @mystic-io
- Fixed Tardis incremental L2 batches ending on exchange timestamps (#4872), thanks for reporting @szpony
Internal Improvements
- Added Python memory leak checks for backtest, live node, model, and persistence lifecycles
- Added strict Clippy audit tooling
- Allowed
DataActorimplementations without nativeComponentstate - Improved model type boundary regression coverage
- Improved nightly Clippy compatibility across Rust workspace checks
- Improved
OrderBookregression coverage - Improved Python
Positionlifecycle validation to raiseValueErrorfor invalid fills - Improved Architect AX and Bybit initial WebSocket retries and cancellation (#4867), thanks @folknor
- Improved Betfair stream lifecycle test synchronization (#4849), thanks @folknor
- Improved dYdX retry timeout test coverage (#4835), thanks @folknor
- Improved Lighter async task ownership across execution and WebSocket reconnects
- Improved Polymarket auto-load and data task ownership across reconnects
- Improved Polymarket reconciliation regression coverage (#4855), thanks @seungpyoson
- Refined model fixed-point validation and wallet scaling
- Refined
OrderBookvalidation, snapshots, quotes, and display paths - Refined Python actor setup across runtime paths
- Standardized Rust blocking locks on
parking_lot - Optimized
BacktestEngineprocessing when simulation modules and liquidation are disabled - Optimized
IdsGeneratortrade ID formatting - Optimized
MatchingEngineL1 pending order queue scans - Optimized
OrderMatchingEnginequeue tracking and liquidity consumption - Optimized
OrderBookL1 level reuse - Optimized risk, execution, and portfolio processing for accounts and positions with long histories
- Optimized Betfair subscription test teardown (#4837), thanks @folknor
- Optimized Hyperliquid startup reconciliation to skip inactive dexes (#4861), thanks for reporting @nah294
- Optimized Polymarket quote parsing across WebSocket inputs
- Upgraded Rust (MSRV) to 1.98.0
- Upgraded Miri to
nightly-2026-08-23 - Upgraded
cargo-hawkto v0.1.13 - Upgraded
shellcheck-pypre-commit hook to v0.11.0.1-1 - Upgraded
alloycrate to v2.4.1 - Upgraded
alloy-primitivescrate to v1.7.1 - Upgraded
arrowcrate to v59.2.0 - Upgraded
arrow-rowcrate to v59.2.0 - Upgraded
blake3crate to v1.8.7 - Upgraded
databentocrate to v0.60.0 - Upgraded
datafusioncrate to v55.0.0 - Upgraded
eithercrate to v1.18.0 - Upgraded
logcrate to v0.4.34 - Upgraded
parquetcrate to v59.2.0 - Upgraded
uuidcrate to v1.26.0 - Upgraded
maturinbuild backend and package (dev) to v1.15.0 - Upgraded
ruffpackage (dev) and pre-commit hook to v0.16.4 - Upgraded
simplejsonpackage (visualization) to v4.1.1 - Upgraded
typackage (dev) to v0.0.74 - Upgraded
uvicornpackage (dev) to v0.52.4
Documentation Updates
- Updated maintained examples and tutorials for current APIs and removed unsupported variants
- Documented behavioral model dispatch and native model extension boundaries
- Documented Lighter Testnet account and API key setup
- Documented OKX instrument cache reconciliation and WebSocket update behavior
- Documented Polymarket quote sources and order book feed interaction
- Documented Polymarket RTDS crypto TWAP delivery, reconnect, and conflict handling
- Fixed broken OMS configuration link (#4877), thanks for reporting @aarushkandukoori
NautilusTrader 2.0.0rc3
Released on 20th August 2026 (UTC).
Note
Some renames in this release, such as AggressorSide Buyer/Seller becoming Buy/Sell, restore
the most correct naming conventions. The Cython-era C API shared one enum namespace across types,
which ruled out these names; since the removal of Cython, that limitation no longer applies.
Enhancements
- Added dead-peer detection to every transport with a configured heartbeat, reconnecting when the peer stops sending
- Added TCP keepalive and Linux
TCP_USER_TIMEOUTto all outbound connections, detecting half-open sockets in ~1 min - Added HTTP
CONNECTproxy support to the Sockudo WebSocket backend - Added
WebSocketConfig.heartbeat_timeout_secsso every connect entry point can set a liveness window - Added a one-second floor on flapping reconnect attempts, keeping clients under venue connection-rate limits
- Added
WalletAccountfor native and token balances with local reservations - Added
PositionOpenedrealized PnL - Added
AccountStatevenue metadata - Added canonical Rust backtest results with normalized projections, content digests, and stable ordering
- Added full Rust config parity for the Python testkit
ExecTesterConfig - Added
Sumiterator support for owned and borrowedQuantityvalues (#4720), thanks @faysou - Added Python v2 Redis message bus backing for
LiveNode(#4630), thanks for reporting @davidgreyme - Added Python v2 cache database backing for
LiveNode(#4634), thanks for reporting @AlphaTraderK - Added Python v2
LiveNode.run_async(),LiveNodeHandle, andNodeStatefor caller-owned event loops - Added direct message bus backing installation through
RedisMessageBusConfig - Added
LiveNode.start()warning when external message bus ingress requiresrun() - Added trader start warning when
load_stateorsave_stateis enabled without a cache database backing - Added runtime external-order claim registration and removal to Rust
LiveNode(#4620), thanks @folknor - Added
INFOlogs for socket and WebSocket connection loss and recovery (#4621), thanks @folknor - Added Rust and Python
SocketStateChangedevents for Binance Futures, Lighter, and Polymarket live clients - Added Coinbase heartbeat counter gap warnings, resetting after reconnect
- Added Deribit book summaries as requestable custom data (#4576), thanks @graceyangfan
- Added Derive fixed-window rate limits for global and per-instrument matching requests
- Added Hyperliquid socket-state reporting and
reconnect_socketon data and execution WebSockets - Added Hyperliquid user TWAP history and slice fills as opt-in custom data (#4674), thanks @graceyangfan
- Added Interactive Brokers support for canonical 21-character OPRA option IDs (#4774), thanks @xxxxxx-oss
- Added Lighter inbound liveness timeout and socket-state reporting on data and execution WebSockets
- Added Polymarket
compute_effective_deltasconfig option to emit net changes for book snapshots (defaultFalse) - Added Polymarket
series_idsinstrument provider scoping for Gamma market families (#4650), thanks @mystic-io - Added Polymarket instrument bootstrap from a
filtersmap or a registeredInstrumentFilterwithoutload_all - Added Polymarket backtest fee model with per-market taker fees and maker credits
Breaking Changes
- Removed legacy v1 Cython package and root build path; use the Rust + PyO3 package
- Removed
nautilus_trader.core.is_pycapsule; use normal Python type checks on model objects - Removed model
as_pycapsulemethods andOrderBookDeltas.from_pycapsule; pass typed model objects directly - Removed FFI features and static libraries outside
nautilus-coreandnautilus-model; use Rust or PyO3 APIs - Removed
cython-compat, Cython cbindgen configs, anddrop_cvec_pycapsule; use PyO3 APIs - Removed generic Python clients and support APIs from
nautilus_trader.network; use adapter APIs ornautilus-network - Removed
LiveNode.poll()and PythonLiveNode.start(); use hostedrun_with_mode(...)orrun_async() - Removed
nautilus_trader.data.OptionChainManager; usesubscribe_option_chainand handleOptionChainSlice - Removed
Cache.actor_ids(), which always returned an empty set; use RustTrader::actor_ids() - Removed
WebSocketClient::connect_with_heartbeat_timeout; setWebSocketConfig.heartbeat_timeout_secsinstead - Removed duck-typed object conversion from
BacktestEngine.add_data; pass model objects directly - Removed unused Rust
SocketClientandWebSocketClientconnection callbacks; use message or epoch handlers - Removed Rust
nautilus_execution::matching_engine::adapter::OrderEngineAdapter; useOrderMatchingEngine - Removed Rust
from_pyobjectconstructors fromnautilus_modeldata types; useBound::extractfor the target type - Removed Rust
nautilus_core::CleanDropand itsdropmodule; implementDropdirectly - Removed Databento
load_*_as_pycapsulemethods; use the correspondingload_*methods - Removed the trailing
heartbeat_timeoutparameter from the epoch-handler connect; set it on the config - Replaced Rust
nautilus_model::python::data::data_to_pycapsulewithdata_to_pyobject - Renamed
Portfolio.margins_inittoinstrument_initial_margins - Renamed
Portfolio.margins_mainttoinstrument_maintenance_margins - Renamed
Portfolio.is_flattois_net_flat - Renamed
Portfolio.is_completely_flattois_completely_net_flat - Renamed
AggressorSideBuyer/Sellervariants toBuy/SellandBUYER/SELLERmembers toBUY/SELL - Renamed Cap'n Proto
AggressorSidesymbols tobuy/sell, preserving ordinals - Renamed PostgreSQL
AGGRESSOR_SIDElabels toBUY/SELL; migrate withALTER TYPE ... RENAME VALUE - Changed Rust
OrderMatchingEngineimport tonautilus_execution::matching_engine::OrderMatchingEngine - Changed Rust
QueryResultandDataQueryResultto iterateResultitems carrying a newQueryError - Changed
DataQueryResultiteration to return Python object lists instead ofDataFFIcapsules - Changed adapter callbacks to receive typed model objects instead of
PyCapsuleobjects - Changed cache actor APIs to
ActorIdfromComponentId, coveringCacheDatabaseAdapteractor state methods - Changed Interactive Brokers historical tick responses and Tardis batch streams to provide typed model objects
- Changed portfolio statistic
calculate_from_positionsto requirePositionobjects instead of duck-typed ones - Changed
AggressorSidestring output fromBUYER/SELLERtoBUY/SELLfor display, serde, and SQL encoding - Changed
WebSocketConfig.heartbeattoheartbeat_interval_secsandheartbeat_msgtoheartbeat_payload - Changed
WebSocketConfig.reconnect_timeout_mstoconnect_timeout_ms, which also bounds the initial dial - Changed
SocketConfig.heartbeatfrom a tuple toOption<SocketHeartbeat>withinterval_secsandpayload - Changed
SocketConfig.idle_timeout_mstoheartbeat_timeout_secs, matching the inbound silence it always detected - Changed a configured heartbeat to imply dead-peer detection, defaulting
heartbeat_timeout_secsto three intervals - Changed the Sockudo backend to tunnel through a configured
proxy_urlinstead of silently falling back to Tungstenite - Changed WebSocket and socket clients to validate config on connect, so an invalid config now fails at startup
- Changed custom cache database adapters to require
index_order_clientsfor live orders (#4797), thanks @xxxxxx-oss - Changed Betfair
stream_heartbeat_mstostream_heartbeat_secs, now seconds rather than milliseconds (default5) - Changed Betfair
stream_idle_timeout_mstostream_heartbeat_timeout_secs, now seconds (default60) - Changed Binance spot and futures WebSocket API trading clients to send a keepalive, which they previously omitted
- Changed Bybit
bybit_bar_spec_to_intervalto take aBarAggregationinstead of an integer - Changed Bybit execution
heartbeat_interval_secsdefault from5to20, matching the documented cadence - Changed Hyperliquid
subscribe_book_deltasandsubscribe_book_snapshotsto take aBookTypeinstead of an integer - Changed OKX and dYdX Python WebSocket clients to default
heartbeatto the venue cadence instead ofNone - Changed Polymarket
HeartbeatResponse::Acknowledgedto carry a required chained ID - Changed Polymarket Gamma
game_idto a string onGammaMarket,GammaEvent, and instrumentinfo - Changed Polymarket Gamma and CLOB tick size fields from
f64toDecimal - Changed Polymarket strict allowance decoding to require the plural
allowancesmap (#4760), thanks @seungpyoson
Security
- Hardened development wheel publishing to validate exact artifacts and fail closed
- Pinned the direct
alloycrate dependency to v2.2.0 to limit its larger supply-chain risk surface - Fixed Rust network and WebSocket adapter logs that could expose credentials and payload contents
- Removed
OrderBookDeltas.from_pycapsule, which reinterpreted unvalidated pointers and risked invalid memory access - Fixed Hyperliquid client configs leaking private keys in
Debugoutput
Fixes
- Fixed overflowing order fill raw sums becoming undefined quantities or panicking
- Fixed
MarginAccounttotal margin getters panicking on out-of-range raw sums - Fixed clocks accepting oversized timer intervals and unrepresentable first event times
- Fixed live timers firing up to 1 ms before their nominal deadlines
- Fixed
LiveClock::default()missing time-event senders initialized after clock construction - Fixed Python
on_historical_datato receiveCustomDataresponse batches as a single list - Fixed
Cache::get_xratefor instrument symbols that do not use theBASE/QUOTEformat - Fixed market order risk checks to use cached bars and deny orders without a usable price
- Fixed
Positionaverage open price (avg_px_open) for exact closes after partial fills - Fixed order list
OrderInitializedevents to carryorder_list_idthrough publication, persistence, and replay - Fixed Postgres cache restore dropping order
tagsandexec_algorithm_params - Fixed Cache venue order ID alias indexing and purging during mass-status reconciliation
- Fixed failed live strategy registrations leaving orphaned external-order claims (#4620), thanks @folknor
- Fixed network controllers treating aborted reconnects as completed reconnections (#4623), thanks @folknor
- Fixed WebSocket pongs held across a reconnect being enqueued on the replacement connection (#4613), thanks @folknor
- Fixed Python v2
FeeModelsubclass constructors and concrete model inheritance (#4640), thanks @dfjmax - Fixed fee model panics from invalid Python inputs and decimal overflow (#4640), thanks @dfjmax
- Fixed malformed external message topics aborting Python v2
LiveNode(#4630), thanks for reporting @davidgreyme - Fixed macOS ARM64 PyArrow SIGSEGVs (#4633, #4642), thanks for reporting @ZhongxuanWang; thanks @alex09x
- Fixed macOS Python allocator TLS collisions by selecting mimalloc v2 (#4758), thanks @faysou
- Fixed
CashAccountaborts when reserving negative-price buy orders (#4725), thanks @folknor - Fixed
OrderBookDeltas::new_checkedaccepting child instrument mismatches (#4710), thanks @folknor - Fixed Python
MessageBusendpoint panics from empty, whitespace, or wildcard addresses - Fixed synthetic formula parser stack overflows from unbounded nesting (#4723), thanks @folknor
- Fixed
f32logarithm approximation on non-positive and non-finite inputs (#4740), thanks @folknor - Fixed margin models reserving a negative requirement for negative-price orders (#4751), thanks @folknor
- Fixed
DeltaNeutralVolaborting when a rehedge quantity rounds to zero (#4752), thanks @folknor - Fixed strategy config accepting
GTDmarket exits, which later aborted flattening (#4762), thanks @folknor - Fixed backtest
BorrowMutErroraborts whenuse_message_queueis disabled (#4763), thanks @folknor - Fixed AMA reset history retention and Rust
FuzzyCandlesticksoutput retention (#4666), thanks @mkzung - Fixed
ChandeMomentumOscillatorreturning values outside [-100, 100] for a zero gain average (#4667), thanks @mkzung - Fixed portfolio PnL and net exposure currency when
convert_to_account_base_currencyis disabled - Fixed portfolio realized PnL mixing snapshot and position exchange rates with
use_mark_xratesenabled - Fixed account state log throttling for events carrying an earlier
ts_init - Fixed catalog and session queries treating DataFusion decode failures as exhausted; Python now raises
RuntimeError - Fixed default execution mass status generation to compose granular reports (#4669), thanks @folknor
- Fixed Parquet custom data queries for
Vec<u8>fields (#4670), thanks @TheoBabilon - Fixed WebSocket pongs replaying on replacements via connection epoch binding (#4683), thanks @folknor
- Fixed backtest windows dropping boundary data and empty runs advancing time (#4685), thanks @folknor
- Fixed
BetPositionaverage price and PnL after stake increases (#4684), thanks @folknor - Fixed option expiry settlement dispatching partial legs and failing to retry missing prices (#4618), thanks @folknor
- Fixed simulated exchange order queries returning all orders for unknown instruments (#4687), thanks @folknor
- Fixed
FixedRiskSizeromitting instrument contract multipliers (#4699), thanks @dfjmax - Fixed cache resets retaining stale
OptionGreeksvalues (#4701), thanks @folknor - Fixed
f32exponential approximation outside its normal exponent range (#4709), thanks @folknor - Fixed orderless position cache indexes and replayed flips (#4688), thanks @pengpengyi92
- Fixed event-store
verifyreporting a timeout when a large corrupt report filled the worker pipes - Fixed event-store writer treating a zero channel capacity as a rendezvous that fail-stopped the run
- Fixed portfolio Greeks failing on closed positions (#4700), thanks @folknor
- Fixed
AverageTrueRangeignoring its configuredma_typeand always using a simple moving average - Fixed Python
MessageBusaccepting empty or whitespace-only subscription patterns - Fixed the
OptionSeriesIdPython constructor panicking on an invalid venue; it now raisesValueError - Fixed Python
BarSpecificationpanicking on oversized time intervals; construction now raisesValueError - Fixed stale venue book snapshots logging one out-of-order warning per delta
- Fixed backtest timer callbacks inheriting the next data event's timestamp (#4747), thanks @faysou
- Fixed
AverageTrueRange.reset()leaving the inner moving average populated (#4749), thanks @mkzung - Fixed HTTP query parameters being dropped when the URL already has a fragment (#4750), thanks @folknor
- Fixed option constructors accepting a zero or negative strike price (#4745), thanks @folknor
- Fixed cache position updates applying the index change before the value write (#4767), thanks @folknor
- Fixed DeFi pool positions dropping fees when fee-growth counters wrap (#4768), thanks @folknor
- Fixed
MovingAverageConvergenceDivergenceinput counting (#4779), thanks @mkzung - Fixed WebSocket text heartbeats being replayed on the replacement connection
- Fixed startup reconciliation losing the source execution client for external orders (#4781), thanks @xxxxxx-oss
- Fixed cache order and position adds leaving partial indexes when persistence failed (#4783), thanks @folknor
- Fixed cache position updates recreating a partial entry for an unknown or purged ID (#4785), thanks @folknor
- Fixed purge retention minutes overflowing nanoseconds and panicking in timer callbacks (#4784), thanks @folknor
- Fixed stopped TWAP execution schedules never resuming their remaining slices (#4786), thanks @folknor
- Fixed purge timer setup panicking on oversized intervals (#4804), thanks @folknor
- Fixed Betfair stream reauthentication and subscription replay after session replacement
- Fixed Betfair rounding a sub-second stream heartbeat interval up instead of down
- Fixed Binance Spot HTTP submissions to use private-stream order events across reconnects
- Fixed Binance Futures hedge-mode
positionSideforclose_positionexits (#4732), thanks @hashtagdenis - Fixed Bybit REST and WebSocket order
smpGroupstring decoding (#4655), thanks for reporting @a-green-hand-jack - Fixed Bybit
open_onlyreports missing recently closed orders (#4765), thanks @NoiceHax - Fixed Databento MBO snapshots advancing the incremental sequence (#4686), thanks @faysou
- Fixed Databento parent book-delta responses splitting by child instrument
- Fixed Deribit losing its
set_heartbeatcontract after reconnecting, disabling venuetest_requestfor the session - Fixed Derive cancel-only replacements and reused labels during order reconciliation
- Fixed Derive WebSocket recovery, subscription replay, and silent connection detection
- Fixed Derive fill commissions to construct exactly from wire decimals and error on unrepresentable fees
- Fixed Derive account state reporting collateral credit as locked and net health as margin requirements
- Fixed Derive denying unsupported orders only after
OrderSubmitted - Fixed Derive historical trade aggressor side and forward-price event times
- Fixed Hyperliquid historical candle timestamps and unfinished candle filtering (#4727), thanks @HKOWL
- Fixed Hyperliquid order and position reconciliation across standard and HIP-3 dexes
- Fixed Hyperliquid WebSocket reconnect events being swallowed after resubscription
- Fixed Hyperliquid oid queries dropping the known client order ID
- Fixed Hyperliquid REST user fills dropping venue
tidandbuilderFee - Fixed Hyperliquid historical order and order-status parsing for
FrontendMarketandLiquidationMarketTIF - Fixed Interactive Brokers continuous futures historical bar requests (#4664), thanks @dfjmax
- Fixed Interactive Brokers deactivated open-order processing
- Fixed Interactive Brokers delayed market data not emitting
QuoteTickvalues (#4719), thanks @faysou - Fixed Interactive Brokers local modify and cancel rejection event emission (#4564), thanks for reporting @davidgreyme
- Fixed Lighter startup reconciliation for bounded fill history, incomplete coverage, and restored fills
- Fixed Lighter acknowledged creates, position snapshot versus incremental updates
- Fixed OKX margin reconciliation omitting
SPOTorders and fills (#4743), thanks @silarin - Fixed OKX
QueryOrderrouting for algo and regular orders (#4731), thanks @silarin - Fixed OKX algo child dispatch and triggered conditional query recovery
- Fixed OKX retryable and timeout command failures being treated as venue rejections
- Fixed Polymarket commissions to preserve exact decimal values in
Moneyconstruction - Fixed Polymarket maker fill ownership and reported mass-status trade drops (#4662), thanks @seungpyoson
- Fixed Polymarket WebSocket asset and discovery subscription replay across reconnects
- Fixed Polymarket market subscriptions to explicitly request initial book snapshots
- Fixed Polymarket buffered fills after terminal status leaving orders
PartiallyFilledand dropping expiry fills - Fixed Polymarket HTTP rejection reasons carrying the raw JSON body instead of the venue message
- Fixed Polymarket WebSocket
FAKandFOKBUY sizes reported as the signed pUSD maker amount - Fixed Polymarket order-safety heartbeat routing, ID chaining, rate-limit retries, and safety deadlines
- Fixed Polymarket order book snapshots accepting divergent data with invalid venue hashes
- Fixed Polymarket compact book snapshots being dropped when hash preimage fields are absent
- Fixed Polymarket open markets being removed from live state after
endDate(#4706), thanks @mystic-io - Fixed Polymarket Gamma pagination for composite
gameIdsports markets (#4771), thanks for reporting @jamesjklin - Fixed Polymarket treating HTTP 425 and non-CLOB 429 submit failures as definitive rejections
- Fixed Polymarket WebSocket application heartbeat liveness
- Fixed Polymarket terminal condition retirement repeating every poll cycle
- Fixed Polymarket auto-load dropping open markets omitted from the default Gamma lookup (#4728), thanks @mystic-io
- Fixed Polymarket allowance decoding accepting duplicate spender keys (#4760), thanks @seungpyoson
- Fixed Polymarket FIFO replay evicting still-active order identity and fill state
- Fixed Polymarket unsent and rejected cancels remaining in flight
- Fixed Polymarket user channel dropping batched messages on unknown event types (#4794), thanks @yashwardhan-gautam
- Fixed Polymarket partial GTC fills not reaching a terminal order status (#4795), thanks @yashwardhan-gautam
- Fixed Polymarket pagination accepting stalled or repeated cursors (#4800), thanks @seungpyoson
- Fixed Tardis CSV funding rates dropping
next_funding_nswithout a predicted rate - Fixed Tardis Machine funding rates omitting
next_funding_ns - Fixed Tardis Machine heartbeats continuing after the stream ended
Internal Improvements
- Added
Fromconversions fromActorId,ExecAlgorithmId, andStrategyIdtoComponentId - Improved native backtest workload coverage for canonical result checks
- Improved indicator test tolerances across floating-point magnitudes (#4718, #4742), thanks @mkzung
- Improved published-registry verifier tests to ignore fork metadata (#4715), thanks @xxxxxx-oss
- Improved Coinbase request tests by removing redundant waits (#4637), thanks @pengpengyi92
- Improved WebSocket reconnect replay to drop Ping, Pong, and Close frames instead of resending them
- Improved network crate tests for retries, rate limits, mutual TLS, HTTP, socket reconnects, and WebSocket messages
- Improved Polymarket order response tests for the
tradeIDsmatched shape and batch submission legs - Improved Polymarket on-chain approval-plan sharing and test coverage (#4773), thanks @seungpyoson
- Improved Tardis tests with OKX X-Perp and USDC index migration fixtures
- Refactored the Redis cache adapter to delegate deletions and custom data writes to
RedisCacheDatabase(Rust) - Refined CI, build, and dependency configuration after the v1 removal
- Replaced Chrono and Chrono-TZ with Jiff and bundled TZDB data (#4639), thanks @sunlei
- Standardized remaining risk engine order-denied reasons to coded values (#4744), thanks @folknor
- Standardized order command failure classification with shared
CommandFailurefor Architect AX, Bybit, and Kraken - Standardized OKX order command failure classification with the shared
CommandFailuretype - Standardized Polymarket submit and cancel HTTP failures with
CommandFailure - Standardized Polymarket local order denials to coded
OrderDeniedReasonvalues - Optimized pre-commit and local validation by reusing build artifacts and skipping unchanged checks, thanks @faysou
- Optimized Hyperliquid allMids projection to update on subscribe instead of every message
- Optimized Polymarket interleaved price-change dispatch and timestamp parsing
- Updated concept and tutorial docs to describe current Rust and PyO3 behavior after the v1 removal
- Upgraded Python and workflow tools:
uvv0.12.5,pypi-attestationsv0.0.30, andzizmorv1.29.0 - Upgraded Python lockfile dependencies:
numpyv2.5.2,platformdirsv4.11.2,librtv0.15.0, andsoupsievev2.9.2 - Upgraded Rust development tools:
cargo-hawkv0.1.12,cargo-nextestv0.9.143, and Mirinightly-2026-08-14 - Upgraded
cargo-llvm-covto v0.9.0 - Upgraded
flamegraphto v0.6.14 - Upgraded
prekto v0.4.14 andosv-scannerto v2.5.1 - Upgraded
async-traitcrate to v0.1.92 - Upgraded
aws-lc-rscrate to v1.18.0 - Upgraded
base64crate to v0.23.1 with only its safestdfeature enabled - Upgraded
blake3crate to v1.8.6 - Upgraded
bollardcrate to v0.21.1 - Upgraded
capnpandcapnpccrates to v0.27.0 and regenerated schema bindings - Upgraded
clapcrate to v4.6.6 - Upgraded
databentocrate to v0.58.0 - Upgraded
futuresandfutures-utilcrates to v0.3.34 - Upgraded
httpcrate to v1.5.0 - Upgraded
ibapicrate to v3.3.0 - Upgraded
pemcrate to v4.0.0 to align with the current Base64 API - Upgraded
pyo3crate to v0.29.2 for object-lifetime, free-threading, and compatibility fixes - Upgraded
rcgencrate to v0.14.9 - Upgraded
redbcrate to v4.2.0 - Upgraded
rediscrate to v1.6.0 - Upgraded
thiserrorcrate to v2.0.20 - Upgraded
timecrate to v0.3.55 - Upgraded
tomlcrate to v1.1.4 - Upgraded
uuidcrate to v1.24.1
Documentation Updates
- Added Python concept guidance for runtime ownership, public APIs, and hosted live execution
- Added thousands separators to adapter config-table quantity values
- Consolidated Python v2 integration guides and examples on canonical paths
- Corrected the Rust
DataTesterbook depth support note in the data testing spec - Documented external Redis message fields and Python custom-data registration
- Documented order book out-of-order update and stale snapshot reporting behavior
- Documented Polymarket command-failure classes and coded local denial reasons
- Documented Hyperliquid reconnect event forwarding, dead-peer timeout, and socket-state endpoints
- Documented the transient startup position-check race in the Lighter integration guide
- Fixed broken README links on PyPI (#4644, #4648), thanks for reporting @ZhongxuanWang; thanks @xxxjqm
Deprecations
- Deprecated
BUYER/SELLERserialization input forAggressorSide; useBUY/SELL(removal in a future release)
NautilusTrader 1.231.0 Beta
Released on 2nd August 2026 (UTC).
NautilusTrader v2 transition notice
This release is intended to be the final NautilusTrader 1.x release with support for the legacy
Cython v1 core. If final validation finds a serious blocker, maintainers may take another 1.x
release rather than force the cutover.
The v2 Rust + PyO3 runtime has reached the release-candidate stage for the supported workflows: Python strategy authoring, backtesting, live operation, core risk and execution, portfolio/accounting, data catalog usage, and the current adapter set. Some lower-use and newer surfaces remain deferred, and those are tracked in the v2 roadmap rather than treated as blockers for the cutover.
After this release, develop will move to v2-only. The legacy v1 core will move to a
develop_v1 branch, where maintainers will accept critical security backports for approximately
three months after the v2 cutover. New feature work will target v2.
The paired 2.0.0rc2 wheels are being released alongside 1.231.0 for community testing with
normal --pre installation. Follow-up 2.0.0rcN wheels are likely to ship at a higher cadence
than normal releases as feedback arrives, before the final 2.0.0 release.
Migration contracts
The v2 cutover makes the Rust + PyO3 package the primary path for new installs and source builds.
In the current checkout it lives under python/ and uses python/.venv; the root package and root
.venv still provide the legacy v1 Cython environment. Both packages import as
nautilus_trader, so test the migration in a separate virtual environment. See
Migrate from v1 to v2 for the current imports and build commands.
The accepted v2 contract differences are native CustomData without v1 wrapper semantics,
OptionGreeks cache writes, no Python Bar.is_revision, and a cross-zero Position.apply entry
price that resets to the flipping fill. V2 also prefers mark prices by default. Catalog order-event
data written before activation_price and OrderFilled.info were added is not readable with the new
schema and must be regenerated or migrated before an in-place upgrade. OrderFillVoided replay
requires the referenced fill locally before reopening and treats VOIDED as terminal. Regenerate
v2 order streams that contain a reopened correction before its referenced fill, or a cancel or
update after VOIDED.
The migration guide includes the v1-to-v2 identifier, collection, lifecycle, callback,
subscription, historical-batch, and removed-hook mappings. Typed historical requests use batch
callbacks; generic custom data continues through on_historical_data.
Cutover limits
The supported cutover workflows cover Python strategies, actors, backtests, live nodes, core risk and execution, portfolio/accounting, data catalogs, reports, tearsheets, and the current Rust-backed adapter set. The following limits remain deferred:
- Python request callbacks omit v1 joined-response, pending cleanup, and late or duplicate delivery conveniences.
- PostgreSQL cache position and synthetic loads, actor and strategy state persistence, and heartbeat.
- External message-bus publication of serialized order and position snapshots.
- V1
StreamingConfigandDataCatalogConfigiterator wiring on the v2BacktestNode. - V1 adapter instrument-provider filters; Hyperliquid v2 loads the configured universe.
- Published tutorials still use v1; generated v2 stubs and the Rust-native adapter examples show the current API.
- Static typing does not cover three Kraken batch methods or adapter wire DTO runtime attributes.
Enhancements
- Added v2
OrderFillVoided,OrderStatus.VOIDED, terminal voiding, and strategy and algorithm callbacks - Added v2
Decimalorder fill pricing;Order.avg_pxandOrder.slippageno longer round throughf64 - Added v2
infofill metadata toOrderFilled - Added v2 order-event
activation_pricepersistence through event and dictionary reconstruction - Added v2 Cap'n Proto and SQL persistence for order-event activation prices and fill
info - Added v2 trailing stops that activate at market and set prices from the first update
- Added v2 replay state carryover across NETTING close/reopen cycles (#4546), thanks @HungNgo4444
- Added v2 actor and strategy state persistence across live and backtest lifecycles
- Added v2
OrderBookDepth10subscriptions and callbacks for Rust and Python actors and strategies (#4439) - Added Rust and Python v2 cache introspection for market-data histories (#4586), thanks @Kenneth-zh
- Added
make_qty_from_decimal/make_price_from_decimalon theInstrumenttrait - Added
LiveNodeBuilder.with_controllerfor runtime controller configuration (#4427), thanks @bebop23 - Added returns skewness and kurtosis portfolio statistics (#4334), thanks @Martingale42
- Added Up/Down Capture ratio portfolio statistics (#4354), thanks @mahimn01
- Added Ulcer Index, Omega Ratio, VaR, and Expected Shortfall portfolio statistics (#4352), thanks @Martingale42
- Added Tail Ratio portfolio statistic (#4341), thanks @Martingale42
- Added Python v2 historical book-delta and depth batch callbacks for actors and strategies
- Added Python v2 subclassable execution algorithms for routed orders
- Added Python v2 execution algorithm config subclassing and importable config export
- Added Python v2
ExecutionAlgorithm.deny_orderwith terminal denial of invalid TWAP inputs - Added Python v2
ExecutionAlgorithmportfolio, lifecycle, signals, and constructed live registration - Added Python v2 controller subclassing and importable controller configs for backtest/live
- Added Python v2
BacktestNodepost-run cache, portfolio, statistics, and report inspection - Added Python v2 tearsheet support for
BacktestResultinput (#4563), thanks @faysou - Added Python v2
FeeModelandFillModelsubclass support for custom backtest models - Added Python v2
nautilus_trader.configconvenience imports for core configuration types - Added Python v2
Strategy.shutdown_system()andLiveNode.dispose()bindings - Added Python v2
LiveNodecache and portfolio inspection with bounded host-loop polling - Added Python v2
LiveNode.add_strategyfor constructed strategy instances (#4487), thanks @dfjmax - Added Python v2
PositionSizerandFixedRiskSizerbindings (#4573), thanks @dfjmax - Added Python v2
EfficiencyRatioandRelativeStrengthIndexmethods (#4420), thanks @a1zb2yc3z - Added Python v2 portfolio snapshot access with base-currency equity and stale/unpriced metadata
- Added Python v2
ExecTesterConfigcontrols for UUID order IDs, quote quantity, and stop-time cancels - Added Python v2
ExecTesterConfig.close_positions_qty_precisionfor venue-fillable stop-time closes - Added Rust
LiveNoderunner metrics snapshots - Added opt-in
mimallocallocator feature, enabled by default for Python wheels (#4358), thanks @ivannp - Added v2
MessageBusConfig.autotrim_maxlenfor Redis stream count retention (#4433), thanks for reporting @gtalknitin - Added WebSocket transport backend selection for Python and PyO3 configs (#4342), thanks @graceyangfan
- Added adapter config readback in Python v2 while keeping credentials and nested configs private
- Added Architect AX dated futures parsing and configurable WebSocket heartbeat and disconnect cancellation
- Added Architect AX funding-slot schedule requests via
GET /funding-slots - Added Architect AX Python v2 data and execution client factory bindings
- Added Binance Futures and OKX trailing-stop activation prices to v2 execution reports
- Added Binance GTD expiry support for USD-M and local expiry mapping for Spot and COIN-M
- Added Binance v2 extended bars, bounded history, snapshots, tickers, estimated settlement prices, and L1 books
- Added Binance USD-M (monthly and quarterly) and COIN-M (quarterly) delivery futures support
- Added Binance v2 USD-M TradFi perpetual instrument support (#4488), thanks @M4n5ter
- Added Binance v2 instrument filters, fees, scheduled refresh, proxy, and receive-window configuration
- Added Binance US Spot JSON data and HMAC execution to the Rust-backed v2 adapter
- Added Binance Python v2 constants, instrument loading, order book CSV loading, and client-order-ID decoders
- Added Binance Spot WebSocket trading setup timeout configuration (#4538), thanks @folknor
- Added Blockchain pool analysis to build exact checkpoint snapshots without storing full swap history
- Added Bybit spot
margin_tradinginstrument info field (#4540), thanks @dxwil - Added Bybit v2 automatic SPOT margin borrow repayment (#4543), thanks @dxwil
- Added DeFi pool
CurrencyPaircaching and publication with pool IDs, token-derived precision, andtaker_fee - Added Hyperliquid fast-cancel payloads for non-trigger order cancels (#4414), thanks for reporting @magnified103
- Added Hyperliquid market data stream health warnings for stalled Deltas, Depth10, and Quote subscriptions (#4298)
- Added Hyperliquid opt-in stale stream recovery with targeted resubscribe and reconnect escalation (#4298)
- Added Hyperliquid persistable
HyperliquidPublicTradecustom data (#4468), thanks @graceyangfan - Added Interactive Brokers PyO3 type stub annotations (#4350), thanks @dfjmax
- Added OKX RPI market data and order execution support
- Added PancakeSwap V3 protocol-fee replay accounting; run
make init-dbfor schema changes - Added Polymarket v2 market WebSocket sharding that enforces
ws_max_subscriptionsper connection pool - Added Polymarket v2 instrument definition subscriptions through live publishers with generic capability contracts
- Added Polymarket v2 GTD expiry and idempotent already-canceled execution test contracts
- Added Polymarket v2 HTTP and WebSocket proxy support for every live client transport
- Added Polymarket v2 opt-in authenticated order-safety heartbeats
- Added Polymarket v2 fill
infometadata carrying the raw venue trade fields - Added Polymarket v2 fills at
MATCHEDwith corrections for failed settlement - Added Polymarket v2 WS
hashandtransaction_hashfield decoding (#4377), thanks for reporting @SebastianPartarrieu - Added Polymarket v2
PolymarketDataLoaderfor public discovery and historical trades - Added Tardis MEXC spot and futures market data support
Breaking Changes
- Changed Rust
mins_to_secsandmins_to_nanosto panic on overflow; use thechecked_*variants - Changed L3 books to move IDs re-added at a new price on the same side, fixing ghost levels
- Changed L3 books to derive price-based order IDs for orders with a zero order ID
- Changed unstable Cap'n Proto
BarSpec.stepfromUInt32toUInt64 - Changed Rust
BookIntegrityErrorto addAmbiguousOrderSide; update exhaustive matches - Changed Rust encoding errors to add
MixedMetadataandReservedValue; update exhaustive matches - Changed Rust
SendErrorto addWriteTimeout; update exhaustive matches (#4572), thanks @folknor - Changed Rust
Cache::snapshot_positionto return(); usesnapshot_position_encodedfor the frame - Changed Rust time-event channels to
TimeEventMessage; callbacks are no longerSend + Sync(#4496), thanks @folknor - Changed Rust
DataQueryResult.chunkto private; use the borrow returned byset_chunk(#4499), thanks @folknor - Changed Rust FFI functions accessing
CVecdata tounsafe; wrap calls inunsafeblocks (#4499), thanks @folknor - Changed Rust
OrderStatusReport::with_avg_pxto take aDecimaland returnSelf; it no longer returns aResult - Changed Rust
calculate_fixed_risk_position_sizeto returnResult<Quantity>; callers must handle errors - Changed Rust CLI parser fields to crate-private; use
nautilus_cli::cli_commandandrun - Changed v2
PortfolioConfig.use_mark_pricesto prefer marks by default; setfalseto skip marks - Changed v2 portfolios to record daily equity snapshots by default; set
equity_curve=Falseto opt out - Changed v2 order-event schemas to persist activation prices and fill
info; old catalogs must be migrated - Changed v2 trailing-stop and order-event constructors to accept activation prices and fill
info - Changed v2
OrderPendingUpdateandOrderPendingCancelaccount_idto optional (AccountId | None), matching v1 - Changed v2 order average and slippage prices to
Decimalin Rust anddecimal.Decimalin Python - Changed v2 SQL order average and slippage prices to
NUMERIC; runnautilus database init - Changed v2
OrderSnapshotaverage and slippage prices to strings; migrate mixed-schema catalogs - Changed v2 instrument Arrow schemas to persist all constraints; old catalogs must be migrated
- Changed index option settlement to require
IndexPriceUpdatefor underlying levels (#4430, #4431), thanks @taozle - Changed DeFi
Poolinstrument conversion to preserve pool IDs; update callers keyed by token-pair symbols - Changed Architect AX request models and low-level APIs to current schemas; unverified stop-limit orders are rejected
- Changed BitMEX quanto multipliers from raw to settlement-currency units (#4507), thanks for reporting @4px4d9cdby-star
- Changed Blockchain fee-protocol update and snapshot storage to use
INTEGERprotocol-fee shares; runmake init-db - Changed Bybit repay result status fields from
StringtoBybitRepayStatus - Changed Lighter
LighterHttpErrorto addHistoryIncomplete; update exhaustive matches - Changed OKX algo order state filters from
OKXOrderStatustoOKXAlgoOrderStatus - Removed
DataActororder fill/cancel callbacks and subscription methods; use the message bus - Removed
CopyandClonefrom RustCVec; move values instead (#4499), thanks @folknor - Removed Rust
CANCELLABLE_ORDER_STATUSESand cancellable status set functions; useOrderStatus::is_cancellable() - Removed Rust
last_day_of_monthandis_leap_yearhelpers fromnautilus_core::datetime; use chrono equivalents - Removed Polymarket v2
ack_timeout_secs; submit buffering no longer waits for acknowledgments - Renamed Python v2
RedisMessageBusDatabasetoRedisMessageBusBacking(documenting a previous break) - Renamed Interactive Brokers PyO3 enum variants to uppercase names (e.g.
MarketDataType.DELAYED) (#4350)
Security
- Fixed
CVecownership and FFI reconstruction issues that could cause undefined behavior (#4499), thanks @folknor - Fixed cross-thread
RustLocalcallback access that could cause undefined behavior (#4496), thanks @folknor - Fixed time-event callback teardown aborting during thread-local destruction (#4516), thanks @folknor
- Fixed float time conversions saturating and real-time
AtomicTimereturning placeholder timestamps or aborting - Fixed underflow and currency-mismatch panics from out-of-order fill events (#4483), thanks @folknor
- Fixed fixed-risk position sizing panics from invalid inputs, overflow, and quantity conversion (#4573), thanks @dfjmax
- Fixed v2
CompetitionAwareFillModelandVolumeSensitiveFillModelpanics on invalid or overflowing liquidity - Fixed Arrow batch encoders silently re-labeling mixed metadata and leading clear deltas
- Fixed SBE
FundingRateUpdatemaximum optional values encoding as absent - Fixed Cap'n Proto
PriceandQuantitydecoding panicking on malformed precision - Fixed Cap'n Proto
BarSpec.steptruncating values aboveu32::MAX - Fixed DeFi
SwapTradeInfocalculations panicking on a zero prior spot price - Fixed DeFi spot and execution prices panicking or silently wrapping on high ratios and unsupported token decimals
- Fixed malformed Binance client order IDs aborting live adapters during report parsing
- Fixed out-of-range Binance timestamps aborting live adapters or silently wrapping; streams warn and use receive time
- Fixed Kraken data and execution config debug output exposing API credentials
Fixes
- Fixed execution engine and Binance minute intervals and lookbacks overflowing
u64nanoseconds - Fixed order book
NoOrderSidedeltas mutating the bid side when the ID is on both book sides - Fixed Rust
OwnBookLevel::updatepanicking on a missing order - Fixed own-book filtering using wall time without a supplied timestamp (#4597), thanks @folknor
- Fixed cache venue order ID collisions rebinding orders (#4595), thanks @folknor
- Fixed backtest venue registration rollback and non-positive leverage validation (#4596), thanks @folknor
- Fixed backtest generated ID collisions after instrument re-registration (#4580), thanks @folknor
- Fixed simulated venue multi-currency liquidation, FX rollover, and reset sequencing (#4612), thanks @folknor
- Fixed
DataTypedeserialization trusting stale cached hashes (#4592), thanks @folknor - Fixed stop-market updates clearing existing
protection_pricevalues when omitted (#4578), thanks @folknor - Fixed completed data response handlers persisting after dispatch (#4583), thanks @xxxxxx-oss
- Fixed
Throttlerstranding buffered messages after a rejectedtry_reserve(Rust), breaking drain order - Fixed network client reconnect stalls and stale-session frame delivery (#4572), thanks @folknor
- Fixed
nautilus database initpanicking instead of skipping existing schema objects on re-run - Fixed
nautilus database initleaving schema objects owned by the bootstrap administrator - Fixed the v2 SQL schema loader splitting dollar-quoted (
$$) statement bodies on their inner semicolons - Fixed Parquet catalog queries panicking in the Rust live runtime (#4526), thanks @TheoBabilon
- Fixed
CAGRandCalmarRatioreporting undefined results as zero - Fixed v2 clock
set_time_alertandset_timerpanicking on pre-epoch or out-of-rangeDateTimeinputs - Fixed v2 clock past-alert warning logging the adjusted time instead of the original alert time
- Fixed v2
LiveTimerpanicking in the timer task instead of atstartfor senderless Rust callbacks - Fixed v2 cache orders stuck pending-cancel-local after a cancel rejection, blocking later cancels
- Fixed v2 cache cold loads losing forward venue order ID lookups until the next order event
- Fixed v2 cache exchange rates picking an arbitrary bar type instead of the latest bar per side
- Fixed v2 sandbox execution retaining matching engines and cache state for expired quote-only instruments
- Fixed v2 NETTING backtest growth from replay logs in snapshots and fill clones (#4546), thanks @HungNgo4444
- Fixed v2 result tearsheets to reject disposed node state
- Fixed v2 result tearsheets reporting the backtest range instead of the wall-clock run duration
- Fixed v2 result tearsheets to filter PnL and account balances by currency
- Fixed v2
PortfolioAnalyzeraccount returns failing after empty balance snapshots - Fixed v2
PortfolioAnalyzernative position ingestion and statistic registration - Fixed v2
BettingInstrumentcatalog round trips corrupting raw symbols, increments, and precisions - Fixed v2 instrument catalog round trips dropping constraints, margins, and fees
- Fixed v2 realized PnL returning zero for missing rates or range errors and panicking on overflow
- Fixed v2 realized PnL counting only the newest snapshot for NETTING positions with three or more cycles (v1 parity)
- Fixed v2 realized PnL miscounting archived NETTING cycles whose boundaries a prior-cycle fill void moved
- Fixed v2 duplicate replayed fills reopening a flat position and panicking on a later fill void replay
- Fixed v2 portfolio snapshots retaining stale-price flags after the affected position side closed
- Fixed v2 portfolio snapshots dropping temporarily unpriced positions and hiding stale valuations
- Fixed v2 equity curves omitting unrealized PnL between fills (#3899), thanks for reporting @q-learning-trader
- Fixed v2 account-scoped valuations clearing other accounts' missing-price flags on shared venues
- Fixed v2 portfolio net exposure ignoring position side, so hedged books reported gross instead of net (v1 parity)
- Fixed v2 account locks and margins using settlement currency instead of each calculated currency
- Fixed v2 portfolio pending recovery discarding initial margin after recalculating maintenance margin
- Fixed v2 portfolio initialization materializing account balance currencies in a nondeterministic order
- Fixed v2 margin accounts adding zero balances for unreported currencies and denying unified-account orders
- Fixed v2 invalid or out-of-range notional and PnL valuations panicking or falling back to zero
- Fixed v2 multi-currency cash equity double-counting assets already credited to account balances
- Fixed v2 quanto position notionals using quote currency instead of settlement currency
- Fixed v2 portfolio valuations labeling and converting cost-currency amounts as settlement currency
- Fixed v2 composite bar aggregation (
@source) to deliver aggregated bars to subscribed actors and strategies - Fixed v2 tick-family aggregators to emit the standard bar type for composite subscriptions
- Fixed v2 volume-runs and value-runs aggregators dropping volume across bar boundaries
- Fixed v2 value-based aggregators dropping fractional volume after size-precision rounding
- Fixed v2
BarType.new_compositeto validate specifications during construction - Fixed v2
BarandBarSpecificationdeserialization to validate OHLC ordering and step periodicity - Fixed v2
Bar.from_pyobjectand bar type parsing at the Python boundary to raiseValueErrorinstead of panicking - Fixed v2 catalog writes re-labeling mixed instruments or bar types; writes now group or reject them
- Fixed v2 bar-type conversion corrupting
-INTERNALsymbols and composite bar types - Fixed v2 SQL bar decoding to reject invalid rows and composite bar inserts without panicking
- Fixed v2 external bar unsubscribe detaching the venue stream while other actors remained subscribed
- Fixed v2 continuous future bar unsubscribe tearing down the chain while other actors remained subscribed
- Fixed v2 continuous future bar requests emitting synthetic last-close bars across roll gaps (v1 parity)
- Fixed v2 orphaned composite source aggregator teardown leaking the underlying client tick subscription
- Fixed v2
subscribed_barsto include internally aggregated subscriptions (v1 parity) - Fixed v2
request_barsto reject composite bar types (v1 parity) - Fixed v2
skip_first_non_full_barper-command override for bar subscriptions and aggregation requests (v1 parity) - Fixed v2 matching engine uncanceled part-fill
INITIALIZEDIOC market orders (#4626), thanks for reporting @linimin - Fixed v2 matching engine stop and touch orders to honor last-price triggers (#4481), thanks for reporting @mgd134
- Fixed v2 matching engine quote-bar execution to honor
bar_adaptive_high_low_ordering(v1 parity) - Fixed v2 matching engine
resetto clear cached bid/ask bars, preventing stale pairs across runs - Fixed v2 order emulation leaving immediately matched submissions and modifications pending
- Fixed v2 order emulation retaining stale trigger and limit prices after modification (v1 parity)
- Fixed v2 volume aggregation step thresholds to use exact integer arithmetic instead of floating-point conversion
- Fixed v2
ValueBarAggregatorto accumulate value inDecimalmatching the v1 implementation - Fixed v2 internal bar aggregation dropping the first tick in backtests
- Fixed v2 quote extraction and quote-fed indicators panicking for a
Lastprice type - Fixed v2 wranglers to detect raw fixed-point overflow before Arrow conversion (#4372), thanks @MandalorianBatman
- Fixed v2 hedging phantom positions (#4424), thanks for reporting @luckykefu and for the patch @akashchakrabortymsc-cmd
- Fixed v2 matching engine queue position for per-order deltas in L3 books (#4370), thanks for reporting @warmi024
- Fixed v2 own order book sizes to track remaining quantity after partial fills
- Fixed v2 order-book average prices losing precision during weighted accumulation
- Fixed v2 order-book raw exposure and crossed level sizes losing precision through floating-point conversion
- Fixed v2 option-chain strike selection and rebalance thresholds losing precision
- Fixed v2 value-based bars emitting early and distorting volume through floating-point splitting
- Fixed v2 order average prices losing precision through floating-point weighted accumulation
- Fixed v2
Price,Quantity, andMoneyconversions toDecimalpanicking for large high-precision values - Fixed v2
Quantitymultiplication falsely overflowing before fixed-point scaling - Fixed v2 interval book snapshots blocking order submission from
on_bookhandlers - Fixed v2 position reconciliation grace to measure on the monotonic clock (#4366), thanks @folknor
- Fixed v2 cross-zero reconciliation stranding synthetic orders after a failed leg (#4521), thanks @folknor
- Fixed v2 continuous position reconciliation emitting fills from stale in-flight reports (#4517), thanks @folknor
- Fixed v2 missing-order resolution and failed-report handling in live reconciliation (#4479), thanks @folknor
- Fixed v2 batch-cancel inflight coverage, tracking leaks, and stale cancel-replace grace (#4523), thanks @folknor
- Fixed v2 live fill deduplication suppressing reports after rejected fills (#4522), thanks @folknor
- Fixed v2 startup reconciliation fill-key deduplication and retention (#4518), thanks @folknor
- Fixed v2 startup reconciliation reapplying retained fills to position and PnL state
- Fixed v2 continuous reconciliation stalling indefinitely on a hung client report task (#4529), thanks @folknor
- Fixed v2 live reconciliation dropping hedge-mode venue reports (#4535), thanks @faysou
- Fixed v2 reconciliation booking negative inferred fill prices on instruments that disallow them
- Fixed v2 reconciliation dropping inferred fills and voids when the venue average was unusable
- Fixed v2 execution algorithm subscriptions not restoring after cache-backed restarts (#4590), thanks @xxxxxx-oss
- Fixed v2 order event application committing the state transition before validating the update (#4530), thanks @folknor
- Fixed v2 pending-update orders rejecting delayed submission acknowledgments (#4549), thanks @folknor
- Fixed v2 execution client deregistration blocking registration of a replacement default client (v1 parity)
- Fixed v2 execution algorithms dropping submit parameters for spawned orders (#4524), thanks @dxwil
- Fixed v2 TWAP sizing at instrument precision and interval validation (#4544), thanks @folknor
- Fixed v2 live node connect and disconnect awaits escaping lifecycle timeouts (#4528), thanks @folknor
- Fixed v2 live node connection timeouts reporting the node as running (#4528), thanks @folknor
- Fixed v2 live nodes to apply configured default and venue client routing (#4408), thanks @dfjmax
- Fixed v2 strategy orders bypassing risk checks in live and backtest runners
- Fixed v2
RiskEnginebalance checks for non-reducing multi-currency cash sells when the asset balance was absent - Fixed v2
RiskEngineskipping cash and betting account balance checks for reduce-only buy orders - Fixed v2
RiskEnginerate-limit modify-order rejections omitting the orderaccount_id - Fixed v2 matching engine filling triggered stop-limit orders beyond their limit price
- Fixed v2 matching engine dropping taker liquidity when a triggered stop-limit or LIT order was amended into the market
- Fixed v2 matching engine charging
FixedFeeModelcommission per book level instead of once per order - Fixed v2 matching engine emitting
OrderTriggeredfor stop orders already canceled in the same iteration - Fixed v2 order emulator ignoring trailing-stop
activation_priceand trailing before activation - Fixed v2 order emulator panicking on reentrant commands issued from order-event handlers
- Fixed v2 order emulator dropping OCO and OUO contingency actions for events published while handling
- Fixed v2 order emulator reversing released order event history so
init_eventwas not first - Fixed v2 order emulator reactivating emulated child orders of closed position-less parents on start
- Fixed v2 execution engine re-applying duplicate leg fills instead of fully skipping them
- Fixed v2 execution engine applying portfolio economics for projected reconciliation fills on cash accounts
- Fixed v2 order manager syncing quantities for OCO instead of OUO contingent orders
- Fixed v2 reconciliation fill voids never voiding the proportional commissions
- Fixed v2 reconciliation position matching always passing for negative venue average prices
- Fixed v2 reconciliation inferred fills misclassifying liquidity for market-to-limit and post-only orders
- Fixed v2 execution algorithms retaining submit params for denied orders
- Fixed v2
DeltaNeutralVolexample strategy not rehedging after a hedge order rejection, denial, or expiration - Fixed v2
LiveNodestartup to restore cache databases and honorflush_on_start - Fixed v2
LiveNodestartup continuing after reconciliation failures (#4406), thanks @TheoBabilon - Fixed v2
LiveExecEngineConfigaccepting invalid or sub-nanosecond interval seconds - Fixed v2
LiveNodeexternal order claims bypassing the execution engine (#4347), thanks for reporting @linimin - Fixed v2
LiveNode.dispose()before start to release the trader idempotently - Fixed v2
LiveNodestartup failures to propagate errors and clean up components - Fixed v2
LiveNodelosing stop requests received during startup - Fixed v2 zero-duration waits to recognize already-ready engines
- Fixed Python v2 API coverage and exception handling
- Fixed Python v2 backtests rejecting
CustomDatainjection (#4582), thanks @xxxxxx-oss - Fixed Python v2 order, event, balance, position, instrument, indicator, and config inspection
- Fixed Python v2
Price,Quantity, andMoneyinteger conversion and Money debug output losing precision - Fixed Python v2 cached
OrderListfields and concrete cache return types (#4453), thanks @JiajunWan - Fixed Python v2 indicators matching Rust semantics (#4421), thanks @a1zb2yc3z
- Fixed Python v2 config stub/readback drift for
DataActorConfig,StrategyConfig, andExecutionAlgorithmConfig - Fixed Python v2
OrderFactoryidentity readback while keeping ID-format options onStrategy.config - Fixed Python v2 migration gaps for
core.datetime,Clock.set_time, and Strategy data APIs - Fixed Python v2 subclassable PyO3 stubs marked as final (#4384), thanks @bebop23
- Fixed Python v2
Strategyclose-position and close-all-position commands to accept and forwardparams - Fixed Python v2
DataActor.shutdown_system()unregistered calls to raiseRuntimeError - Fixed Python v2
LiveNode.stop()to complete shutdown instead of only signaling the handle - Fixed Python v2 boundary error handling to raise exceptions instead of panicking on invalid inputs
- Fixed Python v2 DeFi comparisons to return
NotImplementedfor unsupported ordering instead of panicking - Fixed
OrderFactory.brackettp_post_onlydocs (#4437), thanks for reporting @jh171717 and @chang-pro for the patch - Fixed
PerContractFeeModelspread fees per leg (#4360), thanks @faysou and @pjlegato - Fixed
HEDGINGreduce-only orders without cached position IDs (#4312), thanks for reporting @luckykefu - Fixed
LiveTimerfiring past itsstop_time_nsbound (#4401), thanks @folknor - Fixed
Clock.timer_existsto exclude expired timers (#4400), thanks @folknor - Fixed expired clock timers and alert replacement on invalid input (#4477), thanks @folknor
- Fixed
TestTimerpanicking after firing at the maximum timestamp - Fixed backtest simulated exchange panicking on order and account status queries (#4545), thanks @folknor
- Fixed catalog consolidation dropping single-file windows (#4435), thanks @Functionhx and @shanezilla
- Fixed catalog runtime teardown blocking in PyO3 deallocation (#4493), thanks @faysou and @mystic-io
- Fixed global logger initialization races and reuse after guard teardown (#4520), thanks @folknor
- Fixed high-precision builds using mismatched model and serializer widths (#4550), thanks @folknor
- Fixed SBE and Cap'n Proto decoding when model precision differs from serializer features (#4567), thanks @folknor
- Fixed order purges leaving stale cache index entries that could panic queries (#4569), thanks @folknor
- Fixed indicator rolling-window bounds and averages past capacity (#4351), thanks @Martingale42
- Fixed legacy
Equitycatalogs dropping quantity constraints (#4461), thanks @chang-pro and @baturytalk - Fixed live fill deduplication when trade IDs collide across accounts or instruments
- Fixed live reconciliation real-time gates to use the monotonic clock (#4376), thanks @folknor
- Fixed live missing-order reconciliation to use monotonic receipt time (#4387), thanks @folknor
- Fixed live execution engine position activity to stamp receipt time instead of venue
ts_event - Fixed Rust v2
log_trace!rejecting the documented color and component argument forms - Fixed an edge case where same-millisecond log rotation could delete the active log file
- Fixed rotated log file names using a colon reserved on Windows, which could prevent log files being written
- Fixed backtest funding, replay order, streaming book state, error policy, duplicate venues, and FX rollover validation
- Fixed mixed-instrument backtest order-list fills using the wrong book (#4392), thanks for reporting @gtalknitin
- Fixed nondeterministic event ordering in backtests (#4480), thanks @folknor
- Fixed nondeterministic emulator unsubscribe, WebSocket replay, and instrument publication ordering
- Fixed portfolio PnL and account-state resolution for broker-routed instruments (#4451), thanks @dfjmax
- Fixed reverse exchange rates using the wrong spread side and nondeterministic routes (#4568), thanks @folknor
- Fixed FX session boundary drift across daylight-saving transitions (#4584), thanks @folknor
- Fixed routing-client position reconciliation tolerance lookup (#4490), thanks @folknor
- Fixed Redis message bus startup with Python v2 configs (#4356), thanks for reporting @davidgreyme
- Fixed Rust RSI moving-average selection and max-value regression (#4382), thanks @bebop23
- Fixed VWAP nanosecond day rollover (#4428), thanks @akashchakrabortymsc-cmd and @a1zb2yc3z
- Fixed Architect AX data and execution clients not refreshing authentication tokens
- Fixed Architect AX market data streams emitting unrequested trade and ticker events
- Fixed Architect AX
/transactionsrequests omitting the required bounded time range - Fixed Architect AX REST ticker, order, transaction models, and query parameters (#4402)
- Fixed Architect AX simulated market orders using venue rather than instrument price precision
- Fixed Architect AX order book snapshots omitting the snapshot record flag
- Fixed Architect AX order book snapshots falling back to venue-precision prices when conversion failed
- Fixed Architect AX REST trade and book-snapshot timestamps wrapping instead of rejecting negative seconds
- Fixed Architect AX
GET /whoamimodel not matching the venue schema, which made the response undeserializable - Fixed Architect AX instruments always reporting zero maker and taker fees
- Fixed Architect AX REST and WebSocket assigning different trade IDs to the same market data trade
- Fixed Architect AX market data trade IDs colliding when one aggressor swept several book levels
- Fixed Architect AX market data subscription tracking, unsubscribes, book-level changes, and failed-subscription replay
- Fixed Architect AX startup reconciliation omitting filled and canceled orders from mass status
- Fixed Architect AX startup reconciliation failing when venue reports referenced an uncached instrument
- Fixed Architect AX data requests remaining active after disconnect, stop, reset, or dispose
- Fixed Architect AX instrument, risk, fill, order routing, and pagination for current REST schemas
- Fixed Architect AX Python instrument-list and order-book snapshot data requests
- Fixed Architect AX depth quote delivery and regular fill reconciliation with optional classification
- Fixed Architect AX submitting unsupported reduce-only, quote-quantity, and display-quantity orders
- Fixed Architect AX local modify rejections, replacement ID races, and Python reconciliation identity
- Fixed Architect AX Python reconciliation emitting duplicate order acceptance events
- Fixed Architect AX client order ID bounds, query correlation, and rejection when market previews fail
- Fixed Betfair v2 live stream
ts_inittimestamps to use local receipt time - Fixed Betfair v2 matched sizes and mass-status fill IDs, commissions, and gaps
- Fixed Betfair v2 voids without reversing unapplied exposure from reconnect snapshots
- Fixed Binance Futures hedge-mode tracking with configurable
oms_type(#4422), thanks for reporting @luckykefu - Fixed Binance Futures algo reports omitting fill quantity and average price
- Fixed Binance Futures filled market reconciliation prices (#4441), thanks @KaizynX
- Fixed Binance Futures external order reports omitting limit prices (#4346), thanks for reporting @linimin
- Fixed Binance Futures external algo order materialization (#4348), thanks for reporting @linimin
- Fixed Binance Futures algo orders missing USD-M order-count limits (#4395), thanks for reporting @cjdsellers
- Fixed Binance Futures COIN-M quotas and shared USD-M/COIN-M REST rate-limit state (#4301)
- Fixed Binance Futures COIN-M private user stream URL routing in Rust and Python
- Fixed Binance Futures inflight queries rejecting untriggered algo orders (#4411), thanks @reijz
- Fixed Binance Futures historical algo order queries (#4449), thanks @KaizynX
- Fixed Binance Futures startup reconciliation omitting and truncating fill history
- Fixed Binance Spot startup reconciliation omitting and truncating fill history
- Fixed Binance Spot instrument loading after the SBE schema
3:5rollout (#4407), thanks @learnerLj - Fixed Binance Spot SBE
ts_initusing venue time instead of the adapter clock (#4474), thanks @seungpyoson - Fixed Binance WebSocket trading signatures to sign parameters sorted by key (#4416), thanks @reijz
- Fixed BitMEX cancel-all responses emitting sparse cancellation rejections as external orders
- Fixed BitMEX sparse order updates losing cached order state (#4508), thanks for reporting @4px4d9cdby-star
- Fixed BitMEX UTF-8 JSON binary WebSocket frames being dropped (#4509), thanks for reporting @4px4d9cdby-star
- Fixed BitMEX WebSocket auth rejections waiting for the login timeout (#4541), thanks @folknor
- Fixed Blockchain
U256price and quantity decoding losing exact raw units above thef64integer limit - Fixed Blockchain HyperSync live pool-event streams overreaching the tip window
- Fixed Blockchain pool-event sync to backfill missing protocol-fee history; run
make init-dbfor schema changes - Fixed Blockchain pool-event unsubscribe leaving internally owned block feeds active
- Fixed Blockchain RPC pool snapshots panicking on incomplete topology
- Fixed Bybit post-only rejections omitting the
due_post_onlyflag (#4500), thanks @dxwil - Fixed Bybit spot instruments missing
min_notionaland the newer lot-size fields (#4527), thanks @dxwil - Fixed Bybit v2 spot margin auto-repayment quantities, MNT fees, and result handling
- Fixed Bybit WebSocket fills hardcoding the commission currency to the quote currency (#4536), thanks @dxwil
- Fixed Bybit REST and WebSocket corporate-action executions failing deserialization
- Fixed Databento OPRA option contract multipliers (#4388), thanks for reporting @pjlegato
- Fixed Databento MBO fill/no-action decoding and replay gating (#4446), thanks @taozle
- Fixed Deribit tracked fill and amendment routing while preserving external-order reports
- Fixed Derive execution WebSocket connect and reconnect handling
- Fixed Derive perpetual quote and settlement currency to USDC
- Fixed Derive option
scheduled_activationparsing as UNIX seconds - Fixed Derive unknown enum decoding and recovery of malformed trade rows
- Fixed Derive historical trades and funding order
- Fixed Derive historical bar timestamps and forming-bucket filtering
- Fixed Derive instrument loading for absent product types and malformed rows
- Fixed Derive fill reconciliation dropping fills on retry
- Fixed Derive mass status flattening held positions when quantity conversion fails
- Fixed Derive null cancel acknowledgements being reported as failures
- Fixed Derive zero-match cancel-by-label requests not emitting
OrderCancelRejected - Fixed Derive cancel, replace, nonce failures, and non-positive
max_fee_per_contractconfigs - Fixed Derive shared channel ownership, unsubscribe races, and stale quote caches
- Fixed Derive request pacing, write expiry, null IDs, and handler blocking during reconnects
- Fixed dYdX instrument parsing panicking on invalid tick sizes (#4562), thanks @sbOogway
- Fixed Hyperliquid
l2Bookresubscribe options and shared stream teardown (#4298) - Fixed Hyperliquid resting brackets, filled-order reconciliation, and venue rejection metadata
- Fixed Hyperliquid PyO3 order book depth subscriptions (#4381), thanks @graceyangfan
- Fixed Hyperliquid Rust public trade responses dropping instrument identifiers
- Fixed Hyperliquid order modification to use cached CLOIDs with an OID fallback
- Fixed Hyperliquid chained modifications dropping in-flight cancel suppression
- Fixed Interactive Brokers bar timestamps to use bar closes (#4579), thanks @dfjmax
- Fixed Interactive Brokers execution timestamps for non-UTC zones (#4396), thanks @dfjmax
- Fixed Interactive Brokers market order update price normalization (#4383), thanks @faysou
- Fixed Interactive Brokers v2 tracked fill lifecycle and terminal fill identity
- Fixed Interactive Brokers
IneligibilityReasonserialization (#4380), thanks @xxxxxx-oss - Fixed Interactive Brokers Docker gateway startup with non-default Docker contexts
- Fixed Interactive Brokers startup loading all configured instruments (#4519), thanks @mahimn01
- Fixed Interactive Brokers v2 crypto market data for PAXOS and ZeroHash venue routing (#4389), thanks @bebop23
- Fixed Interactive Brokers treating transient data-farm flaps as full connectivity loss (#4412), thanks @dinana
- Fixed Interactive Brokers Rust adapter conflating socket connectivity with data-farm health (#4457), thanks @faysou
- Fixed Interactive Brokers data feeds waiting for every farm before recovery (#4469), thanks @faysou
- Fixed Kraken Futures batch order
order_tagserialization (#4459), thanks @Andreas197510 - Fixed Kraken Futures fill parsing for all documented
fillTypevalues (#4591), thanks for reporting @Andreas197510 - Fixed Kraken financial values losing precision through floating-point parsing and arithmetic
- Fixed Lighter batch orders to use correlated sequential WebSocket transactions
- Fixed Lighter bar and funding-rate requests returning page-capped partial history as success
- Fixed Lighter live funding updates exposing
funding_timestampasnext_funding_ns - Fixed Lighter reconciliation cursor loops, fill deduplication, and trailing fill identity
- Fixed Lighter instrument parsing, gap candle filtering, and spot quote currencies
- Fixed Lighter modify validation, conditional acks, nonce recovery, auth refresh, and WS timeouts
- Fixed Lighter ambiguous sends, response attribution, live order identity binding, index collisions, and GTD expiry
- Fixed Lighter zero-quantity rows in
account_all_positionssnapshots remaining in cached position reports - Fixed Lighter reconnect auth rotation not reaching the venue (#4603), thanks @folknor
- Fixed OKX price-limit metadata parsing and public limit-price requests (#4413)
- Fixed OKX v2 yearly candle bar validation and round trips
- Fixed OKX algo order status report state filtering and single-order lookups
- Fixed OKX ambiguous submit failures to await reconciliation instead of rejecting
- Fixed OKX repeated reconciliation reports for replayed post-only rejections
- Fixed OKX public mark-price requests missing the required instrument type
- Fixed Polymarket v1 and v2 allowances for the current Neg Risk adapter
- Fixed Polymarket auto-loaded instruments not reaching WebSocket subscription (#4574), thanks for reporting @nietoga
- Fixed Polymarket RTDS retained-subscription recovery after reconnects (#4353), thanks @graceyangfan
- Fixed Polymarket Gamma market and event keyset filters, validation, and repeated query encoding
- Fixed Polymarket Gamma discovery to use keyset pagination beyond the legacy offset cap
- Fixed Polymarket Gamma pagination looping on repeated cursors (#4605), thanks for reporting @mystic-io
- Fixed Polymarket v2 fee schedules and RTDS equity snapshot handling
- Fixed Polymarket v2 order cancellation during shutdown so accepted venue orders are not left open
- Fixed Polymarket v2 book delta atomicity and local limit-price range validation
- Fixed Polymarket v2 market WebSocket batches dropped by unknown
event_type(#4604), thanks for reporting @mystic-io - Fixed Polymarket v2 execution races, ambiguous submissions, trade finality, fill IDs, and proxy funder validation
- Fixed Polymarket v2 SELL sizing, terminal IOC remainders, and sub-cent reconciliation synthetic fills
- Fixed Polymarket v2 exec tester close-on-stop requesting SELL quantities finer than venue signing permits
- Fixed Polymarket v2 limit IOC/FOK BUY orders submitting invalid fractional-cent maker amounts
- Fixed Polymarket v2 instrument price bounds to match the current tick-relative venue range instead of static limits
- Fixed Polymarket v2 instrument parsing and tick-size changes panicking (#4534), thanks @mystic-io
- Fixed Polymarket v2 batch cancellations exceeding venue ID and signer burst limits
- Fixed Tardis replay trades directory to
trades/for catalog compatibility (#4373), thanks @AdvancedUno - Fixed Tardis replay bars directory to
bars/for catalog compatibility (#4378), thanks @AdvancedUno
Internal Improvements
- Added
CacheCriterion bench forget_xratequote and bar fallback paths (Rust) - Aligned Rust event and own-book ordering with equality (#4598), thanks @folknor
- Aligned Rust subscription ordering with equality while preserving delivery order (#4611), thanks @folknor
- Improved
Params::get_usizeto returnNonefor values outside the targetusizerange - Improved core decimal deserialization to round fractional scales above 28 digits instead of erroring
- Improved v2 NETTING backtest throughput by ~17% by encoding position snapshot frames only when a consumer reads them
- Improved live reconciliation recency tracking with
RecencyMap(#4386), thanks @folknor - Improved portfolio statistics test coverage with canonical worked examples
- Improved
Quantitytests across feature-conditional precision modes (#4556), thanks @folknor - Improved infrastructure tests to fail fast without Redis or PostgreSQL (#4587), thanks @folknor
- Improved Clippy compatibility for nightly and all-feature Rust builds (#4505), thanks @folknor
- Improved pre-commit checks for DST, Python errors, and Cargo dependency groups (#4506), thanks @folknor
- Improved DST coverage for
nautilus-backtestrun timestamps and convention enforcement - Improved test fixture selection to follow the model's precision (#4609), thanks @folknor
- Improved Architect AX, BitMEX, and Bybit test runtime (#4553, #4554, #4555), thanks @folknor
- Improved Betfair, dYdX, OKX, and Polymarket test waits (#4531, #4532, #4539, #4547), thanks @folknor
- Improved dYdX fallback URL tests to avoid network-dependent outcomes (#4627), thanks @xxxxxx-oss
- Improved Hyperliquid stale-quote recovery tests to avoid load-sensitive timing (#4610), thanks @folknor
- Improved Lighter signing latency through faster quintic field multiplication and squaring
- Improved Lighter signing and execution coverage for conditional, IOC, cancel-all, and leverage transactions
- Made portfolio reference-count clones explicit (#4364), thanks @ChrisAB
- Optimized Polymarket WebSocket parsing and authenticated request signing
- Prepared Binance SAPI base URL and path constants for upcoming margin support (#4447), thanks @akashchakrabortymsc-cmd
- Standardized Rust adapter task storage with
TaskHandlesand client-local lifecycle policies - Upgraded Binance Spot SBE REST and WebSocket API requests to schema
3:5(Rust) - Upgraded Rust (MSRV) to 1.97.1
- Upgraded Cython to v3.2.9
- Upgraded Cap'n Proto to v1.5.0
- Upgraded
capnpcrate to v0.26.2 - Upgraded
databentocrate to v0.55.0 - Upgraded
datafusioncrate to v54.1.0 - Upgraded
ed25519-dalekcrate to v3.0.0 - Upgraded
futurescrate to v0.3.33 - Upgraded
rediscrate to v1.4.1 - Upgraded
rustlscrate to v0.23.43 - Upgraded
sockudo-wscrate to v2.0.1 - Upgraded
tokiocrate to v1.53.1 - Upgraded
tokio-tungstenitecrate to v0.30.0 - Upgraded
pyarrowto v25.0.0
Documentation Updates
- Added the v1-to-v2 property, method, and callback migration matrix
- Added v2
BacktestResulttearsheet lifecycle and currency filter guidance - Added
managedparameter docs forDataActorbook subscriptions (#4589), thanks @sbOogway - Added canonical references and doc comments for portfolio statistics
- Added SinoPac Securities community adapter listing (#4324), thanks @Martingale42
- Added Binance Futures
/fapi/v1/algoOrderorder-count rate limit docs - Updated authored comments and documentation to use ASCII punctuation (#4504), thanks @folknor
- Updated Polymarket v2 examples and integration docs for current markets, order modes, and configuration
- Updated Architect AX integration docs for current market-data, REST schema, and funding-rate behavior
- Updated Bybit v2 spot margin auto-repayment behavior and configuration
- Updated Lighter integration docs for sequential order fanout and reconciliation limits
- Fixed Lighter get-started Python v2 development wheel link
- Fixed PyO3 docstring generation for attributes with trailing comments
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
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 event-store capture duplicating
DataCommanddispatches across the queue and execute endpoints (Rust) - Fixed event-store capture losing a message when its encoder failed before the last dispatch hop (Rust)
- Fixed event-store
MemoryBackendsilently replacing a sealed run on a same-id reopen (Rust) - Fixed event-store reads accepting entries whose embedded
seqdisagreed with the redb table key (Rust) - Fixed event-store replay claiming a full apply when a fill's position could not open (Rust)
- Fixed event-store replay fill guard to mirror live duplicate-fill semantics for flat positions (Rust)
- Fixed event-store run listing and retention planning depending on filesystem order for equal start times (Rust)
- Fixed event-store
verifydropping entry findings when the marker sidecar scan failed (Rust) - Fixed event-store verifier aborting the whole scan on one undecodable entry instead of reporting it (Rust)
- Fixed event-store writer halt firing twice across stall and backend failures and accepting post-halt submits (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 Interactive Brokers crypto order sizing where inverse quote-quantity SELL orders were converted to
cashQty(which IBKR accepts for BUY only) and fractional coin quantities were truncated to zero viaint(), causing venue rejection ("size value cannot be zero"); the Python and Rust adapters now applycashQtyonly for inverse quote-quantity BUYs and reject quote-quantity SELLs - 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 instrument IDs (#4259), thanks for reporting @seungpyoson
- Fixed matching engine fill commission side in Rust
- Fixed portfolio account update scoping in Rust
- Fixed PyO3 domain
from_rawmethods panicking on invalid input instead of raisingValueError - Fixed rate limiter arithmetic to saturate so extreme quotas deny instead of admitting every request (Rust)
- Fixed reconnect backoff jitter collapsing to zero at the maximum delay (Rust)
- Fixed reconnect timeout cancelling the writer swap and replaying buffered messages into a readerless connection (Rust)
- Fixed recoverable order, commission, and PnL conditions logging as errors, halting
shutdown_on_errornodes (Rust) - Fixed Postgres order-client index load panic on orders persisted without a client ID (Rust)
- Fixed Postgres cache writer runtime
- Fixed risk sizing without max quantity in Rust
- Fixed Redis order updates to persist events before index replay can fail (Rust)
- Fixed
RiskEnginebypass to also skip modify-order risk checks (#2330), thanks for reporting @fabz1 - Fixed socket client
closestalling on and regressing an already closed client (Rust) - Fixed socket reconnect confirmation hanging when a stalled peer blocks the buffer drain (Rust)
- Fixed stream-mode WebSocket clients accepting a zero heartbeat interval (Rust)
- Fixed streaming index prices and PyO3 mark, index, and funding data paths
- Fixed per-instrument streaming paths for
MarkPriceUpdate(#4267), thanks @graceyangfan - Fixed TLS client authentication silently dropped for combined key and certificate PEM files (Rust)
- Fixed
TwapAlgorithmrejecting primary orders already cached by the engine submit path (Rust) - Fixed
TwapAlgorithmtime event and lifecycle dispatch so all scheduled slices execute (Rust) - Fixed unbounded WebSocket initial connection wait against servers that never complete the upgrade (Rust)
- Fixed WebSocket and socket writer failure paths overwriting a concurrent disconnect with a reconnect (Rust)
- Fixed WebSocket auth and connection-state waiters missing wakeups from unregistered
Notifyfutures (Rust) - Fixed WebSocket idle timeout starvation under control-frame floods faster than the check interval (Rust)
- Fixed Docker image build missing the
patchesdirectory needed bypyo3-stub-gen - Fixed nightly CI publish and Windows Harden-Runner checks
- Fixed Architect AX to deny invalid submits locally and defer ambiguous command failures to reconciliation
- Fixed Binance Futures empty algo order IDs
- Fixed Binance Futures hedge reduce-only orders in Rust
- Fixed Binance Futures leverage initialization aborting execution client connect (#4289), thanks @YeeTsai
- Fixed Binance Futures node panic on
BNFCRCredits Trading Mode balances - Fixed Binance Spot expired order handling
- Fixed Binance Spot/Futures WebSocket connection pool race (#4244), thanks @filipmacek
- Fixed Binance HTTP client handling of non-JSON success responses during demo/testnet reconciliation
- Fixed BitMEX instrument bootstrap aborting on any row deserialize failure (#4283), thanks for reporting @seungpyoson
- Fixed Blockchain snapshot bootstrap checks
- Fixed Blockchain pool-event replay to require durable timestamps before checkpoints
- Fixed Blockchain pool sync aborting on swaps with an unrepresentable spot price
- Fixed Blockchain pool profiler logging self-correcting tick and liquidity mismatches at error severity (now warn)
- Fixed Blockchain snapshot validation rejecting fee-protocol-only mismatches
- Fixed Bybit demo native TP/SL and option params routing through the create-order endpoint (Rust and Python)
- Fixed Deribit chart bar volume for inverse perpetuals (#4245), thanks @filipmacek
- Fixed dYdX Indexer WebSocket dropping subscriptions beyond the 32-per-channel cap (#4290), thanks @filipmacek
- Fixed dYdX to share one REST rate-limit bucket across data and execution clients (#4265), thanks @filipmacek
- Fixed dYdX to deny unsupported submits locally and emit rejections only for definitive CheckTx refusals
- Fixed Hyperliquid bracket-child statuses and atomic fills orphaning orders (#4160), thanks @sonnymai
- Fixed Hyperliquid cancel-replace fill stranding on a dropped
ACCEPTED(#4270), thanks for reporting @AlphaTraderK - Fixed Hyperliquid order status queries surfacing a stale cancel closing a live order mid-modify (Rust)
- Fixed Interactive Brokers reconnect startup handling (#4210), thanks @faysou
- Fixed Interactive Brokers PERM cancel/modify routing and pending commission parsing (#4281), thanks @faysou
- Fixed Interactive Brokers to use
permIdfor stable order identity (#4276), thanks @faysou - Fixed Interactive Brokers to deny not-ready submits locally and drop synthetic cancel/modify rejections
- Fixed Kraken spot WebSocket dead-connection detection with an idle timeout (#4275), thanks @folknor
- Fixed Kraken count-only bar requests returning oldest bars instead of latest (#4274), thanks @folknor
- Fixed Lighter AccountState to include perp-side margin balance (#4246), thanks @filipmacek
- Fixed Lighter cancel and modify rejections for local, venue, and acked no-op failures
- Fixed Lighter concurrent batch nonce-ordering race (#4263), thanks @filipmacek
- Fixed Lighter maker-only key lookup authentication (#4234), thanks @filipmacek
- Fixed Lighter positions falsely flattening on malformed snapshots
- Fixed Lighter WebSocket clients exceeding shared venue rate limits (#4282), thanks @filipmacek
- Fixed Lighter nonce exhaustion halting order flow after 16 transactions per connection
- Fixed Lighter nonce recovery after venue rejections wedging subsequent transactions
- Fixed OKX instrument parsing for malformed venue payloads
- Fixed OKX conditional and attached TP/SL algo amend fields (#4268), thanks @jhavie
- Fixed Polymarket batch submit node panic on a venue-rejected leg (empty order ID); now emits
OrderRejected - Fixed Polymarket instrument expiration precision for Gamma markets (#4278), thanks for reporting @OnlyC
- Fixed Polymarket expired instruments re-entering live data paths (#4272), thanks @graceyangfan
- Fixed Polymarket marketable BUY fills above nominal size dropped as overfills (Rust)
- Fixed Polymarket marketable fills orphaning when a WS trade beats the submit response (Rust)
- Fixed Polymarket post-only crossing rejections not setting
due_post_only
Internal Improvements
- Added Cargo publish dry-run and nightly publish plan checks
- Added a Docker check that Python references match the base image tag and
requires-python - Added turmoil coverage for WebSocket heartbeats, server-initiated pings, and server close frames (Rust)
- Improved instrument validation to reject non-positive multiplier and lot size (Rust)
- Improved
FixedTickSchemevalidation to reject non-finite tick sizes (Rust) - Improved release verifier retries and manual-publish recovery checks
- Improved network crate property tests with window-budget, full-domain arithmetic, and jitter-spread checks (Rust)
- Improved retry budget-exceeded errors to include the last underlying error (Rust)
- Improved plug-in ABI-mismatch reporting with manifest diagnostics instead of a null-manifest error (Rust)
- Improved
nautilus_plugin!macro errors for missingnameorversionfields (Rust) - Improved event-store marker writer and capture diagnostics with logged fail-stop errors (Rust)
- Improved Postgres order-client index restore to pick the latest client ID per order (Rust)
- Improved OTO contingency position ID recovery to persist re-indexed assignments (Rust)
- Improved backtest expiration timers and
TestClockadvancement performance (#4307), thanks @faysou - Improved sandbox expired-instrument retention to prune after open positions settle (#4293), thanks @graceyangfan
- Improved Polymarket data client module structure (#4260), thanks @graceyangfan
- Improved Polymarket execution lookup retention for expired instruments (#4287), thanks @graceyangfan
- Improved Polymarket execution module structure (#4271), thanks @graceyangfan
- Improved Polymarket resolution module structure (#4269), thanks @graceyangfan
- Optimized
Cachequery filtering to scale with open orders and positions (#4242), thanks for reporting @magnified103 - Refined common clock reference-counted clone calls (#4302), thanks @learnerLj
- Standardized Rust
OrderDeniedreason codes - Standardized Betfair adapter to emit order events for own orders and reports for external orders only (Rust)
- Standardized Polymarket adapter to emit order events for own orders and reports for external orders only (Rust)
- Upgraded Interactive Brokers Rust adapter to
ibapi3.0.1 (#4209), thanks @faysou - Upgraded
pandasto v3.0 and widened the supported range to<4.0.0 - Upgraded
capnpandcapnpccrates to v0.26.0 - Upgraded
rediscrate to v1.2.4 - Upgraded
pyo3andpyo3-async-runtimescrates to v0.29.0
Documentation Updates
- Added developer-guide rate-limiting policy distinguishing data and execution paths
- Added Binance COIN-M/USD-M architecture docs for stream, REST, rate-limit, and position-mode changes
- Updated plugins concept guide for panic recovery, build pinning, and UTF-8 validation semantics
- Updated event sourcing guide for capture dedup, recovery resilience, and snapshot-anchor verification
- Updated message bus docs for publisher forwarding, payload encoding, and JSON defaults
- Updated message bus docs for backing terminology and inbound subscriber shape
- Updated cache and message bus docs for technology-owned config factories
- Updated commodity instrument and execution concept guides for negative price support
- Updated OKX integration docs with EEA endpoint override guidance (#4250), thanks for reporting @msnatm-code
NautilusTrader 1.228.0 Beta
Released on 8th June 2026 (UTC).
Enhancements
- Added BSC chain support to blockchain adapter with
UniswapV3andPancakeSwapV3DEX registrations - Added Aerodrome Slipstream pool-event signatures and parsers for bootstrap and replay on Base
- Added Blockchain adapter
analyze-poolsCLI for batch DeFi pool snapshot hydration - Added structured
PoolProfilerErrorcarrying pool id, block, transaction/log index, and event kind - Added DeFi data (
DefiData) replay through the data and backtest engines as a first-classDatavariant - Added
BacktestEngine.add_defi_datafor replaying DeFi block, pool, and pool-event data in backtests - Added funding-rate catalog replay and
FundingSettlementhandling for backtests (Rust) - Added generic structured key-value fields to
LogLine(#4090), thanks @filipmacek - Added
correlation_idfield to trading and system command structs for request tracing (Rust) - Added checked mantissa/exponent constructors for
PriceandQuantity(Rust) - Added Cap'n Proto and adapter split propagation of trading command
correlation_id - Added
nautilus-plugincrate for loading separately compiled Rust cdylibs at live-node startup (Rust) - Added custom-data plug point via
PluginCustomDatatrait andnautilus_plugin!macro (Rust) - Added actor plug point via
PluginActortrait with lifecycle and data callbacks (Rust) - Added strategy plug point via
PluginStrategytrait withHostVTableorder-command surface (Rust) - Added plug-in
HostVTablecallbacks for cache, subscriptions, msgbus, and timers (Rust) - Added
PluginActorAdapterandPluginStrategyAdapterwrapping plug-in cdylibs as hostDataActor/Strategy(Rust) - Added
PluginLoader::with_hostso the live node can install a customHostVTablefor order-command routing (Rust) - Added
host_vtableandplugin_loaderhelpers binding submit/cancel/modify order to the strategy adapter (Rust) - Added
register_custom_data_from_manifestto register plug-in custom data withDataRegistryat load time (Rust) - Added
config_jsonargument to plug-increatethunks andPluginActor::new/PluginStrategy::new(Rust) - Added
DataEnginecontinuous futures historical bar requests and live bar subscriptions (Rust) - Added
DataEngineresponse bounds-trim and request-pipeline fan-in withRequestJoinsupport (Rust) - Added
DataEnginecatalog / client response-side request splitting (Rust) - Added
DataEnginecatalog orchestration for funding rates, custom data, and instruments (Rust) - Added
DataEnginetime-range pipeline support for long historical requests (Rust) - Added
DataEngineorder book deltas request and response with catalog/client split (Rust) - Added
DataEnginehistorical order book snapshot replay at UTC day boundaries (Rust) - Added support for mixed-instrument
OrderLists at the same venue (e.g. pairs, calendar spreads, multi-leg legs) - Added
OrderList.is_uniform_instrumentandOrderList.instrument_idshelpers (Python) - Added deny guard for mixed-instrument order lists submitted with a
position_id - Added portfolio PyO3 bindings and
Strategy.portfolioaccess (#4085), thanks @ms32035 - Added beta-weighted vega greeks against volatility index instruments (#4097), thanks @faysou
- Added native
OptionGreekspersistence and backtest replay support (#4132), thanks @Jonah-Chan - Added
StrikeRange.delta(...)to select option-chain strikes by target delta - Added deterministic liquidation engine for backtests (#4077), thanks @abhishektang
- Added configurable logging IO policies (#4158), thanks @sunlei
- Added Binance Futures liquidation custom data subscriptions (#4095), thanks @graceyangfan
- Added Binance Futures open interest request custom data (Rust) (#4109), thanks @graceyangfan
- Added Binance Spot JSON public market data mode (#4178), thanks @graceyangfan
- Added pending-resolution settlement pipeline for binary options (Rust) (#4101), thanks @graceyangfan
- Added
Serialize/Deserializederives forPositionEvent(#4199), thanks @filipmacek - Added Coinbase WebSocket
statuschannel subscription emittingInstrumentStatusevents - Added Coinbase Python v2 factory bindings and tester examples
- Added
CryptoFuturesSpreadandCryptoOptionSpreadinstrument types mirroringCryptoFuture/CryptoOption - Added Deribit
option_comboandfuture_comboparsing asCryptoOptionSpread/CryptoFuturesSpreadinstruments - Added Deribit combo trade leg parsing (
legs[],combo_id,combo_trade_id) on public trade messages - Added Deribit
get_last_trades_by_currencyHTTP endpoint for combo trade backfill - Added Deribit
get_expirationsHTTP endpoint for traded option-chain expirations - Added Deribit public
TradeIdprovenance prefix (RFQ-/BLK-/COMBO-) for block, RFQ, and combo trades - Added Deribit
subscribe_combo_legsopt-in for combo leg trade streams - Added Derive initial adapter (on-chain spot, perps, options)
- Added Derive WebSocket trading API support for submit, cancel, modify, and cancel-all actions
- Added Hyperliquid WebSocket trading API support for submit, cancel, modify, and cancel-all actions
- Added Hyperliquid HIP-4 outcome
BinaryOption.infowith parsed venue description and question metadata - Added Hyperliquid
HYPERLIQUID_ACCOUNT_ADDRESSenv var fallback forHyperliquidExecClientConfig.account_address - Added Hyperliquid live open interest custom data from
activeAssetCtx(Rust) (#4120), thanks @graceyangfan - Added Hyperliquid
allDexsAssetCtxscustom data subscriptions (#4136), thanks @graceyangfan - Added Kraken WebSocket rate limiting (#4093), thanks @filipmacek
- Added Lighter initial adapter (DEX: spot, perps)
- Added OKX
on_instrumentwrite-through so data-client instrument updates refresh exec caches without restart - Added OKX spread instrument discovery as
CryptoFuturesSpreadinstruments (Rust) - Added OKX Nitro spread order execution and reconciliation support (Rust)
- Added Polymarket adapter bounded-retry auto-load with
auto_load_max_retriesand exponential backoff with jitter (Rust) - Added Polymarket condition-level resolution for expired markets (#4164), thanks @graceyangfan
- Added Polymarket
new_marketfetch dedupe and bounded concurrency (#4185), thanks @graceyangfan - Added Polymarket
POLY_1271deposit-wallet signing support (#4053), thanks for reporting @sumuzhao and @sophyphilo - Added
shutdown_on_errorto stop Rust backtests and live nodes after error logs - Added Tardis option greeks ingestion to the catalog for backtest replay
- Added Tardis
extract_bbo_as_quotesto emitQuoteTickfromoption_summaryBBO fields
Breaking Changes
- Renamed custom-data field marker
jsontoserde(#4133), thanks @faysou - Removed live engine
graceful_shutdown_on_error; use node-levelshutdown_on_errorinstead - Changed
nautilus_pyo3.get_exchange_rateto returndecimal.Decimalinstead offloat - Changed DeFi pool-event and snapshot types to require
ts_event/ts_inittimestamps (was optionaltimestamp) - Changed
PoolProfiler::initializeandcheck_if_initializedto returnResultrather than assert - Changed command
newconstructors to acceptcorrelation_id: Option<UUID4>, passNonefor old behavior (Rust) - Changed
CVecto no longer implementSend; use typed wrappers for thread transfer (Rust) - Changed Hyperliquid HIP-4 outcome
InstrumentIdto{outcome_index}-{YES|NO}-OUTCOME.HYPERLIQUID - Changed Deribit
DeribitWebSocketClient.with_credentialsto acceptapi_key/api_secretafterenvironment - Changed order event
reconciliationanddue_post_onlyfromu8tobool(changes JSON/Arrow schemas) - Changed Deribit combos to land as
CryptoOptionSpread/CryptoFuturesSpreadinstead ofOptionSpread/FuturesSpread;FuturesSpread/OptionSpreadonce again guarantee whole-contract sizing - Changed
NautilusKernelConfig.timeout_connectiondefault from 120 to 60 seconds (#4179)
Security
- Added OpenSSF Scorecard workflow (#4187), thanks @pushkarm029
- Fixed DataFFI PyCapsules to reject mismatched types and prevent repeated
CVecdrops - Fixed thread-local registry access to avoid exposing global-lifetime actor and component refs
- Fixed
OrderBookDepth10FFI constructor to avoid unwinding across C ABI boundaries - Fixed
StackStr::from_c_ptr_checkedto returnNonefor null C string pointers
Fixes
- Fixed matching engine panic on mark price bars in Rust (#4189), thanks @po4yka
- Fixed raw value boundary constants in Rust (#4188), thanks @po4yka
- Fixed unbounded Cache
VecDequememory leak (Rust) (#4107), thanks @filipmacek - Fixed
Throttlersilently dropping buffered messages in buffer mode (Python v1) (#4221), thanks @santatic - Fixed
Cache.resetclearing FX rate lookup for retained instruments (#4159), thanks for reporting @dfjmax - Fixed
BacktestEngineoption positions remaining open when data stops before expiry - Fixed
BacktestEnginelosing latency-deferred commands at shutdown (Rust) (#4062), thanks for reporting @zhanghaoda - Fixed
BacktestEngineduplicate account state events on reset, thanks for reporting @dfjmax - Fixed calculated account state flag for cash and margin accounts (#4218), thanks @faysou
- Fixed
PortfolioStatistic.downsample_to_daily_binsto compound sub-daily returns (#4141), thanks @mahimn01 - Fixed missing
PortfolioStatistictrait methods returningNone(#4174), thanks @mahimn01 - Fixed matching engine not canceling unmatched IOC/FOK limit orders (Rust) (#4112), thanks for reporting @Jonah-Chan
- Fixed matching engine L1 slip-through for market orders exhausting top-of-book volume (Rust)
- Fixed multi-currency balance update violating
total == locked + free(#4165), thanks for reporting @qaxayuan - Fixed NETTING reconciliation opening phantom reduce-only positions (#4106), thanks for reporting @M-at-ti-a
- Fixed HEDGING margin scaling with fill count instead of net exposure (#4110), thanks for reporting @qaxayuan
- Fixed live reconciliation filtering for unclaimed external venue orders (Rust)
- Fixed
ExecTesteron_stop leaving INITIALIZED orders and bracket legs live across all cancel modes (Rust) - Fixed Aerodrome Slipstream
AmmTypefromStableSwaptoCLAMM - Fixed
PoolProfiler::update_positionto pre-validate active liquidity so failures leave pool state unchanged - Fixed
DefiDataEngineexposing zero-state pool profiler during snapshot bootstrap - Fixed pool profiler
AlreadyInitializederror when hypersync replay revisitsInitializeafter snapshot restore - Fixed deterministic catalog directory registration order (#4208), thanks @faysou
- Fixed
LiveNodesignal handling during startup connection wait (#4102), thanks @filipmacek - Fixed
NautilusKernelConfig.timeout_connectiondefault at 60 seconds (#4179), thanks for reporting @triyys - Fixed quarter bar volume precision (#4201), thanks @HaakonFlaaronning
- Fixed Python
ShutdownSystemdict serialization to round-tripcorrelation_id(was previously dropped) - Fixed Python v2 live trading deadlocks from timer callbacks and kept Polymarket instrument refreshes Rust-only
- Fixed Python v2 order-book wranglers writing raw fixed-point bytes in big-endian (needed little-endian) (#4111), thanks for reporting @fabz1
- Fixed Python v2 type stub generation failing to locate
libpythonunder uv-managed interpreters - Fixed Betfair adapter snapshot book deltas emitting zero-volume
Addentries (Rust) - Fixed Betfair adapter traded volume cache to handle bet voids and non-runner adjustments (Rust)
- Fixed Betfair adapter RCM custom data
ts_initparity between live and historical streams (Rust) - Fixed Betfair adapter overfill checks for rounded stream matched sizes (Rust)
- Fixed Betfair adapter unsupported unsubscribe commands logging above debug (Rust)
- Fixed Binance Futures algo params for trailing stops/reduce-only (#4192), thanks for reporting @luckykefu
- Fixed Binance Futures execution symbol format (#4182), thanks for reporting @luckykefu
- Fixed Binance Futures full-depth book startup after snapshot retries
- Fixed Binance Spot full-depth book startup after snapshot retries (#4181), thanks for reporting @graceyangfan
- Fixed Binance Spot full-depth books to seed diffs from REST snapshots
- Fixed Binance Spot JSON full-depth books to use REST-synced diff streams (#4181), thanks @graceyangfan
- Fixed Binance Spot SBE numeric parsing to reject invalid price and quantity values
- Fixed Binance status-unknown submits emitting phantom rejections (#4215), thanks for reporting @Centaur-pub
- Fixed BitMEX startup handling for crypto futures spreads, duplicate subscriptions,
USYCmargins, and account ID discovery - Fixed BitMEX order submission to deny unsupported GTD time-in-force locally
- Fixed BitMEX mark/index price updates on altcoin perps (#4147), thanks @filipmacek
- Fixed Blockchain adapter
analyze-pool --to-blockbounds during snapshot replay - Fixed Blockchain adapter caching a half-initialized
PoolProfilerwheninitializereturnsInitialTickMismatch - Fixed Blockchain adapter Multicall validation chunking and flash-event resume bounds
- Fixed Bybit linear/inverse
minNotionalValueparsing (#4216), thanks @filipmacek - Fixed Coinbase book snapshot deltas missing
F_SNAPSHOTflag in REST and WebSocket parsers - Fixed
CurrencyPair.asset_classfor crypto pairs (#4175), thanks @filipmacek - Fixed Deribit
DeribitExecutionClientnot forwarding config credentials to the WebSocket client - Fixed dYdX rate limiter being skipped due to missing keys (#4091), thanks @filipmacek
- Fixed Hyperliquid
Alolimit order status reports being parsed as trigger orders - Fixed Hyperliquid account balances for zeroed perp summaries (#4207), thanks @jungsooyun
- Fixed Hyperliquid balances preserving negative
totalRawUsd(#4177), thanks for reporting @jzheng2017 - Fixed Hyperliquid cancel-replace modify overfill on an in-flight fill (#4154), thanks for reporting @AlphaTraderK
- Fixed Interactive Brokers order submit to guard on client readiness (#4100), thanks @honvl
- Fixed Interactive Brokers order requests to guard on client readiness (Rust) (#4125), thanks @faysou
- Fixed Interactive Brokers Python
request_instrumentscache leakage (#4099), thanks @mahimn01 - Fixed Interactive Brokers
request_instrumentsreturning cumulative cache (Rust) (#4114), thanks @faysou - Fixed Interactive Brokers Rust orders routing to exchange MIC venues (#4129), thanks @faysou
- Fixed Interactive Brokers live bar reconnect tracking cleanup (#4169), thanks @faysou
- Fixed Interactive Brokers warmup
last_disconnection_ns(#4173), thanks @HKOWL - Fixed Kraken Futures
feeScheduleUiddeserialization to tolerate absence ahead of the 2026-06-22 Fee Schedules deprecation - Fixed Kraken Spot L2 snapshots and subscribed-depth pruning
- Fixed OKX
OKXExecutionClientnot forwarding config credentials to WebSocket clients (#4115), thanks @pusteckiy - Fixed OKX adapter to validate
clOrdIdrules before submission (#4116), thanks for reporting @pusteckiy - Fixed Polymarket adapter dropping auto-load batches on Gamma chunk failures (Rust)
- Fixed Polymarket Gamma market lookups to send repeated list query params (Rust)
- Fixed Polymarket adapter treating encoded-empty
clob_token_idsas terminal instead of transient (Rust) - Fixed Polymarket PyO3 bootstrap to honor
instrument_config(#4127), thanks @graceyangfan - Fixed sandbox cached account config after initial
AccountState(#4191), thanks @graceyangfan - Fixed Tardis CSV delta loaders missing book resets between consecutive snapshots
Internal Improvements
- Added
cargo machetepre-commit hook to detect unused workspace dependencies - Added cargo conventions check for stale
[package.metadata.cargo-machete]ignored entries - Added default log color signature (#4202), thanks @HaakonFlaaronning
- Added
try_liquidity_math_addreturning structuredLiquidityMathErroralongside the panicking variant - Added structured-error coverage tests for
PoolProfileroverflow/underflow paths and Display formats - Added round-trip tests for
correlation_idin Cap'n Proto, Arrow, and msgpack serialization - Added DEX event-signature/parser parity tests across all registered chains
- Added Derive fuzz targets
- Added option chain backtest replay tests for slice assembly and snapshot cadence
- Added Hyperliquid
flattenbinary that cancels working orders and closes perpetual positions - Added Hyperliquid Criterion bench groups for inbound pipeline, exec pipeline, and dispatch (Rust)
- Added OKX Criterion bench groups for inbound pipeline, exec pipeline, dispatch, and HTTP signing (Rust)
- Added Polymarket
auto_load_retry_delayhelper with exponential backoff and jitter (Rust) - Added Polymarket Criterion bench groups for inbound pipeline, exec pipeline, and signing (Rust)
- Enabled
unreachable_pubrustc lint workspace-wide to prevent dead public surface - Implemented OKX
DataClient::unsubscribe_instrumentoverride to silence missing-handler warning at teardown - Improved Portfolio calculations with
Decimalarithmetic (Rust) - Improved
RiskEngineper-order pre-trade checks to resolve each order's own instrument in mixed-instrument lists - Improved
ExecutionEngineto route own-order-book inserts per order for mixed-instrument lists - Improved Binance Spot SBE missing credentials error message (#4092), thanks @filipmacek
- Improved Coinbase
avg_priceparsing to validate viaDecimalbeforef64conversion - Aligned Derive and Lighter configs with workspace conventions (#4183), thanks @filipmacek
- Refined
OptionSpread/FuturesSpreadtrait accessors to readsize_precision/size_incrementfields - Refined Rust data engine to match Cython behavior (#4219), thanks @faysou
- Refined Hyperliquid adapter hot paths in WebSocket handler, parse, and signing modules
- Refined Interactive Brokers
nautilus-execution/nautilus-networkdeps behindexecutionfeature - Refined OKX adapter hot paths in WebSocket frame deserializer, book10 parse, and fee currency lookup
- Removed dead Hyperliquid WebSocket codec module
- Removed unused
async-streamandindexmapfromnautilus-interactive-brokersdependencies - Optimized common logging hot paths (#4150), thanks @sunlei
- Optimized datetime and UUID formatting (#4161), thanks @sunlei
- Optimized
AtomicMapsnapshot borrowing (#4162), thanks @sunlei - Optimized Derive signing and hot paths with benchmark report
- Optimized Hyperliquid signing and hot paths with benchmark report
- Optimized OKX hot paths with benchmark report
- Optimized portfolio
update_positionto avoid per-eventPositionclones (#4197), thanks @po4yka - Upgraded Rust (MSRV) to 1.96.0
- Upgraded Cython to v3.2.5
- Upgraded
databentocrate to v0.53.0 - Upgraded
rediscrate to v1.2.2 - Upgraded
sqlxcrate to v0.9.0
Documentation Updates
- Added plug-in concept guide covering the C-ABI boundary, manifest, lifecycle, and live-node integration
- Added event-sourcing concept guide covering capture, replay, snapshot recovery, and verifier behaviour
- Added concept-guide section on mixed-instrument order lists covering downstream caveats and OMS guards
- Added backtesting guide notes for funding settlement flows
- Added FFI and Rust unsafe-code guidance for
PyCapsuleownership and scoped TLS access - Added Polymarket integration guide notes for
POLY_1271deposit wallets - Refined
BacktestEngineshutdown notes withon_stopvenue-latency ordering and pre-stop fill caveats - Refined Coinbase integration guide for instrument-status, funding rate backlog, and order rejection wording
- Refined OKX integration guide with product capabilities and Nitro spread order notes
- Fixed
NautilusKernelConfigstate flag default docs (#4144), thanks for reporting @trikafi - Fixed
LatencyModelConfigbase latency unit comment (1 second) (#4170), thanks for reporting @phx000 - Fixed Polymarket crate README labelling separate Gamma and Data API endpoints
- Fixed Polymarket integration guide inaccuracies (Gamma vs Data API split,
determine_trade_idhash by adapter)
Deprecations
None
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 balances when balances were populated - Fixed
allow_cash_borrowingnot applied to cached cash accounts during simulated venue initialization - Fixed cache venue order ID updates and own-book cleanup for cancel-replace flows (Rust)
- Fixed
Cache::orders_for_exec_algorithmdiscarding query filters when applying intersection (Rust) - Fixed
OwnOrderBooktracking for reconciled external open orders (Rust) - Fixed
OrderAny::from_eventspanic on malformedOrderInitialized; reconciliation returnsErrinstead of crashing - Fixed
BacktestEnginenot enablingcalculate_account_stateon accounts (#3988), thanks for reporting @magnified103 - Fixed
BacktestEnginenot settlingon_stopcommands before shutdown (#4062), thanks for reporting @zhanghaoda - Fixed
MessageBuslate wildcard subscriptions missing events on already-cached topics (#3942), thanks for reporting @graceyangfan - Fixed
OrderMatchingEngineto propagate tick-size toMatchingCore(#3942), thanks for reporting @graceyangfan - Fixed
OrderMatchingEngineduplicate fills from closed matching-core orders (#4075) - Fixed
OrderMatchingEngine.resetleakingOrderBook.ts_lastacross resets (Python) (#3992), thanks @YeeTsai - Fixed sandbox tick-size precision race that could panic on stale ticks (#3994), thanks @graceyangfan
- Fixed matching engine and sandbox handling of stale-precision quote and trade ticks (#4044), thanks @graceyangfan
- Fixed bracket SL/TP rejected by matching engine on submit (Rust) (#4040), thanks for reporting @maximsamsonov
- Fixed
ExecutionEnginereconciliation skippingOrderUpdatedwhen both report and order were alreadyACCEPTED - Fixed
ExecutionEnginesubscribe_venue_instrumentsrouting through the typed publisher so adapters receive instrument updates - Fixed execution fill reconciliation account scoping and duplicate trade IDs (Rust)
- Fixed reconciliation drift when a venue snapshot carries both a fill mismatch and a quantity/price amendment (Rust)
- Fixed reconciliation premature
OrderUpdatedemission for pending venue states before venue confirmation (Rust) - Fixed reconciliation missing
MarketIfTouched/LimitIfTouchedprice and trigger drift detection (Rust) - Fixed live position reconciliation conflating positions across accounts (#4029), thanks @faysou
- Fixed live position reconciliation retry/throttle leaking across accounts on the same instrument (Python and Rust)
- Fixed live position reconciliation collapsing multi-account positions on the same instrument (Rust)
- Fixed
Strategy/Actorclock callback leak on dispose (#3967), thanks for reporting @frslvr - Fixed
Strategypending cancel and pending update events before order commands (Rust) - Fixed
Strategysubmit methods to publishOrderInitializedbefore cache updates (Rust) - Fixed
ExecTesterLIT pricing direction so reconciled BUY/SELL LIT orders satisfy thetrigger_priceinvariant - Fixed wrangler v2 timestamp resolution to force nanoseconds before the int64 cast for pandas 3 compatibility (#3970), thanks @gzenz
- Fixed custom data parquet schema registration and multi-file query (#4021), thanks @faysou
- Fixed
custom_datamacro PyO3 stub generation: ordergen_stubabovepyo3attributes and detectcfg_attr-wrapped invocations - Fixed catalog
consolidate_data_by_periodcleanup for skipped targets (#4080), thanks @arpankapoor - Fixed SQL
ParserErrorfor symbols containing ampersand (#4025), thanks @arpankapoor - Fixed
DataEngineto route subscribe/unsubscribe commands to theBACKTESTclient when registered (Rust) - Fixed
DataEngineto applyvalidate_data_sequenceto bars emitted by internal aggregators (Rust) - Fixed
emit_quotes_from_bookandemit_quotes_from_book_depthsconfig flags being silently ignored (Rust) - Fixed
DataEnginecomposite book subscriptions not routing per-underlying deltas/depth to per-underlying books (Rust) - Fixed
DataEnginecomposite + exact book subscription overlap double-applying to the shared cache book (Rust) - Fixed
DataEngineunsubscribe detaching the client while exact-topic subscribers remained (Rust) - Fixed
DataEnginebar aggregator quote/trade subscription priority (Rust) - Fixed
DataEngine::resetleaking book and option-chain state across resets (Rust) - Fixed
DataActorcomposite book delta subscriptions not receiving per-underlying publishes (Rust) - Fixed Architect AX
GET /order-statusto useoid/cidper v14.0.1; legacyorder_id/client_order_idnow return HTTP 400 - Fixed Binance Futures reduce-only orders not reconciling venue-side quantity (Python and Rust) (#3983), thanks for reporting @KaizynX
- Fixed Binance Spot inflight REST polls for pruned IOC orders (#4072), thanks for reporting @marcelmdn
- Fixed Binance WebSocket pong unhandled
RuntimeErrorblocking reconnect after server close (#4020), thanks for reporting @M-at-ti-a - Fixed Bybit ambiguous submit failures to await reconciliation, thanks for reporting @shorino
- Fixed Bybit BBO orders not reconciling the venue-resolved price in cached order state (Rust and Python)
- Fixed Bybit funding rate parsing for dated futures on shared
tickers.linearWS topic; gates toCryptoPerpetualonly (#4084) - Fixed Betfair Rust adapter dropped fills on reconnect by resyncing the fill tracker from cache
- Fixed Betfair Rust adapter panic on blank
customerOrderRef/rfoby normalizing empty strings toNone - Fixed Betfair Rust adapter spurious
OrderRejectedafter OCM already reported a terminal state - Fixed Betfair Rust adapter
ignore_external_ordersto treat emptyrfostrings the same as missing - Fixed Databento market data price precision preservation (#4002), thanks @faysou
- Fixed Databento MBP10 panic on undefined depth levels (#4046), thanks for reporting @prajjwal23
- Fixed Databento decoder gaps on dbn 0.58 wire data: skip
'I'(Index) classes and map new stat types 14-20 - Fixed dYdX FOK and DAY time-in-force orders to reject pre-submission instead of failing at the venue or mapping to GTC
- Fixed dYdX MIT/LIT round-tripping on reconcile when the Indexer collapses both variants under
TAKE_PROFIT - Fixed dYdX GTD expiry to surface
OrderExpiredon both WS and HTTP reconciliation paths - Fixed dYdX
TriggerTypedefault whencondition_typeis unset so reconciliation no longer rejects the report - Fixed dYdX
TAKE_PROFITorder type deserialization (the Indexer omits the_LIMITsuffix) - Fixed dYdX reconciliation noise by dropping reports for orders already in a terminal state in the local cache
- Fixed dYdX Python
_request_instrument(s)to pass the full_handle_data_responseargument set - Fixed dYdX Python
_subscribe_order_book_depthto log a graceful warning instead of raisingNotImplementedError - Fixed Deribit
StopMarketOrderRejectedwhen the order response omitsfilled_amount(#3995), thanks for reporting @marco-rigoni - Fixed Deribit cross-margin overcounting; reports
equityfor total andavailable_withdrawal_fundsfor free (#4009), thanks @filipmacek - Fixed Deribit subscriptions silently dropping data for uncached instruments (#4035), thanks for reporting @linimin
- Fixed Deribit funding rate log spam from perpetual channel updates emitting info/debug on every tick (#4083)
- Fixed Deribit and Hyperliquid custom data builds without the
arrowfeature - Fixed Hyperliquid modify-after-partial-fill sending absolute quantity to the cancel-replace leg, causing engine overfill (#3986)
- Fixed Hyperliquid testnet orders rejected with "Builder fee has not been approved" by omitting builder attribution like vault orders (#3989)
- Fixed Hyperliquid spurious
OrderCanceledon concurrent modifies (Python and Rust) (#3971), thanks @M-Advis - Fixed Hyperliquid cancel-replace fill race emitting
OrderFilledagainst stale local order state (Python and Rust) (#3972) - Fixed Hyperliquid dropping
FillReportbefore order cached; fills now buffered and drained onOrderAccepted(#4076), thanks @M-Advis - Fixed Hyperliquid terminal rejections on submit/cancel/modify failures; defers to WS reconciliation (Python and Rust), thanks @M-Advis
- Fixed Hyperliquid Rust data client reconnect leaving the consumption loop on a cancelled token after disconnect
- Fixed Interactive Brokers spread fill races (#3957), thanks @taozle
- Fixed Interactive Brokers callback ordering races (#3976), thanks @faysou
- Fixed Interactive Brokers market data farm reconnects not resubscribing feeds (#3968), thanks @onixenix
- Fixed Interactive Brokers market data dispatch on fractional tick sizes (#4022), thanks @faysou
- Fixed Interactive Brokers shutdown reader
RuntimeErroron stop and dispose (#4023), thanks @faysou - Fixed Interactive Brokers reconnect before server version handshake (#4027), thanks @faysou
- Fixed Interactive Brokers SMART stock venue resolution (#4061), thanks @faysou
- Fixed Kraken Spot margin wallet balances for multi-asset collateral (#3997), thanks @mcgrj
- Fixed Kraken symbol normalization for WS v2 compatibility (#3961), thanks @mcgrj
- Fixed Kraken Spot WebSocket dispatch dropping delta-only execution frames that omit
symbol(#4052), thanks @mcgrj - Fixed Kraken Futures order-update batches failing to deserialize on venue-emitted
"unknown"enum values - Fixed OKX missing
post_onlyinstrument status (#3966), thanks @jhavie - Fixed OKX missing
rebaseinstrument status (#3998), thanks @jhavie - Fixed OKX future instrument status parsing (#4005), thanks @cryptoSUN2049
- Fixed Polymarket V2 BUY overfill rejection via overfill-only
last_qtysnap on WS, REST, and buffered drain paths - Fixed Polymarket REST fill paths bypassing dust normalization, causing engine state to diverge from venue across paths
- Fixed Polymarket residual
ACCEPTEDorders via trade-history recovery (#4024), thanks for reporting @fedoraiver - Fixed Polymarket adapter book resync on
tick_size_change(#3942), thanks for reporting @graceyangfan - Fixed Polymarket no-op
tick_size_changeclearing local book and queuing a redundant snapshot (Python and Rust) - Fixed Polymarket stale local book and last quote leaked across unsubscribe cycles (Python and Rust)
- Fixed Polymarket auto-loaded instrument subscriptions not receiving live data (#4050), thanks for reporting @d0dge
- Fixed Polymarket auto-load dropping subscriptions on CLOB transient 404 and empty
token_idfor newly-minted markets - Fixed Polymarket market IOC orders submitting as FOK (#4006), thanks for reporting @fedoraiver
- Fixed Polymarket WS order parsing of venue cancellations with reason suffix (#3987), thanks for reporting @Javdu10
- Fixed Polymarket WebSocket parse-error logging raising a secondary exception on non-UTF8 payloads (#4038), thanks @graceyangfan
- Fixed Polymarket
parse_tradesTradeId collisions on multi-filltransactionHash(Python and Rust) - Fixed Polymarket
parse_tradests_eventcollisions on same-second fills (Python and Rust) - Fixed Polymarket
fetch_tradesaborting on historical-offset ceiling; warns and returns partial (Python and Rust) - Fixed Polymarket
load_tradesnon-deterministic same-second ordering across pages (Python and Rust) - Fixed Polymarket Gamma instrument loading capped at 100 markets (#4086), thanks for reporting @haimgel
- Fixed Tardis instrument metadata parsing for numeric fields encoded as strings
Internal Improvements
- Added
OrderMatchingCore::update_price_incrementprimitive for tick-size propagation parity (Rust) - Added
iter_*API onOrderMatchingCorefor zero-allocation read-only iteration of resting orders (Rust) - Added Criterion bench suite for
OrderMatchingCorecovering add/get/delete/iterate hot paths (Rust) - Added
OwnOrderBookproperty tests for Rust model invariants - Added
ContinuousFutureAdjustmentTypeenum andBarBuilderprice adjustment pipeline (Rust) - Added native
is_externally_aggregated/is_internally_aggregatedmethods onBarType(Rust) - Added live node stress harness with
trade_burstandcancel_starvationscenarios (Rust) - Added
DataEngineandAsyncRunnerper-stage benches for the trade-to-cache path (Rust) - Added Python
TradingNodeparity stress harness for v1 vs v2 comparison - Added
cargo-flamegraphto workspace tools with pinned version - Added
simulationfeature onnautilus-liveso the stress harness runs undercfg(madsim)for DST validation - Added
NautilusKernel::with_cache_databasebuilder setter and constructor variant for cache database adapter injection (Rust) - Added
nautilus-event-storesnapshot capture/restore/replay viaNautilusKernelfor durable cache state across runs (Rust) - Added automatic
Tungstenitefallback whenWebSocketConfig.proxy_urlis set with Sockudo selected (Rust) - Added typed publish_instrument() to message bus (#4081), thanks @filipmacek
- Added Binance Futures
-4531(UM/CMdualSidePositionsync) error classifier with hedge-mode hint (Rust) - Added
BinanceSpotUserDataEventTypeenum for typed Spot user-data event dispatch (Rust) - Added Interactive Brokers PyO3 live client config support in
TradingNodeConfig(#3964), thanks @faysou - Added Interactive Brokers Rust adapter support for v2 live trading (#3974), thanks @faysou
- Added Interactive Brokers per-order exchange routing params (#4079), thanks @faysou
- Improved
#[custom_data]to support live-only JSON types without Arrow registration - Improved
DataEngine.resetto clear book updaters, snapshotters, option chain managers, and timers (Rust) - Improved
DataEngineto create per-underlying books for composite-symbol book subscriptions (Rust) - Improved object materialization in Rust stream Feather to parquet conversion (#3954), thanks @faysou
- Improved cache order storage to per-order
Rc<RefCell<OrderAny>>cells, closing stale-clone bug class (Rust) - Improved
OwnBookLadderto defer error logging to callers, removing duplicate own-book error noise - Improved
DataEngine/DataActorbulky responses: summaries at debug, full at trace; same for raw WS frames in Bybit, OKX, BitMEX - Improved
OrderMatchingEnginetrailing-stop activation to use theOrderMatchingCoreiter_*API (Rust) - Improved
OrderMatchingEngine.iterateper-order loop to align trailing-stop and GTD timing with Cython (Rust) - Improved
OrderMatchingEnginequeue-position fill gating to match Cython on cross-through trades (Rust) - Improved
OrderMatchingEngine.iteratebid/ask reset gate to honor in-flight trade overrides (Rust) - Improved
update_balance_multi_currencyto delegate negative-balance enforcement to per-accountupdate_balances - Improved live exec clients to log ERROR with
timeout_post_stophint when cancel tasks abort on disconnect - Improved
ExecTesterto refresh tracked orders from cache before modify/cancel-replace so they see venue acks - Improved
make buildto leave the venv able to importnautilus_traderfrom any cwd via a local editable.pth - Improved Betfair Rust adapter to suppress late HTTP acceptance at debug level
- Improved Betfair Rust adapter to suppress noisy
instrument_closesubscribe/unsubscribe warnings - Improved Betfair Rust HTTP client
connect()to short-circuit when authenticated and serialise concurrent callers - Improved Betfair Rust HTTP client
disconnect()to cancel in-flight retries and install a fresh cancellation token - Improved Betfair Rust
unsubscribe_book_deltaslog level towarnto match Python visibility - Improved Betfair Rust adapter with explicit info-level no-op overrides for unsupported unsubscribe methods
- Improved Betfair Rust integration test coverage to cover OCM, replace flow, batch ops, and session recovery
- Improved Hyperliquid data client to track spawned subscribe tasks for abort on disconnect/reset (Rust)
- Improved Interactive Brokers Python 3.14 installation and integration test coverage
- Regenerated Binance Spot SBE codecs against schema 3:4
- Refined data engine request workflow (#3928), thanks @faysou
- Refined Hyperliquid data client by extracting
parse_l2_book_snapshothelper for direct unit testing (Rust) - Optimized
Cacheorder and position query methods to a single size-ordered intersection pass (Rust) - Optimized
Cache::*_countmethods to count via index without materializing a sortedVec(Rust) - Optimized
OrderMatchingCorestorage to splitBTreeMaplimit/stop books per side for price-time priority (Rust) - Optimized live node biased select to dispatch exec commands ahead of market data (Rust)
- Optimized live node loop by collapsing six maintenance timers into one shared maintenance dispatcher (Rust)
- Ported Interactive Brokers adapter hardening fixes to Rust (#4073)
- Upgraded
alloycrate to v2.0.4 - Upgraded
databentocrate to v0.51.0 - Upgraded
rediscrate to v1.2.1 - Upgraded
tokiocrate to v1.52.3 (fixes a performance regression)
Documentation Updates
- Added DST docs caveats for process-global lazy state RNG consumption and
CacheViewfactory blocker - Added Bybit hedge-mode docs with official
positionIdxAPI links - Added Bybit BBO order docs with params and examples
- Added Databento docs for price precision precedence and publisher mappings
- Added Deribit DVOL and Hyperliquid
allMidsadapter docs - Added Polymarket fill quantity normalization section explaining the dust snap, deferred dust, and commission semantics
- Added dYdX adapter notes for FOK deprecation, DAY rejection, equity-tier limit, and MIT/LIT round-tripping
- Added adapter timestamp conversion conventions covering ms-to-ns helpers and
ts_eventvsts_init - Added Rust shared-mutability storage guide with
Rc<RefCell<T>>decision tree to the developer guide - Improved Hyperliquid integration guide flagging Rust-only execution config options and scoped slippage note
- Added
Shutdown semanticsto the backtesting guide coveringon_stopcommand settlement - Updated adapter docs and examples to use environment enums instead of legacy test flags
Errata
- Seven 0.57.0 crates manually published via API token (not OIDC) due to a topo-sort bug in
publish-cargo-crates.sh - Affected:
nautilus-{analysis,common,execution,network,portfolio,testkit,trading}; fixed for v1.228.0
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, new exchange contracts, reshaped order fields, pUSD collateral, and
py-clob-client-v2on the Python side - 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) to read and write under their declared URI prefix; move data previously written to the bucket root 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
- Fixed sockudo WebSocket backend dropping handshake leftover bytes when the server piggybacks the first frame on the 101 response (#3932), thanks @sunlei
- Fixed account state regeneration dropping account-wide margins on every fill across live and backtest paths
- Fixed
AccountStateto accept emptybalancesandmargins - Fixed
FillModeldeterminism viaIndexMapinOrderMatchingEngine(#3914), thanks for reporting @timkoopmans - Fixed quote midpoint raw arithmetic across precision modes (#3849), thanks @BurnOutTrader
- Fixed
quote_quantitypropagation in execution algorithm spawn orders (#3845), thanks @dxwil - Fixed streaming backtest shutdown determinism on
FORCE_STOP(#3920) - Fixed
mark_values/equitykeying by base currency when conversion is off; now keys by settlement currency - Fixed
PortfolioAnalyzerAttributeError onMaxDrawdown/CAGR/CalmarRatio(#3941), thanks for reporting @a1zb2yc3z - Fixed
stop_timerinTimeBarAggregator(#3822), thanks @faysou - Fixed
RiskEngineapplying basemin_quantity/max_quantitybounds to quote-denominated orders - Fixed backtest
OrderMatchingEnginetreatingquote_quantity=Trueorders as base quantity; the quote notional is now converted to a base quantity before fill simulation (#3873), thanks for reporting @fedoraiver - Fixed
subscribe_option_chainhanging on bootstrap in backtest (#3938), thanks for reporting @aaurix - Fixed backtest option expiry fills missing from cache and fills report (#3939), thanks for reporting @hotelmike
- Fixed backtest physical option assignment closing the option leg at the opening premium (#3948), thanks for reporting @hotelmike
- Fixed
DataBackendSessionGIL deadlock when streaming custom data types (#3847), thanks for reporting @GianC0 - Fixed
BacktestNodestreaming with mixed built-in and custom data types (#3853), thanks for reporting @GianC0 - Fixed
DataBackendSessionchunked streaming memory leak causing RSS growth (#3889), thanks for reporting @GianC0 - Fixed book snapshot subscriptions to preserve exact
(instrument_id, interval_ms)semantics for shared intervals and exact unsubscribe handling (Rust) (#3823), thanks for reporting @dwolfesberger - Fixed WebSocket auth state during reconnection for Bybit, OKX, and Deribit (#3820), thanks for reporting @KaizynX
- Fixed WebSocket
idle_timeout_msreset onPing/Pongkeep-alive frames (#3907), thanks for reporting @camarigor - Fixed
TradingNodeConfig.parsedropping importable live client configpathandfactoryfields during raw config decoding - Fixed
OrderTriggeredValueError on market-style stop orders (#3812), thanks for reporting @jindrichsirucek - Fixed
consolidate_data_by_periodpairwise merging on fragment-per-flush catalogs (#3857), thanks for reporting @M-Advis - Fixed
consolidate_data_by_perioddestroying data on repeat runs and when straddling files spanned the consolidation window, mirrored in the Rust catalog backend (#3883), thanks @M-Advis - Fixed
ParquetDataCatalog.get_intervals(identifier=None)on per-identifier data (#3903), thanks for reporting @GianC0 - Fixed
ParquetDataCatalog.consolidate_dataraisingIndexErrorwhen the start/end range did not overlap any files, andconsolidate_catalog_by_periodaborting the loop on the first unrecognized directory rather than skipping it (#3910), thanks for reporting @M-Advis - Fixed remote catalog object paths under URI prefix so writes and reads under
s3://bucket/base/path(and other remote schemes) no longer collapse to the bucket root (#3930), thanks @fedoraiver - Fixed S3-backed custom data queries and remote Feather discovery (#3931), thanks for reporting @fedoraiver
- Fixed
FeatherWriterwriting 0-precision metadata on leadingCLEARdelta (#3913), thanks for reporting @fedoraiver - Fixed empty error log on
TradingNodeclean shutdown fromCancelledError(#3862), thanks for reporting @jxstanford - Fixed
SymbolandPositionIddeserialize of non-ASCII escaped strings (#3893), thanks for reporting @volemont - Fixed execution engine ignoring user-supplied
position_idfromsubmit_order(Rust) - Fixed
ExecutionEngineleg-fill position events not publishing to subscribers (#3939) - Fixed cache load not repairing OTO contingent child
position_idafter a partial fill-time crash (Rust) - Fixed
TestDataGenerator.generate_trade_ticksusing random UUID4; now sequences deterministicT-{idx}IDs - Fixed reconciliation IDs non-deterministic across restarts (#3878), thanks for reporting @peanut-copilot
- Fixed reconciliation synthetic
OrderStatusReportnow propagates fill price toavg_pxfor downstream inferred fills - Fixed
reconcile_fill_reportdropping fills for unknown orders; now bootstraps external orders for venue closures - Fixed PyO3
InstrumentStatuspersistence and backtest streaming throughParquetDataCatalog(#3855) - Fixed PyO3
LiveNoderequest_bars()historical callbacks dropped during startup warmup (#3825), thanks @BurnOutTrader - Fixed PyO3
DataActormissingon_historical_funding_ratesandon_historical_dataforwardingNone - Fixed PyO3 crypto instrument
from_dictfor unregistered base/underlying codes (#3882), thanks for reporting @volemont - Fixed PyO3 catalog
instruments()failing on unregistered currencies (#3898), thanks for reporting @volemont - Fixed PyO3
from_dicton non-ASCII strings viaensure_ascii=Falseinjson.dumps(#3895), thanks @costajohnt - Fixed Betfair event order:
Instrumentnow emits beforeInstrumentStatus/InstrumentClosewithin each MCM - Fixed Betfair scratched runners (
Removed/RemovedVacant) emitting close only at market close; now fire immediately - Fixed Betfair non-snapshot book deltas emitting inline; now tailed after trades/tickers to match Python semantics
- Fixed Betfair BSP deltas emitting before book deltas; now tailed after book deltas within each MCM
- Fixed Betfair order rejection reason dropping instruction-level
errorMessagedetail - Fixed Betfair
query_orderto emit status reports viacustomer_order_refandbet_idlookups (Rust) - Fixed Binance user data stream not recovering after keepalive failure (#3861), thanks for reporting @KaizynX
- Fixed Binance Futures user data stream event loss during listen key rotation (#3861), thanks for reporting @KaizynX
- Fixed Binance Futures WebSocket trades by forcing
@aggTrade(#3861), thanks for reporting @KaizynX - Fixed Binance Futures exchange-generated fills losing real
trade_idandcommissionby bundling status + fill - Fixed Binance Ed25519 detector silently accepting base64 HMAC secrets as Ed25519 keys (Rust)
- Fixed Binance HTTP request Ed25519 signature URL-encoding in query strings (Rust)
- Fixed Binance Futures USD-M
cancel_all_orderssilently failing; routes through HTTP (WS API does not support it) - Fixed Binance Futures
TRADE_LITEuser data events logging "Unknown event type" warnings on every fill - Fixed Binance USD-M Futures WebSocket routing for
fstream-mmandfstream-authhosts - Fixed BitMEX trade ID fallback using random UUID4 when
trdMatchIDmissing; now hashed from trade fields - Fixed Bybit demo mode websocket data URLs (#3742), thanks for reporting @jindrichsirucek
- Fixed Bybit position deserialization for closed positions (#3836), thanks for reporting @pusteckiy
- Fixed Bybit perpetual instrument status to emit
PreClosewhen scheduled for delisting (#3829), thanks @dxwil - Fixed Bybit
load_all_asyncdroppingbase_coinfilter for options (#3865), thanks for reporting @Baerenstein - Fixed Bybit
InstrumentStatusmessages silently dropped instead of forwarded to the data engine - Fixed Bybit and Deribit option chain example
subscribe_option_chaincall (#3887), thanks @sunlei - Fixed Bybit margin missing for accounts with orders but no positions (#3725), thanks for reporting @marco-rigoni
- Fixed Bybit JSON pong websocket frames not being skipped before classification (#3936), thanks @sunlei
- Fixed Bybit hedge mode
positionIdxrejection whenposition_modeset (#3944), thanks for reporting @pusteckiy - Fixed Bybit execution client not applying configured leverage, position mode, or margin mode on connect (Rust)
- Fixed Databento CMBP1 and TCBBO trade IDs using random UUID4 instead of deterministic hash of trade fields
- Fixed Databento dropping
start_nsafter session start; now logs error (#3877), thanks for reporting @jxstanford - Fixed Deribit mark/index price subscriptions silently dropping data in Python (#3821), thanks for reporting @linimin
- Fixed Deribit
StopMarketOrderRejectedonmarket_priceprice field (#3925), thanks for reporting @marco-rigoni - Fixed dYdX
generate_order_status_reportfetching only the first order and missing later matches in the response - Fixed dYdX orderbook snapshots missing
F_SNAPSHOTflag on deltas; empty-book Clear now emitsF_SNAPSHOT | F_LAST - Fixed dYdX crossed-book resolution stripping
F_SNAPSHOTfrom synthetic uncrossing deltas and the terminator - Fixed dYdX trade-tick pagination dedup missing non-adjacent duplicates across page boundaries
- Fixed dYdX trade-tick pagination overshooting target
endblock from fixed block-time estimate - Fixed dYdX crossed-book size arithmetic using
f64subtraction; now usesDecimalat full precision - Fixed dYdX position reports overriding venue
sidefromsizesign; venue side now preserved end-to-end - Fixed dYdX
DydxAdapterConfigdefaulting to mainnet URLs regardless ofnetwork; addedfor_networkhelper - Fixed Hyperliquid
LiveNodebootstrap panic on HIP-3 instrument symbols containing*/?(e.g.dex:STREAMABCD****-USD-PERP) by substituting wildcard bytes withxinInstrumentId.symbolwhile preserving the venue-official name onraw_symbol(#3896), thanks for reporting @daiwanwei - Fixed Hyperliquid bracket order submission grouping (#3810), thanks for reporting @jindrichsirucek
- Fixed Hyperliquid modify cancel-replace emitting stale
OrderCanceled(#3827), thanks for reporting @P1YU5H-50N1 - Fixed Hyperliquid order status query for closed orders (#3879), thanks for reporting @pusteckiy
- Fixed Hyperliquid batch cancel silently dropping per-item errors (#3879), thanks for reporting @pusteckiy
- Fixed Hyperliquid Rust
query_orderhandler to emit status reports (#3879), thanks for reporting @pusteckiy - Fixed Hyperliquid
request_account_statediscarding parsed margins (#3725), thanks for reporting @marco-rigoni - Fixed Hyperliquid
cancel_all_ordersdropping per-order rejection events on partial or transport failure - Fixed Hyperliquid
request_tradessilently returning empty; now bails explicitly - Fixed Hyperliquid
Auto-Deleveragingfill direction deserialization (#3922), thanks for reporting @AlphaTraderK - Fixed IB Gateway Docker image failing on ARM64 hosts (#3813), thanks for reporting @Baki-0501
- Fixed Interactive Brokers rejecting negative average fill price on combo/spread net-credit fills (#3884), thanks @faysou
- Fixed Interactive Brokers position reconciliation
TypeErrorwhenpriceMagnifierisNone(#3885), thanks @davidsblom - Fixed Kraken Futures limit order
OrderUpdatedpanic from wirestop_price: 0.0treated as trigger price - Fixed Kraken Futures fast-fill market orders resolving as rejected during order status reconciliation (#3870), thanks for reporting @Stamppot82
- Fixed Kraken Futures margin-account balance parse violating the
AccountBalanceinvariant (total == locked + free) when Kraken'saffield and the derivedamount - afround independently at the currency precision - Fixed Kraken Spot quote-quantity orders never reaching terminal state from base/quote size mismatch
- Fixed Kraken Spot ticker
QuoteTick.ts_eventusing local init time instead of the exchangetimestampfield (#3926), thanks @ptzafos - Fixed Kraken trade dedup clearing the entire set at capacity instead of evicting the oldest entry
- Fixed Kraken Futures
AccountBalanceinvariant panic on margin parse (#3868), thanks @Stamppot82 - Fixed Kraken Futures WebSocket re-authentication deadlock on reconnect (#3871), thanks for reporting @Stamppot82
- Fixed OKX option greeks not forwarded due to inaccessible Cython
cdefsubscription attribute - Fixed OKX option greeks emitting
BlackScholesconvention regardless of subscribed greeks type - Fixed OKX order identity registration race during concurrent order submission (Rust)
- Fixed OKX algo orders missing from order status reconciliation reports
- Fixed OKX spot margin position reconciliation preferring
CurrencyPairwith USDT/USDC/USD quote over alternatives - Fixed OKX index-price subscription refcount leaking across reconnect and concurrent transitions
- Fixed OKX option summary subscription refcount not rolling back on subscribe failure
- Fixed OKX duplicate fills from empty
trade_idusing deterministic synthesized id instead of random UUID - Fixed OKX panics on unmapped
OrderStatusand emptyOptionTypevalues viaTryFromconversion (Rust) - Fixed OKX
InstrumentStatusmessages logged as unhandled instead of forwarded to the data engine - Fixed OKX
query_orderto emit status reports by merging regular and algo order lookups (Rust) - Fixed Polymarket commission formula and fee source for fills (#3838), thanks for reporting @santivazq
- Fixed Polymarket reconciliation fills using incorrect commission (#3860), thanks for reporting @fedoraiver
- Fixed Polymarket instrument
min_quantitydenying market orders via limit-order shares rule (#3874), thanks for reporting @fedoraiver - Fixed Polymarket
request_instrument(s)dropping WS via staletoken_meta(#3900), thanks for reporting @fedoraiver - Fixed Polymarket
parse_to_quote_ticksusing changed level as top of book (#3905), thanks for reporting @camarigor - Fixed Polymarket
parse_to_snapshotmissingF_SNAPSHOTflag on CLEAR and intermediate ADD deltas - Fixed Polymarket
parse_to_deltasflaggingF_LASTon every delta instead of only the final one - Fixed Polymarket
parse_to_trade_tickusinguuid.uuid4(), producing non-deterministic trade IDs - Fixed Tardis replay handling of sparse
book_snapshot_*levels (#3953), thanks for reporting @a1zb2yc3z - Fixed Tardis trade ID fallback using random UUID4 when venue
idmissing/empty (CSV and WebSocket parsers)
Internal Improvements
- Added
AccountBalance::from_total_and_lockedandAccountBalance::from_total_and_free, and migrated adapter balance parsing to preserve thetotal == locked + freeinvariant at currency precision (Rust) - Added typed
CorrectnessErrorenum to replaceanyhow::Errorincorrectnesshelpers (Rust) - Added
CorrectnessResultExt::expect_displayfor display-formatted panics on typed correctness errors (Rust) - Added deterministic simulation testing (DST) re-export module gated behind
simulationfeature (Rust) - Added
wall_clock_nowseam innautilus-corefor virtual time under simulation (Rust) - Added
biasedtotokio::select!blocks in network and live crates for deterministic poll order - Added
nautilus_network::transportmodule withMessage/TransportError/WsTransportfor future backend swap (Rust) - Added neutral
Message/TransportErrorre-exports onnautilus_networkto ease future backend swaps (Rust) - Added engine config methods on PyO3
LiveNodeBuilder(#3848), thanks @BurnOutTrader - Added read-only
params()accessor toSubscribeCommandandTradingCommand(#3846), thanks @faysou - Added
ShutdownSystemhandling viacommands.system.shutdownpub/sub topic, wired to kernel, backtest, and live (Rust) - Added PyO3
DataActorparity with v1 forpublish_data,publish_signal,subscribe_signal,unsubscribe_signal,add_synthetic, andupdate_synthetic(Rust) - Added per-currency account-wide margin storage to
MarginAccount, routing event margins byinstrument_idpresence - Added Architect AX unit and integration tests for execution, request filters, and WebSocket parsers
- Added dYdX debug logging to
generate_order_status_reportshowing filter scope andpage_fullonNoneresults - Added Polymarket
determine_trade_idhelper with FNV-1a (Rust) and blake2b (Python) deterministic hashing - Added Hyperliquid criterion benchmarks for L1 signing path
- Added Hyperliquid integration tests for funding rates, trades, cancel-all, and
handle_l2_bookrouting - Added Hyperliquid
minTradeSpotNtlRejectedorder status andUnknownliquidation method fallback - Added Binance unit tests for spot/futures dispatch dedup, post-only rejection, and value conversions
- Added
derive_trade_idFNV-1a helpers in BitMEX and Tardis common parse modules for deterministic fallback - Added
derive_cmbp_trade_idin Databento decode for schemas without a native trade ID - Added property-based tests for Databento trade ID derivation (stability and 16-hex format)
- Added Rust/Python parity tests pinning matching-engine
TradeIdformat across language bindings - Added
nodefeature tonautilus-livegatingbuilder,config,manager, andnodemodules (default on) - Added support for user-provided Tokio runtime in live module (#3918), thanks @filipmacek
- Added continuous futures support for bar requests and subscriptions (#3921), thanks @faysou
- Improved
nautilus-live/defito no longer pullLiveNodeorchestration deps - Improved CI uv cache via
setup-uvauto mode to skip GHA uploads on self-hosted runners (#3933), thanks @sunlei - Cleaned up unused dependencies (#3886), thanks @sunlei
- Improved CI cache hygiene on self-hosted runners with uv prune, prek auto-gate, and footprint summary
- Migrated
WebSocketClientonto theWsTransporttrait, decoupling reconnect/auth from tungstenite types (Rust) - Changed Polymarket
PolymarketQuote.best_bid/best_askto optional, matching the RustOption<String>schema - Ported Interactive Brokers Rust historical bar replay with Python parity fixes (#3892), thanks @faysou
- Standardized adapter example manifests and trading deps (#3891), thanks @sunlei
- Standardized margin emission convention across live derivatives adapters to use currency-keyed
MarginBalanceentries - Refactored
reconciliationmodule intotypes,ids,positions, andorderssubmodules (Rust) - Refactored Binance Futures user data stream dispatch and listen key recovery into dedicated modules (Rust)
- Refactored Binance Futures value conversions into a new
futures::conversionsmodule (Rust) - Replaced
AHashMap/AHashSetwithIndexMap/IndexSetinExecutionManagerfor deterministic ordering in simulations (Rust) - Refined
nautilus-systemto optional in adapter crates (gated bypython); default builds drop heavy transitive deps - Refined DST convention hook to enforce
IndexMapinOrderMatchingEngine - Refined make cargo-test to not include binaries for test harness builds (#3828), thanks @faysou
- Refined Interactive Brokers combo fill average price calculation (#3834), thanks @faysou
- Refined Kraken WebSocket execution dispatch to emit typed events for tracked orders via per-product modules
- Refined Kraken Spot WS auth via
AuthTrackerwithis_authenticated/wait_until_authenticatedPython APIs - Optimized Hyperliquid L1 signing by caching
PrivateKeySignerand EIP-712 domain (#3851) - Optimized
ClientOrderIdgeneration with cached prefix buffer (#3935), thanks @sunlei - Optimized
OrderListIdandPositionIdgeneration with cached prefix buffers (Rust) - Upgraded Rust (MSRV) to 1.95.0
- Upgraded Cap'n Proto to v1.4.0
- Upgraded
alloycrate to v2.0.1 - Upgraded
capnpcrate to v0.25.4 (regenerated schemas with 4-space indents and version headers) - Upgraded
databentocrate to v0.48.0 - Upgraded
datafusioncrate to v53.1.0 - Upgraded
msgspecto v0.21.1 - Upgraded
pyarrowto v24.0.0 - Upgraded
tokiocrate to v1.52.1
Documentation Updates
- Added Polymarket Python and Rust adapter config tables and updated rate limits
- Added ID determinism invariant to the reconciliation live and execution concept guides
- Added Trade ID derivation sections to Polymarket, Databento, BitMEX, and Tardis integration guides
- Added Trade ID derivation section to the backtesting concept guide
- Added "Equity and mark-to-market" section to the portfolio concept guide
- Added ADL / liquidation handling sections to the Binance, Bybit, OKX, BitMEX, Hyperliquid, Deribit, dYdX guides
- Added reconciliation reports section to the execution concept guide
- Refined docs to follow style guide for symbols and filler words (#3830), thanks @JKDasondee
- Refined Interactive Brokers documentation regarding UTC timestamps (#3826), thanks @faysou
- Refined dYdX integration guide config tables to match the Python API (
environment,subaccount,base_url_grpc) - Updated Hyperliquid integration guide with funding history, depth10, subscribe_params, and slippage
- Updated the configuration concept guide to define unknown-field rejection as the config standard in Python and Rust
Deprecations
- Deprecated
demo/testnetbools onBybitDataClientConfig/BybitExecClientConfig- useenvironment - Deprecated
is_demoonOKXDataClientConfig/OKXExecClientConfig- useenvironment - Deprecated
testnetonHyperliquidDataClientConfig/HyperliquidExecClientConfig- useenvironment - Deprecated
is_testnetonDeribitDataClientConfig/DeribitExecClientConfig- useenvironment - Deprecated
is_testnetonDydxDataClientConfig/DydxExecClientConfig- useenvironment - Deprecated
testnetonBitmexDataClientConfig/BitmexExecClientConfig- useenvironment
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
subscribe_instrumentsusing exact topic instead of wildcard pattern, causing venue-level subscriptions to miss per-instrument publishes fromDataEngine(Rust) - Fixed spurious "Timer replaced" warnings for expired timers in
LiveClockandTestClock(#3690), thanks @HaakonFlaaronning - Fixed time bar historical event deferral (#3698), thanks @faysou
- Fixed
DataActorandStrategytimer callbacks in live mode silently lost on shared clock - Fixed
DataActor::handle_time_eventmissingnot_running()state guard - Fixed
SimulatedExchangeaccount balance adjustment mutation (#3704), thanks for reporting @thaning0 - Fixed analyzer and tearsheet returns to prefer portfolio-level daily returns when they can be derived from account balances
- Fixed backtest analyzer to include position snapshots in Rust (#3710), thanks @necofx
- Fixed
make_dict_serializerincompatible with instance-methodto_dictfor@customdataclasstypes (#3722), thanks for reporting @Lacleman-trading - Fixed Sandbox
RefCellre-entrancy panic when submitting orders throughExecutionEnginein async runner (#3732), thanks for reporting @linimin - Fixed triggered stop orders remaining in matching core after full fill, causing repeated duplicate fill log messages (#3741), thanks for reporting @linimin
- Fixed matching engine
L1_MBPstale bid/ask when backtesting with trade-only data (Rust and Cython) - Fixed matching engine GTD order expiry running after fills, allowing expired orders to fill before being expired
- Fixed
Order::calculate_overfillemitting falseQuantitysaturation warnings during normal partial fills (#3746), thanks for reporting @linimin - Fixed Sandbox reconciliation missing
account_id(#3705), thanks for reporting @eliotOrderson - Fixed Rust
Portfolioaccount-scopednet_exposure,net_exposures, and balance updates in multi-account mode - Fixed
RefCellborrow conflict inPortfolio::initialize_orders(#3787), thanks @filipmacek - Fixed reported
MarginAccountupdates dropping initial and maintenance margins (#3725), thanks for reporting @marco-rigoni - Fixed option chains emitting data after expiry (#3735), thanks @filipmacek
- Fixed
BettingInstrument.selection_handicapPyO3 name - Fixed adapter
query_accountpanic fromblock_oninside async runtime across all adapters (Rust) - Fixed Betfair order modify
Quantityserialization for partial cancel size reduction - Fixed Binance trailing stop params and testnet URLs (#3778), thanks @eliotOrderson
- Fixed Binance Spot SBE schema version mismatch after Binance upgraded to schema 3:3 (released 2026-03-25)
- Fixed Binance algo order update (#3665), thanks @qu1zzyboy
- Fixed Binance SBE price/quantity precision derivation (#3670), thanks @husariancom
- Fixed Binance Futures
set_futures_hedge_modesending GET instead of POST topositionSide/dualendpoint (#3745), thanks for reporting @dodge-basic - Fixed Binance order update silently dropped when instrument not cached (#3775), thanks for reporting @M-at-ti-a
- Fixed Binance Futures
OrderStatusReportmissingavg_pxfrom WS order updates (Python) - Fixed Binance Spot post-only (
LIMIT_MAKER) rejection not settingdue_post_onlyonOrderRejectedevents (Python and Rust) - Fixed Binance Rust WS trading API not decoding SBE error responses, losing error codes on rejection
- Fixed Binance Rust WS trading request-response race condition where fast rejections arrived before pending request registration
- Fixed Binance Rust WS trading
OrderRejectedDashMap deadlock whencleanup_terminalran while holding a read guard - Fixed Binance Spot Rust
connect()not waiting for WS session authentication before signaling connected - Fixed Binance Futures account state parsing failing on empty string balances from inactive accounts
- Fixed Bybit demo exec client failing with error 10001 when
/v5/account/fee-rateis unavailable (#3742), thanks for reporting @jindrichsirucek - Fixed Bybit HTTP client not retrying on 429 rate limit responses
- Fixed Bybit HTTP cancellation token not resettable after
disconnect(), causing REST calls to short-circuit on reconnect - Fixed Bybit WebSocket subscription ACKs confirming all pending topics instead of the acknowledged topic (via
req_idcorrelation) - Fixed Bybit WebSocket failed subscription ACKs (success=false) not triggering
mark_failurerecovery path - Fixed Bybit spot market orders ignoring
is_quote_quantityon the order, causing all spot market buys to default to quote currency quantity via the Bybit API - Fixed Bybit demo mode
submit_orderignoringis_leverageparam, hardcodingfalseinstead of reading from order params - Fixed Bybit
trigger_typeignored on conditional orders, always submitting asLastPrice(#3794), thanks for reporting @marco-rigoni - Fixed Bybit TP/SL conditional orders misclassified as plain Market/Limit during reconciliation
- Fixed Bybit bulk order status reports silently missing conditional (stop/MIT) orders
- Fixed Bybit account state free balance underflowing when locked margin exceeds wallet total during liquidation
- Fixed Databento price precision truncation for fractional tick sizes (#3696), thanks @pandashark
- Fixed Deribit stop order submission missing
trigger_priceandtriggerfields in Python exec client (#3794), thanks for reporting @marco-rigoni - Fixed Deribit cancel event lost during WebSocket reconnection gap when
user.orderssubscription update never arrives - Fixed Deribit duplicate
OrderCanceledevents when cancel RPC response anduser.orderssubscription both emit - Fixed Deribit
GenerateOrderStatusReportunable to find closed orders when onlyclient_order_idis provided - Fixed Deribit
next_8_utcGTD expiry calculation panicking on edge-case timestamps outside nanosecond range - Fixed Deribit historical trade pagination dropping trades when >1000 share a millisecond boundary
- Fixed Deribit late-listed instruments not propagating to HTTP and WebSocket handler caches
- Fixed Deribit
request_book_snapshotsilently using default 8/8 precision when instrument not in cache - Fixed Deribit
request_barsignoringlimitparameter - Fixed Deribit
request_forward_pricesignoring requestclient_idoverride - Fixed Deribit
reset()leaking stream tasks by replacing cancellation token without canceling the old one - Fixed Deribit
send_auth_requestsilently dropping serialization and channel send errors - Fixed Deribit
send_subscribe/send_unsubscribeleaving subscription state wedged on command send failure - Fixed Deribit
VenueOrderIdcomparison via unnecessary string conversion in fill report filtering - Fixed Deribit
OrderSideconversion using fragile string round-trip instead oforder_side_to_pyo3in_submit_orderand_submit_order_list - Fixed Deribit WebSocket
connect()not clearing subscription state for manual disconnect/reconnect cycles - Fixed dYdX WebSocket account state parsing failing on empty string balances from zero-equity accounts
- Fixed dYdX WebSocket handler repeatedly emitting
NewInstrumentDiscoveredfor uncached instruments on everyv4_marketsupdate - Fixed Hyperliquid
_submit_order_listpassing raw Cython orders to Rust, causingTypeErroron bracket/batch orders (#3763), thanks for reporting @jindrichsirucek - Fixed Hyperliquid
_modify_orderOrderSideconversion using fragile string round-trip instead oforder_side_to_pyo3 - Fixed Hyperliquid vault orders rejected with "Builder fee has not been approved" when
vault_addressis configured (#3762), thanks for reporting @chester0 - Fixed Interactive Brokers docs
request_ticksAPI and add contract example (#3699), thanks @faysou - Fixed Interactive Brokers live-session synchronization and reconciliation (#3715), thanks @faysou
- Fixed Interactive Brokers shared historical request dedup for concurrent warmup (#3719), thanks @Johnkhk
- Fixed Interactive Brokers historical bar subscriptions not restored after daily gateway restart (#3733), thanks for reporting @bomber555
- Fixed Interactive Brokers inactive order status handling to prevent silent dropping (#3723), thanks @pandashark
- Fixed Interactive Brokers trailing stop order field parsing during reconciliation and open-order updates (#3771), thanks @faysou
- Fixed Interactive Brokers spread instrument not found on restart reconciliation (#3753), thanks @davidsblom
- Fixed Interactive Brokers adapter not reconnecting on error 326 during gateway restart (#3796), thanks @Johnkhk
- Fixed Kraken post-only order rejection not setting
due_post_onlyonOrderRejectedevents (Spot and Futures) - Fixed OKX option conditional order rejection emitting
OrderSubmittedbeforeanyhow::bail!, leaving orders stuck inSubmittedstate - Fixed OKX
MarketToLimitorders not rejected for options in HTTP and WebSocket clients - Fixed OKX
determine_order_typeclassifying IV/USD-priced option IOC orders asMarketwhen primarypxfield is empty - Fixed OKX BboTbt quote parsing spamming errors on empty bid/ask arrays for illiquid options by adding
QuoteCachefor partial quote merging - Fixed OKX
_subscribe_instrument_statusraisingNotImplementedErrorinstead of being a no-op (status detected via polling) - Fixed OKX
batch_cancel_all_ordersandbatch_cancel_ordersnot emittingOrderCancelRejectedevents for regular (non-algo) batch cancel failures - Fixed OKX
batch_submit_ordersnot removingorder_identitiesfrom dispatch state on batch submit failure - Fixed OKX business WebSocket requiring API credentials for public-only candle data
- Fixed OKX
parse_fill_reporterroring on zero incremental fill quantity during reconnect replay instead of skipping gracefully - Fixed OKX
request_position_status_reportsquerying positions API for Spot/Margin instruments (unsupported by endpoint) - Fixed OKX
cancel_all_ordersandbatch_cancel_ordersnot seedingorder_identitiesfor reconciliation-loaded orders - Fixed OKX
pending_orders,pending_cancels, andpending_amendsmaps leaking entries on WebSocket send failure - Fixed OKX duplicate fills after WebSocket reconnect when replayed messages have the same
trade_id - Fixed OKX HTTP algo order helpers ignoring per-item
sCode, treating venue rejections as success - Fixed OKX batch algo cancel not emitting
OrderCancelRejectedevents for per-item or batch-level failures - Fixed OKX spot margin short position quantity exceeding
size_precisionfrom quote-to-base division - Fixed OKX
parse_rfc3339_timestampsilently wrapping negativei64nanoseconds to garbageu64 - Fixed OKX
update_fee_fill_cachesdiverging from sharedparse_fee_currency(missing non-zero fee warning) - Fixed OKX duplicate fill early return skipping terminal cleanup for
order_identitiesandorder_state_cache - Fixed OKX position status reports incorrectly filtered by
start/endtime, dropping unchanged open positions - Fixed OKX
connect()not passinginstrument_familiesfor OPTION instrument requests (HTTP 400 from OKX API) - Fixed OKX
base_url_wsignored for private and business WebSocket channels (#3727), thanks for reporting @Stamppot82 - Fixed OKX exec client crash on empty account when OKX returns empty strings for numeric balance fields (#3772), thanks for reporting @ProfitChef
- Fixed Polymarket WebSocket initial vs incremental subscribe (#3717), thanks @Javdu10
- Fixed Polymarket cancel request silently dropped when
venue_order_idnot yet available, causing order to remain open until next reconciliation (Python and Rust) - Fixed Polymarket market BUY quote-to-base quantity calculation using worst crossing price instead of per-level accumulation (#3747), thanks @filipmacek
- Fixed Polymarket FOK orders stuck in accepted state when WS terminal status update is missed; deferred REST status check resolves after 5s
- Fixed Polymarket fee rate cache serving stale values indefinitely; added 5-minute TTL with graceful fallback on refresh failure
- Fixed Polymarket
calculate_market_pricenot bailing when all book levels have zero price or size - Fixed Polymarket
created_attimestamp conversion (#3785), thanks @filipmacek - Fixed Polymarket
ts_inittimestamps on reports and reconciliation (#3786), thanks @filipmacek - Fixed Polymarket position reconciliation dust cycling by filtering sub-threshold positions and implementing Data API position reports (#3774), thanks @filipmacek
- Fixed Polymarket duplicate inferred fill panic when order update races trade (#3770), thanks for reporting @Javdu10
- Fixed Polymarket
query_orderpanic fromblock_oninside async runtime (#3803), thanks for reporting @Javdu10 - Fixed Polymarket order stuck in non-terminal state when fills race with cancel (#3797), thanks for reporting @Javdu10
- Fixed Tardis data client CTRL+C not responding due to signal starvation in
LiveNodeevent loop - Fixed Tardis data client
stop()/disconnect()lifecycle leaving tasks alive oris_connectedstale - Fixed Tardis data client
derivative_tickernot streaming unless manually added todata_types
Internal Improvements
- Added
SpreadQuoteAggregator(#3698), thanks @faysou - Added
Paramsanddictfield support for#[custom_data]and@customdataclasspersistence (#3765), thanks @faysou - Added
BINANCE_GTX_ORDER_REJECT_CODEandBINANCE_SPOT_POST_ONLY_REJECT_MSGconstants for reliable post-only rejection detection in Rust - Added
batch_submit_limit_pairtoExecTesterConfigfor order list testing - Added Python strategy support to v2
LiveNodewithadd_strategy_from_config - Added Python exec algorithm support to v2
LiveNodewithadd_exec_algorithm_from_config - Added
LiveNodeintegration tests for actor, strategy, and exec algorithm registration - Added
LiveNode::add_exec_algorithmfor registering execution algorithms on the Rust live trading node - Added
LiveNodestop-handle timeout test for shutdown reliability - Added
ExecutionEngineruntime external order creation fromOrderStatusReportfor exchange-generated orders (liquidation, ADL, settlement) not previously in cache (Rust) - Added
add_exec_algorithm_from_configPyO3 binding onLiveNodewithImportableExecAlgorithmConfig - Added
msgbus::has_endpointfor endpoint existence checks - Added backtest margin models,
FXRolloverInterestModule,PerContractFeeModel, andSimulationModuletrait in Rust - Added
subscribe_option_greekssupport toDataTesterin Rust - Added
WebSocketClient.notify_closed()for stream-mode callers to signal reader EOF to the controller - Added pending cancel/update to event emitter in Rust (#3739), thanks @Javdu10
- Added
LimitIfTouched,MarketToLimit,TrailingStopMarket, andTrailingStopLimittotransform_order_to_pyo3Cython-to-PyO3 order converter - Added PyO3 type assertions to adapter submit-order tests (Hyperliquid, Bybit, Kraken, Architect AX) to catch Cython/PyO3 type boundary regressions
- Added Binance missing
BinanceFilterTypevariants andRawRequestsrate limit type for complete API enum coverage (Rust) - Added Binance unit tests for liquidation, ADL, settlement, and insurance fill parsing with
is_exchange_generateddetection (Rust) - Added Binance parametrized tests for
resolve_commissionfallback andmake_venue_position_id(Rust) - Added Binance Futures priceMatch (BBO) order support (Rust)
- Added Bybit
BybitWsFrameenum separating wire-level deserialization from publicBybitWsMessageAPI per adapter spec pattern - Added Bybit frame classification and subscription correlation test coverage (25 handler tests)
- Added Databento feed handler integration tests with mock LSG server
- Added Databento MBO buffering unit tests and proptests
- Added OKX
QuoteCacheintegration and option greeks subscription lifecycle tests - Added OKX reconciliation pagination cap warnings when fetches hit the maximum page limit
- Added OKX trade-level fill dedup via
emitted_tradesDashSet with atomic insert for cross-stream safety - Added OKX
AlgoCancelContextanddispatch_algo_cancelsto centralize algo cancel partitioning and rejection handling - Added OKX options fill fields (
fill_px_vol,fill_px_usd,fill_fwd_px) and order pricing fields (px_usd,px_vol) to WebSocket and HTTP models - Added OKX execution client integration tests for trade dedup, algo cancel rejections, batch cancel failures, and concurrent dedup
- Added OKX HTTP mock test for
place_algo_ordersCoderejection path - Added OKX
OKXPriceType,OKXSettlementState,OKXQuickMarginTypeenums for type-safe field deserialization - Added Tardis HTTP and WebSocket mock server integration tests
- Replaced Binance
WsDispatchStateDashSetdedup withFifoCachefromnautilus_commonfor bounded FIFO eviction with properremove()cleanup - Replaced Bybit topic string constants with
BybitWsPublicChannelandBybitWsPrivateChannelenum references - Replaced
AtomicMapandAtomicSettype aliases with newtypes wrappingArcSwapfor ergonomic read-heavy concurrent collections - Replaced
DashMap/DashSetwithAtomicMap/AtomicSetfor subscription tracking sets, instrument caches, and bar type caches across all adapters - Refactored computation of greeks (#3691), thanks @faysou
- Refactored
DataEngineinstrument subscribers to message bus pattern, enabling execution clients to receive live instrument updates viaon_instrumentwithout polling (#3766), thanks @filipmacek - Refactored data and execution client startup into two phases with a data event drain between them (#3773), thanks @filipmacek
- Refactored Deribit trade pagination into
TradePaginatorwith dedup and cursor logic shared across public trades and fill reports - Refactored Polymarket HTTP client and improved outcome enum (#3702), thanks @filipmacek
- Refactored Tardis adapter module organization to align with adapter spec (
common/,machine/cache.rs) - Refactored Tardis
TardisDataClientwithCredential::resolve(), centralized URL resolution, andAHashMap - Regenerated Binance Spot SBE codecs from schema 3:3 XML using Real Logic SBE tool v1.37.1
- Moved cache purge timers to base
ExecutionEnginein Python - Improved socket clients reconnect and shutdown reliability
- Improved
LiveNodeevent loop to use biasedselect!with pinnedctrl_cfor reliable signal handling - Improved Binance Spot SBE HTTP parsers to use
block_lengthfrom the message header for end-of-block skip, making decoders forward-compatible with future schema additions - Improved Databento live price precision handling with maps populated from instrument definitions
- Improved Polymarket Rust adapter (#3726), thanks @filipmacek
- Improved Polymarket execution client (#3734), thanks @filipmacek
- Improved Polymarket adapter in Rust (#3760), thanks @filipmacek
- Refined
TimeEventHandlerordering and fixed spread quote timestamps (#3764), thanks @faysou - Refined
SpreadQuoteAggregatortransition from historical to live mode (#3759), thanks @faysou - Refined handling of instruments in catalog (#3761), thanks @faysou
- Refined
AtomicTimemode switching and datetime panics - Refined base catalog interface (#3703), thanks @faysou
- Refined IB option symbols to be OCC compliant (#3731), thanks @faysou
- Standardized
type_name()across order events and instruments - Wired
ExecutionManagerinto live event loop with full inflight lifecycle (Rust) (#3798), thanks @filipmacek - Optimized network client performance and add benchmarks
- Upgraded Interactive Brokers
ibapito 10.45 (#3804) - Upgraded Rust (MSRV) to 1.94.1
- Upgraded
capnpandcapnpccrates to v0.25.3 (regenerated schemas with 4-space indents and version headers) - Upgraded
databentocrate to v0.45.0 - Upgraded
datafusioncrate to v53.0.0 - Upgraded
pyo3crate to v0.28.3 - Upgraded
rediscrate to v1.2.0 - Upgraded
tokiocrate to v1.51.0 - Upgraded
tokio-tungstenitecrate to v0.29.0
Documentation
- Added Rust tutorial for Betfair book imbalance backtest with
DataActorwalkthrough - Added Options concept guide with chain architecture, subscription API, strike filtering, and snapshot modes
- Added Greeks concept guide covering venue-provided and local calculator paths
- Added end-to-end data flow and execution flow sequence diagrams to architecture concepts
- Added Events concept guide with event catalog, handler dispatch, and fill-to-position chain
- Added Rust concept guide with capability matrix, project setup, and feature flags
- Added
how_to/configure_live_trading.mdextracted fromconcepts/live.mdconfiguration content - Added adapter developer guide sections for WS unit tests, close/stream patterns, and split-client architecture
- Added adapter developer guide sections for symbol normalization, status diffing, task management, data event emission, and AuthTracker
- Added adapter developer guide section on configuration best practices: builder defaults,
TvsOption<T>rules,Defaultdelegation pattern - Added adapter developer guide section on
block_onsafety rules andspawn_taskusage in sync trait methods - Added OKX options trading section to integration guide with pricing modes, order types, restrictions, and configuration
- Added Group 10 (options trading) to execution testing spec with venue-agnostic test cases
- Added
DeltaNeutralVolREADME updates for strangle entry flow, config fields, and usage examples - Added Binance Link & Trade
clientOrderIddecoding section with usage examples to integration docs - Added Bybit options support matrix and trading limitations to integration docs
- Added OKX to adapter support tables in Options and Greeks concept guides
- Added option greeks test cases (TC-D62, TC-D63) with config examples to the data testing spec
- Added test style guidance against log capture assertions in developer testing guide
- Rewrote Live Trading concept guide for accuracy (reconciliation, periodic timers, lookback windows)
- Rewrote Custom Data architecture docs for two-mode (Rust/Python) registration
- Improved Value Types concept guide with full arithmetic operator and unary operation docs
- Improved accuracy of Greeks and Options concept guides, thanks @faysou
- Improved
concepts/live.mdto focus on reconciliation explanation, linking to how-to for configuration - Updated all API reference links to Sphinx HTML paths
- Migrated Python API reference from sphinx-markdown-builder to Sphinx HTML with Furo theme
- Fixed actors timer example referencing nonexistent
on_timerandon_alerthooks
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
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), thanks @KaulSe
- Fixed instrument cache race condition during
LiveNode(Rust) startup (#3385), thanks @filipmacek - Fixed quickstart MACD strategy logic (#3377), thanks for reporting @SisyphusCoin
- Fixed value bar aggregators emitting zero-volume bars (#3608), thanks for reporting @ggianfran
- Fixed reconciliation race condition where inferred fills were generated before real fills arrived, causing double-counting and overfill errors
- Fixed reconciliation timing (for v2 Rust) - process instruments before reconciliation (#3415), thanks @filipmacek
- Fixed
request_order_book_snapshotand add Bybit support (#3416), thanks @dxwil - Fixed Arrow serialization encoding for custom Nautilus types (#3515), thanks @dennisnissle
- Fixed cache loading when flush_on_start set to True (#3551), thanks @HaakonFlaaronning
- Fixed Redis cache buffer flushing during idle periods (#3426), thanks for reporting @santivazq
- Fixed Redis cache flush no-op and harden close lifecycle
- Fixed Betfair dropped fills from premature cache update
- Fixed Betfair duplicate cancel event race condition(s)
- Fixed Betfair stream batch handling and modify/cancel edge cases
- Fixed Betfair reconciliation with stale API fill data
- Fixed Binance Spot WebSocket subscription acknowledgment parsing (#3382), thanks @Johnkhk
- Fixed Binance Futures instrument parsing for margin requirements (#3420), thanks @linimin
- Fixed Binance algo order quantity
AttributeErroron_memaccess - Fixed Binance
cancel_all_ordersto route futures algo orders through correct cancel endpoint - Fixed Binance Spot
OrderStatusReport.avg_pxalways None (#3499), thanks for reporting @mrbaron3 - Fixed Binance Spot
client_order_idreplaced with UUID (#3500), thanks for reporting @mrbaron3 - Fixed Bybit demo trading by using HTTP REST API for order operations (Bybit demo does not support WebSocket Trade API)
- Fixed Bybit HOUR bars not triggering on_bar (#3474), thanks for reporting @88z
- Fixed Bybit historical requests to use ts_event as ts_init (#3502), thanks @dxwil
- Fixed Databento
databento_datato fetch definitions for full date range (#3414), thanks @Johnkhk - Fixed Databento zero-length interval at dataset boundary (#3429), thanks @shzhng
- Fixed Databento empty underlying for index-based derivatives (#3480), thanks for reporting @davidsblom
- Fixed Deribit auth token refresh race condition (#3402), thanks @filipmacek
- Fixed Deribit race condition between response and subscription (#3436), thanks @filipmacek
- Fixed Deribit grouped book channel parsing (#3473), thanks @filipmacek
- Fixed Deribit trades parsing for combo_trade_id field (#3520), thanks @davidsblom
- Fixed Interactive Brokers
fetch_all_open_ordersin client cache key preventing connection sharing (#3441), thanks @shzhng - Fixed Interactive Brokers synthetic position order reconciliation causing filled_qty mismatch errors during periodic consistency checks (#3443), thanks @shzhng
- Fixed Interactive Brokers reconciliation error when account has no positions (#3459), thanks @shzhng
- Fixed Interactive Brokers venue determination when primaryExchange is empty (#3452), thanks @shzhng
- Fixed Interactive Brokers option symbol parsing to preserve OCC format with space padding (#3452), thanks @shzhng
- Fixed Interactive Brokers minor bugs with options (#3452), thanks @shzhng
- Fixed Interactive Brokers partial fill state transition errors where
openOrdercallbacks after fills caused invalidPARTIALLY_FILLED->ACCEPTEDtransitions, thanks @shzhng - Fixed Interactive Brokers OrderStatusReport filled_qty always being 0 for open orders causing reconciliation errors, thanks @shzhng
- Fixed Interactive Brokers external order ID collision where orders placed via TWS/other clients (orderId=0) could cause fills to be attributed to wrong orders (#3465), thanks @shzhng
- Fixed Interactive Brokers position reconciliation double-counting partial fills from open orders (#3476), thanks @shzhng
- Fixed Interactive Brokers future chain building for index instruments (#3483), thanks @davidsblom
- Fixed Interactive Brokers options missing
^prefix on index underlying symbols with simplified symbology (#3540), thanks @shzhng - Fixed Interactive Brokers contract for ESTX50 IND contract (#3556), thanks @davidsblom
- Fixed Interactive Brokers parsing options for Stoxx50 (#3562), thanks @davidsblom
- Fixed Interactive Brokers contract details for FESX futures (#3575), thanks @davidsblom
- Fixed Interactive Brokers
ibapi10.43 protobuf compatibility:IBContract.strikedefault andContractDetails.underConIdfield typo (#3599), thanks @shzhng - Fixed Interactive Brokers
track_option_exercise_from_position_updatenot generating FLAT reports for expired options (zero-quantity position updates were silently skipped), thanks @shzhng - Fixed Interactive Brokers bar unsubscribe (#3588), thanks for reporting @pandashark
- Fixed Kraken spot instrument fee/margin parsing where parameters were incorrectly swapped
- Fixed Kraken spot XBT to BTC symbol normalization (#3509), thanks for reporting @chester0
- Fixed OKX HTTP error messages missing rejection reason details (#3580), thanks @griffith-h
- Fixed Polymarket cancel-rejection loop for done orders
- Fixed Polymarket order state race condition where
PLACEMENTevents could arrive late - Fixed Polymarket duplicate WebSocket subscriptions (#3403), thanks for reporting @santivazq
- Fixed Polymarket duplicate trade_id for multi-order fills (#3450), thanks for reporting @santivazq
- Fixed Polymarket
load_all_asyncignoring time-based filters (#3475), thanks @Coyote-Den - Fixed Tardis deltas snapshot boundaries with CLEAR (#3530), thanks @Arandott
Internal Improvements
- Added
Commodity,IndexInstrument, andCfdinstruments in Rust - Added support for setting cache database adapter in cache and
LiveNode(#3401), thanks @filipmacek - Added
ts_initnormalization option toconvert_stream_to_data(#3433), thanks @faysou - Added Params type and catalog instrument persistence in Rust (#3539), thanks @faysou
- Added metadata validation for parquet file consolidation to improve handling of mixed precision instruments
- Added Binance
listenKeyExpiredevent handling (#3387), thanks @Johnkhk - Added Deribit data client (#3368), thanks @filipmacek
- Added Deribit order submission (#3408), thanks @filipmacek
- Added Deribit live reconciliation support (#3421), thanks @filipmacek
- Added Deribit rate limiting for HTTP and WebSocket clients (#3424), thanks @filipmacek
- Added Deribit side-specific order cancellation (#3442), thanks @filipmacek
- Added Deribit real-time portfolio WS subscription (#3444), thanks @filipmacek
- Added Deribit integration documentation (#3508), thanks @filipmacek
- Added OKX
instIdCodesupport for WebSocket order operations (#3536), thanks @Add1ct1ve - Added Polymarket data loader rate limiting
- Migrated Nautilus internal logging to
logcrate (externaltracingavailable viause_tracingconfig) - Renamed Deribit instrument kind enum to product type (#3512), thanks @filipmacek
- Refactored execution clients to use
OrderEventEmitterin Rust (#3469), thanks @filipmacek - Refactored computation of greeks (#3393), thanks @faysou
- Refactored
instrument_greeks(#3587), thanks @faysou - Refactored
TearsheetConfig.chartsto chart objects (removedchart_args) (#3398), thanks @KaulSe - Refactored Betfair order matching to use
rfoas primary key - Refactored Deribit WS client to use standard Nautilus method names (#3418), thanks @filipmacek
- Refactored dYdX v4 execution client in Rust (#3477), thanks @filipmacek
- Refactored dYdX v4 adapter (#3521), thanks @filipmacek
- Refactored dYdX v4 data client (#3547), thanks @filipmacek
- Refactored dYdX v4 execution client (#3557), thanks @filipmacek
- Refactored Kraken spot quotes to use dedicated Ticker channel
- Refactored Polymarket WebSocket to multi-client pool pattern
- Improved
cancel_all_ordersto include inflight orders - Improved pnl FX conversions in portfolio (#3335), thanks @faysou
- Improved live timers to use
BTreeMapfor storage (#3392), thanks @faysou - Improved checks before writing data in catalog._write_chunk (#3411), thanks @faysou
- Improved
ts_initmonotonicity enforcement inconvert_stream_to_data(#3600), thanks @faysou - Improved
OptionExerciseModulelogging and fix cache reference (#3388), thanks @davidsblom - Improved execution reports builder pattern in Rust (#3417), thanks @filipmacek
- Improved
GridMarketMakerstrategy and dYdX cancel handling (#3601), thanks @filipmacek - Improved visualization to use fill report for create_bars_with_fills (#3466), thanks @faysou
- Improved Architect AX WebSocket data and order handling (#3577), thanks @andrew-cho-architect
- Improved Betfair adapter rate limiting and fill deduplication
- Improved Deribit with high-performance
Decimaldeserialization (#3510), thanks @filipmacek - Improved precision-mode validation for Arrow data (#3511), thanks for reporting @2-5
- Improved dYdX v4 data client subscription handling (#3537), thanks @filipmacek
- Improved dYdX v4 rate limiting and cancel strategy (#3606), thanks @filipmacek
- Improved dYdX v4 docs and grid market making tutorial (#3607)
- Refined closing of streaming writer (#3394), thanks @faysou
- Refined handling of
skip_first_non_full_barinTimeBarAggregator(#3395), thanks @faysou - Refined greeks safeguards and docs (#3407), thanks @faysou
- Refined processing of gaps in aggregated historical bars (#3412), thanks @faysou
- Refined exercise and settlement of expiring instruments (#3531), thanks @faysou
- Refined
OptionExerciseModule(#3423), thanks @faysou - Refined instrument
is_spread()method (#3434), thanks @faysou - Refined
OrderBookDeltas.batch(#3437), thanks @faysou - Refined conversion of feather files to parquet (#3590), thanks @faysou
- Refined Interactive Brokers adapter (#3195), thanks @faysou
- Refined Interactive Brokers query of option chains (#3481), thanks @faysou
- Refined Interactive Brokers parsing of alternative option symbol format (#3564), thanks @faysou
- Optimized
Price::from_decimalwith integer arithmetic - Optimized
Quantity::from_decimalwith integer arithmetic - Optimized
Money::from_decimalwith integer arithmetic - Optimized message bus publish with thread-local
SmallVecbuffers in Rust - Optimized message bus pattern matching with greedy algorithm
- Upgraded Interactive Brokers adapter to
ibapi10.43 (#3427, #3595), thanks @faysou - Upgraded Rust (MSRV) to 1.93.1
- Upgraded Cap'n Proto to v1.3.0
- Upgraded Cython to v3.2.4
- Upgraded
databentocrate to v0.41.0 - Upgraded
datafusioncrate to v52.1.0 - Upgraded
pyo3crate to v0.28.2 - Upgraded
pyo3-async-runtimescrate to v0.28.0 - Upgraded
rediscrate to v1.0.4 - Upgraded
tokiocrate to v1.49.0
Documentation Updates
- Added related guides sections to concepts
- Added developer guide for test dataset standards
- Added AX Exchange adapter integration guides
- Added Deribit adapter integration guides
- Split dYdX v3/v4 adapter integration guides
Deprecations
- Deprecated Betfair legacy
customer_order_reftruncation (first 32 characters); the adapter now uses last 32 characters for better entropy. Legacy truncation support during startup reconciliation will be removed in a future version. - Deprecated Binance
key_typeconfig field; key type is now auto-detected (only needed if explicitly using RSA keys) - Deprecated Binance
testnetconfig field; useenvironment=BinanceEnvironment.TESTNETinstead - Deprecated Binance
BINANCE_ED25519_*andBINANCE_*_ED25519_*environment variables; migrate to the standardBINANCE_API_KEY/BINANCE_API_SECRETvariables
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); this inadvertently broke demo trading since Bybit demo does not support WebSocket Trade API -
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 Polymarket maker fills parsing for cross-asset matching and multiple concurrent fills (#3172), thanks @petioptrv
- Fixed Polymarket account balance update timing issue (#3161), thanks for reporting @santivazq
- Fixed Polymarket handling of overfilled FOK orders using
allow_overfillsexecution engine config option (#3221), thanks for reporting @Javdu10 - Fixed Polymarket
match_timetimestamp parsing (#3273), thanks for reporting @santivazq - Fixed Polymarket timestamp conversions (#3291, #3292), thanks for reporting @santivazq
- Fixed Polymarket fill reports for cross-asset matches (#3345), thanks for reporting @santivazq
- Fixed Polymarket order side for cross-asset matches (#3357), thanks for reporting @santivazq
- Fixed Tardis book snapshot to deltas CLEAR prepending
- Fixed Tardis CSV parsing for mid-day snapshots
Internal Improvements
- Added BitMEX submit broadcaster
- Added Bybit start/end time filtering for order status reports (#3209), thanks @sunlei
- Added BybitRawHttpClient Python bindings (#3252), thanks @sunlei
- Added Databento subscription acknowledgement handling and logging
- Added non-mutating swap quote simulation for Pool tickmap profiling (#3123), thanks @filipmacek
- Added ERC20 token balance tracking to BlockchainExecutionClient (#3224), thanks @filipmacek
- Added DeFi pool discovery service with full Uniswap(V2/V3/V4) support (#3255), thanks @filipmacek
- Added Deribit HTTP client with instrument support (#3288), thanks @filipmacek
- Added Deribit account balance and credential management (#3295), thanks @filipmacek
- Added Deribit WebSocket client with market data support (#3297), thanks @filipmacek
- Added Deribit WebSocket auth and raw data stream support (#3304), thanks @filipmacek
- Added Deribit data client in Rust (#3311), thanks @filipmacek
- Added Deribit data client Python bindings (#3315), thanks @filipmacek
- Added Deribit data client WebSocket handling and request methods (#3340), thanks @filipmacek
- Added Deribit execution client scaffolding (#3350), thanks @filipmacek
- Added dYdX v4 crate (#3138), thanks @nicolad
- Added dYdX v4 WebSocket in Rust (#3158), thanks @nicolad
- Added dYdX v4 DataClient in Rust (#3162), thanks @nicolad
- Added dYdX v4 ExecutionClient in Rust (#3163), thanks @nicolad
- Added dYdX v4 execution reconciliation in Rust (#3171), thanks @nicolad
- Added dYdX v4 gRPC order execution (#3222), thanks @nicolad
- Added dYdX v4 order execution via gRPC with Python bindings (#3245), thanks @nicolad
- Added dYdX v4 conditional orders (#3259), thanks @nicolad
- Added dYdX v4 Python adapter layer (#3275), thanks @nicolad
- Added dYdX v4 batch cancel and expose missing Python bindings (#3282), thanks @nicolad
- Added dYdX v4 HTTP data, execution, and WebSocket tests (#3290), thanks @nicolad
- Added Kraken Futures demo support (#3262), thanks @nicolad
- Added check before creation of bars in IB adapter (#3348), thanks @PJPRoche and @faysou
- Added check for empty data in _handle_table_nautilus (#3248), thanks @faysou
- Integrated trade analytics across DeFi pools swaps and simulated quotes (#3174), thanks @filipmacek
- Implemented size for impact bps
PoolProfilersimulation (#3186), thanks @filipmacek - Implemented dual-parser architecture for DEX event parsing (#3228), thanks @filipmacek
- Implemented Bybit chunking support for batch cancel orders (#3244), thanks @sunlei
- Scaffolded blockchain execution client with native balance fetch (#3214), thanks @filipmacek
- Ported Bybit integration adapter to Rust
- Unified tokio runtime selection in Rust adapters (#3321), thanks @filipmacek
- Converted
LatencyModelto trait withStaticLatencyModelimpl (#3369), thanks @marcus-sa - Refactored network crate to modularize
http,socket, andwebsocket - Refactored reading of feather files in catalog (#3114), thanks @faysou
- Refactored processing of historical data (#3038), thanks @faysou
- Refactored execution engine reconciliation (#3185), thanks @faysou
- Refactored risk engine initialization with shallow clone for portfolio (#3360), thanks @marcus-sa
- Refactored
SpreadQuoteAggregator(#3312), thanks @faysou - Refactored Polymarket instrument provider to use async HttpClient
- Refactored Interactive Brokers
HistoricInteractiveBrokersClient(#3261), thanks @faysou - Refactored IB Historical client (#3276), thanks @faysou
- Improved trade execution matching with transient bid/ask override for
trade_execution=Truemode, ensuring limit orders fill correctly when trades occur at the limit price - Improved Stochastics indicator with additional parameters (#3296), thanks @mahmutf
- Improved
Nonehandling in equality and comparison methods - Improved
Actor.request_barsto enforce standard bar types (#3216), thanks @faysou - Improved JSON-RPC non-standard rate limit error handling (#3227), thanks @filipmacek
- Improved Betfair execution error handling and edge cases
- Improved Betfair order rejection and duplicate fills handling
- Improved Binance data client with optional authentication
- Improved Bybit spot borrow repayments (#3223), thanks @vcraciun
- Improved Databento live connection stability and reconnects
- Improved Databento decoder sentinel value handling (#3361), thanks for reporting @davidsblom
- Improved dYdX v3 resilience and reliability (#3225), thanks @SarunasSS
- Improved dYdX v4 adapter test coverage (#3212), thanks @nicolad
- Improved dYdX v4 network, bars, and batch cancel (#3231), thanks @nicolad
- Improved dYdX v4 gRPC execution with edge cases and batch cancel (#3239), thanks @nicolad
- Improved dYdX v4 data/exec testers and fix GTT (#3254), thanks @nicolad
- Improved dYdX v4 WebSocket subscription state management (#3286), thanks @nicolad
- Improved dYdX v4 enums for type safety and improve WS tests (#3294), thanks @nicolad
- Improved dYdX v4 model type safety with enums (#3299), thanks @nicolad
- Improved dYdX v4 parse block height WebSocket feed and gate short-term order submission (#3320), thanks @nicolad
- Improved Polymarket position querying using Gamma API (#3142), thanks @DeirhX
- Improved Tardis adapter robustness and error handling
- Standardized dYdX WebSocket architecture (#3173), thanks @nicolad
- Standardized dYdX client integration tests (#3193), thanks @nicolad
- Standardized dYdX per adapter guide conventions (#3267), thanks @nicolad
- Changed Interactive Brokers default quote tick subscription to batch quotes (#3196), thanks @faysou
- Changed spread quote aggregation to opt-in (#3355), thanks @faysou
- Removed redundant debug code for reconcile execution (#3344), thanks @TaiShanQ
- Refined timer name validation to accept non-ASCII characters (common for foreign currencies) (#3154), thanks for reporting @woung717
- Refined spread support (#3284), thanks @faysou
- Refined support for monthly and yearly bars (#3166), thanks @faysou
- Refined bar aggregators in Rust (#3170), thanks @faysou
- Refined adding files to catalog session (#3215), thanks @faysou
- Refined loading of files in catalog (#3313), thanks @faysou
- Refined catalog file filter methods (#3318), thanks @faysou
- Refined
HistoricInteractiveBrokersClient(#3187), thanks @faysou - Refined
BacktestDataIteratordocstrings (#3264), thanks @faysou - Refined
BacktestDataConfig.query(#3266), thanks @faysou - Refined Databento utils (#3268), thanks @faysou
- Refined Interactive Brokers historical data request methods (#3279), thanks @faysou
- Refined requests and aggregators (#3328), thanks @faysou
- Refined parsing of IB expiries (#3332), thanks @faysou
- Refined subscription to spread quotes (#3349), thanks @faysou
- Refined data query and subscription (#3353), thanks @faysou
- Refined response to join_request (#3366), thanks @faysou
- Refined adding instrument to cache after modifying it (#3372), thanks @faysou
- Optimized unnecessary string allocations and
Ustrusage - Optimized build to prefer sccache when available (#3243), thanks @sunlei
- Optimized execution reconciliation to avoid quadratic complexity (#3140), thanks @DeirhX
- Optimized network clients by enabling
TCP_NODELAY(#3156), thanks @sunlei - Optimized build by disabling Cargo incremental compilation when using sccache (#3157), thanks @sunlei
- Optimized BitMEX submit and cancel broadcasters by removing unnecessary lock on internal transport clients
- Optimized full math division for DeFi calculations (#3179), thanks @filipmacek
- Optimized parquet data filtering and streaming initialization performance (#3298), thanks @ReCodeLife
- Repaired OKX spot margin position reports for borrowing, thanks @sunlei
- Repaired Bybit docs links in comment (#3125), thanks @sunlei
- Repaired Bybit HTTP order place (#3127), thanks @sunlei
- Repaired Bybit
AccountPositionmessage parsing (#3147), thanks @sunlei - Repaired Bybit conditional order trigger semantics and type
- Repaired Bybit instruments pagination handling (#3210), thanks @sunlei
- Repaired Bybit batch place orders (#3211), thanks @sunlei
- Repaired Bybit
get_account_details(#3219), thanks @sunlei - Repaired Bybit
set_position_mode(#3220), thanks @sunlei - Upgraded implied-vol crate (#3115), thanks @faysou
- Upgraded Rust (MSRV) to 1.92.0
- Upgraded Cython to v3.2.3
- Upgraded
databentocrate to v0.37.0 - Upgraded
datafusioncrate to v51.0.0 - Upgraded
msgspecto v0.20.0 - Upgraded
pyo3crate to v0.27.2 - Upgraded
pyo3-async-runtimescrate to v0.27.0 - Upgraded
rediscrate to v1.0.2
Documentation Updates
- Added Polymarket historical data loading docs
- Added visualization docs for
bars_with_fillstearsheet feature - Added order state flow diagram with lifecycle documentation
- Added fee rate sign convention in instruments concept guide
- Added fill price determination to backtesting concept guide
- Improved concept docs with Mermaid diagrams replacing ASCII diagrams
- Improved execution concept guide with overfills explanation
- Improved backtesting concept guide to clarify bar execution behavior
- Improved documentation for uv-installed Python environments, thanks to @faysou for investigating and reporting
- Improved notebook path handling and fix quickstart data loading, thanks for reporting @semihtekten
Deprecations
None
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
ParquetDataCatalog.from_urito support Windows paths (#3283), thanks @nikitium - 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
- Added liquidity utilization rate to AMM pool profiler (#3107), thanks @filipmacek
- Added
filter_sec_typesconfig to skip unsupported IB instrument types (#3108), thanks @sunlei - Ported
PortfolioAnalyzerand all portfolio statistics to Rust - Introduced AMM Pool profiler with tickmaps and Uniswapv3 support (#3000, #3010, #3019, #3036), thanks @filipmacek
- Introduced snapshot, analytics, and PSQL schema for PoolProfiler (#3048), thanks @filipmacek
- Implemented consistency checking for AMM pool profiler with RPC state (#3030), thanks @filipmacek
- Implemented
PoolFlashevent in blockchain adapter (#3055, #3058), thanks @filipmacek - Implemented Blockchain adapter pool profiler snapshot integration (#3090), thanks @filipmacek
- Implemented BitMEX robust ping/pong handling
- Implemented Hyperliquid adapter HTTP client (#2939), thanks @nicolad
- Implemented Hyperliquid adapter scaffolding and examples (#2957), thanks @nicolad
- Implemented Hyperliquid weighted rate limiter for REST API (#2960), thanks @nicolad
- Implemented Hyperliquid L2 order book with tick-based pricing (#2967), thanks @nicolad
- Implemented Hyperliquid data client and fix dependencies (#2975), thanks @nicolad
- Implemented Hyperliquid REST API models for execution (#2983), thanks @nicolad
- Implemented Hyperliquid
InstrumentProvider/ definitions parsing (#2992), thanks @nicolad - Implemented Hyperliquid DataClient in Python (#2996), thanks @nicolad
- Implemented Hyperliquid DataClient in Rust (#2999), thanks @nicolad
- Implemented Hyperliquid ExecutionClient in Python (#3003), thanks @nicolad
- Implemented Hyperliquid ExecutionClient in Rust (#3013), thanks @nicolad
- Implemented Hyperliquid websocket tester for streaming market data (#3018), thanks @nicolad
- Implemented Hyperliquid basic market and limit orders (#3022), thanks @nicolad
- Implemented Hyperliquid conditional / advanced orders (#3035), thanks @nicolad
- Implemented Hyperliquid execution reconciliation (#3041), thanks @nicolad
- Implemented Hyperliquid execution client order submission (#3050), thanks @nicolad
- Implemented Hyperliquid LiveExecutionClientExt trait (#3075), thanks @nicolad
- Implemented Hyperliquid typed enums and optimize WebSocket lookups (#3089), thanks @nicolad
- Refactored Hyperliquid adapter to push complexity to Rust layer (#3063), thanks @nicolad
- Refactored streaming writer to support per-bar-type persistence (#3078), thanks @faysou
- Changed
Symbol,Currency, andInstrumentIdstring validation from ASCII to UTF-8, fixing Binance compatibility with Chinese symbols - Changed
PositionIdvalidation check from ASCII to UTF-8, fixing Binance compatibility with Chinese symbols (#3105), thanks @Osub - Improved clock and timer thread safety and validations
- Improved live timer lifecycle management by canceling existing timers with the same name
- Improved
ActorExecutorlifecycle and concurrency handling - Improved order book error handling, state integrity, and pprint/display
- Improved order book handling of
NoOrderSidedeltas - Improved websocket reconnection sequence protections in stream mode
- Improved socket reconnect sequence and tighten client setup and testing
- Improved socket client URL parsing
- Improved compatibility of Makefile for Windows git-bash (#3066), thanks @faysou
- Improved Blockchain adapter shutdown with cancellation token
- Improved Blockchain adapter
node_testscript (#3092), thanks @filipmacek - Improved and optimize AMM pool profiling (#3098), thanks @filipmacek
- Improved Hyperliquid adapter patterns (#2972), thanks @nicolad
- Improved BitMEX spot instruments quantity handling by scaling to correct fractional units
- Improved BitMEX REST rate limits configuration
- Improved BitMEX instrument cache error logging
- Improved Binance, Bybit, OKX, BitMEX, and Coinbase International HTTP rate limiting to enforce documented per-endpoint quotas
- Improved Binance fill handling when instrument not cached with clearer error log
- Improved dYdX v4 websocket lifecycle and add fixture-based tests (#3285), thanks @nicolad
- Improved OKX trade mode detection and fee currency parsing
- Improved OKX client connection reliability
- Improved OKX liquidation and ADL fill handling and logging
- Improved Tardis instrument requests to filter options by default
- Standardized Binance order validations with proper order denied events to avoid "hanging" orders
- Refined Renko bar aggregator and add tests (#2961), thanks @faysou
- Refined setting of flags in Makefile (#3060), thanks @faysou
- Refined Bybit balance parsing to use
Money.from_strto ensure no rounding errors - Refined Interactive Brokers execution flows (#2993), thanks @faysou
- Refined Interactive Brokers filtering of bars in IB adapter after disconnection (#3011), thanks @faysou and @Johnkhk
- Refined Interactive Brokers account summary log to debug level (#3084), thanks @sunlei
- Refined catalog
reset_data_file_namesmethod (#3071), thanks @adrianbeer and @faysou - Optimized
ExecutionEnginehot path with topic caching and reduced cache lookups - Optimized rate limiter quota keys with string interning to avoid repeated allocations
- Upgraded Rust (MSRV) to 1.90.0
- Upgraded Cython to v3.1.6
- Upgraded
databentocrate to v0.35.0 - Upgraded
datafusioncrate to v50.3.0 - Upgraded
pyo3andpyo3-async-runtimescrates to v0.26.0 - Upgraded
rediscrate to v0.32.7 - Upgraded
tokiocrate to v1.48.0 - Upgraded
uvloopto v0.22.1 (upgrades libuv to v1.49.0)
Documentation Updates
- Added quick-reference rate limit tables with links to official docs for Binance, Bybit, OKX, BitMEX, and Coinbase International
- Updated cache concept guide with purging ops
- Improved dark and light themes for readability
- Improved clarity of implemented bar aggregations
- Standardized consistent styling per docs style guide
- Fixed some broken links
Deprecations
- Deprecated
convert_quote_qty_to_base; disable (False) to maintain consistent behaviour going forwards. Automatic conversion will be removed in a future version.
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
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 @faysuo - 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 params (can be eitherpd.Timestampor Unix nanosint) - Improved handling of Tardis Machine websocket connection errors
- Improved positions report to mark snapshots (#2840), thanks @stastnypremysl
- Improved ERC20 token metadata handling and error recovery (#2847), thanks @filipmacek
- Improved Docker configuration (#2868), thanks @nicolad
- Improved security for
Credentialstruct (#2882), thanks @nicolad - Improved DeFi pool event parsing and integrate Arbitrum Camelotv3 new pools signature (#2889), thanks @filipmacek
- Improved Databento multiplier decoding to prevent precision loss (#2895), thanks @nicolad
- Improved Bybit balance precision by avoiding float conversion (#2903), thanks @scoriiu
- Improved dYdX message parsing robustness to allow unknown fields (#2911), thanks @davidsblom
- Improved Polymarket instrument provider bulk loading (#2913), thanks @DeirhX
- Improved Polymarket binary options parsing with no
endDate(#2919), thanks @DeirhX - Refined Rust catalog path handling (#2743), thanks @faysou
- Refined Rust
GreeksCalculator(#2760), thanks @faysou - Refined Databento bars timestamp decoding and backtest execution usage (#2800), thanks @faysou
- Refined allowed queries for bars from
BacktestDataConfig(#2838), thanks @faysou - Refined
FillModel(#2795), thanks @faysou and @stefansimik - Refined request of instruments (#2822), thanks @faysou
- Refined
subscribe_barsin IB adapter (#2852), thanks @faysou - Refined
get_start_timeinTimeBarAggregator(#2866), thanks @faysou - Refined option spread execution (#2859), thanks @faysou
- Refined
subscribe_historical_barsin IB adapter (#2870), thanks @faysou - Relaxed conditions on
startandendof instrument requests in adapters (#2867), thanks @faysou - Updated
request_aggregated_barsexample (#2815), thanks @faysou - Updated PostgreSQL connection parameters to use 'nautilus' user (#2805), thanks @stastnypremysl
- Upgraded Rust (MSRV) to 1.89.0
- Upgraded Cython to v3.1.3
- Upgraded
web3for Polymarket allowances script (#2814), thanks @DeirhX - Upgraded
databentocrate to v0.33.1 - Upgraded
datafusioncrate to v49.0.1 - Upgraded
rediscrate to v0.32.5 - Upgraded
tokiocrate to v1.47.1
Fixes
- Fixed Rust-Python reference cycles by replacing
Arc<PyObject>with plainPyObjectin callback-holding structs, eliminating memory leaks - Fixed
TimeEventHandlermemory leaks with Python callback references in FFI layer - Fixed
PyCapsulememory leaks by adding destructors to enable proper Rust value cleanup - Fixed multiple circular-dependency memory leaks for network and bar Python callbacks using new
SharedCell/WeakCellhelpers - Fixed precision preservation for value types (
Price,Quantity,Money) - Fixed incorrect raw price type for matching engine in high-precision mode that could overflow during trades processing (#2810), thanks for reporting @Frzgunr1 and @happysammy
- Fixed incorrect currency used for cash account SELL orders pre-trade risk check
- Fixed accounting for locked balance with multiple currencies (#2918), thanks @GhostLee
- Fixed portfolio realized PnL for NETTING OMS position snapshot cycles (#2856), thanks for reporting @idobz and analysis @paulbir
- Fixed decoding zero-sized trades for Databento MBO data
- Fixed purging of contingent orders where open linked orders would still be purged
- Fixed backtest bracket order quantity independence, preventing child orders from incorrectly syncing to net position size
- Fixed Tardis Machine replay processing and Parquet file writing
- Fixed Tardis exchange-venue mapping for Kraken Futures (should map to
cryptofacilities) - Fixed Tardis CSV loader for book snapshots with interleaved bid/ask columns
- Fixed Polymarket reconciliation for signature type 2 trades where wallet address differs from funder address
- Fixed catalog query of multiple instruments of same type (#2772), thanks @faysou
- Fixed modification of contingent orders in backtest (#2761), thanks faysou
- Fixed balance calculations on order fill to allow operating at near account balance capacity (#2752), thanks @petioptrv
- Fixed cash account locked balance calculations for sell orders (#2906), thanks for reporting @GhostLee
- Fixed time range end in some databento request functions (#2755), thanks @faysou
- Fixed
skip_first_non_full_bartolerance for near-boundary starts (#2605), thanks for reporting @stastnypremysl - Fixed EOD bar for Interactive Brokers (#2764), thanks @faysou
- Fixed dYdX Take Profit order type mapping error (#2758), thanks @nicolad
- Fixed dYdX logging typo (#2790), thanks @DeirhX
- Fixed dYdX order and fill message schemas (#2824), thanks @davidsblom
- Fixed dYdX message schemas (#2910), thanks @davidsblom
- Fixed Binance Spot testnet streaming URL, thanks for reporting @Frzgunr1
- Fixed Binance US trading fee endpoint URL (#2914), thanks for reporting @bmlquant
- Fixed Binance Ed25519 key handling
- Fixed Bybit execution fee handling where the
execFeefield was not used when available as well as incorrect fee currency - Fixed Bybit instrument provider fee rate handling during parsing
- Fixed Bybit SPOT commission currency for makers
- Fixed Bybit positions pagination to handle more than 20 positions (#2879), thanks @scoriiu
- Fixed Bybit REST model parsing balance precision errors for high-value tokens (#2898), thanks @scoriiu
- Fixed Bybit WebSocket message parsing balance precision errors for high-value tokens (#2904), thanks @scoriiu
- Fixed OKX bars request pagination logic (#2798, #2825), thanks @nicolad
- Fixed RPC client content type header (#2828), thanks @filipmacek
- Fixed
venue_order_idhandling for Polymarket order status request (#2848), thanks @DeirhX - Fixed race-condition on node shutdown in async
InteractiveBrokersDataClient._disconnect()(#2865), thanks @ruvr - Fixed
AttributeErrorwhen loading cachedIBContractobjects (#2862), thanks @ruvr - Fixed
PolymarketUserTrade.bucket_indexfield type that changed fromstrtoint(#2872), thanks for reporting @thefabus - Fixed Polymarket websocket 500 tokens per connection limitation (#2915), thanks @odobias and @DeirhX
- Fixed Interactive Brokers
submit_order_listrejection (#2892), thanks @faysou - Fixed Interactive Brokers bars query for indices (#2921), thanks @ms32035
- Fixed missing
funding_ratesfor Cache Debug impl (#2894), thanks @MK27MK - Fixed missing
log_component_levelsfor PyO3 logging initialization - Fixed catalog consolidation name clash for an overlapping edge case (#2933), thanks @ms32035
- Fixed historical data request race condition in DataEngine (#2946), thanks @lisiyuan656
- Fixed catalog metadata retention on deduplication (#2943), thanks @ms32035
Documentation Updates
- Added Positions concept guide
- Added Reports concept guide
- Added FFI Memory Contract developer guide
- Added Windows signal handling guidance
- Added mixed debugging instructions and example (#2806), thanks @faysou
- Improved dYdX integration guide (#2751), thanks @nicolad
- Updated IB documentation for option spreads (#2839), thanks @faysou
- Moved rust-python debugging documentation to
testing.md(#2928), thanks @faysou
Deprecations
None
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
- Changed timer
allow_past=Falsebehavior: now validates thenext_event_timeinstead of thestart_time. This allows timers with past start times as long as their next scheduled event is still in the future - Changed behavior of timers
allow_past=Falseto permit start times in the past if the next event time is still in the future - Changed Databento DBN upgrade policy to default v3
- Removed
basename_templatefromParquetDataCatalog.write_data(...), runcatalog.reset_all_file_names()to update file names to the new convention - 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 unexpected exceptions result in an immediate hard 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
Released on 31st May 2025 (UTC).
Enhancements
- Added convenient re-exports for Betfair adapter (constants, configs, factories, types)
- Added convenient re-exports for Binance adapter (constants, configs, factories, loaders, types)
- Added convenient re-exports for Bybit adapter (constants, configs, factories, loaders, types)
- Added convenient re-exports for Coinbase International adapter (constants, configs, factories)
- Added convenient re-exports for Databento adapter (constants, configs, factories, loaders, types)
- Added convenient re-exports for dYdX adapter (constants, configs, factories)
- Added convenient re-exports for Polymarket adapter (constants, configs, factories)
- Added convenient 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 Binances mark price stream across all markets (#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
datafusioncrate to v48.0.2 - 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 Databento instrument definitions v1 data, v2 & v3 continue to be supported and v1 data can be migrated (see Databento documentation)
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
NautilusTrader 1.216.0 Beta
Released on 13th April 2025 (UTC).
This release adds support for Python 3.13 (not yet compatible with free-threading), and introduces support for Linux on ARM64 architecture.
Enhancements
- Added
allow_pastboolean flag forClock.set_timer(...)to control behavior with start times in the past (defaultTrueto allow start times in the past) - Added
allow_pastboolean flag forClock.set_time_alert(...)to control behavior with alert times in the past (defaultTrueto fire immediate alert) - Added risk engine check for GTD order expire time, which will deny if expire time is already in the past
- Added instrument updating for exchange and matching engine
- Added additional price and quantity precision validations for matching engine
- Added log file rotation with additional config options
max_file_sizeandmax_backup_count(#2468), thanks @xingyanan and @twitu - Added
bars_timestamp_on_closeconfig option forBybitDataClientConfig(defaultTrueto match Nautilus conventions) - Added
BetfairSequenceCompletedcustom data type for Betfair to mark the completion of a sequence of messages - Added Arrow schema for
MarkPriceUpdatein Rust - Added Arrow schema for
IndexPriceUpdatein Rust - Added Arrow schema for
InstrumentClosein Rust - Added
BookLevel.sideproperty - Added
Position.closing_order_side()instance method - Improved robustness of in-flight order check for
LiveExecutionEngine, once exceeded query retries will resolve submitted orders as rejected and pending orders as canceled - Improved logging for
BacktestNodecrashes with full stack trace and prettier config logging
Breaking Changes
- Changed external bar requests
ts_eventtimestamping from on open to on close for Bybit
Internal Improvements
- Added handling and warning for Betfair zero-sized fills
- Improved WebSocket error handling for dYdX (#2499), thanks @davidsblom
- Ported
GreeksCalculatorto Rust (#2493, #2496), thanks @faysou - Upgraded Cython to v3.1.0b1
- Upgraded
rediscrate to v0.29.5 - Upgraded
tokiocrate to v1.44.2
Fixes
- Fixed setting component clocks to backtest start time
- Fixed overflow error in trailing stop calculations
- Fixed missing
SymbolFilterTypeenum member for Binance (#2495), thanks @sunlei - Fixed
ts_eventfor Bybit bars (#2502), thanks @davidsblom - Fixed position ID handling for Binance Futures in hedging mode with execution algorithm order (#2504), thanks for reporting @Oxygen923
Documentation Updates
- Removed obsolete bar limitations in portfolio docs (#2501), thanks @stefansimik
Deprecations
None
NautilusTrader 1.215.0 Beta
Released on 5th April 2025 (UTC).
Enhancements
- Added
Cache.purge_closed_order(...) - Added
Cache.purge_closed_orders(...) - Added
Cache.purge_closed_position(...) - Added
Cache.purge_closed_positions(...) - Added
Cache.purge_account_events(...) - Added
Account.purge_account_events(...) - Added
purge_closed_orders_interval_minsconfig option forLiveExecEngineConfig - Added
purge_closed_orders_buffer_minsconfig option forLiveExecEngineConfig - Added
purge_closed_positions_interval_minsconfig option forLiveExecEngineConfig - Added
purge_closed_positions_buffer_minsconfig option forLiveExecEngineConfig - Added
purge_account_events_interval_minsconfig option forLiveExecEngineConfig - Added
purge_account_events_lookback_minsconfig option forLiveExecEngineConfig - Added
Order.ts_closedproperty - Added
instrument_idsandbar_typesforBacktestDataConfigto improve catalog query efficiency (#2478), thanks @faysou - Added
venue_dataset_mapconfig option forDatabentoDataConfigto override the default dataset used for a venue (#2483, #2485), thanks @faysou
Breaking Changes
None
Internal Improvements
- Added
Position.purge_events_for_order(...)for purgingOrderFilledevents andTradeIds associated with a client order ID - Added
ConsumerforWebSocketClient(#2488), thanks @twitu - Improved instrument parsing for Tardis with consistent
effectivetimestamp filtering, settlement currency, increments and fees changes - Improved error logging for Betfair
update_account_statetask by logging the full stack trace on error - Improved logging for Redis cache database operations
- Standardized unexpected exception logging to include full stack trace
- Refined type handling for backtest configs
- Refined databento venue dataset mapping and configuration (#2483), thanks @faysou
- Refined usage of databento
use_exchange_as_venue(#2487), thanks @faysou - Refined time initialization of components in backtest (#2490), thanks @faysou
- Upgraded Rust (MSRV) to 1.86.0
- Upgraded
pyo3crate to v0.24.1
Fixes
- Fixed MBO feed handling for Databento where an initial snapshot was decoding a trade tick with zero size (#2476), thanks for reporting @JackWCollins
- Fixed position state snapshots for closed positions where these snapshots were being incorrectly filtered
- Fixed handling of
PolymarketTickSizeChangedmessage - Fixed parsing spot instruments for Tardis where
size_incrementwas zero, now inferred from base currency - Fixed default log colors for Rust (#2489), thanks @filipmacek
- Fixed sccache key for uv in CI (#2482), thanks @davidsblom
Documentation Updates
- Clarified partial fills in backtesting concept guide (#2481), thanks @stefansimik
Deprecations
- Deprecated strategies written in Cython and removed
ema_cross_cythonstrategy example
NautilusTrader 1.214.0 Beta
Released on 28th March 2025 (UTC).
Enhancements
- Added Coinbase International Exchange initial integration adapter
- Added
time_in_forceparameter forStrategy.close_position(...) - Added
time_in_forceparameter forStrategy.close_all_positions(...) - Added
MarkPriceUpdatedata type - Added
IndexPriceUpdatedata type - Added
Actor.subscribe_mark_prices(...) - Added
Actor.subscribe_index_prices(...) - Added
Actor.unsubscribe_mark_prices(...) - Added
Actor.unsubscribe_index_prices(...) - Added
Actor.on_mark_price(...) - Added
Actor.on_index_price(...) - Added
Cache.mark_price(...) - Added
Cache.index_price(...) - Added
Cache.mark_prices(...) - Added
Cache.index_prices(...) - Added
Cache.mark_price_count(...) - Added
Cache.index_price_count(...) - Added
Cache.has_mark_prices(...) - Added
Cache.has_index_prices(...) - Added
UnixNanos.to_rfc3339()for ISO 8601 (RFC 3339) strings - Added
recv_window_msconfig for Bybit WebSocket order client (#2466), thanks @sunlei - Enhanced
UnixNanosstring parsing to support YYYY-MM-DD date format (interpreted as midnight UTC)
Breaking Changes
- Changed
Cache.add_mark_price(self, InstrumentId instrument_id, Price price)toadd_mark_price(self, MarkPriceUpdate mark_price)
Internal Improvements
- Improved
WebSocketClientandSocketClientdesign with dedicated writer task and message channel - Completed global message bus design in Rust (#2460), thanks @filipmacek
- Refactored enum dispatch (#2461), thanks @filipmacek
- Refactored data interfaces to messages in Rust
- Refined catalog file operations in Rust (#2454), thanks @faysou
- Refined quote ticks and klines for Bybit (#2465), thanks @davidsblom
- Standardized use of
anyhow::bail(#2459), thanks @faysou - Ported
add_venueforBacktestEnginein Rust (#2457), thanks @filipmacek - Ported
add_instrumentforBacktestEnginein Rust (#2469), thanks @filipmacek - Upgraded
rediscrate to v0.29.2
Fixes
- Fixed race condition on multiple reconnect attempts for
WebSocketClientandSocketClient - Fixed position state snapshot
ts_snapshotvalue, which was alwaysts_lastinstead of timestamp when the snapshot was taken - Fixed instrument parsing for Tardis, now correctly applies changes and filters by
effective - Fixed
OrderStatusReportfor conditional orders of dYdX (#2467), thanks @davidsblom - Fixed submitting stop market orders for dYdX (#2471), thanks @davidsblom
- Fixed retrying HTTP calls on
DecodeErrorfor dYdX (#2472), thanks @davidsblom - Fixed
LIMIT_IF_TOUCHEDorder type enum parsing for Bybit - Fixed
MARKETorder type enum parsing for Bybit - Fixed quote ticks for Polymarket to only emit new quote ticks when the top-of-book changes
- Fixed error on cancel order for IB (#2475), thanks @FGU1
Documentation Updates
- Improved custom data documentation (#2470), thanks @faysou
Deprecations
None
NautilusTrader 1.213.0 Beta
Released on 16th March 2025 (UTC).
Enhancements
- Added
CryptoOptioninstrument, supporting inverse and fractional sizes - Added
Cache.prices(...)to return a map of latest price per instrument for a price type - Added
use_uuid_client_order_idsconfig option forStrategyConfig - Added catalog consolidation functions of several parquet files into one (#2421), thanks @faysou
- Added FDUSD (First Digital USD) crypto
Currencyconstant - Added initial leverage,
margin_modeandposition_modeconfig options for Bybit (#2441), thanks @sunlei - Updated parquet catalog in Rust with recent features (#2442), thanks @faysou
Breaking Changes
None
Internal Improvements
- Added
timeout_secsparameter toHttpClientfor default timeouts - Added additional precision validations for
OrderMatchingEngine - Added symmetric comparison impls between
u64andUnixNanos - Improved
InstrumentProvidererror handling when loading (#2444), thanks @davidsblom - Improved order denied reason message for balance impact
- Handle BybitErrors when updating instruments for ByBit (#2437), thanks @davidsblom
- Handle unexpected errors when fetching order books for dYdX (#2445), thanks @davidsblom
- Retry if HttpError is raised for dYdX (#2438), thanks @davidsblom
- Refactored some Rust logs to use named parameters in format strings (#2443), thanks @faysou
- Some minor performance optimizations for Bybit and dYdX adapters (#2448), thanks @sunlei
- Ported backtest engine and kernel to Rust (#2449), thanks @filipmacek
- Upgraded
pyo3andpyo3-async-runtimescrates to v0.24.0 - Upgraded
tokiocrate to v1.44.1
Fixes
- Fixed source distribution (sdist) packaging
- Fixed
Clock.timer_names()memory issue resulting in an empty list - Fixed underflow panic when setting a time alert in the past (#2446), thanks for reporting @uxbux
- Fixed logger name for
Strategycustomstrategy_ids - Fixed unbound variable for Bybit (#2433), thanks @davidsblom
Documentation Updates
- Clarify docs for timestamp properties in
Data(#2450), thanks @stefansimik - Updated environment setup document (#2452), thanks @faysou
Deprecations
None
NautilusTrader 1.212.0 Beta
Released on 11th March 2025 (UTC).
This release introduces uv as the Python project and dependency management tool.
Enhancements
- Added
OwnOrderBookandOwnBookOrderto track own orders and prevent self-trades in market making - Added
manage_own_order_booksconfig option forExecEngineConfigto enable own order tracking - Added
Cache.own_order_book(...),Cache.own_bid_orders(...)andCache.own_ask_orders(...)for own order tracking - Added optional beta weighting and percent option greeks (#2317), thanks @faysou
- Added pnl information to greeks data (#2378), thanks @faysou
- Added precision inference for
TardisCSVDataLoader, whereprice_precisionandsize_precisionare now optional - Added
Order.ts_acceptedproperty - Added
Order.ts_submittedproperty - Added
UnixNanos::to_datetime_utc()in Rust - Added
Markvariant forPriceTypeenum - Added mark price handling for
Cache - Added mark exchange rate handling for
Cache - Added
PortfolioConfigfor configuration settings specific to thePortfolio - Added
use_mark_prices,use_mark_xratesandconvert_to_account_base_currencyoptions forPortfolioConfig - Added mark price calculations and xrate handling for
Portfolio - Added Rust debugging support and refined cargo nextest usage (#2335, #2339), thanks @faysou
- Added catalog write mode options (#2365), thanks @faysou
- Added
BarSpecificationto msgspec encoding and decoding hooks (#2373), thanks @pierianeagle - Added
ignore_external_ordersconfig option forBetfairExecClientConfig, defaultFalseto retain current behavior - Added requests for order book snapshots with HTTP for dYdX (#2393), thanks @davidsblom
Breaking Changes
- Removed talib subpackage (see deprecations for v1.211.0)
- Removed internal
ExchangeRateCalculator, replaced withget_exchange_rate(...)function implemented in Rust - Replaced
ForexSessionenum with equivalent from PyO3 - Replaced
ForexSessionFilterwith equivalent functions from PyO3 - Renamed
InterestRateDatatoYieldCurveData - Renamed
Cache.add_interest_rate_curvetoadd_yield_curve - Renamed
Cache.interest_rate_curvetoyield_curve - Renamed
OrderBook.counttoupdate_countfor clarity - Moved
ExecEngineConfig.portfolio_bar_updatesconfig option toPortfolioConfig.bar_updates
Internal Improvements
- Added initial
Cachebenchmarking for orders (#2341), thanks @filipmacek - Added support for
CARGO_BUILD_TARGETenvironment variable inbuild.py(#2385), thanks @sunlei - Added test for time-bar aggregation (#2391), thanks @stefansimik and @faysou
- Implemented actor framework and message bus v3 (#2402), thanks @twitu
- Implemented latency modeling for SimulatedExchange in Rust (#2423), thanks @filipmacek
- Implemented exchange rate calculations in Rust
- Improved handling of
oms_typeforStrategyConfigwhich now correctly handles theOmsTypeenum - Improved Binance websocket connections management to allow more than 200 streams (#2369), thanks @lidarbtc
- Improved log event timestamping to avoid clock or time misalignments when events cross to the logging thread
- Improved error logging for live engines to now include stacktrace for easier debugging
- Improved logging initialization error handling to avoid panicking in Rust
- Improved Redis cache database queries, serialization, error handling and connection management (#2295, #2308, #2318), thanks @Pushkarm029
- Improved validation for
OrderListto check all orders are for the same instrument ID - Improved
Controllerfunctionality with ability to create actors and strategies from configs (#2322), thanks @faysou - Improved
Controllercreation for more streamlined trader registration, and separate clock for timer namespacing (#2357), thanks @faysou - Improved build by adding placeholders to avoid unnecessary rebuilds (#2336), thanks @bartolootrit
- Improved consistency of
OrderMatchingEnginebetween Cython and Rust and fix issues (#2350), thanks @filipmacek - Removed obsolete reconnect guard for dYdX (#2334), thanks @davidsblom
- Refactored data request interfaces into messages (#2260), thanks @faysou
- Refactored data subscribe interfaces into messages (#2280), thanks @faysou
- Refactored reconciliation interface into messages (#2375), thanks @faysou
- Refactored
_handle_query_groupto work withupdate_catalog(#2412), thanks @faysou - Refactored execution message handling in Rust (#2291), thanks @filipmacek
- Refactored repetitive code in backtest examples (#2387, #2395), thanks @stefansimik
- Refined yield curve data (#2300), thanks @faysou
- Refined bar aggregators in Rust (#2311), thanks @faysou
- Refined greeks computation (#2312), thanks @faysou
- Refined underlying filtering in portfolio_greeks (#2382), thanks @faysou
- Refined
request_instrumentsgranularity for Databento (#2347), thanks @faysou - Refined Rust date functions (#2356), thanks @faysou
- Refined parsing of IB symbols (#2388), thanks @faysou
- Refined
base_templatebehaviour in parquet write_data (#2389), thanks @faysou - Refined mixed catalog client requests (#2405), thanks @faysou
- Refined update catalog docstring (#2411), thanks @faysou
- Refined to use
next_backinstead oflastfor identifier tag functions (#2414), thanks @twitu - Refined and optimized
OrderBookin Rust - Cleaned up PyO3 migration artifacts (#2326), thanks @twitu
- Ported
StreamingFeatherWriterto Rust (#2292), thanks @twitu - Ported
update_limit_orderforOrderMatchingEnginein Rust (#2301), thanks @filipmacek - Ported
update_stop_market_orderforOrderMatchingEnginein Rust (#2310), thanks @filipmacek - Ported
update_stop_limit_orderforOrderMatchingEnginein Rust (#2314), thanks @filipmacek - Ported market-if-touched order handling for
OrderMatchingEnginein Rust (#2329), thanks @filipmacek - Ported limit-if-touched order handling for
OrderMatchingEnginein Rust (#2333), thanks @filipmacek - Ported market-to-limit order handling for
OrderMatchingEnginein Rust (#2354), thanks @filipmacek - Ported trailing stop order handling for
OrderMatchingEnginein Rust (#2366, #2376), thanks @filipmacek - Ported contingent orders handling for
OrderMatchingEnginein Rust (#2404), thanks @filipmacek - Updated Databento
publishers.jsonmappings file(s) - Upgraded
nautilus-ibapito 10.30.1 with necessary changes for Interactive Brokers (#2420), thanks @FGU1 - Upgraded Rust to 1.85.0 and 2024 edition
- Upgraded
arrowandparquetcrates to v54.2.1 - Upgraded
databentocrate to v0.20.0 (upgrades thedbncrate to v0.28.0) - Upgraded
datafusioncrate to v46.0.0 - Upgraded
pyo3crate to v0.23.5 - Upgraded
tokiocrate to v1.44.0
Fixes
- Fixed large difference between
Dataenum variants (#2315), thanks @twitu - Fixed
startandendrange filtering forTardisHttpClientto use API query params - Fixed built-in data type Arrow schemas for
StreamingFeatherWriter, thanks for reporting @netomenoci - Fixed memory allocation performance issue for
TardisCSVDataLoader - Fixed
effectivetimestamp filtering forTardisHttpClientto now only retain latest version at or beforeeffective - Fixed contract
activationfor Binance Futures, now based on theonboardDatefield - Fixed hardcoded signature type for
PolymarketExecutionClient - Fixed unsubscribing from quotes for dYdX (#2331), thanks @davidsblom
- Fixed docstrings for dYdX factories (#2415), thanks @davidsblom
- Fixed incorrect type annotations in
_request_instrumentsignature (#2332), thanks @faysou - Fixed composite bars subscription (#2337), thanks @faysou
- Fixed sub command issue in some adapters (#2343), thanks @faysou
- Fixed
bypass_loggingfixture to keep log guard alive for entire test session - Fixed time parsing for IB adapter (#2360), thanks @faysou
- Fixed bad
ts_initvalue in IB weekly and monthly bar (#2355), thanks @Endura2024 - Fixed bar timestamps for IB (#2380), thanks @Endura2024
- Fixed backtest example load bars from custom CSV (#2383), thanks @hanksuper
- Fixed subscribe composite bars (#2390), thanks @faysou
- Fixed invalid link in IB docs (#2401), thanks @stefansimik
- Fixed cache index loading to ensure persisted data remains available after startup, thanks for reporting @Saransh-28
- Fixed bars pagination, ordering and limit for Bybit
- Fixed
update_baraggregation function to guarantee high and low price invariants (#2430), thanks @hjander and @faysou
Documentation Updates
- Added documentation for messaging styles (#2410), thanks @stefansimik
- Added backtest clock and timers example (#2327), thanks @stefansimik
- Added backtest bar aggregation example (#2340), thanks @stefansimik
- Added backtest portfolio example (#2362), thanks @stefansimik
- Added backtest cache example (#2370), thanks @stefansimik
- Added backtest cascaded indicators example (#2398), thanks @stefansimik
- Added backtest custom event with msgbus example (#2400), thanks @stefansimik
- Added backtest messaging with msgbus example (#2406), thanks @stefansimik
- Added backtest messaging with actor & data example (#2407), thanks @stefansimik
- Added backtest messaging with actor & signal example (#2408), thanks @stefansimik
- Added indicators example (#2396), thanks @stefansimik
- Added documentation for debugging with Rust (#2325), thanks @faysou
- Added MRE strategy example (#2352), thanks @stefansimik
- Added data catalog example (#2353), thanks @stefansimik
- Improved and expandd bar aggregation docs (#2384), thanks @stefansimik
- Improved
emulation_triggerparameter description in docstrings (#2313), thanks @stefansimik - Improved docs for emulated orders (#2316), thanks @stefansimik
- Improved getting started doc for backtesting API levels (#2324), thanks @faysou
- Improved FSM example explanations for beginners (#2351), thanks @stefansimik
- Refined option greeks docstrings (#2320), thanks @faysou
- Refined adapters concept documentation (#2358), thanks @faysou
- Fixed typo in docs/concepts/actors.md (#2422), thanks @lsamaciel
- Fixed singular noun in docs/concepts/instruments.md (#2424), thanks @lsamaciel
- Fixed typo in docs/concepts/data.md (#2426), thanks @lsamaciel
- Fixed Limit-If-Touched example in docs/concepts/orders.md (#2429), thanks @lsamaciel
Deprecations
None
NautilusTrader 1.211.0 Beta
Released on 9th February 2025 (UTC).
This release introduces high-precision mode,
where value types such as Price, Quantity and Money are now backed by 128-bit integers (instead of 64-bit),
thereby increasing maximum precision to 16, and vastly expanding the allowable value ranges.
This will address precision and value range issues experienced by some crypto users, alleviate higher timeframe bar volume limitations, as well as future proofing the platform.
See the RFC for more details. For an explanation on compiling with or without high-precision mode, see the precision-mode section of the installation guide.
For migrating data catalogs due to the breaking changes, see the data migrations guide.
This release will be the final version that uses Poetry for package and dependency management.
Enhancements
- Added
high-precisionmode for 128-bit integer backed value types (#2072), thanks @twitu - Added instrument definitions range requests for
TardisHttpClientwith optionalstartandendfilter parameters - Added
quote_currency,base_currency,instrument_type,contract_type,active,startandendfilters forTardisInstrumentProvider - Added
log_commandsconfig option forActorConfig,StrategyConfig,ExecAlgorithmConfigfor more efficient log filtering - Added additional limit parameters for
BettingInstrumentconstructor - Added
venue_position_idparameter forOrderStatusReport - Added bars update support for
PortfolioPnLs (#2239), thanks @faysou - Added optional
paramsforStrategyorder management methods (symmetry withActordata methods) (#2251), thanks @faysou - Added heartbeats for Betfair clients to keep streams alive (more robust when initial subscription delays)
- Added
timeout_shutdownconfig option forNautilusKernelConfig - Added IOC time in force mapping for Betfair orders
- Added
min_market_start_timeandmax_market_start_timetime range filtering forBetfairInstrumentProviderConfig - Added
default_min_notionalconfig option forBetfairInstrumentProviderConfig - Added
stream_conflate_msconfig option forBetfairDataClientConfig - Added
recv_window_msconfig option forBybitDataClientConfigandBybitExecClientConfig - Added
open_check_open_onlyconfig option forLiveExecEngineConfig - Added
BetSideenum (to supportBetandBetPosition) - Added
BetandBetPositionfor betting market risk and PnL calculations - Added
total_pnlandtotal_pnlsmethods forPortfolio - Added optional
priceparameter forPortfoliounrealized PnL and net exposure methods
Breaking Changes
- Renamed
OptionsContractinstrument toOptionContractfor more technically correct terminology (singular) - Renamed
OptionsSpreadinstrument toOptionSpreadfor more technically correct terminology (singular) - Renamed
options_contractmodules tooption_contract(see above) - Renamed
options_spreadmodules tooption_spread(see above) - Renamed
InstrumentClass.FUTURE_SPREADtoInstrumentClass.FUTURES_SPREADfor more technically correct terminology - Renamed
event_loggingconfig option tolog_events - Renamed
BetfairExecClientConfig.request_account_state_periodtorequest_account_state_secs - Moved SQL schema directory to
schemas/sql(reinstall the Nautilus CLI withmake install-cli) - Changed
OrderBookDeltaArrow schema to useFixedSizeBinaryfields to support the new precision modes - Changed
OrderBookDepth10Arrow schema to useFixedSizeBinaryfields to support the new precision modes - Changed
QuoteTickArrow schema to useFixedSizeBinaryfields to support the new precision modes - Changed
TradeTickArrow schema to useFixedSizeBinaryfields to support the new precision modes - Changed
BarArrow schema to useFixedSizeBinaryfields to support the new precision modes - Changed
BettingInstrumentdefaultmin_notionaltoNone - Changed meaning of
ws_connection_delay_secsfor PolymarketDataClientConfig to be non-initial delay (#2271), thanks @ryantam626 - Changed
GATEIOTardis venue toGATE_IOfor consistency withCRYPTO_COMandBLOCKCHAIN_COM - Removed
max_ws_reconnection_triesfor dYdX configs (no longer applicable with infinite retries and exponential backoff) - Removed
max_ws_reconnection_triesfor Bybit configs (no longer applicable with infinite retries and exponential backoff) - Removed remaining
max_ws_reconnection_triesfor Bybit configs (#2290), thanks @sunlei
Internal Improvements
- Added
ThrottledEnqueuerfor more efficient and robust live engines queue management and logging - Added
OrderBookDeltaTestBuilderin Rust to improve testing (#2234), thanks @filipmacek - Added custom certificate loading for
SocketClientTLS - Added
check_nonempty_stringfor string validation in Rust - Improved Polymarket WebSocket subscription handling by configurable delay (#2271), thanks @ryantam626
- Improved
WebSocketClientwith state management, error handling, timeouts and robust reconnects with exponential backoff - Improved
SocketClientwith state management, error handling, timeouts and robust reconnects with exponential backoff - Improved
TradingNodeshutdown when running withasyncio.run()(more orderly handling of event loop) - Improved
NautilusKernelpending tasks cancellation on shutdown - Improved
TardisHttpClientrequests and error handling - Improved log file writer to strip ANSI escape codes and unprintable chars
- Improved
cleanmake target behavior and addeddistcleanmake target (#2286), @demonkoryu - Refined
Currencynameto accept non-ASCII characters (common for foreign currencies) - Refactored CI with composite actions (#2242), thanks @sunlei
- Refactored Option Greeks feature (#2266), thanks @faysou
- Changed validation to allow zero commission for
PerContractFeeModel(#2282), thanks @stefansimik - Changed to use
moldas the linker in CI (#2254), thanks @sunlei - Ported market order processing for
OrderMatchingEnginein Rust (#2202), thanks @filipmacek - Ported limit order processing for
OrderMatchingEnginein Rust (#2212), thanks @filipmacek - Ported stop limit order processing for
OrderMatchingEnginein Rust (#2225), thanks @filipmacek - Ported
CancelOrderprocessing forOrderMatchingEnginein Rust (#2231), thanks @filipmacek - Ported
CancelAllOrdersprocessing forOrderMatchingEnginein Rust (#2253), thanks @filipmacek - Ported
BatchCancelOrdersprocessing forOrderMatchingEnginein Rust (#2256), thanks @filipmacek - Ported expire order processing for
OrderMatchingEnginein Rust (#2259), thanks @filipmacek - Ported modify order processing for
OrderMatchingEnginein Rust (#2261), thanks @filipmacek - Ported generate fresh account state for
SimulatedExchangein Rust (#2272), thanks @filipmacek - Ported adjust account for SimulatedExchange in Rust (#2273), thanks @filipmacek
- Continued porting
RiskEngineto Rust (#2210), thanks @Pushkarm029 - Continued porting
ExecutionEngineto Rust (#2214), thanks @Pushkarm029 - Continued porting
OrderEmulatorto Rust (#2219, #2226), thanks @Pushkarm029 - Moved
modelcrate stubs into defaults (#2235), thanks @fhill2 - Upgraded
pyo3crate to v0.23.4 - Upgraded
pyo3-async-runtimescrate to v0.23.0
Fixes
- Fixed
LiveTimerimmediate fire when start time zero (#2270), thanks for reporting @bartolootrit - Fixed order book action parsing for Tardis (ensures zero sizes in snapshots work with the tighter validation for
actionvssize) - Fixed PnL calculations for betting instruments in
Portfolio - Fixed net exposure for betting instruments in
Portfolio - Fixed backtest start and end time validation assertion (#2203), thanks @davidsblom
- Fixed
CustomDataimport inDataEngine(#2207), thanks @graceyangfan and @faysou - Fixed databento helper function (#2208), thanks @faysou
- Fixed live reconciliation of generated order fills to use the
venue_position_id(when provided), thanks for reporting @sdk451 - Fixed
InstrumentProviderinitialization behavior whenreloadflagTrue, thanks @ryantam626 - Fixed handling of Binance HTTP error messages (not always JSON-parsable, leading to
msgspec.DecodeError) - Fixed
CARGO_TARGET_DIRenvironment variable for build script (#2228), thanks @sunlei - Fixed typo in
delta.rsdoc comment (#2230), thanks @eltociear - Fixed memory leak in network PyO3 layer caused by the
gil-refsfeature (#2229), thanks for reporting @davidsblom - Fixed reconnect handling for Betfair (#2232, #2288, #2289), thanks @limx0
- Fixed
instrument.idnull dereferences in error logs (#2237), thanks for reporting @ryantam626 - Fixed schema for listing markets of dYdX (#2240), thanks @davidsblom
- Fixed realized pnl calculation in
Portfoliowhere flat positions were not included in cumulative sum (#2243), thanks @faysou - Fixed update order in
Cachefor Rust (#2248), thanks @filipmacek - Fixed websocket schema for market updates of dYdX (#2258), thanks @davidsblom
- Fixed handling of empty book messages for Tardis (resulted in
deltascannot be empty panicking) - Fixed
Cache.bar_typesaggregation_sourcefiltering, was incorrectly usingprice_type(#2269), thanks @faysou - Fixed missing
comboinstrument type for Tardis integration - Fixed quote tick processing from bars in
OrderMatchingEngineresulting in sizes below the minimum increment (#2275), thanks for reporting @miller-moore - Fixed initialization of
BinanceErrorCodes requiringint - Fixed resolution of Tardis
BINANCE_DELIVERYvenue for COIN-margined contracts - Fixed hang in rate limiter (#2285), thanks @WyldeCat
- Fixed typo in
InstrumentProviderConfigdocstring (#2284), thanks @ikeepo - Fixed handling of
tick_size_changemessage for Polymarket
Documentation Updates
- Added Databento overview tutorial (#2233, #2252), thanks @stefansimik
- Added docs for Actor (#2233), thanks @stefansimik
- Added docs for Portfolio limitations with bar data (#2233), thanks @stefansimik
- Added docs overview for example locations in repository (#2287), thanks @stefansimik
- Improved docstrings for Actor subscription and request methods
- Refined
streamingparameter description (#2293), thanks @faysou and @stefansimik
Deprecations
NautilusTrader 1.210.0 Beta
Released on 10th January 2025 (UTC).
Enhancements
- Added
PerContractFeeModel, thanks @stefansimik - Added
DYDXInternalErrorandDYDXOraclaPricedata types for dYdX (#2155), thanks @davidsblom - Added proper
OrderBookDeltasflags parsing for Betfair - Added Binance TradeLite message support (#2156), thanks @DeevsDeevs
- Added
DataEngineConfig.time_bars_skip_first_non_full_barconfig option (#2160), thanks @faysou - Added
execution.fastsupport for Bybit (#2165), thanks @sunlei - Added catalog helper functions to export data (#2135), thanks @twitu
- Added additional timestamp properties for
NautilusKernel - Added
event_loggingconfig option forStrategyConfig(#2183), thanks @sunlei - Added
bar_adaptive_high_low_orderingtoBacktestVenueConfig(#2188), thanks @faysou and @stefansimik
Breaking Changes
- Removed optional
valueparam fromUUID4(useUUID4.from_str(...)instead), aligns with Nautilus PyO3 API - Changed
unix_nanos_to_iso8601to output an ISO 8601 (RFC 3339) format string with nanosecond precision - Changed
format_iso8601to output ISO 8601 (RFC 3339) format string with nanosecond precision - Changed
format_iso8601dtparameter to enforcepd.Timestamp(which has nanosecond precision) - Changed
TradingNode.is_builtfrom a property to a method.is_built() - Changed
TradingNode.is_runningfrom a property to a method.is_running() - Changed
OrderInitializedArrow schema (linked_order_idsandtagsdata types changed fromstringtobinary) - Changed order dictionary representation field types for
avg_pxandslippagefromstrtofloat(as out of alignment with position events) - Changed
aggregation_sourcefilter parameter forCache.bar_types(...)to optional with default ofNone
Internal Improvements
- Improved market order handling when no size available in book (now explicitly rejects)
- Improved validation for
TradeTickby ensuringsizeis always positive - Improved validation for
OrderBookDeltaby ensuringorder.sizeis positive whenactionis eitherADDorUPDATE - Improved validation for
BarSpecificationby ensuringstepis always positive - Standardized ISO 8601 timestamps to RFC 3339 spec with nanosecond precision
- Standardized flags for
OrderBookDeltasparsing across adapters - Refined parsing candles for dYdX (#2148), thanks @davidsblom
- Refined imports for type hints in Bybit (#2149), thanks @sunlei
- Refined private WebSocket message processing for Bybit (#2170), thanks @sunlei
- Refined WebSocket client re-subscribe log for Bybit (#2179), thanks @sunlei
- Refined margin balance report for dYdX (#2154), thanks @davidsblom
- Enhanced
lotSizeFilterfield for Bybit (#2166), thanks @sunlei - Renamed WebSocket private client for Bybit (#2180), thanks @sunlei
- Added unit tests for custom dYdX types (#2163), thanks @davidsblom
- Allow bar aggregators to persist after
request_aggregated_bars(#2144), thanks @faysou - Handle directory and live streams to catalog (#2153), thanks @limx0
- Use timeout when initializing account for dYdX (#2169), thanks @davidsblom
- Use retry manager when sending websocket messages for dYdX (#2196), thanks @davidsblom
- Refined error logs when sending pong for dYdX (#2184), thanks @davidsblom
- Optimized message bus topic
is_matching(#2151), thanks @ryantam626 - Added tests for
bar_adaptive_high_low_ordering(#2197), thanks @faysou - Ported
OrderManagerto Rust (#2161), thanks @Pushkarm029 - Ported trailing stop logic to Rust (#2174), thanks @DeevsDeevs
- Ported
FeeModelto Rust (#2191), thanks @filipmacek - Implemented IDs generator for
OrderMatchingEnginein Rust (#2193), thanks @filipmacek - Upgraded Cython to v3.1.0a1
- Upgraded
tokiocrate to v1.43.0 - Upgraded
datafusioncrate to v44.0.0
Fixes
- Fixed type check for
DataClienton requests to support clients other thanMarketDataClient - Fixed processing trade ticks from bars in
OrderMatchingEngine- that could result in zero-size trades, thanks for reporting @stefansimik - Fixed
instrument is Nonecheck flows forDataEngineandPolymarketExecutionClient - Fixed instrument updates in
BetfairDataClient(#2152), thanks @limx0 - Fixed processing of time events on backtest completion when they occur after the final data timestamp
- Fixed missing enum member
CANCELED_MARKET_RESOLVEDforPolymarketOrderStatus - Fixed missing
init_idfield from some order.to_dict()representations - Fixed writing
DYDXOraclePriceto catalog (#2158), thanks @davidsblom - Fixed account balance for dYdX (#2167), thanks @davidsblom
- Fixed markets schema for dYdX (#2190), thanks @davidsblom
- Fixed missing
OrderEmulatedandOrderReleasedArrow schemas - Fixed websocket public channel reconnect for Bybit (#2176), thanks @sunlei
- Fixed execution report parsing for Binance Spot (client order ID empty string now becomes a UUID4 string)
- Fixed docs typo for
fill_orderfunction inOrderMatchingEngine(#2189), thanks @filipmacek
Documentation Updates
- Added docs for
Cache, slippage and spread handling in backtesting (#2162), thanks @stefansimik - Added docs for
FillModeland bar based execution (#2187), thanks @stefansimik - Added docs for choosing data (cost vs. accuracy) and bars OHLC processing (#2195), thanks @stefansimik
- Added docs for bar processing in backtests (#2198), thanks @stefansimik
- Added docs for timestamp and UUID specs
NautilusTrader 1.209.0 Beta
Released on 25th December 2024 (UTC).
Enhancements
- Added WebSocket API trading support for Bybit (#2129), thanks @sunlei
- Added
BybitOrderBookDeltaDataLoaderwith tutorial for Bybit backtesting (#2131), thanks @DeevsDeevs - Added margin and commission docs (#2128), thanks @stefansimik
- Added optional
depthparameter for someOrderBookmethods - Added trade execution support where trades are processed by the matching engine (can be useful backtesting with throttled book and trades data)
- Refactored to use
exchangeMIC code asvenuefor instrument IDs with Databento GLBX dataset (#2108, #2121, #2124, #2126), thanks @faysou - Refactored to use
self.configattributes consistently (#2120), thanks @stefansimik
Internal Improvements
- Optimized
UUID4::new()avoiding unnecessary string allocation, achieving a ~2.8x performance improvement (added benches) - Upgraded v4-proto for dYdX (#2136), thanks @davidsblom
- Upgraded
databentocrate to v0.17.0
Breaking Changes
- Moved
BinanceOrderBookDeltaDataLoaderfromnautilus_trader.persistence.loaderstonautilus_trader.adapters.binance.loaders
Fixes
- Fixed multi-threaded monotonicity for
AtomicTimein real-time mode - Fixed timeout error code for Bybit (#2130), thanks @sunlei
- Fixed instruments info retrieval for Bybit (#2134), thanks @sunlei
- Fixed
request_aggregated_barsmetadata handling (#2137), thanks @faysou - Fixed demo notebook
backtest_high_level.ipynb(#2142), thanks @stefansimik
NautilusTrader 1.208.0 Beta
Released on 15th December 2024 (UTC).
Enhancements
- Added specific
paramsfor data subscriptions and requests which supports Databentobbo-1sandbbo-1mquotes (#2083, #2094), thanks @faysou - Added support for
STOP_LIMITentry order type forOrderFactory.bracket(...) - Added
.group_bids(...)and.group_asks(...)forOrderBook - Added
.bids_to_dict()and.asks_to_dict()forOrderBook - Added
ShutdownSystemcommand andshutdown_system(...)method for components (system-wide shutdown for backtest, sandbox, or live environments) - Added
max_ws_reconnection_triestoBybitDataClientConfig(#2100), thanks @sunlei - Added additional API functionality for Bybit (#2102), thanks @sunlei
- Added position and execution.fast subscriptions for Bybit (#2104), thanks @sunlei
- Added
max_ws_reconnection_triestoBybitExecClientConfig(#2109), thanks @sunlei - Added
margin_init,margin_maint,maker_fee,taker_feeparams and attributes forFuturesContract - Added
margin_init,margin_maint,maker_fee,taker_feeparams and attributes forFuturesSpread - Added
margin_init,margin_maint,maker_fee,taker_feeparams and attributes forOptionContract - Added
margin_init,margin_maint,maker_fee,taker_feeparams and attributes forOptionSpread - Improved Databento symbology support for Interactive Brokers (#2113), thanks @rsmb7z
- Improved support of
STOP_MARKETandSTOP_LIMITorders for dYdX (#2069), thanks @Saransh-Bhandari - Improved timer validation for
interval_ns(avoids panicking from Rust)
Internal Improvements
- Added
.bids_as_map()and.asks_as_map()forOrderBookin Rust - Added type stubs for
coresubpackage - Added type stubs for
commonandmodelenums - Added type stubs for
common.messages - Added re-exports and module declarations to enhance code ergonomics and improve import discoverability
- Added subscriptions for block height websocket messages for dYdX (#2085), thanks @davidsblom
- Added sccache in CI (#2093), thanks @sunlei
- Refined
BybitWebSocketClientprivate channel authentication (#2101), thanks @sunlei - Refined
BybitWebSocketClientsubscribe and unsubscribe (#2105), thanks @sunlei - Refined place order class definitions for Bybit (#2106), thanks @sunlei
- Refined
BybitEnumParser(#2107), thanks @sunlei - Refined batch cancel orders for Bybit (#2111), thanks @sunlei
- Upgraded
tokiocrate to v1.42.0
Breaking Changes
- Renamed
LeveltoBookLevel(standardizes order book type naming conventions) - Renamed
LaddertoBookLadder(standardizes order book type naming conventions) - Changed
FuturesContractArrow schema (addedmargin_init,margin_maint,maker_fee,taker_fee) - Changed
FuturesSpreadArrow schema (addedmargin_init,margin_maint,maker_fee,taker_fee) - Changed
OptionContractArrow schema (addedmargin_init,margin_maint,maker_fee,taker_fee) - Changed
OptionSpreadArrow schema (addedmargin_init,margin_maint,maker_fee,taker_fee)
Fixes
- Fixed data requests when specifying
endwith no catalog registered (comparison betweenpd.TimestampandNoneType) - Fixed
BEST_EFFORT_CANCELEDorder status report for dYdX (#2082), thanks @davidsblom - Fixed order handling for
BEST_EFFORT_CANCELEDmessages of dYdX (#2095), thanks @davidsblom - Fixed specifying price for market orders on dYdX (#2088), thanks @davidsblom
- Fixed interest rate curve custom data and interpolation (#2090), thanks @gcheshkov
- Fixed
BybitHttpClienterror handling when not a JSON string (#2096), thanks @sunlei - Fixed
BybitWebSocketClientprivate channel reconnect (#2097), thanks @sunlei - Fixed incorrect order side use in
BybitExecutionClient(#2098), thanks @sunlei - Fixed default
http_base_urlfor Bybit (#2110), thanks @sunlei
NautilusTrader 1.207.0 Beta
Released on 29th November 2024 (UTC).
Enhancements
- Implemented mixed catalog data requests with catalog update (#2043), thanks @faysou
- Added Databento symbology support for Interactive Brokers (#2073), thanks @rsmb7z
- Added
metadataparameter for data requests (#2043), thanks @faysou - Added
STOP_MARKETandSTOP_LIMITorder support for dYdX (#2066), thanks @davidsblom - Added
max_reconnection_triesto data client config for dYdX (#2066), thanks @davidsblom - Added wallet subscription for Bybit (#2076), thanks @sunlei
- Added docs clarity on loading historical bars (#2078), thanks @dodofarm
- Added
price_precisionoptional parameter forDatabentoDataLoadermethods - Improved
Cachebehavior when adding more recent quotes, trades, or bars (now adds to cache)
Internal Improvements
- Ported
PortfolioandAccountManagerto Rust (#2058), thanks @Pushkarm029 - Implemented
AsRef<str>forPrice,Money, andCurrency - Improved expired timer cleanup in clocks (#2064), thanks @twitu
- Improved live engines error logging (will now log all exceptions rather than just
RuntimeError) - Improved symbol normalization for Tardis
- Improved historical bar request performance for Tardis
- Improved
TradeIdDebug implementation to display value as proper UTF-8 string - Refined
HttpClientfor use directly from Rust - Refined Databento decoder (removed currency hard coding and use of
unsafe) - Upgraded
datafusioncrate to v43.0.0 (#2056), thanks @twitu
Breaking Changes
- Renamed
TriggerType.LAST_TRADEtoLAST_PRICE(more conventional terminology)
Fixes
- Fixed missing venue -> exchange mappings for Tardis integration
- Fixed account balance and order status parsing for dYdX (#2067), thanks @davidsblom
- Fixed parsing best effort opened order status for dYdX (#2068), thanks @davidsblom
- Fixed occasionally incorrect
price_precision,multiplierandlot_sizedecoding for Databento instruments - Fixed missing Arrow schemas for instrument deserialization
- Reconcile order book for dYdX when inconsistent (#2077), thanks @davidsblom
NautilusTrader 1.206.0 Beta
Released on 17th November 2024 (UTC).
Enhancements
- Added
TardisDataClientproviding live data streams from a Tardis Machine WebSocket server - Added
TardisInstrumentProviderproviding instrument definitions from Tardis through the HTTP instrument metadata API - Added
Portfolio.realized_pnl(...)method for per instrument realized PnL (based on positions) - Added
Portfolio.realized_pnls(...)method for per venue realized PnL (based on positions) - Added configuration warning for
InstrumentProvider(to warn when node starts with no instrument loading) - Implemented Tardis optional symbol normalization
- Implemented
WebSocketClientreconnection retries (#2044), thanks @davidsblom - Implemented
OrderCancelRejectedevent generation for Binance and Bybit - Implemented
OrderModifyRejectedevent generation for Binance and Bybit - Improved
OrderRejectedhandling ofreasonstring (Noneis now allowed which will become the string'None') - Improved
OrderCancelRejectedhandling ofreasonstring (Noneis now allowed which will become the string'None') - Improved
OrderModifyRejectedhandling ofreasonstring (Noneis now allowed which will become the string'None')
Internal Improvements
- Ported
RiskEngineto Rust (#2035), thanks @Pushkarm029 and @twitu - Ported
ExecutionEngineto Rust (#2048), thanks @twitu - Added globally shared data channels to send events from engines to Runner in Rust (#2042), thanks @twitu
- Added LRU caching for dYdX HTTP client (#2049), thanks @davidsblom
- Improved identifier constructors to take
AsRef<str>for a cleaner more flexible API - Refined identifiers
Fromtrait impls - Refined
InstrumentProviderinitialization behavior and logging - Refined
LiveTimercancel and performance testing - Simplified
LiveTimercancellation model (#2046), thanks @twitu - Refined Bybit HMAC authentication signatures (now using Rust implemented function)
- Refined Tardis instrument ID parsing
- Removed Bybit
msgspecredundant import alias (#2050), thanks @sunlei - Upgraded
databentocrate to v0.16.0
Breaking Changes
None
Fixes
- Fixed loading specific instrument IDs for
InstrumentProviderConfig - Fixed PyO3 instrument conversions for
raw_symbol(was incorrectly using the normalized symbol) - Fixed reconcile open orders and account websocket message for dYdX (#2039), thanks @davidsblom
- Fixed market order
avg_pxfor Polymarket trade reports - Fixed Betfair clients keepalive (#2040), thanks @limx0
- Fixed Betfair reconciliation (#2041), thanks @limx0
- Fixed Betfair customer order ref limit to 32 chars
- Fixed Bybit handling of
PARTIALLY_FILLED_CANCELEDstatus orders - Fixed Polymarket size precision for
BinaryOptioninstruments (precision 6 to match USDC.e) - Fixed adapter instrument reloading (providers were not reloading instruments at the configured interval due to internal state flags)
- Fixed static time logging for
BacktestEnginewhen running withuse_pyo3logging config - Fixed in-flight orders check and improve error handling (#2053), thanks @davidsblom
- Fixed dYdX handling for liquidated fills (#2052), thanks @davidsblom
- Fixed
BybitResponse.timefield as optionalint(#2051), thanks @sunlei - Fixed single instrument requests for
DatabentoDataClient(was incorrectly calling_handle_instrumentsinstead of_handle_instrument), thanks for reporting @Emsu - Fixed
fsspecrecursive globbing behavior to ensure only file paths are included, and bumped dependency to version 2024.10.0 - Fixed jupyterlab url typo (#2057), thanks @Alsheh
NautilusTrader 1.205.0 Beta
Released on 3rd November 2024 (UTC).
Enhancements
- Added Tardis Machine and HTTP API integration in Python and Rust
- Added
LiveExecEngineConfig.open_check_interval_secsconfig option to actively reconcile open orders with the venue - Added aggregation of bars from historical data (#2002), thanks @faysou
- Added monthly and weekly bar aggregations (#2025), thanks @faysou
- Added
raise_exceptionoptional parameter toTradingNode.run(#2021), thanks @faysou - Added
OrderBook.get_avg_px_qty_for_exposurein Rust (#1893), thanks @elementace - Added timeouts to Interactive Brokers adapter configurations (#2026), thanks @rsmb7z
- Added optional time origins for time bar aggregation (#2028), thanks @faysou
- Added Polymarket position status reports and order status report generation based on fill reports
- Added USDC.e (PoS) currency (used by Polymarket) to internal currency map
- Upgraded Polymarket WebSocket API to new version
Internal Improvements
- Ported analysis subpackage to Rust (#2016), thanks @Pushkarm029
- Improved Postgres testing (#2018), thanks @filipmacek
- Improved Redis version parsing to support truncated versions (improves compatibility with Redis-compliant databases)
- Refined Arrow serialization (record batch functions now also available in Rust)
- Refined core
BarAPI to remove unnecessary unwraps - Standardized network client logging
- Fixed all PyO3 deprecations for API breaking changes
- Fixed all clippy warning lints for PyO3 changes (#2030), thanks @Pushkarm029
- PyO3 upgrade refactor and repair catalog tests (#2032), thanks @twitu
- Upgraded
pyo3crate to v0.22.5 - Upgraded
pyo3-async-runtimescrate to v0.22.0 - Upgraded
tokiocrate to v1.41.0
Breaking Changes
- Removed PyO3
DataTransformer(was being used for namespacing, so refactored to separate functions) - Moved
TEST_DATA_DIRconstant fromteststonautilus_traderpackage (#2020), thanks @faysou
Fixes
- Fixed use of Redis
KEYScommand which, is unsupported in cluster environments (replaced withSCANfor compatibility) - Fixed decoding fill HTTP messages for dYdX (#2022), thanks @davidsblom
- Fixed account balance report for dYdX (#2024), thanks @davidsblom
- Fixed Interactive Brokers market data client subscription log message (#2012), thanks @marcodambros
- Fixed Polymarket execution reconciliation (was not able to reconcile from closed orders)
- Fixed catalog query mem leak test (#2031), thanks @Pushkarm029
- Fixed
OrderInitialized.to_dict()tagsvalue type tolist[str](was a concatenatedstr) - Fixed
OrderInitialized.to_dict()linked_order_idsvalue type tolist[str](was a concatenatedstr) - Fixed Betfair clients shutdown (#2037), thanks @limx0
NautilusTrader 1.204.0 Beta
Released on 22nd October 2024 (UTC).
Enhancements
- Added
TardisCSVDataLoaderfor loading data from Tardis format CSV files as either legacy Cython or PyO3 objects - Added
Clock.timestamp_us()method for UNIX timestamps in microseconds (μs) - Added support for
bbo-1sandbbo-1mquote schemas for Databento adapter (#1990), thanks @faysou - Added validation for venue
book_typeconfiguration vs data (prevents an issue where top-of-book data is used when order book data is expected) - Added
compute_effective_deltasconfig option forPolymarketDataClientConfig, reducing snapshot size (defaultFalseto retain current behavior) - Added rate limiter for
WebSocketClient(#1994), thanks @Pushkarm029 - Added in the money probability field to GreeksData (#1995), thanks @faysou
- Added
on_signal(signal)handler for custom signal data - Added
nautilus_trader.common.eventsmodule with re-exports forTimeEventand other system events - Improved usability of
OrderBookDepth10by filling partial levels with null orders and zero counts - Improved Postgres config (#2010), thanks @filipmacek
- Refined
DatabentoInstrumentProviderhandling of large bulks of instrument definitions (improved parent symbol support) - Standardized Betfair symbology to use hyphens instead of periods (prevents Betfair symbols being treated as composite)
- Integration guide docs fixes (#1991), thanks @FarukhS52
Internal Improvements
- Ported
Throttlerto Rust (#1988), thanks @Pushkarm029 and @twitu - Ported
BettingInstrumentto Rust - Refined
RateLimiterforWebSocketClientand add tests (#2000), thanks @Pushkarm029 - Refined
WebSocketClientto close existing tasks on reconnect (#1986), thanks @davidsblom - Removed mutable references in
CacheDatabaseAdaptertrait in Rust (#2015), thanks @filipmacek - Use Rust rate limiter for dYdX websockets (#1996, #1999), thanks @davidsblom
- Improved error logs for dYdX websocket subscriptions (#1993), thanks @davidsblom
- Standardized log and error message syntax in Rust
- Continue porting
SimulatedExchangeandOrderMatchingEngineto Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007, #2009, #2014), thanks @filipmacek
Breaking Changes
- Removed legacy
TardisQuoteDataLoader(now redundant with new Rust implemented loader) - Removed legacy
TardisTradeDataLoader(now redundant with new Rust implemented loader) - Custom signals are now passed to
on_signal(signal)instead ofon_data(data) - Changed
Position.to_dict()commissionsvalue type tolist[str](was an optionalstrof a list of strings) - Changed
Position.to_dict()avg_px_openvalue type tofloat - Changed
Position.to_dict()avg_px_closevalue type tofloat | None - Changed
Position.to_dict()realized_returnvalue type tofloat | None - Changed
BettingInstrumentArrow schema fieldsevent_open_dateandmarket_start_timefromstringtouint64
Fixes
- Fixed
SocketClientTLS implementation - Fixed
WebSocketClienterror handling on writer close, thanks for reporting @davidsblom - Fixed resubscribing to orderbook in batched mode for dYdX (#1985), thanks @davidsblom
- Fixed Betfair tests related to symbology (#1988), thanks @limx0
- Fixed check for
OmsTypeinOrderMatchingEngineposition ID processing (#2003), thanks @filipmacek - Fixed
TardisCSVDataLoadersnapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029 - Fixed Binance clients venue assignment, we should use the
client_idparams (which match the custom clientname) to communicate with the clients, and use the same'BINANCE'venue identifiers - Fixed
OrderMatchingEngineincorrectly attempting to process monthly bars for execution (which will fail, as no reasonabletimedeltais available), thanks for reporting @frostRed - Fixed handling
MONTHaggregation forcache.bar_types()(sorting required an internal call for the bar intervalstimedelta), thanks for reporting @frostRed
NautilusTrader 1.203.0 Beta
Released on 5th October 2024 (UTC).
Enhancements
- Added
modeparameter toParquetDataCatalog.write_datato control data writing behavior (#1976), thanks @faysou - Added batch cancel for short terms orders of dYdX (#1978), thanks @davidsblom
- Improved OKX configuration (#1966), thanks @miller-moore
- Improved option greeks (#1964), thanks @faysou
Internal Improvements
- Implemented order book delta processing for
SimulatedExchangein Rust (#1975), thanks @filipmacek - Implemented bar processing for
SimulatedExchangein Rust (#1969), thanks @filipmacek - Implemented remaining getter functions for
SimulatedExchangein Rust (#1970), thanks @filipmacek - Implemented rate limiting for dYdX websocket subscriptions (#1977), thanks @davidsblom
- Refactored reconnection handling for dYdX (#1983), thanks @davidsblom
- Refined
DatabentoDataLoaderinternals to accommodate usage from Rust - Added initial large test data files download and caching capability
Breaking Changes
None
Fixes
- Fixed out of order row groups in DataFusion filter query (#1974), thanks @twitu
- Fixed
BacktestNodedata sorting regression causing clock non-decreasing time assertion error - Fixed circular imports for
Actor, thanks @limx0 - Fixed OKX HTTP client signatures (#1966), thanks @miller-moore
- Fixed resubscribing to orderbooks for dYdX (#1973), thanks @davidsblom
- Fixed generating cancel rejections for dYdX (#1982), thanks @davidsblom
- Fixed
WebSocketClienttask cleanup on disconnect (#1981), thanks @twitu - Fixed
Conditionmethod name collisions with Ctrueandfalsemacros, which occurred during compilation in profiling mode
NautilusTrader 1.202.0 Beta
Released on 27th September 2024 (UTC).
This will be the final release with support for Python 3.10.
The numpy version requirement has been relaxed to >= 1.26.4.
Enhancements
- Added Polymarket decentralized prediction market integration
- Added OKX crypto exchange integration (#1951), thanks @miller-moore
- Added
BinaryOptioninstrument (supports Polymarket integration) - Added
LiveExecutionEngine.inflight_check_retriesconfig option to limit in-flight order query attempts - Added
Symbol.root()method for obtaining the root of parent or composite symbols - Added
Symbol.topic()method for obtaining the subscription topic of parent or composite symbols - Added
Symbol.is_composite()method to determine if symbol is made up of parts with period (.) delimiters - Added
underlyingfilter parameter forCache.instruments(...)method - Added
reduce_onlyparameter forStrategy.close_position(...)method (defaultTrueto retain current behavior) - Added
reduce_onlyparameter forStrategy.close_all_positions(...)method (defaultTrueto retain current behavior) - Implemented flush with truncate Postgres function for
PostgresCacheDatabase(#1928), thanks @filipmacek - Implemented file rotation for
StreamingFeatherWriterwith internal improvements usingClockandCache(#1954, #1961), thanks @graceyangfan - Improved dYdX execution client to use
RetryManagerfor HTTP requests (#1941), thanks @davidsblom - Improved Interactive Brokers adapter to use a dynamic IB gateway
container_imagefrom config (#1940), thanks @rsmb7z - Improved
OrderBookDeltasstreaming and batching based on theF_LASTflag - Standardized underscore thousands separators for backtest logging
- Updated Databento
publishers.json
Internal Improvements
- Implemented
OrderTestBuilderto assist testing in Rust (#1952), thanks @filipmacek - Implemented quote tick processing for SimulatedExchange in Rust (#1956), thanks @filipmacek
- Implemented trade tick processing for SimulatedExchange in Rust (#1956), thanks @filipmacek
- Refined
Loggerto use unbuffered stdout/stderr writers (#1960), thanks @twitu
Breaking Changes
- Renamed
batch_size_bytestochunk_size(more accurate naming for number of data points to process per chunk in backtest streaming mode) - Standardized Stop-Loss (SL) and Take-Profit (TP) parameter ordering for
OrderFactory.bracket(...)including:tp_time_in_force,tp_exec_algorithm_params,tp_tags,tp_client_order_id
Fixes
- Fixed
LoggingConfigissue forlevel_filewhen used withuse_pyo3=True(was not passing through thelevel_filesetting), thanks for reporting @xt2014 - Fixed composite bar requests (#1923), thanks @faysou
- Fixed average price calculation for
ValueBarAggregator(#1927), thanks @faysou - Fixed breaking protobuf issue by pinning
protobufandgrpciofor dYdX (#1929), thanks @davidsblom - Fixed edge case where exceptions raised in
BacktestNodeprior to engine initialization would not produce logs, thanks for reporting @faysou - Fixed handling of internal server error for dYdX (#1938), thanks @davidsblom
- Fixed
BybitWebSocketClientprivate channel authentication on reconnect, thanks for reporting @miller-moore - Fixed
OrderFactory.bracket(...)parameter ordering forsl_time_in_forceandtp_time_in_force, thanks for reporting @marcodambros - Fixed
Cfdinstrument Arrow schema and serialization - Fixed bar subscriptions on TWS/GW restart for Interactive Brokers (#1950), thanks @rsmb7z
- Fixed Databento parent and continuous contract subscriptions (using new symbol root)
- Fixed Databento
FuturesSpreadandOptionSpreadinstrument decoding (was not correctly handling price increments and empty underlyings) - Fixed
FuturesSpreadserialization - Fixed
OptionSpreadserialization
NautilusTrader 1.201.0 Beta
Released on 9th September 2024 (UTC).
Enhancements
- Added order book deltas triggering support for
OrderEmulator - Added
OrderCancelRejectedevent generation for dYdX adapter (#1916), thanks @davidsblom - Refined handling of Binance private key types (RSA, Ed25519) and integrated into configs
- Implemented cryptographic signing in Rust (replacing
pycryptodomefor Binance) - Removed the vendored
tokio-tungstenitecrate (#1902), thanks @VioletSakura-7
Breaking Changes
None
Fixes
- Fixed
BinanceFuturesEventTypeby adding newTRADE_LITEmember, reflecting the Binance update on 2024-09-03 (UTC)
NautilusTrader 1.200.0 Beta
Released on 7th September 2024 (UTC).
Enhancements
- Added dYdX integration (#1861, #1868, #1873, #1874, #1875, #1877, #1879, #1880, #1882, #1886, #1887, #1890, #1891, #1896, #1901, #1903, #1907, #1910, #1911, #1913, #1915), thanks @davidsblom
- Added composite bar types, bars aggregated from other bar types (#1859, #1885, #1888, #1894, #1905), thanks @faysou
- Added
OrderBookDeltas.batchfor batching groups of deltas based on record flags (batch untilF_LAST) - Added
OrderBookDeltasbatching support forParquetDataCatalog(usedata_clsofOrderBookDeltasto batch with the same flags method as live adapters) - Added
RetryManagerPoolto abstract common retry functionality for all adapters - Added
InstrumentClosefunctionality forOrderMatchingEngine, thanks @limx0 - Added
BacktestRunConfig.dispose_on_completionconfig option to control post-run disposal behavior for each internal backtest engine (defaultTrueto retain current behavior) - Added
recv_window_msconfig option forBinanceExecClientConfig - Added
sl_time_in_forceandtp_time_in_forceparameters toOrderFactory.bracket(...)method - Added custom
client_order_idparameters toOrderFactorymethods - Added support for Binance RSA and Ed25519 API key types (#1908), thanks @NextThread
- Added
multiplierparameter forCryptoPerpetual(default 1) - Implemented
BybitExecutionClientretry logic forsubmit_order,modify_order,cancel_orderandcancel_all_orders - Improved error modeling and handling in Rust (#1866), thanks @twitu
- Improved
HttpClienterror handling and addedHttpClientErrorexception for Python (#1872), thanks @twitu - Improved
WebSocketClienterror handling and addedWebSocketClientErrorexception for Python (#1876), thanks @twitu - Improved
WebSocketClient.send_textefficiency (now accepts UTF-8 encoded bytes, rather than a Python string) - Improved
@customdataclassdecorator withdatefield and refined__repr__(#1900, #1906, #1909), thanks @faysou - Improved standardization of
OrderBookDeltasparsing and records flags for crypto venues - Refactored
RedisMessageBusDatabaseto tokio tasks - Refactored
RedisCacheDatabaseto tokio tasks - Upgraded
tokiocrate to v1.40.0
Breaking Changes
- Renamed
heartbeat_intervaltoheartbeat_interval_secs(more explicitly indicates time units) - Moved
heartbeat_interval_secsconfig option toMessageBusConfig(the message bus handles external stream processing) - Changed
WebSocketClient.send_text(...)to takedataasbytesrather thanstr - Changed
CryptoPerpetualArrow schema to includemultiplierfield - Changed
CryptoFutureArrow schema to includemultiplierfield
Fixes
- Fixed
OrderBookmemory deallocation in Python finalizer (memory was not being freed on object destruction), thanks for reporting @zeyuhuan - Fixed
Ordertags serialization (was not concatenating to a single string), thanks for reporting @DevRoss - Fixed
types_filterserialization inMessageBusConfigduring kernel setup - Fixed
InstrumentProviderhandling ofload_ids_on_startwhen elements are alreadyInstrumentIds - Fixed
InstrumentProviderConfighashing forfiltersfield
NautilusTrader 1.199.0 Beta
Released on 19th August 2024 (UTC).
Enhancements
- Added
LiveExecEngineConfig.generate_missing_ordersreconciliation config option to align internal and external position states - Added
LogLevel::TRACE(only available in Rust for debug/development builds) - Added
Actor.subscribe_signal(...)method andData.is_signal(...)class method (#1853), thanks @faysou - Added Binance Futures support for
HEDGEmode (#1846), thanks @DevRoss - Overhauled and refined error modeling and handling in Rust (#1849, #1858), thanks @twitu
- Improved
BinanceExecutionClientposition report requests (can now filter by instrument and includes reporting for flat positions) - Improved
BybitExecutionClientposition report requests (can now filter by instrument and includes reporting for flat positions) - Improved
LiveExecutionEnginereconciliation robustness and recovery when internal positions do not match external positions - Improved
@customdataclassdecorator constructor to allow more positional arguments (#1850), thanks @faysou - Improved
@customdataclassdocumentation (#1854), thanks @faysou - Upgraded
datafusioncrate to v41.0.0 - Upgraded
tokiocrate to v1.39.3 - Upgraded
uvloopto v0.20.0 (upgrades libuv to v1.48.0)
Breaking Changes
- Changed
VolumeWeightedAveragePricecalculation formula to use each bars "typical" price (#1842), thanks @evgenii-prusov - Changed
OptionContractconstructor parameter ordering and Arrow schema (consistently group option kind and strike price) - Renamed
snapshot_positions_intervaltosnapshot_positions_interval_secs(more explicitly indicates time units) - Moved
snapshot_ordersconfig option toExecEngineConfig(can now be used for all environment contexts) - Moved
snapshot_positionsconfig option toExecEngineConfig(can now be used for all environment contexts) - Moved
snapshot_positions_interval_secsconfig option toExecEngineConfig(can now be used for all environment contexts)
Fixes
- Fixed
Positionexception type on duplicate fill (should beKeyErrorto align with the same error forOrder) - Fixed Bybit position report parsing when position is flat (
BybitPositionSidenow correctly handles the empty string)
NautilusTrader 1.198.0 Beta
Released on 9th August 2024 (UTC).
Enhancements
- Added
@customdataclassdecorator to reduce need for boiler plate implementing custom data types (#1828), thanks @faysou - Added timeout for HTTP client in Rust (#1835), thanks @davidsblom
- Added catalog conversion function of streamed data to backtest data (#1834), thanks @faysou
- Upgraded Cython to v3.0.11
Breaking Changes
None
Fixes
- Fixed creation of
instrument_idfolder when writing PyO3 bars in catalog (#1832), thanks @faysou - Fixed
StreamingFeatherWriterhandling ofinclude_typesoption (#1833), thanks @faysou - Fixed
BybitExecutionClientposition reports error handling and logging - Fixed
BybitExecutionClientorder report handling to correctly process external orders
NautilusTrader 1.197.0 Beta
Released on 2nd August 2024 (UTC).
Enhancements
- Added Databento Status schema support for loading and live trading
- Added options on futures support for Interactive Brokers (#1795), thanks @rsmb7z
- Added documentation for option greeks custom data example (#1788), thanks @faysou
- Added
MarketStatusActionenum (support Databentostatusschema) - Added
ignore_quote_tick_size_updatesconfig option for Interactive Brokers (#1799), thanks @sunlei - Implemented
MessageBusv2 in Rust (#1786), thanks @twitu - Implemented
DataEnginev2 in Rust (#1785), thanks @twitu - Implemented
FillModelin Rust (#1801), thanks @filipmacek - Implemented
FixedFeeModelin Rust (#1802), thanks @filipmacek - Implemented
MakerTakerFeeModelin Rust (#1803), thanks @filipmacek - Implemented Postgres native enum mappings in Rust (#1797, #1806), thanks @filipmacek
- Refactored order submission error handling for Interactive Brokers (#1783), thanks @rsmb7z
- Improved live reconciliation robustness (will now generate inferred orders necessary to align external position state)
- Improved tests for Interactive Brokers (#1776), thanks @mylesgamez
- Upgraded
tokiocrate to v1.39.2 - Upgraded
datafusioncrate to v40.0.0
Breaking Changes
- Removed
VenueStatusand all associated methods and schemas (redundant withInstrumentStatus) - Renamed
QuoteTick.extract_volume(...)to.extract_size(...)(more accurate terminology) - Changed
InstrumentStatusparams (support Databentostatusschema) - Changed
InstrumentStatusArrow schema - Changed
OrderBookFFI API to take data by reference instead of by value
Fixes
- Fixed rounding errors in accounting calculations for large values (using
decimal.Decimalinternally) - Fixed multi-currency account commission handling with multiple PnL currencies (#1805), thanks for reporting @dpmabo
- Fixed
DataEngineunsubscribing from order book deltas (#1814), thanks @davidsblom - Fixed
LiveExecutionEnginehandling of adapter client execution report causingNonemass status (#1789), thanks for reporting @faysou - Fixed
InteractiveBrokersExecutionClienthandling of instruments not found when generating execution reports (#1789), thanks for reporting @faysou - Fixed Bybit parsing of trade and quotes for websocket messages (#1794), thanks @davidsblom
NautilusTrader 1.196.0 Beta
Released on 5th July 2024 (UTC).
Enhancements
- Added
request_order_book_snapshotmethod (#1745), thanks @graceyangfan - Added order book data validation for
BacktestNodewhen a venuebook_typeisL2_MBPorL3_MBO - Added Bybit demo account support (set
is_demotoTruein configs) - Added Bybit stop order types (
STOP_MARKET,STOP_LIMIT,MARKET_IF_TOUCHED,LIMIT_IF_TOUCHED,TRAILING_STOP_MARKET) - Added Binance venue option for adapter configurations (#1738), thanks @DevRoss
- Added Betfair amend order quantity support (#1687 and #1751), thanks @imemo88 and @limx0
- Added Postgres tests serial test group for nextest runner (#1753), thanks @filipmacek
- Added Postgres account persistence capability (#1768), thanks @filipmacek
- Refactored
AccountAnypattern in Rust (#1755), thanks @filipmacek - Changed
DatabentoLiveClientto use new snapshot on subscribe feature - Changed identifier generator time tag component to include seconds (affects new
ClientOrderId,OrderIdandPositionIdgeneration) - Changed
<Arc<Mutex<bool>>toAtomicBoolin Rustnetworkcrate, thanks @NextThread and @twitu - Ported
KlingerVolumeOscillatorindicator to Rust (#1724), thanks @Pushkarm029 - Ported
DirectionalMovementindicator to Rust (#1725), thanks @Pushkarm029 - Ported
ArcherMovingAveragesTrendsindicator to Rust (#1726), thanks @Pushkarm029 - Ported
Swingsindicator to Rust (#1731), thanks @Pushkarm029 - Ported
BollingerBandsindicator to Rust (#1734), thanks @Pushkarm029 - Ported
VolatilityRatioindicator to Rust (#1735), thanks @Pushkarm029 - Ported
Stochasticsindicator to Rust (#1736), thanks @Pushkarm029 - Ported
Pressureindicator to Rust (#1739), thanks @Pushkarm029 - Ported
PsychologicalLineindicator to Rust (#1740), thanks @Pushkarm029 - Ported
CommodityChannelIndexindicator to Rust (#1742), thanks @Pushkarm029 - Ported
LinearRegressionindicator to Rust (#1743), thanks @Pushkarm029 - Ported
DonchianChannelindicator to Rust (#1744), thanks @Pushkarm029 - Ported
KeltnerChannelindicator to Rust (#1746), thanks @Pushkarm029 - Ported
RelativeVolatilityIndexindicator to Rust (#1748), thanks @Pushkarm029 - Ported
RateOfChangeindicator to Rust (#1750), thanks @Pushkarm029 - Ported
MovingAverageConvergenceDivergenceindicator to Rust (#1752), thanks @Pushkarm029 - Ported
OnBalanceVolumeindicator to Rust (#1756), thanks @Pushkarm029 - Ported
SpreadAnalyzerindicator to Rust (#1762), thanks @Pushkarm029 - Ported
KeltnerPositionindicator to Rust (#1763), thanks @Pushkarm029 - Ported
FuzzyCandlesticksindicator to Rust (#1766), thanks @Pushkarm029
Breaking Changes
- Renamed
Actor.subscribe_order_book_snapshotsandunsubscribe_order_book_snapshotstosubscribe_order_book_at_intervalandunsubscribe_order_book_at_intervalrespectively (this clarifies the method behavior where the handler then receivesOrderBookat a regular interval, distinct from a collection of deltas representing a snapshot)
Fixes
- Fixed
LIMITorder fill behavior forL2_MBPandL3_MBObook types (was not honoring limit price as maker), thanks for reporting @dpmabo - Fixed
CashAccountPnL calculations when opening a position with multiple fills, thanks @Otlk - Fixed msgspec encoding and decoding of
Environmentenum forNautilusKernelConfig - Fixed
OrderMatchingEngineprocessing by book type for quotes and deltas (#1754), thanks @davidsblom - Fixed
DatabentoDataLoader.from_dbn_fileforOrderBookDeltas whenas_legacy_cython=False - Fixed
DatabentoDataLoaderOHLCV bar schema loading (incorrectly accounting for display factor), thanks for reporting @faysou - Fixed
DatabentoDataLoadermultiplier and round lot size decoding, thanks for reporting @faysou - Fixed Binance order report generation
active_symbolstype miss matching (#1729), thanks @DevRoss - Fixed Binance trade data websocket schemas (Binance no longer publish
bbuyer andaseller order IDs) - Fixed
BinanceFuturesInstrumentProviderparsing of min notional, thanks for reporting @AnthonyVince - Fixed
BinanceSpotInstrumentProviderparsing of min and max notional - Fixed Bybit order book deltas subscriptions for
INVERSEproduct type - Fixed
Cachedocumentation forget(was the same asadd), thanks for reporting @faysou
NautilusTrader 1.195.0 Beta
Released on 17th June 2024 (UTC).
Enhancements
- Added Bybit base coin for fee rate parsing (#1696), thanks @filipmacek
- Added
IndexInstrumentwith support for Interactive Brokers (#1703), thanks @rsmb7z - Refactored Interactive Brokers client and gateway configuration (#1692), thanks @rsmb7z
- Improved
InteractiveBrokersInstrumentProvidercontract loading (#1699), thanks @rsmb7z - Improved
InteractiveBrokersInstrumentProvideroption chain loading (#1704), thanks @rsmb7z - Improved
Instrument.make_qtyerror clarity when a positive value is rounded to zero - Updated installation from source docs for Clang dependency (#1690), thanks @Troubladore
- Updated
DockerizedIBGatewayConfigdocs (#1691), thanks @Troubladore
Breaking Changes
None
Fixes
- Fixed DataFusion streaming backend mem usage (now constant mem usage) (#1693), thanks @twitu
- Fixed
OrderBookDeltaDataWranglersnapshot parsing (was not prepending aCLEARaction), thanks for reporting @VeraLyu - Fixed
Instrument.make_priceandmake_qtywhen increments have a lower precision (was not rounding to the minimum increment) - Fixed
EMACrossTrailingStopexample strategy trailing stop logic (could submit multiple trailing stops on partial fills) - Fixed Binance
TRAILING_STOP_MARKETorders (callback rounding was incorrect, was also not handling updates) - Fixed Interactive Brokers multiple gateway clients (incorrect port handling in factory) (#1702), thanks @dodofarm
- Fixed time alerts Python example in docs (#1713), thanks @davidsblom
NautilusTrader 1.194.0 Beta
Released on 31st May 2024 (UTC).
Enhancements
- Added
DataEngineorder book deltas buffering toF_LASTflag (#1673), thanks @davidsblom - Added
DataEngineConfig.buffer_deltasconfig option for the above (#1670), thanks @davidsblom - Improved Bybit order book deltas parsing to set
F_LASTflag (#1670), thanks @davidsblom - Improved Bybit handling for top-of-book quotes and order book deltas (#1672), thanks @davidsblom
- Improved Interactive Brokers integration test mocks (#1669), thanks @rsmb7z
- Improved error message when no tick scheme initialized for an instrument, thanks for reporting @VeraLyu
- Improved
SandboxExecutionClientinstrument handling (instruments just need to be added to cache) - Ported
VolumeWeightedAveragePriceindicator to Rust (#1665), thanks @Pushkarm029 - Ported
VerticalHorizontalFilterindicator to Rust (#1666), thanks @Pushkarm029
Breaking Changes
None
Fixes
- Fixed
SimulatedExchangeprocessing of commands in real-time for sandbox mode - Fixed
DataEngineunsubscribe handling (edge case would attempt to unsubscribe from the client multiple times) - Fixed Bybit order book deltas parsing (was appending bid side twice) (#1668), thanks @davidsblom
- Fixed Binance instruments price and size precision parsing (was incorrectly stripping trailing zeros)
- Fixed
BinanceBarstreaming feather writing (was not setting up writer) - Fixed backtest high-level tutorial documentation errors, thanks for reporting @Leonz5288
NautilusTrader 1.193.0 Beta
Released on 24th May 2024 (UTC).
Enhancements
- Added Interactive Brokers support for Market-on-Close (MOC) and Limit-on-Close (LOC) order types (#1663), thanks @rsmb7z
- Added Bybit sandbox example (#1659), thanks @davidsblom
- Added Binance sandbox example
Breaking Changes
- Overhauled
SandboxExecutionClientConfigto more closely matchBacktestVenueConfig(many changes and additions)
Fixes
- Fixed DataFusion backend data ordering by
ts_initwhen streaming (#1656), thanks @twitu - Fixed Interactive Brokers tick level historical data downloading (#1653), thanks @DracheShiki
NautilusTrader 1.192.0 Beta
Released on 18th May 2024 (UTC).
Enhancements
- Added Nautilus CLI (see docs) (#1602), many thanks @filipmacek
- Added
CfdandCommodityinstruments with Interactive Brokers support (#1604), thanks @DracheShiki - Added
OrderMatchingEnginefutures and option contract activation and expiration simulation - Added Sandbox example with Interactive Brokers (#1618), thanks @rsmb7z
- Added
ParquetDataCatalogS3 support (#1620), thanks @benjaminsingleton - Added
Bar.from_raw_arrays_to_list(#1623), thanks @rsmb7z - Added
SandboxExecutionClientConfig.bar_executionconfig option (#1646), thanks @davidsblom - Improved venue order ID generation and assignment (it was previously possible for the
OrderMatchingEngineto generate multiple IDs for the same order) - Improved
LiveTimerrobustness and flexibility by not requiring positive intervals or stop times in the future (will immediately produce a time event), thanks for reporting @davidsblom
Breaking Changes
- Removed
allow_cash_positionsconfig (simplify to the most common use case, spot trading should track positions) - Changed
tagsparameter and return type fromstrtolist[str](more naturally expresses multiple tags) - Changed
Order.to_dict()commissionandlinked_order_idfields to lists of strings rather than comma separated strings - Changed
OrderMatchingEngineto no longer process internally aggregated bars for execution (no tests failed, but still classifying as a behavior change), thanks for reporting @davidsblom
Fixes
- Fixed
CashAccountPnL and balance calculations (was adjusting filled quantity based on open position quantity - causing a desync and incorrect balance values) - Fixed
from_strforPrice,QuantityandMoneywhen input string contains underscores in Rust, thanks for reporting @filipmacek - Fixed
Moneystring parsing where the value fromstr(money)can now be passed toMoney.from_str - Fixed
TimeEventequality (now based on the eventidrather than the eventname) - Fixed
ParquetDataCatalogbar queries byinstrument_idwhich were no longer returning data (the intent is to usebar_type, however usinginstrument_idnow returns all matching bars) - Fixed venue order ID generation and application in sandbox mode (was previously generating additional venue order IDs), thanks for reporting @rsmb7z and @davidsblom
- Fixed multiple fills causing overfills in sandbox mode (
OrderMatchingEnginenow caching filled quantity to prevent this) (#1642), thanks @davidsblom - Fixed
leaves_qtyexception message underflow (now correctly displays the projected negative leaves quantity) - Fixed Interactive Brokers contract details parsing (#1615), thanks @rsmb7z
- Fixed Interactive Brokers portfolio registration (#1616), thanks @rsmb7z
- Fixed Interactive Brokers
IBOrderattributes assignment (#1634), thanks @rsmb7z - Fixed IBKR reconnection after gateway/TWS disconnection (#1622), thanks @benjaminsingleton
- Fixed Binance Futures account balance calculation (was over stating
freebalance with margin collateral, which could result in a negativelockedbalance) - Fixed Betfair stream reconnection and avoid multiple reconnect attempts (#1644), thanks @imemo88
NautilusTrader 1.191.0 Beta
Released on 20th April 2024 (UTC).
Enhancements
- Implemented
FeeModelincludingFixedFeeModelandMakerTakerFeeModel(#1584), thanks @rsmb7z - Implemented
TradeTickDataWrangler.process_bar_data(#1585), thanks @rsmb7z - Implemented multiple timeframe bar execution (will use lowest timeframe per instrument)
- Optimized
LiveTimerefficiency and accuracy withtokiotimer under the hood - Optimized
QuoteTickDataWranglerandTradeTickDataWrangler(#1590), thanks @rsmb7z - Standardized adapter client logging (handle more logging from client base classes)
- Simplified and consolidated Rust
OrderBookdesign - Improved
CacheDatabaseAdaptergraceful close and thread join - Improved
MessageBusgraceful close and thread join - Improved
modify_ordererror logging when order values remain unchanged - Added
RecordFlagenum for Rust and Python - Interactive Brokers further improvements and fixes, thanks @rsmb7z
- Ported
Biasindicator to Rust, thanks @Pushkarm029
Breaking Changes
- Reordered
OrderBookDeltaparamsflagsandsequenceand removed default 0 values (more explicit and less chance of mismatches) - Reordered
OrderBookparamsflagsandsequenceand removed default 0 values (more explicit and less chance of mismatches) - Added
flagsparameter toOrderBook.add - Added
flagsparameter toOrderBook.update - Added
flagsparameter toOrderBook.delete - Changed Arrow schema for all instruments: added
infobinary field - Changed Arrow schema for
CryptoFuture: addedis_inverseboolean field - Renamed both
OrderBookMboandOrderBookMbptoOrderBook(consolidated) - Renamed
Indicator.handle_book_mboandIndicator.handle_book_mbptohandle_book(consolidated) - Renamed
register_serializable_objecttoregister_serializable_type(also renames first parameter fromobjtocls)
Fixes
- Fixed
MessageBuspattern resolving (fixes a performance regression where topics published with no subscribers would always re-resolve) - Fixed
BacktestNodestreaming data management (was not clearing between chunks), thanks for reporting @dpmabo - Fixed
RiskEnginecumulative notional calculations for margin accounts (was incorrectly using base currency when selling) - Fixed selling
Equityinstruments withCASHaccount andNETTINGOMS incorrectly rejecting (should be able to reduce position) - Fixed Databento bars decoding (was incorrectly applying display factor)
- Fixed
BinanceBar(kline) to useclose_timeforts_eventwasopentime(#1591), thanks for reporting @OnlyC - Fixed
AccountMarginExceedederror condition (margin must actually be exceeded now, and can be zero) - Fixed
ParquetDataCatalogpath globbing which was including all paths with substrings of specified instrument IDs
NautilusTrader 1.190.0 Beta
Released on 22nd March 2024 (UTC).
Enhancements
- Added Databento adapter
continuous,parentandinstrument_idsymbology support (will infer from symbols) - Added
DatabaseConfig.timeoutconfig option for timeout seconds to wait for a new connection - Added CSV tick and bar data loader params, thanks @rterbush
- Implemented
LogGuardto ensure global logger is flushed on termination, thanks @ayush-sb and @twitu - Improved Interactive Brokers client connectivity resilience and component lifecycle, thanks @benjaminsingleton
- Improved Binance execution client ping listen key error handling and logging
- Improved Redis cache adapter and message bus error handling and logging
- Improved Redis port parsing (
DatabaseConfig.portcan now be either a string or integer) - Ported
ChandeMomentumOscillatorindicator to Rust, thanks @Pushkarm029 - Ported
VIDYAindicator to Rust, thanks @Pushkarm029 - Refactored
InteractiveBrokersEWrapper, thanks @rsmb7z - Redact Redis passwords in strings and logs
- Upgraded
rediscrate to v0.25.2 which bumps up TLS dependencies, and turned ontls-rustls-webpki-rootsfeature flag
Breaking Changes
None
Fixes
- Fixed JSON format for log file output (was missing
timestampandtrader\_id) - Fixed
DatabaseConfigport JSON parsing for Redis (was always defaulting to 6379) - Fixed
ChandeMomentumOscillatorindicator divide by zero error (both Rust and Cython versions)
NautilusTrader 1.189.0 Beta
Released on 15th March 2024 (UTC).
Enhancements
- Implemented Binance order book snapshot rebuilds on websocket reconnect (see integration guide)
- Added additional validations for
OrderMatchingEngine(will now raise aRuntimeErrorwhen a price or size precision forOrderFilleddoes not match the instruments precisions) - Added
LoggingConfig.use_pyo3config option for PyO3 based logging initialization (worse performance but allows visibility into logs originating from Rust) - Added
exchangefield toFuturesContract,FuturesSpread,OptionContractandOptionSpread(optional)
Breaking Changes
- Changed Arrow schema adding
exchangefield forFuturesContract,FuturesSpread,OptionContractandOptionSpread
Fixes
- Fixed
MessageBushandling of subscriptions after a topic has been published on (was previously dropping messages for these late subscribers) - Fixed
MessageBushandling of subscriptions under certain edge cases (subscriptions list could be resized on iteration causing aRuntimeError) - Fixed
Throttlerhandling of sending messages after messages have been dropped, thanks @davidsblom - Fixed
OrderBookDelta.to_pyo3_listusing zero precision from clear delta - Fixed
DataTransformer.pyo3_order_book_deltas_to_record_batch_bytesusing zero precision from clear delta - Fixed
OrderBookMboandOrderBookMbpintegrity check when crossed book - Fixed
OrderBookMbperror when attempting to add to a L1_MBP book type (now raisesRuntimeErrorrather than panicking) - Fixed Interactive Brokers connection error logging (#1524), thanks @benjaminsingleton
- Fixed
SimulationModuleConfiglocation and missing re-export fromconfigsubpackage - Fixed logging
StdoutWriterfrom also writing error logs (writers were duplicating error logs) - Fixed
BinanceWebSocketClientto new specification which requires responding to pings with a pong containing the pings payload - Fixed Binance Futures
AccountBalancecalculations based on wallet and available balance - Fixed
ExecAlgorithmcircular import issue for installed wheels (importing fromexecution.algorithmwas a circular import)
NautilusTrader 1.188.0 Beta
Released on 25th February 2024 (UTC).
Enhancements
- Added
FuturesSpreadinstrument type - Added
OptionSpreadinstrument type - Added
InstrumentClass.FUTURE_SPREAD - Added
InstrumentClass.OPTION_SPREAD - Added
managedparameter tosubscribe_order_book_deltas, defaultTrueto retain current behavior (if false then the data engine will not automatically manage a book) - Added
managedparameter tosubscribe_order_book_snapshots, defaultTrueto retain current behavior (if false then the data engine will not automatically manage a book) - Added additional validations for
OrderMatchingEngine(will now reject orders with incorrect price or quantity precisions) - Removed
interval_ms20 millisecond limitation forsubscribe_order_book_snapshots(i.e. just needs to be positive), although we recommend you consider subscribing to deltas below 100 milliseconds - Ported
LiveClockandLiveTimerimplementations to Rust - Implemented
OrderBookDeltaspickling - Implemented
AverageTrueRangein Rust, thanks @rsmb7z
Breaking Changes
- Changed
TradeIdvalue maximum length to 36 characters (will raise aValueErrorif value exceeds the maximum)
Fixes
- Fixed
TradeIdmemory leak due assigning unique values to theUstrglobal string cache (which are never freed for the lifetime of the program) - Fixed
TradeTicksize precision for PyO3 conversion (size precision was incorrectly price precision) - Fixed
RiskEnginecash value check when selling (would previously divide quantity by price which is too much), thanks for reporting @AnthonyVince - Fixed FOK time in force behavior (allows fills beyond the top level, will cancel if cannot fill full size)
- Fixed IOC time in force behavior (allows fills beyond the top level, will cancel any remaining after all fills are applied)
- Fixed
LiveClocktimer behavior for small intervals causing next time to be less than now (timer then would not run) - Fixed log level filtering for
log_level_file(bug introduced in v1.187.0), thanks @twitu - Fixed logging
print_configconfig option (was not being passed through to the logging subsystem) - Fixed logging timestamps for backtesting (static clock was not being incrementally set to individual
TimeEventtimestamps) - Fixed account balance updates (fills from zero quantity
NETTINGpositions will generate account balance updates) - Fixed
MessageBuspublishable types collection type (needed to betuplenotset) - Fixed
Controllerregistration of components to ensure all active clocks are iterated correctly during backtests - Fixed
Equityshort selling forCASHaccounts (will now reject) - Fixed
ActorFactory.createJSON encoding (was missing the encoding hook) - Fixed
ImportableConfig.createJSON encoding (was missing the encoding hook) - Fixed
ImportableStrategyConfig.createJSON encoding (was missing the encoding hook) - Fixed
ExecAlgorithmFactory.createJSON encoding (was missing the encoding hook) - Fixed
ControllerConfigbase class and docstring - Fixed Interactive Brokers historical bar data bug, thanks @benjaminsingleton
- Fixed persistence
freeze_dictfunction to handlefs_storage_options, thanks @dimitar-petrov
NautilusTrader 1.187.0 Beta
Released on 9th February 2024 (UTC).
Enhancements
- Refined logging subsystem module and writers in Rust, thanks @ayush-sb and @twitu
- Improved Interactive Brokers adapter symbology and parsing with a
strict_symbologyconfig option, thanks @rsmb7z and @fhill2
Breaking Changes
- Reorganized configuration objects (separated into a
configmodule per subpackage, with re-exports fromnautilus_trader.config)
Fixes
- Fixed
BacktestEngineandTraderdisposal (now properly releasing resources), thanks for reporting @davidsblom - Fixed circular import issues from configuration objects, thanks for reporting @cuberone
- Fixed unnecessary creation of log files when file logging off
NautilusTrader 1.186.0 Beta
Released on 2nd February 2024 (UTC).
Enhancements
None
Breaking Changes
None
Fixes
- Fixed Interactive Brokers get account positions bug (#1475), thanks @benjaminsingleton
- Fixed
TimeBarAggregatorhandling of interval types on build - Fixed
BinanceSpotExecutionClientnon-existent method name, thanks @sunlei - Fixed unused
psutilimport, thanks @sunlei
NautilusTrader 1.185.0 Beta
Released on 26th January 2024 (UTC).
Enhancements
- Added warning log when
bypass_loggingis set true for aLIVEcontext - Improved
register_serializable objectto also add type to internal_EXTERNAL_PUBLIHSABLE_TYPES - Improved Interactive Brokers expiration contract parsing, thanks @fhill2
Breaking Changes
- Changed
StreamingConfig.include_typestype fromtuple[str]tolist[type](better alignment with other type filters) - Consolidated
clockmodule intocomponentmodule (reduce binary wheel size) - Consolidated
loggingmodule intocomponentmodule (reduce binary wheel size)
Fixes
- Fixed Arrow serialization of
OrderUpdated(trigger_pricetype was incorrect), thanks @benjaminsingleton - Fixed
StreamingConfig.include_typesbehavior (was not being honored for instrument writers), thanks for reporting @doublier1 - Fixed
ImportableStrategyConfigtype assignment inStrategyFactory(#1470), thanks @rsmb7z
NautilusTrader 1.184.0 Beta
Released on 22nd January 2024 (UTC).
Enhancements
- Added
LogLevel.OFF(matches the Rusttracinglog levels) - Added
init_loggingfunction with sensible defaults to initialize the Rust implemented logging subsystem - Updated Binance Futures enum members for
BinanceFuturesContractTypeandBinanceFuturesPositionUpdateReason - Improved log header using the
sysinfocrate (adds swap space metrics and a PID identifier) - Removed Python dependency on
psutil
Breaking Changes
- Removed
clockparameter fromLogger(no dependency onClockanymore) - Renamed
LoggerAdaptertoLogger(and removed oldLoggerclass) - Renamed
Loggercomponent_nameparameter toname(matches Python built-inloggingAPI) - Renamed
OptionKindkindparameter and property tooption_kind(better clarity) - Renamed
OptionContractArrow schema fieldkindtooption_kind - Changed
level_filelog level toOFF(file logging is off by default)
Fixes
- Fixed memory leak for catalog queries (#1430), thanks @twitu
- Fixed
DataEngineorder book snapshot timer names (could not parse instrument IDs with hyphens), thanks for reporting @x-zho14 and @dimitar-petrov - Fixed
LoggingConfigparsing ofWARNINGlog level (was not being recognized), thanks for reporting @davidsblom - Fixed Binance Futures
QuoteTickparsing to capture event time forts_event, thanks for reporting @x-zho14
NautilusTrader 1.183.0 Beta
Released on 12th January 2024 (UTC).
Enhancements
- Added
NautilusConfig.json_primitivesto convert object to Python dictionary with JSON primitive values - Added
InstrumentClass.BOND - Added
MessageBusConfiguse_trader_prefixanduse_trader_idconfig options (provides more control over stream names) - Added
CacheConfig.drop_instruments_on_reset(defaultTrueto retain current behavior) - Implemented core logging interface via the
logcrate, thanks @twitu - Implemented global atomic clock in Rust (improves performance and ensures properly monotonic timestamps in real-time), thanks @twitu
- Improved Interactive Brokers adapter raising docker
RuntimeErroronly when needed (not when using TWS), thanks @rsmb7z - Upgraded core HTTP client to latest
hyperandreqwest, thanks @ayush-sb - Optimized Arrow encoding (resulting in ~100x faster writes for the Parquet data catalog)
Breaking Changes
- Changed
ParquetDataCatalogcustom data prefix fromgeneticdata_tocustom_(you will need to rename any catalog subdirs) - Changed
ComponentStateChangedArrow schema forconfigfromstringtobinary - Changed
OrderInitializedArrow schema foroptionsfromstringtobinary - Changed
OrderBookDeltasdictionary representation ofdeltasfield from JSONbytesto a list ofdict(standardize with all other data types) - Changed external message publishing stream name keys to be
trader-{trader_id}-{instance_id}-streams(with options allows many traders to publish to the same streams) - Renamed all version 2 data wrangler classes with a
V2suffix for clarity - Renamed
GenericDatatoCustomData(more accurately reflects the nature of the type) - Renamed
DataClient.subscribed_generic_datato.subscribed_custom_data - Renamed
MessageBusConfig.streamto.streams_prefix(more accurate) - Renamed
ParquetDataCatalog.generic_datato.custom_data - Renamed
TradeReporttoFillReport(more conventional terminology, and more clearly separates market data from user execution reports) - Renamed
asset_typetoinstrument_classacross the codebase (more conventional terminology) - Renamed
AssetTypeenum toInstrumentClass(more conventional terminology) - Renamed
AssetClass.BONDtoAssetClass.DEBT(more conventional terminology) - Removed
AssetClass.METAL(not strictly an asset class, more a futures category) - Removed
AssetClass.ENERGY(not strictly an asset class, more a futures category) - Removed
multiplierparameter fromEquityconstructor (not applicable) - Removed
size_precision,size_increment, andmultiplierfields fromEquitydictionary representation (not applicable) - Removed
TracingConfig(now redundant with new logging implementation) - Removed
Tickerdata type and associated methods (not a type which can be practically normalized and so becomes adapter specific generic data) - Moved
AssetClass.SPORTS_BETTINGtoInstrumentClass.SPORTS_BETTING
Fixes
- Fixed logger thread leak, thanks @twitu
- Fixed handling of configuration objects to work with
StreamingFeatherWriter - Fixed
BinanceSpotInstrumentProviderfee loading key error for partial instruments load, thanks for reporting @doublier1 - Fixed Binance API key configuration parsing for testnet (was falling through to non-testnet env vars)
- Fixed TWAP execution algorithm scheduled size handling when first order should be for the entire size, thanks for reporting @pcgm-team
- Added
BinanceErrorCode.SERVER_BUSY(-1008), also added to the retry error codes - Added
BinanceOrderStatus.EXPIRED_IN_MATCHwhich is when an order was canceled by the exchange due self-trade prevention (STP), thanks for reporting @doublier1
NautilusTrader 1.182.0 Beta
Released on 23rd December 2023 (UTC).
Enhancements
- Added
CacheDatabaseFacadeandCacheDatabaseAdapterto abstract backing technology from Python codebase - Added
RedisCacheDatabaseimplemented in Rust with separate MPSC channel thread for insert, update and delete operations - Added TA-Lib integration, thanks @rsmb7z
- Added
OrderBookDeltaandOrderBookDeltasto serializable and publishable types - Moved
PortfolioFacadetoActor - Improved
ActorandStrategyusability to be more lenient to mistaken calls toclockandloggerfrom the constructor (warnings also added to docs) - Removed
redisandhiredisdependencies from Python codebase
Breaking Changes
- Changed configuration objects to take stronger types as these are now serializable when registered (rather than primitives)
- Changed
NautilusKernelConfig.trader_idto typeTraderId - Changed
BacktestDataConfig.instrument_idto typeInstrumentId - Changed
ActorConfig.component_idto typeComponentId | None - Changed
StrategyConfig.strategy_idto typeStrategyId | None - Changed
Instrument,OrderFilledandAccountStateinfofield serialization due below fix (you'll need to flush your cache) - Changed
CacheConfigto take aDatabaseConfig(better symmetry withMessageBusConfig) - Changed
RedisCacheDatabasedata structure for currencies from hashset to simpler key-value (you'll need to clear cache or delete all currency keys) - Changed
Actorstate loading to now use the standardSerializer - Renamed
register_json_encodingtoregister_config_encoding - Renamed
register_json_decodingtoregister_config_decoding - Removed
CacheDatabaseConfig(due above config change) - Removed
infrastructuresubpackage (now redundant with new Rust implementation)
Fixes
- Fixed
jsonencoding forCacheDatabaseAdapterfrominfofield serialization fix below - Fixed
Instrument,OrderFilledandAccountStateinfofield serialization to retain JSON serializable dicts (rather than double encoding and losing information) - Fixed Binance Futures
good_till_datevalue whentime_in_forcenot GTD, such as when strategy is managing the GTD (was incorrectly passing through UNIX milliseconds) - Fixed
Executorhandling of queued task IDs (was not discarding from queued tasks on completion) - Fixed
DataEnginehandling of order book snapshots with very small intervals (now handles as short as 20 milliseconds) - Fixed
BacktestEngine.clear_actors(),BacktestEngine.clear_strategies()andBacktestEngine.clear_exec_algorithms(), thanks for reporting @davidsblom - Fixed
BacktestEngineOrderEmulator reset, thanks @davidsblom - Fixed
Throttler.resetand reset ofRiskEnginethrottlers, thanks @davidsblom
NautilusTrader 1.181.0 Beta
Released on 2nd December (UTC).
This release adds support for Python 3.12.
Enhancements
- Rewrote Interactive Brokers integration documentation, many thanks @benjaminsingleton
- Added Interactive Brokers adapter support for crypto instruments with cash quantity, thanks @benjaminsingleton
- Added
HistoricInteractiveBrokerClient, thanks @benjaminsingleton and @limx0 - Added
DataEngineConfig.time_bars_interval_type(determines the type of interval used for time aggregationleft-openorright-open) - Added
LoggingConfig.log_colorsto optionally use ANSI codes to produce colored logs (defaultTrueto retain current behavior) - Added
QuoteTickDataWrangler.process_bar_dataoptions foroffset_interval_msandtimestamp_is_close - Added identifier generators in Rust, thanks @filipmacek
- Added
OrderFactoryin Rust, thanks @filipmacek - Added
WilderMovingAveragein Rust, thanks @ayush-sb - Added
HullMovingAveragein Rust, thanks @ayush-sb - Added all common identifier generators in Rust, thanks @filipmacek
- Added generic SQL database support with
sqlxin Rust, thanks @filipmacek
Breaking Changes
- Consolidated all
datasubmodules into onedatamodule (reduce binary wheel size) - Moved
OrderBookfrommodel.orderbook.booktomodel.book(subpackage only had this single module) - Moved
Currencyfrommodel.currencytomodel.objects(consolidating modules to reduce binary wheel size) - Moved
MessageBusfromcommon.msgbustocommon.component(consolidating modules to reduce binary wheel size) - Moved
MsgSpecSerializerfromserialization.msgpack.serializertoserialization.serializer - Moved
CacheConfigsnapshot_orders,snapshot_positions,snapshot_positions_intervaltoNautilusKernelConfig(logical applicability) - Renamed
MsgPackSerializertoMsgSpecSeralizer(now handles both JSON and MsgPack formats)
Fixes
- Fixed missing
trader_idinPositiondictionary representation, thanks @filipmacek - Fixed conversion of fixed-point integers to floats (should be dividing to avoid rounding errors), thanks for reporting @filipmacek
- Fixed daily timestamp parsing for Interactive Brokers, thanks @benjaminsingleton
- Fixed live reconciliation trade processing for partially filled then canceled orders
- Fixed
RiskEnginecumulative notional risk check forCurrencyPairSELL orders on multi-currency cash accounts
NautilusTrader 1.180.0 Beta
Released on 3rd November 2023 (UTC).
Enhancements
- Improved internal latency for live engines by using
loop.call_soon_threadsafe(...) - Improved
RedisCacheDatabaseclient connection error handling with retries - Added
WebSocketClientconnection headers, thanks @ruthvik125 and @twitu - Added
support_contingent_ordersconfig option for venues (to simulate venues which do not support contingent orders) - Added
StrategyConfig.manage_contingent_ordersconfig option (to automatically manage open contingent orders) - Added
FuturesContract.activation_utcproperty which returns apd.Timestamptz-aware (UTC) - Added
OptionContract.activation_utcproperty which returns apd.Timestamptz-aware (UTC) - Added
CryptoFuture.activation_utcproperty which returns apd.Timestamptz-aware (UTC) - Added
FuturesContract.expiration_utcproperty which returns apd.Timestamptz-aware (UTC) - Added
OptionContract.expiration_utcproperty which returns apd.Timestamptz-aware (UTC) - Added
CryptoFuture.expiration_utcproperty which returns apd.Timestamptz-aware (UTC)
Breaking Changes
- Renamed
FuturesContract.expiry_datetoexpiration_ns(and associated params) asuint64_tUNIX nanoseconds - Renamed
OptionContract.expiry_datetoexpiration_ns(and associated params) asuint64_tUNIX nanoseconds - Renamed
CryptoFuture.expiry_datetoexpiration_ns(and associated params) asuint64_tUNIX nanoseconds - Changed
FuturesContractArrow schema - Changed
OptionContractArrow schema - Changed
CryptoFutureArrow schema - Transformed orders will now retain the original
ts_inittimestamp - Removed unimplemented
batch_moreoption forStrategy.modify_order - Removed
InstrumentProvider.venueproperty (redundant as a provider may have many venues) - Dropped support for Python 3.9
Fixes
- Fixed
ParquetDataCatalogfile writing template, thanks @limx0 - Fixed Binance all orders requests which would omit order reports when using a
startparam - Fixed managed GTD orders past expiry cancellation on restart (orders were not being canceled)
- Fixed managed GTD orders cancel timer on order cancel (timers were not being canceled)
- Fixed
BacktestEnginelogging error with immediate stop (caused by certain timestamps beingNone) - Fixed
BacktestNodeexceptions during backtest runs preventing next sequential run, thanks for reporting @cavan-black - Fixed
BinanceSpotPermissionvalue error by relaxing typing forBinanceSpotSymbolInfo.permissions - Interactive Brokers adapter various fixes, thanks @rsmb7z
NautilusTrader 1.179.0 Beta
Released on 22nd October 2023 (UTC).
A major feature of this release is the ParquetDataCatalog version 2, which represents months of
collective effort thanks to contributions from Brad @limx0, @twitu, @ghill2 and @davidsblom.
This will be the final release with support for Python 3.9.
Enhancements
- Added
ParquetDataCatalogv2 supporting built-in data typesOrderBookDelta,QuoteTick,TradeTickandBar - Added
Strategyspecific order and position event handlers - Added
ExecAlgorithmspecific order and position event handlers - Added
Cache.is_order_pending_cancel_local(...)(tracks local orders in cancel transition) - Added
BinanceTimeInForce.GTDenum member (futures only) - Added Binance Futures support for GTD orders
- Added Binance internal bar aggregation inference from aggregated trades or 1-MINUTE bars (depending on lookback window)
- Added
BinanceExecClientConfig.use_gtdconfig option (to remap to GTC and locally manage GTD orders) - Added package version check for
nautilus_ibapi, thanks @rsmb7z - Added
RiskEnginemin/max instrument notional limit checks - Added
Controllerfor dynamically controlling actor and strategy instances for aTrader - Added
ReportProvider.generate_fills_report(...)which provides a row per individual fill event, thanks @r3k4mn14r - Moved indicator registration and data handling down to
Actor(now available forActor) - Implemented Binance
WebSocketClientlive subscribe and unsubscribe - Implemented
BinanceCommonDataClientretries forupdate_instruments - Decythonized
Trader
Breaking Changes
- Renamed
BookType.L1_TBBOtoBookType.L1_MBP(more accurate definition, as L1 is the top-level price either side) - Renamed
VenueStatusUpdate->VenueStatus - Renamed
InstrumentStatusUpdate->InstrumentStatus - Renamed
Actor.subscribe_venue_status_updates(...)toActor.subscribe_venue_status(...) - Renamed
Actor.subscribe_instrument_status_updates(...)toActor.subscribe_instrument_status(...) - Renamed
Actor.unsubscribe_venue_status_updates(...)toActor.unsubscribe_venue_status(...) - Renamed
Actor.unsubscribe_instrument_status_updates(...)toActor.unsubscribe_instrument_status(...) - Renamed
Actor.on_venue_status_update(...)toActor.on_venue_status(...) - Renamed
Actor.on_instrument_status_update(...)toActor.on_instrument_status(...) - Changed
InstrumentStatusfields/schema and constructor - Moved
manage_gtd_expiryfromStrategy.submit_order(...)andStrategy.submit_order_list(...)toStrategyConfig(simpler and allows re-activating any GTD timers on start)
Fixes
- Fixed
LimitIfTouchedOrder.create(exec_algorithm_paramswere not being passed in) - Fixed
OrderEmulatorstart-up processing of OTO contingent orders (when position from parent is open) - Fixed
SandboxExecutionClientConfigkw_only=Trueto allow importing without initializing - Fixed
OrderBookpickling (did not include all attributes), thanks @limx0 - Fixed open position snapshots race condition (added
open_onlyflag) - Fixed
Strategy.cancel_orderfor orders inINITIALIZEDstate and with anemulation_trigger(was not sending command toOrderEmulator) - Fixed
BinanceWebSocketClientreconnect behavior (reconnect handler was not being called due event loop issue from Rust) - Fixed Binance instruments missing max notional values, thanks for reporting @AnthonyVince and thanks for fixing @filipmacek
- Fixed Binance Futures fee rates for backtesting
- Fixed
Timermissing condition check for non-positive intervals - Fixed
Conditionchecks involving integers, was previously defaulting to 32-bit and overflowing - Fixed
ReportProvider.generate_order_fills_report(...)which was missing partial fills for orders not in a finalFILLEDstatus, thanks @r3k4mn14r
NautilusTrader 1.178.0 Beta
Released on 2nd September 2023 (UTC).
Enhancements
None
Breaking Changes
None
Fixes
- Fixed
OrderBookDelta.clearmethod (where thesequencefield was swapped withflagscausing an overflow) - Fixed
OrderManagerOTO contingency handling on fills - Fixed
OrderManagerduplicate order canceled events (race condition when processing contingencies) - Fixed
Cacheloading of initialized emulated orders (were not being correctly indexed as emulated) - Fixed Binance order book subscriptions for deltas at full depth (was not requesting initial snapshot), thanks for reporting @doublier1
NautilusTrader 1.177.0 Beta
Released on 26th August 2023 (UTC).
This release includes a large breaking change to quote tick bid and ask price property and parameter naming. This was done in the interest of maintaining our generally explicit naming standards, and has caused confusion for some users in the past. Data using 'bid' and 'ask' columns should still work with the legacy data wranglers, as columns are renamed under the hood to accommodate this change.
Enhancements
- Added
ActorExecutorwithActorAPI for creating and running threaded tasks in live environments - Added
OrderEmulatedevent and associatedOrderStatus.EMULATEDenum variant - Added
OrderReleasedevent and associatedOrderStatus.RELEASEDenum variant - Added
BacktestVenueConfig.use_position_idsconfig option (defaultTrueto retain current behavior) - Added
Cache.exec_spawn_total_quantity(...)convenience method - Added
Cache.exec_spawn_total_filled_qty(...)convenience method - Added
Cache.exec_spawn_total_leaves_qty(...)convenience method - Added
WebSocketClient.send_text, thanks @twitu - Implemented string interning for
TimeEvent
Breaking Changes
- Renamed
QuoteTick.bidtobid_priceincluding all associated parameters (for explicit naming standards) - Renamed
QuoteTick.asktoask_priceincluding all associated parameters (for explicit naming standards)
Fixes
- Fixed execution algorithm
position_idassignment inHEDGINGmode - Fixed
OrderMatchingEngineprocessing of emulated orders - Fixed
OrderEmulatorprocessing of exec algorithm orders - Fixed
ExecutionEngineprocessing of exec algorithm orders (exec spawn IDs) - Fixed
Cacheemulated order indexing (were not being properly discarded from the set when closed) - Fixed
RedisCacheDatabaseloading of transformedLIMITorders - Fixed a connection issue with the IB client, thanks @dkharrat and @rsmb7z
NautilusTrader 1.176.0 Beta
Released on 31st July 2023 (UTC).
Enhancements
- Implemented string interning with the ustr crate, thanks @twitu
- Added
SyntheticInstrumentcapability, including dynamic derivation formulas - Added
Order.commissions()convenience method (also added to state snapshot dictionaries) - Added
Cacheposition and order state snapshots (configure viaCacheConfig) - Added
CacheDatabaseConfig.timestamps_as_iso8601to persist timestamps as ISO 8601 strings - Added
LiveExecEngineConfig.filter_position_reportsto filter position reports from reconciliation - Added
Strategy.cancel_gtd_expiryto cancel managed GTD order expiration - Added Binance Futures support for modifying
LIMITorders - Added
BinanceExecClientConfig.max_retriesconfig option (for retrying order submit and cancel requests) - Added
BinanceExecClientConfig.retry_delayconfig option (the delay between retry attempts) - Added
BinanceExecClientConfig.use_reduce_onlyconfig option (defaultTrueto retain current behavior) - Added
BinanceExecClientConfig.use_position_idsconfig option (defaultTrueto retain current behavior) - Added
BinanceExecClientConfig.treat_expired_as_canceledoption (defaultFalseto retain current behavior) - Added
BacktestVenueConfig.use_reduce_onlyconfig option (defaultTrueto retain current behavior) - Added
MessageBus.is_pending_request(...)method - Added
LevelAPI for coreOrderBook(exposes the bid and ask levels for the order book) - Added
Actor.is_pending_request(...)convenience method - Added
Actor.has_pending_requests()convenience method - Added
Actor.pending_requests()convenience method - Added
USDP(Pax Dollar) andTUSD(TrueUSD) stablecoins - Improved
OrderMatchingEnginehandling when no fills (an error is now logged) - Improved Binance live clients logging
- Upgraded Cython to v3.0.0 stable
Breaking Changes
- Moved
filter_unclaimed_external_ordersfromExecEngineConfigtoLiveExecEngineConfig - All
Actor.request_*methods no longer take arequest_id, but now return aUUID4request ID - Removed
BinanceExecClientConfig.warn_gtd_to_gtd(now always anINFOlevel log) - Renamed
Instrument.native_symboltoraw_symbol(you must manually migrate or flush your cached instruments) - Renamed
Position.cost_currencytosettlement_currency(standardize terminology) - Renamed
CacheDatabaseConfig.flushtoflush_on_start(for clarity) - Changed
Order.ts_lastto represent the UNIX nanoseconds timestamp of the last event (rather than fill)
Fixes
- Fixed
Portfolio.net_positioncalculation to useDecimalrather thanfloatto avoid rounding errors - Fixed race condition on
OrderFactoryorder identifiers generation - Fixed dictionary representation of orders for
venue_order_id(for three order types) - Fixed
Currencyregistration with core global map on creation - Fixed serialization of
OrderInitialized.exec_algorithm_paramsto spec (bytes rather than string) - Fixed assignment of position IDs for contingent orders (when parent filled)
- Fixed
PENDING_CANCEL->EXPIREDas valid state transition (real world possibility) - Fixed fill handling of
reduce_onlyorders when partially filled - Fixed Binance reconciliation which was requesting reports for the same symbol multiple times
- Fixed Binance Futures native symbol parsing (was actually Nautilus symbol values)
- Fixed Binance Futures
PositionStatusReportparsing of position side - Fixed Binance Futures
TradeReportassignment of position ID (was hardcoded to hedging mode) - Fixed Binance execution submitting of order lists
- Fixed Binance commission rates requests for
InstrumentProvider - Fixed Binance
TriggerTypeparsing #1154, thanks for reporting @davidblom603 - Fixed Binance order parsing of invalid orders in execution reports #1157, thanks for reporting @graceyangfan
- Extended
BinanceOrderTypeenum members to include undocumentedINSURANCE_FUND, thanks for reporting @Tzumx - Extended
BinanceSpotPermissionsenum members #1161, thanks for reporting @davidblom603
NautilusTrader 1.175.0 Beta
Released on 16th June 2023 (UTC).
The Betfair adapter is broken for this release pending integration with the new Rust order book. We recommend you do not upgrade to this version if you're using the Betfair adapter.
Enhancements
- Integrated Interactive Brokers adapter v2 into platform, thanks @rsmb7z
- Integrated core Rust
OrderBookinto platform - Integrated core Rust
OrderBookDeltadata type - Added core Rust
HttpClientbased onhyper, thanks @twitu - Added core Rust
WebSocketClientbased ontokio-tungstenite, thanks @twitu - Added core Rust
SocketClientbased ontokioTcpStream, thanks @twitu - Added
quote_quantityparameter to determine if order quantity is denominated in quote currency - Added
trigger_instrument_idparameter to trigger emulated orders from alternative instrument prices - Added
use_random_idstoadd_venue(...)method, controls whether venue order, position and trade IDs will be random UUID4s (no change to current behavior) - Added
ExecEngineConfig.filter_unclaimed_external_ordersconfig option, if unclaimed order events with anEXTERNALstrategy ID should be filtered/dropped - Changed
BinanceHttpClientto use new core HTTP client - Defined public API for data, can now import directly from
nautilus_trader.model.data(denest namespace) - Defined public API for events, can now import directly from
nautilus_trader.model.events(denest namespace)
Breaking Changes
- Upgraded
pandasto v2 - Removed
OrderBookSnapshot(redundant as can be represented as an initial CLEAR followed by deltas) - Removed
OrderBookData(redundant) - Renamed
Actor.handle_order_book_deltatohandle_order_book_deltas(to more clearly reflect theOrderBookDeltasdata type) - Renamed
Actor.on_order_book_deltatoon_order_book_deltas(to more clearly reflect theOrderBookDeltasdata type) - Renamed
inverse_as_quotetouse_quote_for_inverse(ambiguous name, only applicable for notional calcs on inverse instruments) - Changed
Datacontract (custom data), see docs - Renamed core
LogMessagetoLogEventto more clearly distinguish between themessagefield and the event struct itself (aligns with vector language) - Renamed core
LogEvent.timestamp_nstoLogEvent.timestamp(affects field name for JSON format) - Renamed core
LogEvent.msgtoLogEvent.message(affects field name for JSON format)
Fixes
- Updated
BinanceAccountTypeenum members and associated docs - Fixed
BinanceCommonExecutionClientiteration ofOrderListorders - Fixed heartbeats for
BinanceWebSocketClient(new Rust client now responds withpongframes) - Fixed Binance adapter typing for
orderId,fromId,startTimeandendTime(all are ints), thanks for reporting @davidsblom - Fixed
Currencyequality to be based on thecodefield (avoiding equality issues over FFI), thanks for reporting @Otlk - Fixed
BinanceInstrumentProviderparsing of initial and maintenance margin values
NautilusTrader 1.174.0 Beta
Released on 19th May 2023 (UTC).
Breaking Changes
- Parquet schemas are now shifting towards catalog v2 (we recommend you don't upgrade if using legacy catalog)
- Moved order book data from
model.orderbook.datainto themodel.data.booknamespace
Enhancements
- Improved handling for backtest account blow-up scenarios (balance negative or margin exceeded)
- Added
AccountMarginExceededexception and refinedAccountBalanceNegative - Various improvements to Binance clients error handling and logging
- Improve Binance HTTP error messages
Fixes
- Fixed handling of emulated order contingencies (not based on status of spawned algorithm orders)
- Fixed sending execution algorithm commands from strategy
- Fixed
OrderEmulatorreleasing of already closed orders - Fixed
MatchingEngineprocessing of reduce only for child contingent orders - Fixed
MatchingEngineposition ID assignment for child contingent orders - Fixed
Actorhandling of historical data from requests (will now callon_historical_dataregardless of state), thanks for reporting @miller-moore - Fixed
pyarrowschema dictionary index keys being too narrow (int8 -> int16), thanks for reporting @rterbush
NautilusTrader 1.173.0 Beta
Released on 5th May 2023 (UTC).
Breaking Changes
None
Enhancements
None
Fixes
- Fixed
BacktestEngineprocessing of venue(s) message queue based off time eventts_init - Fixed
Position.signed_decimal_qty(incorrect format precision in f-string), thanks for reporting @rsmb7z - Fixed trailing stop type order updates for
reduce_onlyinstruction, thanks for reporting @Otlk - Fixed updating of active execution algorithm orders (events weren't being cached)
- Fixed condition check for applying pending events (do not apply to orders at
INITIALIZEDstatus)
NautilusTrader 1.172.0 Beta
Released on 30th April 2023 (UTC).
Breaking Changes
- Removed legacy Rust parquet data catalog backend (based on arrow2)
- Removed Binance config for
clock_sync_interval_secs(redundant/unused and should be handled at system level) - Removed redundant rate limiting from Rust logger (and associated
rate_limitconfig params) - Renamed
Futureinstrument toFuturesContract(avoids ambiguity) - Renamed
Optioninstrument toOptionContract(avoids ambiguity and naming conflicts in Rust) - Reinstate hours and minutes time component for default order and position identifiers (easier debugging, less collisions)
- Setting time alerts for in the past or current time will generate an immediate
TimeEvent(rather than being invalid)
Enhancements
- Added new DataFusion Rust parquet data catalog backend (yet to be integrated into Python)
- Added
external_order_claimsconfig option forStrategyConfig(for claiming external orders per instrument) - Added
Order.signed_decimal_qty() - Added
Cache.orders_for_exec_algorithm(...) - Added
Cache.orders_for_exec_spawn(...) - Added
TWAPExecAlgorithmandTWAPExecAlgorithmConfigto examples - Build out
ExecAlgorithmbase class for implementing 'first class' execution algorithms - Rewired execution for improved flow flexibility between emulated orders, execution algorithms and the
RiskEngine - Improved handling for
OrderEmulatorupdating of contingent orders from execution algorithms - Defined public API for instruments, can now import directly from
nautilus_trader.model.instruments(denest namespace) - Defined public API for orders, can now import directly from
nautilus_trader.model.orders(denest namespace) - Defined public API for order book, can now import directly from
nautilus_trader.model.orderbook(denest namespace) - Now stripping debug symbols after build (reduced binary wheel size)
- Refined build and added additional
debugMakefile convenience targets
Fixes
- Fixed processing of contingent orders when in a pending update state
- Fixed calculation of PnL for flipped positions (only book realized PnL against open position)
- Fixed
WebSocketClientsession disconnect, thanks for reporting @miller-moore - Added missing
BinanceSymbolFilterType.NOTIONAL - Fixed incorrect
Multrait forPriceandQuantity(not being used in Cython/Python layer)
NautilusTrader 1.171.0 Beta
Released on 30th March 2023 (UTC).
Breaking Changes
- Renamed all position
net_qtyfields and parameters tosigned_qty(more accurate naming) NautilusKernelConfigremoved alllog_*config options (replaced byloggingwithLoggingConfig)- Trading
CurrencyPairinstruments with a single-currencyCASHaccount type no longer permitted (unrealistic) - Changed
PositionEventparquet schemas (renamednet_qtyfield tosigned_qty)
Enhancements
- Added
LoggingConfigto consolidate logging configs, offering various file options and per component level filters - Added
BacktestVenueConfig.bar_executionto control whether bar data moves the matching engine markets (reinstated) - Added optional
request_idfor actor data requests (aids processing responses), thanks @rsmb7z - Added
Position.signed_decimal_qty() - Now using above signed quantity for
Portfolionet position calculation, andLiveExecutionEnginereconciliation comparisons
Fixes
- Fixed
BacktestEngineclock and logger handling (had a redundant extra logger and not swapping live clock in post run) - Fixed
close_positionorder event publishing and cache persistence forMarketOrderandSubmitOrder, thanks for reporting @rsmb7z
NautilusTrader 1.170.0 Beta
Released on 11th March 2023 (UTC).
Breaking Changes
- Moved
backtest.data.providerstotest_kit.providers - Moved
backtest.data.wranglerstopersistence.wranglers(to be consolidated) - Moved
backtest.data.loaderstopersistence.loaders(to be consolidated) - Renamed
from_datetimetostartacross data request methods and properties - Renamed
to_datetimetoendacross data request methods and properties - Removed
RiskEngineConfig.deny_modify_pending_update(as now redundant with new pending event sequencing) - Removed redundant log sink machinery
- Changed parquet catalog schema dictionary integer key widths/types
- Invalidated all pickled data due to Cython 3.0.0b1 upgrade
Enhancements
- Added logging to file at core Rust level
- Added
DataCatalogConfigfor more cohesive data catalog configuration - Added
DataEngine.register_catalogto support historical data requests - Added
catalog_configfield to baseNautilusKernelConfig - Changed to immediately caching orders and order lists in
Strategy - Changed to checking duplicate
client_order_idandorder_list_idinStrategy - Changed generating and applying
OrderPendingUpdateandOrderPendingCancelinStrategy PortfolioAnalyzerPnL statistics now take optionalunrealized_pnl- Backtest performance statistics now include unrealized PnL in total PnL
Fixes
- Fixed Binance Futures trigger type parsing
- Fixed
DataEnginebar subscribe and unsubscribe logic, thanks for reporting @rsmb7z - Fixed
Actorhandling of bars, thanks @limx0 - Fixed
CancelAllOrderscommand handling for contingent orders not yet in matching core - Fixed
TrailingStopMarketOrderslippage calculation when notrigger_price, thanks for reporting @rsmb7z - Fixed
BinanceSpotInstrumentProviderparsing of quote asset (was using base), thanks for reporting @logogin - Fixed undocumented Binance time in force 'GTE_GTC', thanks for reporting @graceyangfan
- Fixed
Positioncalculation oflast_qtywhen commission currency was equal to base currency, thanks for reporting @rsmb7z - Fixed
BacktestEnginepost backtest run PnL performance statistics for currencies traded per venue, thanks for reporting @rsmb7z
NautilusTrader 1.169.0 Beta
Released on 18th February 2023 (UTC).
Breaking Changes
NautilusConfigobjects now pseudo-immutable from new msgspec 0.13.0- Renamed
OrderFactory.bracketparameterpost_only_entry->entry_post_only(consistency with other params) - Renamed
OrderFactory.bracketparameterpost_only_tp->tp_post_only(consistency with other params) - Renamed
build_time_bars_with_no_updates->time_bars_build_with_no_updates(consistency with new param) - Renamed
OrderFactory.set_order_count()->set_client_order_id_count()(clarity) - Renamed
TradingNode.start()toTradingNode.run()
Enhancements
- Complete overhaul and improvements to Binance adapter(s), thanks @poshcoe
- Added Binance aggregated trades functionality with
use_agg_trade_ticks, thanks @poshcoe - Added
time_bars_timestamp_on_closeconfig option for bar timestamping (Trueby default) - Added
OrderFactory.generate_client_order_id()(calls internal generator) - Added
OrderFactory.generate_order_list_id()(calls internal generator) - Added
OrderFactory.create_list(...)as easier method for creating order lists - Added
__len__implementation forOrderList(returns length of orders) - Implemented optimized logger using Rust MPSC channel and separate thread
- Expose and improve
MatchingEnginepublic API for custom functionality - Exposed
TradingNode.run_async()for easier running from async context - Exposed
TradingNode.stop_async()for easier stopping from async context
Fixes
- Fixed registration of
SimulationModule(and refineActorbase registration) - Fixed loading of previously emulated and transformed orders (handles transforming
OrderInitializedevent) - Fixed handling of
MARKET_TO_LIMITorders in matching and risk engines, thanks for reporting @martinsaip
NautilusTrader 1.168.0 Beta
Released on 29th January 2023 (UTC).
Breaking Changes
- Removed
Cache.clear_cache()(redundant with the.reset()method)
Enhancements
- Added
Cache.add(...)and.get(...)for general 'user/custom' objects (as bytes) - Added
CacheDatabase.add(...)and.load()for general cache objects (as bytes) - Added
RedisCacheDatabase.add(...)and.load()for general Redis persisted bytes objects (as bytes) - Added
Cache.actor_ids() - Added
Actorcached state saving and loading functionality - Improved logging for called action handlers when not overridden
Fixes
- Fixed configuration of loading and saving actor and strategy state
NautilusTrader 1.167.0 Beta
Released on 28th January 2023 (UTC).
Breaking Changes
- Renamed
OrderBookData.update_idtosequence - Renamed
BookOrder.idtoorder_id
Enhancements
- Introduced Rust PyO3 based
ParquetReaderandParquetWriter, thanks @twitu - Added
msgbus.is_subscribed(to check if topic and handler already subscribed) - Simplified message type model and introduce CQRS-ish live messaging architecture
Fixes
- Fixed Binance data clients order book startup buffer handling
- Fixed
NautilusKernelredundant initialization of event loop for backtesting, thanks @limx0 - Fixed
BacktestNodedisposal sequence - Fixed quick start docs and notebook
NautilusTrader 1.166.0 Beta
Released on 17th January 2023 (UTC).
Breaking Changes
Position.unrealized_pnlnowNoneuntil any realized PnL is generated (to reduce ambiguity)
Enhancements
- Added instrument status update subscription handlers, thanks @limx0
- Improvements to InteractiveBrokers
DataClient, thanks @rsmb7z - Improvements to async task handling for live clients
- Various improvements to Betfair adapter, thanks @limx0
Fixes
- Fixed netted
Positionrealized_pnlandrealized_returnfields, which were incorrectly cumulative - Fixed netted
Positionflip logic (now correctly 'resets' position) - Various fixes for Betfair adapter, thanks @limx0
- InteractiveBrokers integration docs fixes
NautilusTrader 1.165.0 Beta
Released on 14th January 2023 (UTC).
A number of enum variant names have been changed in favour of explicitness, and also to avoid C naming collisions.
Breaking Changes
- Renamed
AggressorSide.NONEtoNO_AGGRESSOR - Renamed
AggressorSide.BUYtoBUYER - Renamed
AggressorSide.SELLtoSELLER - Renamed
AssetClass.CRYPTOtoCRYPTOCURRENCY - Renamed
LiquiditySide.NONEtoNO_LIQUIDITY_SIDE - Renamed
OMSTypetoOmsType - Renamed
OmsType.NONEtoUNSPECIFIED - Renamed
OrderSide.NONEtoNO_ORDER_SIDE - Renamed
PositionSide.NONEtoNO_POSITION_SIDE - Renamed
TrailingOffsetType.NONEtoNO_TRAILING_OFFSET - Removed
TrailingOffsetType.DEFAULT - Renamed
TriggerType.NONEtoNO_TRIGGER - Renamed
TriggerType.LASTtoLAST_TRADE - Renamed
TriggerType.MARKtoMARK_PRICE - Renamed
TriggerType.INDEXtoINDEX_PRICE - Renamed
ComponentState.INITIALIZEDtoREADY - Renamed
OrderFactory.bracket(post_only)topost_only_entry - Moved
manage_gtd_expirytoStrategy.submit_order(...)andStrategy.submit_order_list(...)
Enhancements
- Added
BarSpecification.timedeltaproperty, thanks @rsmb7z - Added
DataEngineConfig.build_time_bars_with_no_updatesconfig option - Added
OrderFactory.bracket(post_only_tp)param - Added
OrderListIdGeneratorand integrate withOrderFactory - Added
Cache.add_order_list(...) - Added
Cache.order_list(...) - Added
Cache.order_lists(...) - Added
Cache.order_list_exists(...) - Added
Cache.order_list_ids(...) - Improved generation of
OrderListIdfrom factory to ensure uniqueness - Added auction matches for backtests, thanks @limx0
- Added
.timedeltaproperty toBarSpecification, thanks @rsmb7z - Numerous improvements to the Betfair adapter, thanks @limx0
- Improvements to Interactive Brokers data subscriptions, thanks @rsmb7z
- Added
DataEngineConfig.validate_data_sequence(defaultFalseand currently only forBardata), thanks @rsmb7z
Fixes
- Added
TRD_GRP_*enum variants for Binance spot permissions - Fixed
PARTIALLY_FILLED->EXPIREDorder state transition, thanks @bb01100100
NautilusTrader 1.164.0 Beta
Released on 23rd December 2022 (UTC).
Breaking Changes
None
Enhancements
- Added managed GTD order expiry (experimental feature, config may change)
- Added Rust
ParquetReaderandParquetWriter(forQuoteTickandTradeTickonly)
Fixes
- Fixed
MARKET_IF_TOUCHEDorders forOrderFactory.bracket(..) - Fixed
OrderEmulatortrigger event handling for live trading - Fixed
OrderEmulatortransformation to market orders which had a GTD time in force - Fixed serialization of
OrderUpdatedevents - Fixed typing and edge cases for new
msgspec, thanks @limx0 - Fixed data wrangler processing with missing data, thanks @rsmb7z
NautilusTrader 1.163.0 Beta
Released on 17th December 2022 (UTC).
Breaking Changes
None
Enhancements
None
Fixes
- Fixed
MARKET_IF_TOUCHEDandLIMIT_IF_TOUCHEDtrigger and modify behavior - Fixed
MatchingEngineupdates of stop order types - Fixed combinations of passive or immediate trigger vs passive or immediate fill behavior
- Fixed memory leaks from passing string pointers from Rust, thanks @twitu
NautilusTrader 1.162.0 Beta
Released on 12th December 2022 (UTC).
Breaking Changes
OrderFactorybracket order methods consolidated to.bracket(...)
Enhancements
- Extended
OrderFactoryto provide more bracket order types - Simplified GitHub CI and removed
noxdependency
Fixes
- Fixed
OrderBooksorting for bid side, thanks @gaugau3000 - Fixed
MARKET_TO_LIMITorder initial fill behavior - Fixed
BollingerBandsindicator mid-band calculations, thanks zhp (Discord)
NautilusTrader 1.161.0 Beta
Released on 10th December 2022 (UTC).
This release adds support for Python 3.11.
Breaking Changes
- Renamed
OrderFactory.bracket_markettoOrderFactory.bracket_market_entry - Renamed
OrderFactory.bracket_limittoOrderFactory.bracket_limit_entry - Renamed
OrderFactorybracket orderpriceandtrigger_priceparameters
Enhancements
- Consolidated config objects to
msgspecproviding better performance and correctness - Added
OrderFactory.bracket_stop_limit_entry_stop_limit_tp(...) - Numerous improvements to the Interactive Brokers adapter, thanks @limx0 and @rsmb7z
- Removed dependency on
pydantic
Fixes
- Fixed
STOP_MARKETorder behavior to fill at market on immediate trigger - Fixed
STOP_LIMITorder behavior to fill at market on immediate trigger and marketable - Fixed
STOP_LIMITorder behavior to fill at market on processed trigger and marketable - Fixed
LIMIT_IF_TOUCHEDorder behavior to fill at market on immediate trigger and marketable - Fixed Binance start and stop time units for bar (kline) requests, thanks @Tzumx
RiskEngineConfig.bypassset toTruewill now correctly bypass throttlers, thanks @DownBadCapital- Fixed updating of emulated orders
- Numerous fixes to the Interactive Brokers adapter, thanks @limx0 and @rsmb7z
NautilusTrader 1.160.0 Beta
Released on 28th November 2022 (UTC).
Breaking Changes
- Removed time portion from generated IDs (affects
ClientOrderIdandPositionOrderId) - Renamed
orderbook.data.Ordertoorderbook.data.BookOrder(reduce conflicts/confusion) - Renamed
Instrument.get_cost_currency(...)toInstrument.get_settlement_currency(...)(more accurate terminology)
Enhancements
- Added emulated contingent orders capability to
OrderEmulator - Moved
test_kitmodule to main package to support downstream project/package testing
Fixes
- Fixed position event sequencing: now generates
PositionOpenedwhen reopening a closed position - Fixed
LIMITorder fill characteristics when immediately marketable as a taker - Fixed
LIMITorder fill characteristics when passively filled as a maker as quotes move through - Fixed canceling OTO contingent orders when still in-flight
- Fixed
RiskEnginenotional check when selling cash assets (spot currency pairs) - Fixed flush on closed file bug for persistence stream writers
NautilusTrader 1.159.0 Beta
Released on 18th November 2022 (UTC).
Breaking Changes
- Removed FTX integration
- Renamed
SubmitOrderList.listtoSubmitOrderList.order_list - Slight adjustment to bar aggregation (will not use the last close as the open)
Enhancements
- Implemented
TRAILING_STOP_MARKETorders for Binance Futures (beta) - Added
OUOOne-Updates-OtherContingencyTypewith matching engine implementation - Added bar price fallback for exchange rate calculations, thanks @ghill2
Fixes
- Fixed dealloc of Rust backing struct on Python exceptions causing segfaults
- Fixed bar aggregation start times for bar specs outside typical intervals (60-SECOND rather than 1-MINUTE etc)
- Fixed backtest engine main loop ordering of time events with identically timestamped data
- Fixed
ModifyOrdermessagestrandreprwhen no quantity - Fixed OCO contingent orders which were actually implemented as OUO for backtests
- Fixed various bugs for Interactive Brokers integration, thanks @limx0 and @rsmb7z
- Fixed pyarrow version parsing, thanks @ghill2
- Fixed returning venue from InstrumentId, thanks @rsmb7z
NautilusTrader 1.158.0 Beta
Released on 3rd November 2022 (UTC).
Breaking Changes
- Added
LiveExecEngineConfig.reconciliationboolean flag to control if reconciliation is active - Removed
LiveExecEngineConfig.reconciliation_auto(unclear naming and concept) - All Redis keys have changed to a lowercase convention (either migrate or flush your Redis)
- Removed
BidAskMinMaxindicator (to reduce total package size) - Removed
HilbertPeriodindicator (to reduce total package size) - Removed
HilbertSignalNoiseRatioindicator (to reduce total package size) - Removed
HilbertTransformindicator (to reduce total package size)
Enhancements
- Improved accuracy of clocks for backtests (all clocks will now match generated
TimeEvents) - Improved risk engine checks for
reduce_onlyorders - Added
Actor.request_instruments(...)method - Added
Order.would_reduce_only(...)method - Extended instrument(s) Req/Res handling for
DataClientand `Actor
Fixes
- Fixed memory management for Rust backing structs (now being properly freed)
NautilusTrader 1.157.0 Beta
Released on 24th October 2022 (UTC).
Breaking Changes
- None
Enhancements
- Added experimental local order emulation for all order types (except
MARKETandMARKET_TO_LIMIT) see docs - Added
min_latency,max_latencyandavg_latencytoHttpClientbase class
Fixes
- Fixed Binance Spot
display_qtyfor iceberg orders, thanks @JackMa - Fixed Binance HTTP client error logging
NautilusTrader 1.156.0 Beta
Released on 19th October 2022 (UTC).
This will be the final release with support for Python 3.8.
Breaking Changes
- Added
OrderSide.NONEenum variant - Added
PositionSide.NO_POSITION_SIDEenum variant - Changed order of
TriggerTypeenum variants - Renamed
AggressorSide.UNKNOWNtoAggressorSide.NONE(for consistency with other enums) - Renamed
Order.typetoOrder.order_type(reduces ambiguity and aligns with Rust struct field) - Renamed
OrderInitialized.typetoOrderInitialized.order_typereduces ambiguity) - Renamed
Bar.typetoBar.bar_type(reduces ambiguity and aligns with Rust struct field) - Removed redundant
check_position_existsflag - Removed
hyperoptas considered unmaintained and there are better options - Existing pickled data for
QuoteTickis now invalid (change to schema for correctness) - Existing catalog data for
OrderInitializedis now invalid (change to schema for emulation)
Enhancements
- Added configurable automated in-flight order status checks
- Added order
sidefilter to numerous cache order methods - Added position
sidefilter to numerous cache position methods - Added optional
order_sidetocancel_all_ordersstrategy method - Added optional
position_sidetoclose_all_positionsstrategy method - Added support for Binance Spot second bars
- Added
RelativeVolatilityIndexindicator, thanks @graceyangfan - Extracted
OrderMatchingEnginefromSimulatedExchangewith refinements - Extracted
MatchingCorefromOrderMatchingEngine - Improved HTTP error handling and client logging (messages now contain reason)
Fixes
- Fixed price and size precision validation for
QuoteTickfrom raw values - Fixed IB adapter data parsing for decimal precision
- Fixed HTTP error handling and releasing of response coroutines, thanks @JackMa
- Fixed
Positioncalculations and account for when any base currency == commission currency, thanks @JackMa
NautilusTrader 1.155.0 Beta
Released on September 15th 2022 (UTC).
This is an early release to address some parsing bugs in the FTX adapter.
Breaking Changes
None
Enhancements
None
Fixes
- Fixed parsing bug for FTX futures
- Fixed parsing bug for FTX
Bar
NautilusTrader 1.154.0 Beta
Released on September 14th 2022 (UTC).
Breaking Changes
- Changed
ExecEngineConfigallow_cash_positionsdefault toTrue(more typical use case) - Removed
checkparameter fromBar(always checked for simplicity)
Enhancements
- Added
MARKET_TO_LIMITorder implementation forSimulatedExchange - Make strategy
order_id_tagtruly optional and auto incrementing - Added PsychologicalLine indicator, thanks @graceyangfan
- Added initial Rust parquet integration, thanks @twitu and @ghill2
- Added validation for setting leverages on
CASHaccounts - De-cythonized live data and execution client base classes for usability
Fixes
- Fixed limit order
IOCandFOKbehavior, thanks @limx0 for identifying - Fixed FTX
CryptoFutureinstrument parsing, thanks @limx0 - Fixed missing imports in data catalog example notebook, thanks @gaugau3000
- Fixed order update behavior, affected orders:
LIMIT_IF_TOUCHEDMARKET_IF_TOUCHEDMARKET_TO_LIMITSTOP_LIMIT
NautilusTrader 1.153.0 Beta
Released on September 6th 2022 (UTC).
Breaking Changes
None
Enhancements
- Added trigger orders for FTX adapter
- Improved
BinanceBarto handle enormous quote volumes - Improved robustness of instrument parsing for Binance and FTX adapters
- Improved robustness of WebSocket message handling for Binance and FTX adapters
- Added
override_usdoption for FTX adapter - Added
log_warningsconfig option for Binance and FTX instrument providers - Added
TRD_GRP_005enum variant for Binance spot permissions
Fixes
- Fixed bar aggregator partial bar handling
- Fixed
CurrencyTypevariants in Rust - Fixed missing
encodingin Catalog parsing method, thanks @limx0 and @aviatorBeijing
NautilusTrader 1.152.0 Beta
Released on September 1st 2022 (UTC).
Breaking Changes
- Renamed
offset_typetotrailing_offset_type - Renamed
is_frozen_accounttofrozen_account - Removed
bar_executionfrom config API (implicitly turned on with bars currently)
Enhancements
- Added
TRAILING_STOP_MARKETorder implementation forSimulatedExchange - Added
TRAILING_STOP_LIMITorder implementation forSimulatedExchange - Added all simulated exchange options to
BacktestVenueConfig
Fixes
- Fixed creation and caching of order book on subscribing to deltas, thanks @limx0
- Fixed use of
LoopTimerin live clock for trading node, thanks @sidnvy - Fixed order cancels for IB adapter, thanks @limx0
NautilusTrader 1.151.0 Beta
Released on August 22nd 2022 (UTC).
Breaking Changes
None
Enhancements
- Added
on_historical_datamethod with wiring for functionality - Added 'unthrottled' 0ms order book updates for Binance Futures
- Improved robustness of
WebSocketClientbase during reconnects
Fixes
- Fixed sdist includes for Rust Cargo files
- Fixed
LatencyModelinteger overflows, thanks @limx0 - Fixed parsing of Binance Futures
FUNDING_FEEupdates - Fixed
asyncio.tasks.gatherfor Python 3.10+
NautilusTrader 1.150.0 Beta
Released on August 15th 2022 (UTC).
Breaking Changes
BacktestEnginenow required venues to be added prior to instrumentsBacktestEnginenow requires instruments to be added prior to data- Renamed
Ladder.reversetoLadder.is_reversed - Portfolio performance now displays commissions as a negative
Enhancements
- Added initial backtest config validation for instrument vs venue
- Added initial sandbox execution client
- Added leverage options for
BacktestVenueConfig, thanks @miller-moore - Allow
Traderto run without strategies loaded - Integrated core Rust clock and timer
- De-cythonize
InstrumentProviderbase class
Fixes
- Fixed double counting of commissions for single-currency and multi-currency accounts #657
NautilusTrader 1.149.0 Beta
Released on 27th June 2022 (UTC).
Breaking Changes
- Schema change for
Instrument.infoforParquetDataCatalog
Enhancements
- Added
DirectionalMovementIndicatorindicator, thanks @graceyangfan - Added
KlingerVolumeOscillatorindicator, thanks @graceyangfan - Added
clientIdandstart_gatewayfor IB config, thanks @niks199
Fixes
- Fixed macOS ARM64 build
- Fixed Binance testnet URL
- Fixed IB contract ID dict, thanks @niks199
- Fixed IB
InstrumentProvider#685, thanks @limx0 - Fixed IB orderbook snapshots L1 value assertion #712 , thanks @limx0
NautilusTrader 1.148.0 Beta
Released on 30th June 2022 (UTC).
Breaking Changes
None
Enhancements
- Ported core bar objects to Rust thanks @ghill2
- Improved core
unix_nanos_to_iso8601performance by 30% thanks @ghill2 - Added
DataCataloginterface forParquetDataCatalogthanks @jordanparker6 - Added
AroonOscillatorindicator thanks @graceyangfan - Added
ArcherMovingAveragesTrendsindicator thanks @graceyangfan - Added
DoubleExponentialMovingAverageindicator thanks @graceyangfan - Added
WilderMovingAverageindicator thanks @graceyangfan - Added
ChandeMomentumOscillatorindicator thanks @graceyangfan - Added
VerticalHorizontalFilterindicator thanks @graceyangfan - Added
Biasindicator thanks @graceyangfan
Fixes
None
NautilusTrader 1.147.1 Beta
Released on 6th June 2022 (UTC).
Breaking Changes
None
Enhancements
None
Fixes
- Fixed incorrect backtest log timestamps (was using actual time)
- Fixed formatting of timestamps for nanoseconds zulu as per RFC3339
NautilusTrader 1.147.0 Beta
Released on 4th June 2022 (UTC).
Breaking Changes
None
Enhancements
- Improved error handling for invalid state triggers
- Improved component state transition behavior and logging
- Improved
TradingNodedisposal flow - Implemented core monotonic clock
- Implemented logging in Rust
- Added
CommodityChannelIndexindicator thanks @graceyangfan
Fixes
None
NautilusTrader 1.146.0 Beta
Released on 22nd May 2022 (UTC).
Breaking Changes
AccountIdconstructor now takes single value string- Removed redundant
UUIDFactoryand all associated backing fields and calls - Removed
ClientOrderLinkId(not in use)
Enhancements
- Refinements and improvements to Rust core
Fixes
- Fixed pre-trade notional risk checks incorrectly applied to
MARGINaccounts - Fixed
net_qtyinPositionStatusReportthanks to @sidnvy - Fixed
LinearRegressionindicator thanks to @graceyangfan
NautilusTrader 1.145.0 Beta
Released on 15th May 2022 (UTC).
This is an early release due to the build error in the sdist for 1.144.0.
The error is due to the nautilus_core Rust source not being included in the sdist package.
Breaking Changes
- All raw order constructors now take
expire_time_nsint64 rather than a datetime - All order serializations due to
expire_time_nsoption handling PortfolioAnalyzermoved fromTradertoPortfolio
Enhancements
PortfolioAnalyzernow available to strategies viaself.portfolio.analyzer
Fixes
None
NautilusTrader 1.144.0 Beta
Released on 10th May 2022 (UTC).
Breaking Changes
- Removed
BacktestEngine.add_ticks()as redundant with.add_data() - Removed
BacktestEngine.add_bars()as redundant with.add_data() - Removed
BacktestEngine.add_generic_data()as redundant with.add_data() - Removed
BacktestEngine.add_order_book_data()as redundant with.add_data() - Renamed
Position.from_ordertoPosition.opening_order_id - Renamed
StreamingPersistencetoStreamingFeatherWriter - Renamed
PersistenceConfigtoStreamingConfig - Renamed
PersistenceConfig.flush_intervaltoflush_interval_ms
Enhancements
- Added
Actor.publish_signalfor generic dynamic signal data - Added
WEEKandMONTHbar aggregation options - Added
Position.closing_order_idproperty - Added
tagsparameter toStrategy.submit_order - Added optional
check_position_existsflag toStrategy.submit_order - Eliminated all use of
unsafeRust and C null-terminated byte strings - The
bypass_loggingconfig option will also now bypass theBacktestEnginelogger
Fixes
- Fixed behavior of
IOCandFOKtime in force instructions - Fixed Binance bar resolution parsing
NautilusTrader 1.143.0 Beta
Released on 21st April 2022 (UTC).
Breaking Changes
None
Enhancements
None
Fixes
- Fixed segfault for
CashAccount.calculate_balance_lockedwith no base currency - Various FeatherWriter fixes
NautilusTrader 1.142.0 Beta
Released on 17th April 2022 (UTC).
Breaking Changes
BacktestNodenow requires configs at initialization- Removed
run_configsparameter fromBacktestNode.run()method - Removed
return_engineflag - Renamed
TradingStrategytoStrategy - Renamed
TradingStrategyConfigtoStrategyConfig - Changes to configuration object import paths
- Removed redundant
realized_pointsconcept fromPosition
Enhancements
- Added
BacktestNode.get_engines()method - Added
BacktestNode.get_engine(run_config_id)method - Added
Actor.request_instrument()method (also applies toStrategy) - Added
Cache.snapshot_position()method - All configuration objects can now be imported directly from
nautilus_trader.config - Execution engine now takes snapshots of closed netted positions
- Performance statistics now based on total positions and snapshots
- Added Binance Spot/Margin external order handling
- Added support for millisecond bar aggregation
- Added configurable
debugmode for engines (with extra debug logging) - Improved annualized portfolio statistics with configurable period
Fixes
None
NautilusTrader 1.141.0 Beta
Released on 4th April 2022 (UTC).
Breaking Changes
- Renamed
BacktestNode.run_sync()toBacktestNode.run() - Renamed
flatten_position()toclose_position() - Renamed
flatten_all_positions()toclose_all_positions() - Renamed
Order.flatten_side()toOrder.closing_side() - Renamed
TradingNodeConfigcheck_residuals_delaytotimeout_post_stop - The
SimulatedExchangewill now 'receive' market data prior to theDataEngine(note that this did not affect any test) - Tightened requirement for
DataTypetypes to be subclasses ofData CacheDatabaseConfig.typenow defaults toin-memoryNAUTILUS_CATALOGenv var changed toNAUTILUS_PATHDataCatalogroot path now located under$OLD_PATH/catalog/from the Nautilus pathhiredisandredisare now optional extras as 'redis'hyperoptis now an optional extra as 'hyperopt'
Enhancements
- Unify
NautilusKernelacross backtest and live systems - Improved configuration by grouping into
configsubpackage - Improved configuration objects and flows
- Numerous improvements to the Binance Spot/Margin and Futures integration
- Added Docker image builds and GH packages
- Added
BinanceFuturesMarkPriceUpdatetype and data stream - Added generic
subscribeandunsubscribeto template - Added Binance Futures COIN_M testnet
- The clarity of various error messages was improved
Fixes
- Fixed multiple instruments in
DataCatalog(#554), (#560) by @limx0 - Fixed timestamp ordering streaming from
DataCatalog(#561) by @limx0 - Fixed
CSVReader(#563) by @limx0 - Fixed slow subscribers to the Binance WebSocket streams
- Fixed configuration of
base_currencyfor backtests - Fixed importable strategy configs (previously not returning correct class)
- Fixed
fully_qualified_name()format
NautilusTrader 1.140.0 Beta
Release Notes
Released on 13th March 2022 (UTC).
This is a patch release which fixes a moderate severity security vulnerability in pillow < 9.0.1:
If the path to the temporary directory on Linux or macOS contained a space,
this would break removal of the temporary image file after im.show() (and related actions),
and potentially remove an unrelated file. This been present since PIL.
This release upgrades to pillow 9.0.1.
Note the minor version was incremented in error.
NautilusTrader 1.139.0 Beta
Release Notes
Released on 11th March 2022 (UTC).
Breaking Changes
- Renamed
CurrencySpottoCurrencyPair - Renamed
PerformanceAnalyzertoPortfolioAnalyzer - Renamed
BacktestDataConfig.data_cls_pathtodata_cls - Renamed
BinanceTickertoBinanceSpotTicker - Renamed
BinanceSpotExecutionClienttoBinanceExecutionClient
Enhancements
- Added initial (beta) Binance Futures adapter implementation
- Added initial (beta) Interactive Brokers adapter implementation
- Added custom portfolio statistics
- Added
CryptoFutureinstrument - Added
OrderType.MARKET_TO_LIMIT - Added
OrderType.MARKET_IF_TOUCHED - Added
OrderType.LIMIT_IF_TOUCHED - Added
MarketToLimitOrderorder type - Added
MarketIfTouchedOrderorder type - Added
LimitIfTouchedOrderorder type - Added
Order.has_priceproperty (convenience) - Added
Order.has_trigger_priceproperty (convenience) - Added
msgparameter toLoggerAdapter.exception() - Added WebSocket
log_sendandlog_recvconfig options - Added WebSocket
auto_ping_interval(seconds) config option - Replaced
msgpackwithmsgspec(faster drop in replacement https://github.com/jcrist/msgspec) - Improved exception messages by providing helpful context
- Improved
BacktestDataConfigAPI: now takes either a type ofDataor a fully qualified path string
Fixes
- Fixed FTX execution WebSocket 'ping strategy'
- Fixed non-deterministic config dask tokenization
NautilusTrader 1.138.0 Beta
Release Notes
Released on 15th February 2022 (UTC).
This release contains numerous method, parameter and property name changes
For consistency and standardization with other protocols, the ExecutionId type
has been renamed to TradeId as they express the same concept with a more
standardized terminology. In the interests of enforcing correctness and
safety this type is now utilized for the TradeTick.trade_id.
Breaking Changes
- Renamed
workingorders toopenorders including all associated methods and params - Renamed
completedorders toclosedorders including all associated methods and params - Removed
activeorder concept (often confused withopen) - Renamed
triggertotrigger_price - Renamed
StopMarketOrder.pricetoStopMarketOrder.trigger_price - Renamed all params related to a
StopMarketOrderspricetotrigger_price - Renamed
ExecutionIdtoTradeId - Renamed
execution_idtotrade_id - Renamed
Order.trade_idtoOrder.last_trade_id(for clarity) - Renamed other variations and references of 'execution ID' to 'trade ID'
- Renamed
contingencytocontingency_type
Enhancements
- Introduced the
TradeIdtype to enforcetrade_idtyping - Improve handling of unleveraged cash asset positions including Crypto and Fiat spot currency instruments
- Added
ExecEngineConfigconfig optionallow_cash_positions(Falseby default) - Added
TrailingOffsetTypeenum - Added
TrailingStopMarketOrder - Added
TrailingStopLimitOrder - Added trailing order factory methods
- Added
trigger_typeparameter to stop orders - Added
TriggerTypeenum - Large refactoring of order base and impl classes
- Overhaul of execution reports
- Overhaul of execution state reconciliation
Fixes
- Fixed WebSocket base reconnect handling
NautilusTrader 1.137.1 Beta
Release Notes
Released on 15th January 2022 (UTC).
This is a patch release which fixes moderate to high severity security vulnerabilities in
pillow < 9.0.0:
- PIL.ImageMath.eval allows evaluation of arbitrary expressions, such as ones that use the Python exec method
- path_getbbox in path.c has a buffer over-read during initialization of ImagePath.Path
- path_getbbox in path.c improperly initializes ImagePath.Path
This release upgrades to pillow 9.0.0.
NautilusTrader 1.137.0 Beta
Release Notes
Released on 12th January 2022 (UTC).
Breaking Changes
- Removed redundant
currencyparameter fromAccountBalance - Renamed
local_symboltonative_symbol - Removed the
VenueTypeenum andvenue_typeparameter in favour of aroutingbool flag - Removed
account_idparameter from execution client factories and constructors - Changed venue generated IDs (order, execution, position) which now begin with the venue ID
Enhancements
- Added FTX integration for testing
- Added FTX US configuration option
- Added Binance US configuration option
- Added
MarginBalanceobject to assist with margin account functionality
Fixes
- Fixed parsing of
BarTypewith symbols including hyphens- - Fixed
BinanceSpotTicker__repr__(was missing whitespace after a comma) - Fixed
DataEnginerequests for historicalTradeTick - Fixed
DataEngine_handle_data_responsetyping ofdatatoobject
NautilusTrader 1.136.0 Beta
Release Notes
Released on 29th December 2021.
Breaking Changes
- Changed
subscribe_data(...)method (client_idnow optional) - Changed
unsubscribe_data(...)method (client_idnow optional) - Changed
publish_data(...)method (addeddata_type) - Renamed
MessageBus.subscriptionsmethod parameter topattern - Renamed
MessageBus.has_subscribersmethod parameter topattern - Removed
subscribe_strategy_data(...)method - Removed
unsubscribe_strategy_data(...)method - Removed
publish_strategy_data(...)method - Renamed
CryptoSwaptoCryptoPerpetual
Enhancements
- Can now modify or cancel in-flight orders live and backtest
- Updated
CancelOrderto allow Nonevenue_order_id - Updated
ModifyOrderto allow Nonevenue_order_id - Updated
OrderPendingUpdateto allow Nonevenue_order_id - Updated
OrderPendingCancelto allow Nonevenue_order_id - Updated
OrderCancelRejectedto allow Nonevenue_order_id - Updated
OrderModifyRejectedto allow Nonevenue_order_id - Added
DataType.topicstring for improved message bus handling
Fixes
- Implemented comparisons for
DataType,BarSpecificationandBarType - Fixed
QuoteTickDataWrangler.process_bar_datawithrandom_seed
NautilusTrader 1.135.0 Beta
Release Notes
Released on 13th December 2021.
Breaking Changes
- Renamed
match_idtotrade_id
Enhancements
- Added bars method to
DataCatalog - Improved parsing of Binance historical bars data
- Added
CancelAllOrderscommand - Added bulk cancel capability to Binance integration
- Added bulk cancel capability to Betfair integration
Fixes
- Fixed handling of
cpu_freqcall in logging for ARM architecture - Fixed market order fill edge case for bar data
- Fixed handling of
GenericDatain backtests
NautilusTrader 1.134.0 Beta
Release Notes
Released on 22nd November 2021.
Breaking Changes
- Changed
hiddenorder option todisplay_qtyto support iceberg orders - Renamed
Trader.component_ids()toTrader.actor_ids() - Renamed
Trader.component_states()toTrader.actor_states() - Renamed
Trader.add_component()toTrader.add_actor() - Renamed
Trader.add_components()toTrader.add_actors() - Renamed
Trader.clear_components()toTrader.clear_actors()
Enhancements
- Added initial implementation of Binance SPOT integration (beta stage testing)
- Added support for display quantity/iceberg orders
Fixes
- Fixed
Actorclock time advancement in backtest engine
NautilusTrader 1.133.0 Beta
Release Notes
Released on 8th November 2021.
Breaking Changes
None
Enhancements
- Added
LatencyModelfor simulated exchange - Added
last_update_idto order books - Added
update_idto order book data - Added
depthparameter when subscribing to order book deltas - Added
Clock.timestamp_ms() - Added
TestDataProviderand consolidate test data - Added orjson default serializer for arrow
- Reorganized example strategies and launch scripts
Fixes
- Fixed logic for partial fills in backtests
- Various Betfair integration fixes
- Various
BacktestNodefixes
NautilusTrader 1.132.0 Beta
Release Notes
Released on 24th October 2021.
Breaking Changes
Actorconstructor now takesActorConfig
Enhancements
- Added
ActorConfig - Added
ImportableActorConfig - Added
ActorFactory - Added
actorstoBacktestRunConfig - Improved network base classes
- Refine
InstrumentProvider
Fixes
- Fixed persistence config for
BacktestNode - Various Betfair integration fixes
NautilusTrader 1.131.0 Beta
Release Notes
Released on 10th October 2021.
Breaking Changes
- Renamed
nanos_to_unix_dttounix_nanos_to_dt(more accurate name) - Changed
Clock.set_time_alert(...)method signature - Changed
Clock.set_timer(...)method signature - Removed
pd.TimestampfromTimeEvent
Enhancements
OrderListsubmission and OTO, OCO contingencies now operational- Added
Cache.orders_for_position(...)method - Added
Cache.position_for_order(...)method - Added
SimulatedExchange.get_working_bid_orders(...)method - Added
SimulatedExchange.get_working_ask_orders(...)method - Added optional
run_config_idfor backtest runs - Added
BacktestResultobject - Added
Clock.set_time_alert_ns(...)method - Added
Clock.set_timer_ns(...)method - Added
fill_limit_at_pricesimulated exchange option - Added
fill_stop_at_pricesimulated exchange option - Improve timer and time event efficiency
Fixes
- Fixed
OrderUpdatedleaves quantity calculation - Fixed contingency order logic at the exchange
- Fixed indexing of orders for a position in the cache
- Fixed flip logic for zero-sized positions (not a flip)
NautilusTrader 1.130.0 Beta
Release Notes
Released on 26th September 2021.
Breaking Changes
BacktestEngine.runmethod signature change- Renamed
BookLeveltoBookType - Renamed
FillModelparams
Enhancements
- Added streaming backtest machinery.
- Added
quantstats(removedempyrical) - Added
BacktestEngine.run_streaming() - Added
BacktestEngine.end_streaming() - Added
Portfolio.balances_locked(venue) - Improved
DataCatalogfunctionality - Improved logging for
BacktestEngine - Improved parquet serialization and machinery
Fixes
- Fixed
SimulatedExchangemessage processing - Fixed
BacktestEngineevent ordering in main loop - Fixed locked balance calculation for
CASHaccounts - Fixed fill dynamics for
reduce-onlyorders - Fixed
PositionIdhandling forHEDGINGOMS exchanges - Fixed parquet
Instrumentserialization - Fixed
CASHaccount PnL calculations with base currency
NautilusTrader 1.129.0 Beta
Release Notes
Released on 12th September 2021.
Breaking Changes
- Removed CCXT adapter (#428)
- Backtest configuration changes
- Renamed
UpdateOrdertoModifyOrder(terminology standardization) - Renamed
DeltaTypetoBookAction(terminology standardization)
Enhancements
- Added
BacktestNode - Added
BookIntegrityErrorwith improved integrity checks for order books - Added order custom user tags
- Added
Actor.register_warning_event(also applicable toTradingStrategy) - Added
Actor.deregister_warning_event(also applicable toTradingStrategy) - Added
ContingencyTypeenum (for contingent orders in anOrderList) - All order types can now be
reduce_only(#437) - Refined backtest configuration options
- Improved efficiency of
UUID4using the RustfastuuidPython bindings
Fixes
- Fixed Redis loss of precision for
int64_tnanosecond timestamps (#363) - Fixed behavior of
reduce_onlyorders for both submission and filling (#437) - Fixed PnL calculation for
CASHaccounts when commission negative (#436), thanks for reporting @imcu
NautilusTrader 1.128.0 Beta - Release Notes
Released on 30th August 2021.
This release continues the focus on the core system, with upgrades and cleanups
to the component base class. The concept of an active order has been introduced,
which is an order whose state can change (is not a completed order).
Breaking Changes
- All configuration due
pydanticupgrade - Throttling config now takes string e.g. "100/00:00:01" which is 100 / second
- Renamed
DataProducerFacadetoDataProducer - Renamed
fill.sidetofill.order_side(clarity and standardization) - Renamed
fill.typetofill.order_type(clarity and standardization)
Enhancements
- Added serializable configuration classes leveraging
pydantic - Improved adding bar data to
BacktestEngine - Added
BacktestEngine.add_bar_objects() - Added
BacktestEngine.add_bars_as_ticks() - Added order
activeconcept, withorder.is_activeand cache methods - Added
ComponentStateChangedevent - Added
Component.degrade()andComponent.fault()command methods - Added
Component.on_degrade()andComponent.on_fault()handler methods - Added
ComponentState.PRE_INITIALIZED - Added
ComponentState.DEGRADING - Added
ComponentState.DEGRADED - Added
ComponentState.FAULTING - Added
ComponentState.FAULTED - Added
ComponentTrigger.INITIALIZE - Added
ComponentTrigger.DEGRADE - Added
ComponentTrigger.DEGRADED - Added
ComponentTrigger.FAULT - Added
ComponentTrigger.FAULTED - Wired up
Tickerdata type
Fixes
DataEngine.subscribed_bars()now reports internally aggregated bars also.
NautilusTrader 1.127.0 Beta
Release Notes
Released on 17th August 2021.
This release has again focused on core areas of the platform, including a
significant overhaul of accounting and portfolio components. The wiring between
the DataEngine and DataClient(s) has also received attention, and should now
exhibit correct subscription mechanics.
The Betfair adapter has been completely re-written, providing various fixes and enhancements, increased performance, and full async support.
There has also been some further renaming to continue to align the platform as closely as possible with established terminology in the domain.
Breaking Changes
- Moved margin calculation methods from
InstrumenttoAccount - Removed redundant
Portfolio.register_account - Renamed
OrderStatetoOrderStatus - Renamed
Order.statetoOrder.status - Renamed
msgbus.message_bustomsgbus.bus
Enhancements
- Betfair adapter re-write
- Extracted
accountingsubpackage - Extracted
portfoliosubpackage - Subclassed
AccountwithCashAccountandMarginAccount - Added
AccountsManager - Added
AccountFactory - Moved registration of custom account classes to
AccountFactory - Moved registration of calculated account to
AccountFactory - Added registration of OMS type per trading strategy
- Added
ExecutionClient.create_accountfor custom account classes - Separate
PortfolioFacadefromPortfolio
Fixes
- Data subscription handling in
DataEngine Cashaccounts no longer generate spurious margins- Fix
TimeBarAggregator._stored_close_nsproperty name
NautilusTrader 1.126.1 Beta
Release Notes
Released on 3rd August 2021.
This is a patch release which fixes a bug involving NotImplementedError
exception handling when subscribing to order book deltas when not supported by
a client. This bug affected CCXT order book subscriptions.
Breaking Changes
None
Enhancements
None
Fixes
- Fix
DataEngineorder book subscription handling
NautilusTrader 1.126.0 Beta
Release Notes
Released on 2nd August 2021.
This release sees the completion of the initial implementation of the
MessageBus, with data now being handled by Pub/Sub patterns, along with the
additions of point-to-point and Req/Rep messaging functionality.
An Actor base class has been abstracted from TradingStrategy which allows
custom components to be added to a Trader which aren't necessarily trading
strategies, opening up further possibilities for extending NautilusTrader with
custom functionality.
For the sake of simplicity and to favour more idiomatic Python, the null object pattern is no longer utilized for handling identifiers. This has removed a layer of 'logical indirection' in certain parts of the codebase, and allows for simpler code.
An order is now considered 'in-flight' if it is actively pending a state
transition i.e. in the SUBMITTED,PENDING_UPDATE or PENDING_CANCEL states.
It is now a well established convention that all integer based timestamps are
expressed in UNIX nanoseconds, therefore the _ns postfix has now been dropped.
For clarity - time periods/intervals/objects where the units may not be obvious
have retained the _ns postfix.
The opportunity was identified to unify the parameter naming for the concept
of object instantiation by renaming timestamp_ns and ts_recv_ns to ts_init.
Along the same lines, the timestamps for both event and data occurrence have
been standardized to ts_event.
It is acknowledged that the frequent name changes and modifications to core concepts may be frustrating, however whilst still in a beta phase - we're taking the opportunity to lay a solid foundation for this project to continue to growth in the years ahead.
Breaking Changes
- Renamed
timestamp_nstots_init - Renamed
ts_recv_nstots_event - Renamed various event timestamp parameters to
ts_event - Removed null object methods on identifiers
Enhancements
- Added
Actorcomponent base class - Added
MessageBus.register() - Added
MessageBus.send() - Added
MessageBus.request() - Added
MessageBus.response() - Added
Trader.add_component() - Added
Trader.add_components() - Added
Trader.add_log_sink()
Fixes
- Various Betfair adapter patches and fixes
ExecutionEngineposition flip logic in certain edge cases
NautilusTrader 1.125.0 Beta
Release Notes
Released on 18th July 2021.
This release introduces a major re-architecture of the internal messaging system. A common message bus has been implemented which now handles all events via a Pub/Sub messaging pattern. The next release will see all data being handled by the message bus, see the related issue for further details on this enhancement.
Another notable feature is the introduction of the order 'in-flight' concept,
which is a submitted order which has not yet been acknowledged by the
trading venue. Several properties on Order, and methods on Cache, now exist
to support this.
The Throttler has been refactored and optimized further. There has also been
extensive reorganization of the model sub-package, standardization of identifiers
on events, along with numerous 'under the hood' cleanups and two bug fixes.
Breaking Changes
- Renamed
MessageTypeenum toMessageCategory - Renamed
fill.order_sidetofill.side - Renamed
fill.order_typetofill.type - All
Eventserialization due to domain refactorings
Enhancements
- Added
MessageBusclass - Added
TraderIdtoOrderandPosition - Added
OrderTypeto OrderFilled - Added unrealized PnL to position events
- Added order in-flight concept to
OrderandCache - Improved efficiency of
Throttler - Standardized events
strandrepr - Standardized commands
strandrepr - Standardized identifiers on events and objects
- Improved
Accountstrandrepr - Using
orjsonoverjsonfor efficiency - Removed redundant
BypassCacheDatabase - Introduced
mypyto the codebase
Fixes
- Fixed backtest log timestamping
- Fixed backtest duplicate initial account event
NautilusTrader 1.124.0 Beta
Release Notes
Released on 6th July 2021.
This release sees the expansion of pre-trade risk check options (see
RiskEngine class documentation). There has also been extensive 'under the
hood' code cleanup and consolidation.
Breaking Changes
- Renamed
Position.opened_timestamp_nstots_opened_ns - Renamed
Position.closed_timestamp_nstots_closed_ns - Renamed
Position.open_duration_nstoduration_ns - Renamed Loggers
bypass_loggingtobypass - Refactored
PositionEventtypes
Enhancements
- Added pre-trade risk checks to
RiskEngineiteration 2 - Improve
Throttlerfunctionality and performance - Removed redundant
OrderInvalidstate and associated code - Improve analysis reports
Fixes
- PnL calculations for
CASHaccount types - Various event serializations
NautilusTrader 1.123.0 Beta
Release Notes
Released on 20th June 2021.
A major feature of this release is a complete re-design of serialization for the platform, along with initial support for the Parquet format. The MessagePack serialization functionality has been refined and retained.
In the interests of explicitness there is now a convention that timestamps are
named either timestamp_ns, or prepended with ts. Timestamps which are
represented with an int64 are always in nanosecond resolution, and appended
with _ns accordingly.
Initial scaffolding for new backtest data tooling has been added.
Breaking Changes
- Renamed
OrderState.PENDING_REPLACEtoOrderState.PENDING_UPDATE - Renamed
timestamp_origin_nstots_event_ns - Renamed
timestamp_nsfor data tots_recv_ns - Renamed
updated_nstots_updated_ns - Renamed
submitted_nstots_submitted_ns - Renamed
rejected_nstots_rejected_ns - Renamed
accepted_nstots_accepted_ns - Renamed
pending_nstots_pending_ns - Renamed
canceled_nstots_canceled_ns - Renamed
triggered_nstots_triggered_ns - Renamed
expired_nstots_expired_ns - Renamed
execution_nstots_filled_ns - Renamed
OrderBookLeveltoBookLevel - Renamed
Order.volumetoOrder.size
Enhancements
- Adapter dependencies are now optional extras at installation
- Added arrow/parquet serialization
- Added object
to_dict()andfrom_dict()methods - Added
Order.is_pending_update - Added
Order.is_pending_cancel - Added
run_analysisconfig option forBacktestEngine - Removed
TradeMatchIdin favour of bare string - Removed redundant conversion to
pd.Timestampwhen checking timestamps - Removed redundant data
to_serializable_strmethods - Removed redundant data
from_serializable_strmethods - Removed redundant
__ne__implementations - Removed redundant
MsgPackSerializercruft - Removed redundant
ObjectCacheandIdentifierCache - Removed redundant string constants
Fixes
- Fixed millis to nanos in
CCXTExecutionClient - Added missing trigger to
UpdateOrderhandling - Removed all
import *
NautilusTrader 1.122.0 Beta
Release Notes
Released on 6th June 2021.
This release includes numerous breaking changes with a view to enhancing the core functionality and API of the platform. The data and execution caches have been unified for simplicity. There have also been large changes to the accounting functionality, with 'hooks' added in preparation for accurate calculation and handling of margins.
Breaking Changes
- Renamed
Account.balance()toAccount.balance_total() - Consolidated
TradingStrategy.dataintoTradingStrategy.cache - Consolidated
TradingStrategy.executionintoTradingStrategy.cache - Moved
redissubpackage intoinfrastructure - Moved some accounting methods back to
Instrument - Removed
Instrument.market_value() - Renamed
Portfolio.market_values()toPortfolio.net_exposures() - Renamed
Portfolio.market_value()toPortfolio.net_exposure() - Renamed
InMemoryExecutionDatabasetoBypassCacheDatabase - Renamed
Position.relative_qtytoPosition.net_qty - Renamed
default_currencytobase_currency - Removed
cost_currencyproperty fromInstrument
Enhancements
ExecutionClientnow has the option of calculating account state- Unified data and execution caches into single
Cache - Improved configuration options and naming
- Simplified
Portfoliocomponent registration - Simplified wiring of
Cacheinto components - Added
reprto execution messages - Added
AccountTypeenum - Added
cost_currencytoPosition - Added
get_cost_currency()toInstrument - Added
get_base_currency()toInstrument
Fixes
- Fixed
Order.is_workingforPENDING_CANCELandPENDING_REPLACEstates - Fixed loss of precision for nanosecond timestamps in Redis
- Fixed state reconciliation when uninstantiated client
NautilusTrader 1.121.0 Beta
Release Notes
Released on 30th May 2021.
In this release there has been a major change to the use of inlines for method signatures. From the Cython docs: "Note that class-level cdef functions are handled via a virtual function table so the compiler won’t be able to inline them in almost all cases.". https://cython.readthedocs.io/en/latest/src/userguide/pyrex_differences.html?highlight=inline.
It has been found that adding inline to method signatures makes no difference
to the performance of the system - and so they have been removed to reduce
'noise' and simplify the codebase. Note that the use of inline for
module level functions will be passed to the C compiler with the expected
result of inlining the function.
Breaking Changes
BacktestEngine.add_venueaddedvenue_typeto method paramsExecutionClientaddedvenue_typeto constructor paramsTraderIdinstantiationStrategyIdinstantiationInstrumentserialization
Enhancements
Portfoliopending calculations if data not immediately available- Added
instrumentssubpackage with expanded class definitions - Added
timestamp_origin_nstimestamp when originally occurred - Added
AccountState.is_reportedflagging if reported by exchange or calculated - Simplified
TraderIdandStrategyIdidentifiers - Improved
ExecutionEngineorder routing - Improved
ExecutionEngineclient registration - Added order routing configuration
- Added
VenueTypeenum and parser - Improved parameter typing for identifier generators
- Improved log formatting of
MoneyandQuantitythousands commas
Fixes
- CCXT
TICK_SIZEprecision mode - size precisions (BitMEX, FTX) - State reconciliation (various bugs)
NautilusTrader 1.120.0 Beta
Release Notes
This release focuses on simplifications and enhancements of existing machinery
Breaking Changes
Positionnow requires anInstrumentparamis_inverseremoved fromOrderFilledClientIdremoved fromTradingCommandand subclassesAccountIdremoved fromTradingCommandand subclassesTradingCommandserialization
Enhancements
- Added
Instrumentmethods toExecutionCache - Added
Venuefilter to cache queries - Moved order validations into
RiskEngine - Refactored
RiskEngine - Removed routing type information from identifiers
Fixes
None
NautilusTrader 1.119.0 Beta
Release Notes
This release applies another major refactoring to the value object API for
BaseDecimal and its subclasses Price and Quantity. Previously a precision
was not explicitly required when passing in a decimal.Decimal type which
sometimes resulted in unexpected behavior when a user passed in a decimal with
a very large precision (when wrapping a float with decimal.Decimal).
Convenience methods have been added to Price and Quantity where precision
is implicitly zero for ints, or implied in the number of digits after the '.'
point for strings. Convenience methods have also been added to Instrument to
assist the UX.
The serialization of Money has been improved with the inclusion of the
currency code in the string delimited by whitespace. This avoids an additional
field for the currency code.
RiskEngine has been rewired ahead of ExecutionEngine which clarifies areas
of responsibility and cleans up the registration sequence and allows a more
natural flow of command and event messages.
Breaking Changes
- Serializations involving
Money - Changed usage of
PriceandQuantity - Renamed
BypassExecutionDatabasetoBypassCacheDatabase
Enhancements
- Rewired
RiskEngineandExecutionEnginesequence - Added
Instrumentdatabase operations - Added
MsgPackInstrumentSerializer - Added
Price.from_str() - Added
Price.from_int() - Added
Quantity.zero() - Added
Quantity.from_str() - Added
Quantity.from_int() - Added
Instrument.make_price() - Added
Instrument.make_qty() - Improved serialization of
Money
Fixes
- Handling of precision for
decimal.Decimalvalues passed to value objects
NautilusTrader 1.118.0 Beta
Release Notes
This release simplifies the backtesting workflow by removing the need for the
intermediate BacktestDataContainer. There has also been some simplifications
for OrderFill events, as well as additional order states and events.
Breaking Changes
- Standardized all 'cancelled' references to 'canceled'.
SimulatedExchangeno longer generatesOrderAcceptedforMarketOrder- Removed redundant
BacktestDataContainer - Removed redundant
OrderFilled.cum_qty - Removed redundant
OrderFilled.leaves_qty BacktestEngineconstructor simplifiedBacktestMarketDataClientno longer needs instruments- Renamed
PortfolioAnalyzer.get_realized_pnlsto.realized_pnls
Enhancements
- Re-engineered
BacktestEngineto take data directly - Added
OrderState.PENDING_CANCEL - Added
OrderState.PENDING_REPLACE - Added
OrderPendingUpdateevent - Added
OrderPendingCancelevent - Added
OrderFilled.is_buyproperty (with correspondingis_buy_c()fast method) - Added
OrderFilled.is_sellproperty (with correspondingis_sell_c()fast method) - Added
Position.is_opposite_side(OrderSide side)convenience method - Modified the
OrderFSM and event handling for the above - Consolidated event generation into
ExecutionClientbase class - Refactored
SimulatedExchangefor greater clarity
Fixes
ExecutionCachepositions open queries- Exchange accounting for exchange
OmsType.NETTING - Position flipping logic for exchange
OmsType.NETTING - Multi-currency account terminology
- Windows wheel packaging
- Windows path errors
NautilusTrader 1.117.0 Beta
Release Notes
The major thrust of this release is added support for order book data in
backtests. The SimulatedExchange now maintains order books of each instrument
and will accurately simulate market impact with L2/L3 data. For quote and trade
tick data a L1 order book is used as a proxy. A future release will include
improved fill modelling assumptions and customizations.
Breaking Changes
OrderBook.createnow takesInstrumentandBookLevel
Enhancements
SimulatedExchangenow maintains order books internallyLiveLoggernow exhibits better blocking behavior and logging
Fixes
- Various patches to the Betfair adapter
- Documentation builds
NautilusTrader 1.116.1 Beta
Release Notes
Announcing official Windows 64-bit support.
Several bugs have been identified and fixed.
Breaking Changes
None
Enhancements
- Performance test refactoring
- Removed redundant performance harness
- Added
Queue.peek()to high-performance queue - GitHub action refactoring, CI for Windows
- Builds for 32-bit platforms
Fixes
OrderBook.createforBookLevel.L3now returns correct book- Betfair handling of trade IDs
NautilusTrader 1.116.0 Beta
Release Notes
This release includes substantial breaking changes.
Further fundamental changes to the core API have been made.
Breaking Changes
- Introduce
ClientIdfor data and execution client identification - Standardized client IDs to upper case
- Renamed
OrderBookOperationtoOrderBookDelta - Renamed
OrderBookOperationstoOrderBookDeltas - Renamed
OrderBookOperationTypetoOrderBookDeltaType
Enhancements
None
Fixes
None
NautilusTrader 1.115.0 Beta
Release Notes
This release includes substantial breaking changes.
Due to recent feedback and much further thought - a major renaming has been carried
out involving order identifiers. The Order is the only domain object in the
model which is identified with more than one ID. Due to this, more explicitness
helps to ensure correct logic. Previously the OrderId was
implicitly assumed to be the one assigned by the trading venue. This has been
clarified by renaming the identifier to VenueOrderId. Following this, it no
longer made sense to refer to it through Order.id, and so this was changed to
its full name Order.venue_order_id. This naturally resulted in ClientOrderId(s)
being renamed in properties and variables from cl_ord_id to client_order_id.
Breaking Changes
- Renamed
OrderIdtoVenueOrderId - Renamed
Order.idtoOrder.venue_order_id - Renamed
Order.cl_ord_idtoOrder.client_order_id - Renamed
AssetClass.STOCKtoAssetClass.EQUITY - Removed redundant flag
generate_position_ids(handled byOmsType)
Enhancements
- Introduce integration for Betfair.
- Added
AssetClass.METALandAssetClass.ENERGY - Added
VenueStatusEvent,InstrumentStatusEventandInstrumentClosePrice - Usage of
np.ndarrayto improve function and indicator performance
Fixes
- LiveLogger log message when blocking.
NautilusTrader 1.114.0 Beta
Release Notes
This release includes substantial breaking changes.
Further standardization of naming conventions along with internal refinements and fixes.
Breaking Changes
- Renamed
AmendOrdertoUpdateOrder - Renamed
OrderAmendedtoOrderUpdated - Renamed
amendandamendedrelated methods toupdateandupdated - Renamed
OrderCancelRejecttoOrderCancelRejected(standardize tense)
Enhancements
- Improve efficiency of data wrangling
- Simplify
Loggerand general system logging - Added
stdoutandstderrlog streams with configuration - Added
OrderBookDatabase class
Fixes
- Backtest handling of
GenericDataandOrderBookrelated data - Backtest
DataClientcreation logic prevented client registering
NautilusTrader 1.113.0 Beta
Release Notes
This release includes substantial breaking changes.
Further standardization of naming conventions along with internal refinements and fixes.
Breaking Changes
- Renamed
AmendOrdertoUpdateOrder - Renamed
OrderAmendedtoOrderUpdated - Renamed
amendandamendedrelated methods toupdateandupdated - Renamed
OrderCancelRejecttoOrderCancelRejected(standardize tense)
Enhancements
- Introduce
OrderUpdateRejected, event separated for clarity - Refined LiveLogger: Now runs on event loop with high-performance
Queue - Improved flexibility of when strategies are added to a
BacktestEngine - Improved checks for
VenueOrderIdequality when applying order events
Fixes
- Removed
UNDEFINEDenum values. Do not allow invalid values to be represented in the system (prefer throwing exceptions)
NautilusTrader 1.112.0 Beta
Release Notes
This release includes substantial breaking changes.
The platforms internal timestamping has been standardized to nanoseconds. This
decision was made to increase the accuracy of backtests to nanosecond precision,
improve data handling including order book and custom data for backtesting, and
to future-proof the platform to a more professional standard. The top-level user
API still takes datetime and timedelta objects for usability.
There has also been some standardization of naming conventions to align more closely with established financial market terminology with reference to the FIX5.0 SP2 specification, and CME MDP 3.0.
Breaking Changes
- Moved
BarTypeintoBaras a property - Changed signature of
Barhandling methods due to above - Removed
Instrument.leverage(incorrect place for concept) - Changed
ExecutionClient.venueas aVenuetoExecutionClient.nameas astr - Changed serialization of timestamp datatype to
int64 - Changed serialization constant names extensively
- Renamed
OrderFilled.filled_qtytoOrderFilled.last_qty - Renamed
OrderFilled.filled_pricetoOrderFilled.last_px - Renamed
avg_pricetoavg_pxin methods and properties - Renamed
avg_opentoavg_px_openin methods and properties - Renamed
avg_closetoavg_px_closein methods and properties - Renamed
Position.relative_quantitytoPosition.relative_qty - Renamed
Position.peak_quantitytoPosition.peak_qty
Enhancements
- Standardized nanosecond timestamps
- Added time unit conversion functions as found in
nautilus_trader.core.datetime - Added optional
brokerproperty toVenueto assist with routing - Enhanced state reconciliation from both
LiveExecutionEngineandLiveExecutionClient - Added internal messages to aid state reconciliation
Fixes
DataCacheincorrectly caching bars
NautilusTrader 1.111.0 Beta
Release Notes
This release adds further enhancements to the platform.
Breaking Changes
None
Enhancements
RiskEnginebuilt out including configuration options hook andLiveRiskEngineimplementation- Added generic
Throttler - Added details
dicttoinstrument_idrelated requests to cover IB futures contracts - Added missing Fiat currencies
- Added additional Crypto currencies
- Added ISO 4217 codes
- Added currency names
Fixes
- Queue
putcoroutines in live engines when blocking atmaxlenwas not creating a task on the event loop.
NautilusTrader 1.110.0 Beta
Release Notes
This release applies one more major change to the identifier API. Security has
been renamed to InstrumentId for greater clarity that the object is an identifier,
and to group the concept of an instrument with its identifier.
Data objects in the framework have been further abstracted to prepare for the handling of custom data in backtests.
A RiskEngine base class has also been scaffolded.
Breaking Changes
Securityrenamed toInstrumentIdInstrument.securityrenamed toInstrument.idDatabecomes an abstract base class withtimestampandunix_timestamppropertiesDataandDataTypemoved tomodel.dataon_datamethods now takeGenericData
Enhancements
- Added
GenericData - Added
Futureinstrument
Fixes
None
NautilusTrader 1.109.0 Beta
Release Notes
The main thrust of this release is to refine and further bed down the changes
to the identifier model via InstrumentId, and fix some bugs.
Errors in the CCXT clients caused by the last release have been addressed.
Breaking Changes
InstrumentIdnow takes first class value objectSymbolInstrumentIdasset_classandasset_typeno longer optionalSimulatedExchange.venuechanged toSimulatedExchange.id
Enhancements
- Ensure
TestTimeradvances monotonically increase - Added
AssetClass.BETTING
Fixes
- CCXT data and execution clients regarding
instrument_idvssymbolnaming InstrumentIdequality and hashing- Various docstrings
NautilusTrader 1.108.0 Beta
Release Notes
This release executes a major refactoring of Symbol and how securities are
generally identified within the platform. This will allow a smoother integration
with Interactive Brokers and other exchanges, brokerages and trading
counterparties.
Previously the Symbol identifier also included a venue which confused the concept.
The replacement Security identifier more clearly expresses the domain with a
symbol string, a primary Venue, AssetClass and AssetType properties.
Breaking Changes
- All previous serializations
SecurityreplacesSymbolwith expanded propertiesAssetClass.EQUITYchanged toAssetClass.STOCKfrom_serializable_stringchanged tofrom_serializable_strto_serializable_stringchanged toto_serializable_str
Enhancements
- Reports now include full instrument_id name
- Added
AssetType.WARRANT
Fixes
StopLimitOrderserialization
NautilusTrader 1.107.1 Beta - Release Notes
This is a patch release which applies various fixes and refactorings.
The behavior of the StopLimitOrder continued to be fixed and refined.
SimulatedExchange was refactored further to reduce complexity.
Breaking Changes
None
Enhancements
None
Fixes
TRIGGEREDstates in order FSMStopLimitOrdertriggering behaviorOrderFactory.stop_limitmissingpost_onlyandhiddenOrderandStopLimitOrder__repr__string (duplicate id)
NautilusTrader 1.107.0 Beta
Release Notes
The main thrust of this release is to refine some subtleties relating to order
matching and amendment behavior for improved realism. This involved a fairly substantial refactoring
of SimulatedExchange to manage its complexity, and support extending the order types.
The post_only flag for LIMIT orders now results in the expected behavior regarding
when a marketable limit order will become a liquidity TAKER during order placement
and amendment.
Test coverage was moderately increased.
Breaking Changes
None
Enhancements
- Refactored
SimulatedExchangeorder matching and amendment logic - Added
risksubpackage to group risk components
Fixes
StopLimitOrdertriggering behavior- All flake8 warnings
NautilusTrader 1.106.0 Beta
Release Notes
The main thrust of this release is to introduce the Interactive Brokers integration, and begin adding platform capabilities to support this effort.
Breaking Changes
from_serializable_stringmethods changed tofrom_serializable_str
Enhancements
- Scaffold Interactive Brokers integration in
adapters/ib - Added the
Futureinstrument type - Added the
StopLimitOrderorder type - Added the
DataandDataTypetypes to support custom data handling - Added the
InstrumentIdidentifier types initial implementation to support extending the platforms capabilities
Fixes
BracketOrdercorrectness- CCXT precision parsing bug
- Some log formatting