Releases: nautechsystems/nautilus_trader
NautilusTrader 1.222.0 Beta
NautilusTrader 1.222.0 Beta
Released on 1st January 2026 (UTC).
This release adds support for Python 3.14 with the following limitations:
- dYdX adapter extras (
[dydx]) unavailable due to upstreamcoincurvecompatibility (available on Python 3.12-3.13) - Interactive Brokers adapter extras (
[ib]) unavailable due to upstreamnautilus-ibapicompatibility (available on Python 3.12-3.13)
Enhancements
- Added support for Python 3.14
- Added Kraken integration adapter
- Added Cap'n Proto (
capnp) serialization for efficient zero-copy data interchange (opt-in viacapnpfeature flag innautilus-serializationcrate) - Added initial backtest visualization tearsheets with plotly
- Added matching engine
liquidity_consumptionconfig option to track per-level consumption and prevent overfilling displayed book liquidity (defaultFalseto retain current behavior) - Added matching engine trade consumption tracking (when
liquidity_consumption=Trueandtrade_execution=True) to prevent multiple orders matching the same trade tick from collectively overfilling - Added theme support to
bars_with_fillschart (#3329), thanks @faysou - Added price protection support for market orders (#3065), thanks @Antifrajz
- Added
Quantity.from_decimalconstructor (#3189), thanks @faysou - Added
Price.from_decimalconstructor - Added
Money.from_decimalconstructor - Added
create_bars_with_fillsto Tearsheet (#3137), thanks @faysou - Added
proxy_urlsupport for HTTP clients - Added
CAGRportfolio statistic - Added
CalmarRatioportfolio statistic - Added
MaxDrawdownportfolio statistic - Added
quote_quantityparameter forclose_position(...)andclose_all_positions(...)strategy methods - Added remaining bar aggregation methods:
TICK_IMBALANCE,TICK_RUNS,VOLUME_IMBALANCE,VOLUME_RUNS,VALUE_IMBALANCE,VALUE_RUNS(#3217), thanks @nicolad - Added
ParquetDataCatalog.query_first_timestamp(#3253), thanks @MK27MK - Added
PolymarketDataLoaderfor loading historical data with docs and example - Added Binance accurate commission rates per symbol (#3208), thanks @delusionpig
- Added Binance cross-margin info to
AccountState - Added
BinanceInstrumentProviderConfigto support thequery_commission_ratesconfig option - Added Bybit spot margin auto-borrow and auto-repay with
auto_repay_spot_borrowsconfig option - Added Bybit spot margin manual operations (
BybitMarginAction) for strategy-controlled borrow/repay viaquery_account - Added Bybit HTTP request_tickers support (#3241), thanks @TaiShanQ
- Added Databento subscription acknowledgement handling (#3337), thanks @shzhng
- Added Databento historical client consolidated schema support (#3338), thanks @shzhng
- Added Interactive Brokers optional exchange param for spread contracts (#3319), thanks @faysou
- Added Polymarket Gamma API support for instrument loading (#3141), thanks @DeirhX
- Added OKX historical trades requests
- Added Tardis
book_snapshot_outputconfig option for tardis machine replays (defaultdeltasto retain current behavior) - Added
allow_overfillsconfig option toExecEngineConfig(defaultFalse) to handle order fills exceeding order quantity with warning instead of raising - Added
overfill_qtyfield to orders for tracking fill quantities exceeding original order quantity - Introduced
PositionAdjustedevents for tracking quantity/PnL changes outside normal order fills (base currency commissions, funding payments, manual adjustments) - Upgraded continuous reconciliation for execution engine using position reports to detect missed fills
Breaking Changes
-
Dropped support for Python 3.11
-
Removed
prob_fill_on_stopparameter fromFillModelandFillModelConfig(stop orders have no queue position to simulate as triggers are deterministic when price reaches the trigger level) -
Removed
use_ws_trade_apiconfig option from Bybit execution client (using WebSocket trade API only) -
Renamed
parse_instrumenttoparse_polymarket_instrumentin Polymarket adapter for clarity -
Renamed
ExecTesterConfig.enable_buystoenable_limit_buys -
Renamed
ExecTesterConfig.enable_sellstoenable_limit_sells -
Changed
ParquetDataCatalog.register_datato now treatfiles=[]as registering no files; passfiles=None(default) to include all files -
Standardized data catalog directory naming: Order book data directory names now use plural forms to align with the Rust catalog and Tardis Machine conventions; this ensures data written by the Python
StreamingFeatherWritercan be read by the Rust catalogorder_book_delta/→order_book_deltas/order_book_depth10/→order_book_depths/
Migration: Rename existing data directories to use plural forms:
# If you have existing order book data, rename the directories: mv <your_data_path>/order_book_delta <your_data_path>/order_book_deltas mv <your_data_path>/order_book_depth10 <your_data_path>/order_book_depths
Security
- Added
osv-scannerfor Python dependency vulnerability scanning in pre-commit - Added
cargo-vetfor Rust supply chain security auditing - Hardened unsafe code with runtime checks and
#![deny(unsafe_op_in_unsafe_fn)]lint - Hardened datetime conversions with overflow protection
- Hardened CI workflows by pinning Docker images to SHA digests
- Improved actor/component registry safety with
ActorRefguards and runtime borrow tracking - Fixed code scanning security alerts
Fixes
- Fixed
uint64_ttruncation bug indetermine_trade_fill_qtyfor trade execution withhigh-precisionmode - Fixed stop market order fill price in
L1_MBPmode - Fixed cache dropped same-timestamp market data on insert
- Fixed race condition in InstrumentProvider causing duplicate instrument initialization in shared providers
- Fixed portfolio statistics various bugs and edge cases
- Fixed SyntheticInstrument formula error during parsing with hyphened InstrumentId (#3257), thanks @Javdu10
- Fixed balance recalculation to use raw fixed-point (#3356), thanks @kirill-gr1
- Fixed matching engine GTD order expiry key mismatch (#3272), thanks for reporting @linimin
- Fixed matching engine order modification for partial fills
- Fixed matching engine L2/L3 partial fill quantity calculation on subsequent book updates
- Fixed NETTING position flip snapshots and cache index cleanup (#3081), thanks @SarunasSS
- Fixed incorrect handling of data responses in msgbus (#3310), thanks @filipmacek
- Fixed data engine to use separate aggregators for historical data (#3326), thanks @faysou
- Fixed bar execution generating fractional fill quantities (#3352), thanks @Johnkhk
- Fixed
BacktestResult.total_positionsto match tearsheet count (#3148), thanks for reporting @2-5 - Fixed risk engine negative price handling for spread instruments (#3136), thanks for reporting @q351941406
- Fixed risk engine trailing stop order risk validations (#3160), thanks for reporting @GianC0
- Fixed risk engine balance checks for cash borrowing
- Fixed risk engine balance checks for position-reducing SELL orders (#3256), thanks for reporting @GianC0
- Fixed spawned order client_id caching in
ExecAlgorithm(#3122), thanks for reporting @kirill-gr1 - Fixed parse_dates parameter in CSV loaders (#3132), thanks @maomao9-0
- Fixed
GreeksCalculatorhandling of missing price data (#3116), thanks for reporting @q351941406 - Fixed
StreamingFeatherWriter_setup_streamingwithreplace_existingconfig (#3234), thanks @cauta - Fixed conversion of streamed instruments to catalog (#3235), thanks @faysou
- Fixed active liquidity calculation Pool profiler simulation (#3165), thanks @filipmacek
- Fixed duplicate
on_instrumentcallback in request flow for Python adapters (#3323), thanks @filipmacek - Fixed Redis index key parsing with
use_instance_id - Fixed Betfair datetime encoding error in order status reports
- Fixed Betfair login race condition during concurrent connections
- Fixed Betfair parsing errors for undocumented codes
- Fixed Betfair duplicate fills on startup/reconnect
- Fixed Binance instrument info dict JSON serialization (#3128), thanks for reporting @woung717
- Fixed Binance ADL orders with TRADE execution type
- Fixed Binance Futures Algo Order API for conditional orders (#3287), thanks for reporting @KaizynX
- Fixed Bybit historical bars requests partial (unclosed) bar filtering
- Fixed Bybit WebSocket bars to respect
timestamp_on_closeconfig - Fixed
BybitHttpClienttype stub pyi signatures (#3238), thanks @sunlei - Fixed Databento historical client to support consolidated schemas (
cmbp-1,cbbo-1s,cbbo-1m) in quote requests - Fixed Databento MBO data decoding when
PRICE_UNDEFappears with non-zero precision - Fixed Databento Arrow serialization for
PRICE_UNDEF(#3183), thanks for reporting @marloncalvo - Fixed Databento quote decoding with undefined bid/ask prices
- Fixed Interactive Brokers quote tick subscriptions to use tick-by-tick data (#3135), thanks for reporting @genliusrocks
- Fixed Interactive Brokers serialization of
IBContractDetails(#3181), thanks @faysou - Fixed Interactive Brokers parsing of invalid prices (#3246), thanks @faysou
- Fixed OKX pre-open instrument parsing and standardize enum usage (#3134), thanks for reporting @3wtz
- Fixed OKX
request_barspagination halting prematurely in Range mode (#3145), thanks for reporting @3wtz - Fixed OKX
request_barspagination using correct backwards API semantics (#3145), thanks for reporting @3wtz - Fixed OKX FOK/IOC order type preservation across parsers (#3182), thanks @CuBeof
- Fixed OKX fee rate sign convention for backtesting (#3260), thanks @GhostLee
- Fixed Polymarket maker fill order side inversion (#3126), thanks for reporting @santivazq
- Fixed Polymarket instrument provider market filtering (#3133), thanks @MisterMM23
- Fixed Polymarket websocket client cancellation on concurrent subscriptions (#3169), thanks @DeirhX
- Fixed Polymark...
NautilusTrader 1.221.0 Beta
NautilusTrader 1.221.0 Beta
Released on 26th October 2025 (UTC).
This will be the final release with support for Python 3.11.
Enhancements
- Added support for
OrderBookDepth10requests (#2955), thanks @faysou - Added support for quotes from book depths (#2977), thanks @faysou
- Added support for quotes from order book deltas updates (#3106), thanks @faysou
- Added execution engine rate limiting for single-order reconciliation queries
- Added
subscribe_order_fills(...)andunsubscribe_order_fills(...)forActorallowing to subscribe to all fills for an instrument ID - Added
on_order_filled(...)forActor - Added Renko bar aggregator (#2941), thanks @faysou
- Added
time_range_generatorfor on-the-fly data data subscriptions (#2952), thanks @faysou - Added
__repr__toNewsEvent(#2958), thanks @MK27MK - Added
convert_quote_qty_to_baseconfig option toExecEngineConfig(defaultTrueto retain current behavior) allows adapters to keep quote-denominated sizes when needed - Added contingent order fields
parent_order_idandlinked_order_idsforOrderStatusReportand reconciliation - Added
fs_rust_storage_optionsto Python catalog (#3008), thanks @faysou and @Johnkhk - Added matching engine fallback to default order book for custom fill models (#3039), thanks @Hamish-Leahy
- Added filesystem parameter to parquet in the consolidate functions (#3097), thanks @huracosunah
- Added azure support for az protocol (#3102), thanks @huracosunah
- Added Binance BBO
price_matchparameter support for order submission - Added BitMEX conditional orders support
- Added BitMEX batch cancel support
- Added BitMEX contingent orders support (OCO, OTO, brackets)
- Added BitMEX historical data requests (trades and bars)
- Added BitMEX configurable
recv_window_msfor signed HTTP request expiration - Added Bybit SPOT position reports with opt-in
use_spot_position_reportsconfig option forBybitExecClientConfig - Added Bybit
ignore_uncached_instrument_executionsconfig option forBybitExecClientConfig(defaultFalseto retain current behavior) - Added Databento CME sandbox example
- Added Interactive Brokers cache config support for historical provider (#2942), thanks @ms32035
- Added Interactive Brokers support for fetching orders from all clients (#2948), thanks @dinana
- Added Interactive Brokers order conditions (#2988), thanks @faysou
- Added Interactive Brokers
generate_fill_reportsimplementation (#2989), thanks @faysou - Added OKX conditional trigger orders support
- Added OKX trade mode per order via
paramsusingtd_modekey - Added OKX margin configuration and spot margin support
- Added OKX demo account support
- Added OKX batch cancel support
- Added Polymarket native market orders support
Breaking Changes
- Removed
nautilus_trader.analysis.statisticssubpackage - all statistics are now implemented in Rust and must be imported fromnautilus_trader.analysis(e.g.,from nautilus_trader.analysis import WinRate) - Removed partial bar functionality from bar aggregators and subscription APIs (#3020), thanks @faysou
- Renamed
nautilus-clicrate feature flag fromhypersynctodefi(gates blockchain/DeFi commands) - Polymarket execution client no longer accepts market BUY orders unless
quote_quantity=True
Security
- Fixed non-executable stack for Cython extensions to support hardened Linux systems
- Fixed divide-by-zero and overflow bugs in model crate that could cause crashes
- Fixed core arithmetic operations to reject NaN/Infinity values and improve overflow handling
Fixes
- Fixed reduce-only order panic when quantity exceeds position
- Fixed position purge logic to prevent purging re-opened position
- Fixed
Position.purge_events_for_orderto properly rebuild state from remaining order fills - Fixed cache index cleanup bugs in purge_order operations
- Fixed order average price calculation that was double-counting current fill in weighted average
- Fixed own order book cleanup for terminal orders and inflight handling
- Fixed order book depth snapshot processing to avoid padding levels and metadata tracking for L1 top-of-book ticks
- Fixed crypto instruments PyO3 -> Cython conversion for
lot_sizewhere it was not being passed through - Fixed
serializationcrate bugs and improve error handling - Fixed PyO3 interpreter lifecycle for async shutdown preventing edge case
"interpreter not initialized"panics during shutdown - Fixed
RiskEnginereduce-only cash exits (#2986), thanks for reporting @dennisnissle - Fixed
RiskEnginequote quantity validation - Fixed
BacktestEngineto retain instruments on reset (#3096), thanks for reporting @woung717 - Fixed overflow in
NautilusKernelbuild time calculation due to negative duration (#2998), thanks for reporting @HaakonFlaaronning - Fixed handling of asyncio.CancelledError in execution reconciliation (#3073), thanks @dinana
- Fixed edge case where rejected orders can remain in own order book
- Fixed Currency registration to synchronize between Cython and PyO3 runtimes via new
register_currency()helper - Fixed Databento CMBP-1/CBBO/TBBO symbology resolution
- Fixed
on_loadcalled before strategy added bug (#2953), thanks @lisiyuan656 - Fixed filesystem usage in catalog for
isfileandisdir(#2954), thanks @limx0 - Fixed
SandboxExecutionClientinstrument data handling - Fixed
AccountStateArrow serialization (#3005), thanks for reporting @nikzasel - Fixed
CryptoOptionArrow schemaoption_kindfield to accept string values - Fixed
FuturesSpreadArrow schema missing max/min quantity and price fields - Fixed
OptionSpreadArrow schema missing max/min quantity and price fields - Fixed
CommodityArrow schema to match from_dict requirements - Fixed safe encoded symbols (#2964), thanks @ms32035
- Fixed msgspec encoding for type objects with qualified names
- Fixed nautilus CLI macOS compatibility with regex unicode-perl feature (#2969), thanks @learnerLj
- Fixed fuzzy candlesticks indicator bugs (#3021), thanks @benhaben
- Fixed return type annotation for
ArrowSerializer.deserialize(#3076), thanks @MK27MK - Fixed initializing of sqrt price setting flow when
Poolprofiling (#3100), thanks @filipmacek - Fixed Redis multi-stream consumer skipping messages (#3094), thanks for reporting @kirill-gr1
- Fixed Binance duplicate
OrderSubmittedevent generation for order lists (#2994), thanks @sunlei - Fixed Binance websocket fill message parsing for Binance US with extra fields (#3006), thanks for reporting @bmlquant
- Fixed Binance order status parsing for external orders (#3006), thanks for reporting @bmlquant
- Fixed Binance execution handling for self-trade prevention and liquidations (#3006), thanks for reporting @bmlquant
- Fixed Binance trailing stop to use server-side activation price (#3056), thanks for reporting @hope2see
- Fixed Binance Futures reconciliation duplicated position bug (#3067), thanks @lisiyuan656
- Fixed Binance
price_matchorder price synchronization (#3074) - Fixed Binance Futures position risk query to use v3 API returning only symbols with positions or open orders (#3062), thanks for reporting @woung717
- Fixed Binance Futures liquidation and ADL fill handling
- Fixed BitMEX testnet support
- Fixed BitMEX instrument parsing of lot size
- Fixed BitMEX order rejection handling and response parsing
- Fixed Blockchain adapter out of gas RPC error in Multicall for problematic contracts (#3086), thanks @filipmacek
- Fixed Bybit currency parsing from venue resulting in incorrectly low precision (e.g., USDT precision 4 rather than 8)
- Fixed Bybit handling of
OrderModifyRejectedevents from pending updates - Fixed Bybit account endpoint pagination handling
- Fixed Coinbase Intx API credentials handling to allow passing explicitly
- Fixed Databento MBO
Clearactions and improve docs - Fixed Hyperliquid L1 signing with direct MessagePack serialization (#3087), thanks @nicolad
- Fixed Interactive Brokers tick level historical data downloading (#2956), thanks @DracheShiki
- Fixed Interactive Brokers instrument provider
TypeErrorwhen load_ids/contracts areNone, thanks for reporting @FGU1 - Fixed Interactive Brokers modify bracket order (#2979), thanks @faysou
- Fixed Interactive Brokers historical bars resubscription failure after connection loss (#3002), thanks @Johnkhk
- Fixed Interactive Brokers flat position reconciliation and instrument loading (#3023), thanks @idobz
- Fixed Interactive Brokers bars response handling by removing partial bar (#3040), thanks @sunlei
- Fixed Interactive Brokers account summary handling (#3052), thanks @shinhwasbiz02
- Fixed Interactive Brokers account balance calculation (#3064), thanks @sunlei
- Fixed OKX spot margin quote quantity order handling
- Fixed OKX API credentials handling to allow passing explicitly
- Fixed OKX fee calculations to account for negative fees
- Fixed OKX parsing for
tick_szacross instrument types - Fixed OKX parsing for instruments
multiplierfield - Fixed OKX WebSocket heartbeat and standardize logging
- Fixed Polymarket handling of one-sided quotes (#2950), thanks for reporting @thefabus
- Fixed Polymarket websocket message handling (#2963, #2968), thanks @thefabus
- Fixed Polymarket tick size change handling for quotes (#2980), thanks for reporting @santivazq
- Fixed Polymarket market order submission to use native CLOB market orders (#2984), thanks for reporting @njkds
- Fixed Polymarket maker fill order side inversion (#3077), thanks for reporting @DarioHett
- Fixed Polymarket
neg_riskorder parameter handling - Fixed Tardis instruments
lot_sizemapping - Fixed Tardis adapter error handling and connection robustness
- Fixed Tardis replay to use catalog-compatible filenames
Internal Improvements
- Added ARM64 support to Docker builds
- Added BitMEX adapter integration tests
- Added OKX adapter integration tests
- Added turmoil network simulation testing to network crate
- Adde...
NautilusTrader 1.220.0 Beta
NautilusTrader 1.220.0 Beta
Released on 9th September 2025 (UTC).
Enhancements
- Added initial BitMEX integration adapter
- Added
FundingRateUpdatedata type with caching support through data engine - Added
subscribe_funding_rates(...)andunsubscribe_funding_rates(...)methods for actors - Added
on_funding_rate(...)handler for actors - Added
funding_rate(...)andadd_funding_rate(...)forCache - Added
due_post_onlyfield forOrderRejectedevent, only properly populated for Binance and Bybit for now - Added
log_rejected_due_post_only_as_warningconfig option forStrategyConfig(defaultTrueto retain current behavior) - Added
log_rejected_due_post_only_as_warningconfig option forBinanceExecClientConfig(defaultTrueto retain current behavior) - Added
log_components_onlyconfig option for Logger (#2931), thanks @faysou - Added support for additional Databento schemas:
CMBP_1,CBBO_1S,CBBO_1M,TCBBO, andOHLCV_EOD - Added configurable schema parameters for Databento quote and trade subscriptions, allowing
TBBO/TCBBOfor efficient combined data feeds - Added support for option combos for Interactive Brokers (#2812), thanks @faysou
- Added support for execution of option spreads in backtesting (#2853), thanks @faysou
- Added support for option spread quotes in backtest (#2845), thanks @faysou
- Added loading of options chain from
request_instrumentsfor Interactive Brokers (#2809), thanks @faysou - Added
OptionExerciseModule(#2907), thanks @faysou - Added
MarginModelconcept, base models, config, and factory for backtesting (#2794), thanks @faysou and @stefansimik - Added additional built-in backtest fill models (#2795), thanks @faysou and @stefansimik
- Added
OrderBookDepth10DataWrangler(#2801), thanks @trylovetom - Added
group_sizeparameter for PyO3OrderBook.pprint(...)andOwnOrderBook.pprint(...) - Added custom error logging function support for
RetryManager - Added Bybit options support (#2821), thanks @Baerenstein
- Added Bybit
is_leverageorder parameter support - Added
persist_account_eventsconfig option forCacheConfig(defaultTrueto retain current behavior) - Added
query_accountmethod forStrategy - Added
QueryAccountexecution message - Added streaming methods for
TardisCSVDataLoader - Added stream iterators support for
BacktestEnginelow-level streaming API - Added
YEARaggregation and improved bar specification validation (#2771), thanks @stastnypremysl - Added support for requesting any number of historical bars for dYdX (#2766, #2777), thanks @DeirhX
- Added
use_hyphens_in_client_order_idsconfig option forStrategyConfig - Added
greeks_filterfunction toportfolio_greeks(#2756), thanks @faysou - Added time weighted and percent vega for
GreeksCalculator(#2817), thanks @faysou - Added
VERBOSEoption to common make targets (#2759), thanks @faysou - Added bulk key loading capability for Redis cache database adapter
- Added
multiplierfield forCurrencyPairinstrument (required for some crypto pairs) - Added
tick_scheme_namefield for instrument dictionary conversions - Added default
FixedTickScheme(s) for all valid precisions - Added PancakeSwapV3 pool parsing (#2829), thanks @filipmacek
- Added
PortfolioConfig.min_account_state_logging_interval_msconfig option for throttling account state logging - Added
allow_cash_borrowingconfig option forBacktestVenueConfigto enable negative balances in cash accounts - Added borrowing support for Bybit SPOT accounts, enabling margin trading with negative balances
- Added initial DEX Pool filtering configuration (#2842, #2887), thanks @filipmacek
- Added Arbitrum FluidDEX pool parsing (#2897), thanks @filipmacek
- Added a complete
.env.exampletemplate to guide environment configuration (#2877), thanks @nicolad - Added Interactive Brokers OCA setting to order groups (#2899), thanks @faysou
- Added Interactive Brokers subscriptions for position updates (#2887), thanks @faysou
- Added support for running separate live and paper IB Gateway containers without port conflicts. Simplified container naming and made VNC optional.
- Added
avg_px_openfield toPositionStatusReportfor IB adapter (#2925), thanks @dinana - Added support for running separate live and paper IB Gateway containers simultaneously (#2937), thanks @Bshara23
- Added support for data deduplication on catalog consolidation (#2934), thanks @ms32035
Breaking Changes
- Added
multiplierfield forCurrencyPairArrow schema - Changed
startparameter to required forActordata request methods - Reverted implementation of
delete_account_eventfrom cache database that was too inefficient and is now a no-op pending redesign - Renamed
ParquetDataCatalog.reset_catalog_file_namestoreset_all_file_names - Renamed
BinanceAccountType.USDT_FUTUREtoUSDT_FUTURESfor more conventional terminology - Renamed
BinanceAccountType.COIN_FUTUREtoCOIN_FUTURESfor more conventional terminology - Renamed
InstrumentMiniInfotoTardisInstrumentMiniInfoto standardize adapter naming conventions - Removed the generic
cvec_dropFFI function, as it was unused and prone to misuse, potentially causing memory leaks - Removed redundant
managedparameter forActor.subscribe_book_at_interval(the book must be managed by theDataEngineto provide snapshots at intervals) - Consolidated
OwnBookgroup_bidsandgroup_asksmethods intobid_quantityandask_quantitywith optionaldepthandgroup_sizeparameters - Consolidated ~40 individual indicator modules into 6 files to reduce binary size
- Consolidated
backtest.exchangeintobacktest.engineto reduce binary size - Consolidated
backtest.matching_engineintobacktest.engineto reduce binary size - Changed indicator imports from nested modules to flat structure (e.g.,
from nautilus_trader.indicators.atr import AverageTrueRangebecomesfrom nautilus_trader.indicators import AverageTrueRange) - Changed
NAUTILUS_CATALOG_PATHtoNAUTILUS_PATHfor Tardis adapter (#2850), thanks @nicolad - Simplified Binance environment variables for API credentials: removed separate variables for RSA/Ed25519 keys and consolidated mainnet spot/futures credentials
- Moved
Indicatorbase class fromnautilus_trader.indicators.base.indicatortonautilus_trader.indicators.base
Internal Improvements
- Refactored OKX adapter to Rust API clients
- Refactored
BacktestDataIterator(#2791) to consolidate data generator usage, thanks @faysou - Implemented
LogGuardreference counting for proper thread lifecycle management, ensuring all logs flushed before termination - Implemented live subscriptions for blockchain data client (#2832), thanks @filipmacek
- Implemented initial Hyperliquid adapter (#2912, #2916, #2922, #2935), thanks @nicolad
- Introduced
SharedCell/WeakCellwrappers for ergonomic and safer handling ofRc<RefCell<T>>/Weak<RefCell<T>>pairs - Introduced efficient block syncing command in the
nautilus-cli(#2861), thanks @filipmacek - Introduced pool events syncing command in blockchain data client (#2920), thanks @filipmacek
- Added stream iterators support
BacktestDataIterator - Added serialization support for execution reports
- Added serialization support for execution report commands
- Added
DataTesterstandardized data testing actor for integration adapters - Added
startandstopto response data (#2748), thanks @stastnypremysl - Added integration test service management targets (#2765), thanks @stastnypremysl
- Added integration tests for dYdX bar-partitioning and large-history handling (#2773), thanks @nicolad
- Added make build-debug-pyo3 (#2802), thanks @faysou
- Added pytest timer (#2834), thanks @faysou
- Added support for several instrument versions with
request_instrument(#2835), thanks @faysou - Added
_send_position_status_reportto base execution client (#2926), thanks @faysou - Added
passthrough_bar_typetoTimeBarAggregator(#2929), thanks @faysou - Added matching engine check to return early if
last_qtyis non-positive (#2930), thanks @GhostLee - Added
avg_pxpopulation in order filled events for Interactive Brokers adapter (#2938), thanks @dinana - Optimized identifiers hashing to avoid frequent recomputations using C strings
- Optimized data engine topic string caching for message bus publishing to avoid frequent f-string constructions
- Optimized Redis key scans to improve efficiency over a network
- Completed bar request implementation for OKX (#2789), thanks @nicolad
- Continued
ExecutionEngineand testing in Rust (#2886), thanks @dakshbtc - Enabled parallel pytest tests with
pytest-xdist(#2808), thanks @stastnypremysl - Standardized DeFi chain name validation for
InstrumentId(#2826), thanks @filipmacek - Standardized
NAUTILUS_PATHenv var across Tardis integration (#2850), thanks @nicolad - Standardized zero PnL as Money instead of None when exchange rate missing (#2880), thanks @nicolad
- Refactored
SpreadQuoteAggregator(#2905), thanks @faysou - Refactored bar aggregators to use
ts_initinstead ofts_event(#2924), thanks @fayosu - Improved typing for all the DEX IDs with
DexTypeand add validation (#2827), thanks @filipmacek - Improved reconciliation handling of internally generated orders to align positions (now uses the
INTERNAL-DIFFstrategy ID) - Improved data client for blockchain adapter (#2787), thanks @filipmacek
- Improved DEX pool sync process in the blockchain adapter (#2796), thanks @filipmacek
- Improved efficiency of message bus external streams buffer flushing
- Improved
databento_test_request_barsexample (#2762), thanks @faysou - Improved zero-sized trades handling for Tardis CSV loader (will log a warning)
- Improved ergonomics of
TardisInstrumentProviderdatetime filter para...
NautilusTrader 1.219.0 Beta
NautilusTrader 1.219.0 Beta
Released on 5th July 2025 (UTC).
Enhancements
- Added
graceful_shutdown_on_exceptionconfig option for live engines (defaultFalseto retain intended hard crash on unexpected system exceptions) - Added
purge_from_databaseconfig option forLiveExecEngineConfigto support cache backing database management - Added support for data download during backtest (#2652), thanks @faysou
- Added delete data range to catalog (#2744), thanks @faysou
- Added consolidate catalog by period (#2727), thanks @faysou
- Added
fire_immediatelyflag parameter for timers where a time event will be fired at thestartinstant and then every interval thereafter (defaultFalseto retain current behavior) (#2600), thanks for the idea @stastnypremysl - Added
time_bars_build_delayconfig option forDataEngineConfig(#2676), thanks @faysou - Added immediate firing capability for time alerts and corresponding test (#2745), thanks @stastnypremysl
- Added missing serialization mappings for some instruments (#2702), thanks @faysou
- Added support for DEX swaps for blockchain adapter (#2683), thanks @filipmacek
- Added support for Pool liquidity updates for blockchain adapter (#2692), thanks @filipmacek
- Added fill report reconciliation warning when discrepancy with existing fill (#2706), thanks @faysou
- Added optional metadata function for custom data query (#2724), thanks @faysou
- Added support for order-list submission in the sandbox execution client (#2714), thanks @petioptrv
- Added hidden order support for IBKR (#2739), thanks @sunlei
- Added
subscribe_order_book_deltassupport for IBKR (#2749), thanks @sunlei - Added
bid_levelsandask_levelsforOrderBook.pprint - Added
accepted_buffer_nsfilter param forCache.own_bid_orders(...)andCache.own_ask_orders(...) - Added trailing stop orders
activation_pricesupport in Rust (#2750), thanks @nicolad
Breaking Changes
- Renamed catalog
instrument_idsfilter param toidentifiersto more accurately describe strings which can represent either instrument IDs or bar types - Changed behavior of timers
allow_past=Falseto permitstarttimes in the past if the next event time is still in the future - Changed Databento DBN upgrade policy to default v3
- Removed problematic negative balance check for margin accounts (cash account negative balance check remains unchanged)
- Removed support for Databento DBN v1 schemas (migrate to DBN v2 or v3, see DBN Changelog)
Internal Improvements
- Added logging macros for custom component and color in Rust
- Added Cython-level parameter validation for timer operations to prevent Rust panics and provide clearer Python error messages
- Added property-based testing for
Price,Quantity,Moneyvalue types in Rust - Added property-based testing for
UnixNanosin Rust - Added property-based testing for
OrderBookin Rust - Added property-based testing for
TestTimerin Rust - Added property-based testing for
networkcrate in Rust - Added chaos testing with
turmoilfor socket clients in Rust - Added
check_positive_decimalcorrectness function and use for instrument validations (#2736), thanks @nicolad - Added
check_positive_moneycorrectness function and use for instrument validations (#2738), thanks @nicolad - Ported data catalog refactor to Rust (#2681, #2720), thanks @faysou
- Optimized
TardisCSVDataLoaderperformance (~90% memory usage reduction, ~60-70% faster) - Consolidated the clocks and timers v2 feature from @twitu
- Consolidated on pure Rust cryptography crates with no dependencies on native certs or openssl
- Consolidated on
aws-lc-rscryptography for FIPS compliance - Confirmed parity between Cython and Rust indicators (#2700, #2710, #2713), thanks @nicolad
- Implemented
From<Pool>->CurrencyPair&InstrumentAny(#2693), thanks @nicolad - Updated
Makefileto use new docker compose syntax (#2746), thanks @stastnypremysl - Updated Tardis exchange mappings
- Improved live engine message processing to ensure exceptions result in a crash rather than continuing without the queue processing messages
- Improved live reconciliation robustness and testing
- Improved listen key error handling and recovery for Binance
- Improved handling of negative balances in backtests (#2730), thanks @ms32035
- Improved robustness of cash and margin account locked balance calculations to avoid negative free balance
- Improved robustness of fill price parsing for Betfair
- Improved implementation, validations and testing for Rust instruments (#2723, #2733), thanks @nicolad
- Improved
Currencyequality to usestrcmpto avoid C pointer comparison issues withustrstring interning - Improved unsubscribe cleanup(s) for Bybit adapter
- Improved
Makefileto be self-documenting (#2741), thanks @sunlei - Refactored IB adapter (#2647), thanks @faysou
- Refactored data catalog (#2652, #2740), thanks @faysou
- Refined Rust data catalog (#2734), thanks @faysou
- Refined logging subsystem lifecycle management and introduce global log sender
- Refined signal serialization and tests (#2705), thanks @faysou
- Refined CI/CD and build system (#2707), thanks @stastnypremysl
- Upgraded Rust (MSRV) to 1.88.0
- Upgraded Cython to v3.1.2
- Upgraded
databentocrate to v0.28.0 - Upgraded
datafusioncrate to v48.0.0 - Upgraded
pyo3andpyo3-async-runtimescrates to v0.25.1 - Upgraded
rediscrate to v0.32.3 - Upgraded
tokiocrate to v1.46.1 - Upgraded
tokio-tungstenitecrate to v0.27.0
Fixes
- Fixed
AccountBalancemutation inAccountStateevents (#2701), thanks for reporting @DeirhX - Fixed order book cache consistency in update and remove operations (found through property-based testing)
- Fixed order status report generation for Polymarket where
venue_order_idwas unbounded - Fixed data request identifier attribute access for
LiveDataClient - Fixed
generate_order_modify_rejectedtypo in Binance execution client (#2682), thanks for reporting @etiennepar - Fixed order book depth handling in subscriptions for Binance
- Fixed potential
IndexErrorwith empty bars requests for Binance - Fixed GTD-GTC time in force conversion for Binance
- Fixed incorrect logging of trigger type for Binance
- Fixed trade ticks unsubscribe for Binance which was not differentiating aggregated trades
- Fixed pending update hot cache cleanup for Betfair execution client
- Fixed invalid session information on account update for Betfair execution client
- Fixed order book snapshots unsubscribe for Tardis data client
- Fixed Arrow schema registration for
BinanceBar - Fixed gRPC server shutdown warning when running dYdX integration tests
- Fixed registration of encoder and decoder for
BinanceBar, thanks for reporting @miller-moore - Fixed spot and futures sandbox for Binance (#2687), thanks @petioptrv
- Fixed
cleananddistcleanmake targets entering.venvand corrupting the Python virtual env, thanks @faysou - Fixed catalog identifier matching to exact match (#2732), thanks @faysou
- Fixed last value updating for RSI indicator (#2703), thanks @bartlaw
- Fixed gateway/TWS reconnect process for IBKR (#2710), thanks @bartlaw
- Fixed Interactive Brokers options chain issue (#2711), thanks @FGU1
- Fixed partially filled bracket order and SL triggered for IBKR (#2704, #2717), thanks @bartlaw
- Fixed instrument message decoding when no
exchangevalue for Databento US equities - Fixed fetching single-instrument trading fees for
Binance, thanks @petioptrv - Fixed IB-TWS connection issue with international languages (#2726), thanks @DracheShiki
- Fixed bar requests for Bybit where pagination was incorrect which limited bars being returned
- Fixed Bybit Unknown Error (#2742), thanks @DeevsDeevs
- Fixed margin balance parsing for Bybit
- Restored task error logs for IBKR (#2716), thanks @bartlaw
Documentation Updates
- Updated IB adapter documentation (#2729), thanks @faysou
- Improved reconciliation docs in live concept guide
Deprecations
- Deprecated
Portfolio.set_specific_venue(...), to be removed in a future release; useCache.set_specific_venue(...)instead
NautilusTrader 1.218.0 Beta
NautilusTrader 1.218.0 Beta
Released on 31st May 2025 (UTC).
Enhancements
- Added convenience re-exports for Betfair adapter (constants, configs, factories, types)
- Added convenience re-exports for Binance adapter (constants, configs, factories, loaders, types)
- Added convenience re-exports for Bybit adapter (constants, configs, factories, loaders, types)
- Added convenience re-exports for Coinbase International adapter (constants, configs, factories)
- Added convenience re-exports for Databento adapter (constants, configs, factories, loaders, types)
- Added convenience re-exports for dYdX adapter (constants, configs, factories)
- Added convenience re-exports for Polymarket adapter (constants, configs, factories)
- Added convenience re-exports for Tardis adapter (constants, configs, factories, loaders)
- Added support for
FillModel,LatencyModelandFeeModelin BacktestNode (#2601), thanks @faysou - Added bars caching from
request_aggregated_bars(#2649), thanks @faysou - Added
BacktestDataIteratorto backtest engine to provide on-the-fly data loading (#2545), thanks @faysou - Added support for
MarkPriceUpdatestreaming from catalog (#2582), thanks @bartolootrit - Added support for Binance Futures margin type (#2660), thanks @bartolootrit
- Added support for mark price stream across all markets for Binance (#2670), thanks @sunlei
- Added
bars_timestamp_on_closeconfig option for Databento which defaults toTrueto consistently align with Nautilus conventions - Added
activation_pricesupport for trailing stop orders (#2610), thanks @hope2see - Added trailing stops for OrderFactory bracket orders (#2654), thanks @hope2see
- Added
raise_exceptionconfig option forBacktestRunConfig(defaultFalseto retain current behavior) which will raise exceptions to interrupt a nodes run process - Added
UnixNanos::is_zero()convenience method to check for a zero/epoch value - Added SQL schema, model, and query for
OrderCancelRejected - Added SQL schema, model, and query for
OrderModifyRejected - Added HyperSync client to blockchain adapter (#2606), thanks @filipmacek
- Added support for DEXs, pools, and tokens to blockchain adapter (#2638), thanks @filipmacek
Breaking Changes
- Changed trailing stops to use
activation_pricerather thantrigger_pricefor Binance to more closely match the Binance API conventions
Internal Improvements
- Added
activation_pricestr and repr tests for trailing stop orders (#2620), thanks @hope2see - Added condition check for order
contingency_typeandlinked_order_idswhere a contingency should have associated linked order IDs - Improved robustness of socket client reconnects and disconnects to avoid state race conditions
- Improved error handling for socket clients, will now raise Python exceptions on send errors rather than logging with
tracingonly - Improved error handling for Databento adapter by changing many unwraps to instead log or raise Python exceptions (where applicable)
- Improved error handling for Tardis adapter by changing many unwraps to instead log or raise Python exceptions (where applicable)
- Improved fill behavior for limit orders in
L1_MBPbooks, will now fill entire size when marketable asTAKERor market moves through limit asMAKER - Improved account state event generation for margin accounts, avoiding the generation of redundant intermediate account states for the same execution event
- Improved ergonomics of messaging topics, patterns, and endpoints in Rust (#2658), thanks @twitu
- Improved development debug builds with cranelift backend for Rust (#2640), thanks @twitu
- Improved validations for
LimitOrderin Rust (#2613), thanks @nicolad - Improved validations for
LimitIfTouchedOrderin Rust (#2533), thanks @nicolad - Improved validations for
MarketIfTouchedOrderin Rust (#2577), thanks @nicolad - Improved validations for
MarketToLimitOrderin Rust (#2584), thanks @nicolad - Improved validations for
StopLimitOrderin Rust (#2593), thanks @nicolad - Improved validations for
StopMarketOrderin Rust (#2596), thanks @nicolad - Improved validations for
TrailingStopMarketOrderin Rust (#2607), thanks @nicolad - Improved orders initialize and display tests in Rust (#2617), thanks @nicolad
- Improved testing for Rust orders module (#2578), thanks @dakshbtc
- Improved Cython-Rust indicator parity for
AdaptiveMovingAverage(AMA) (#2626), thanks @nicolad - Improved Cython-Rust indicator parity for
DoubleExponentialMovingAverage(DEMA) (#2633), thanks @nicolad - Improved Cython-Rust indicator parity for
ExponentialMovingAverage(EMA) (#2642), thanks @nicolad - Improved Cython-Rust indicator parity for
HullMovingAverage(HMA) (#2648), thanks @nicolad - Improved Cython-Rust indicator parity for
LinearRegression(#2651), thanks @nicolad - Improved Cython-Rust indicator parity for
WilderMovingAverage(RMA) (#2653), thanks @nicolad - Improved Cython-Rust indicator parity for
VariableIndexDynamicAverage(VIDYA) (#2659), thanks @nicolad - Improved Cython-Rust indicator parity for
SimpleMovingAverage(SMA) (#2655), thanks @nicolad - Improved Cython-Rust indicator parity for
VolumeWeightedAveragePrice(VWAP) (#2661), thanks @nicolad - Improved Cython-Rust indicator parity for
WeightedMovingAverage(WMA) (#2662), thanks @nicolad - Improved Cython-Rust indicator parity for
ArcherMovingAveragesTrends(AMAT) (#2669), thanks @nicolad - Improved zero size trade logging for Binance Futures (#2588), thanks @bartolootrit
- Improved error handling on API key authentication errors for Polymarket
- Improved execution client debug logging for Polymarket
- Improved exception on deserializing order from cache database
- Improved
Nonecondition checks for value types, which now raise aTypeErrorinstead of an obscureAttributeError - Changed
VecDequefor fixed-capacityArrayDequein SMA indicator (#2666), thanks @nicolad - Changed
VecDequefor fixed-capacityArrayDequein LinearRegression (#2667), thanks @nicolad - Implemented remaining Display for orders in Rust (#2614), thanks @nicolad
- Implemented
_subscribe_instrumentfor dYdX and Bybit (#2636), thanks @davidsblom - Untangled
ratelimiterquota frompythonflag (#2595), thanks @twitu - Refined
BacktestDataIteratorcorrectness (#2591), thanks @faysou - Refined formatting of IB adapter files (#2639), thanks @faysou
- Optimized message bus topic-matching logic in Rust by 100× (#2634), thanks @twitu
- Changed to faster message bus pattern matching logic from Rust (#2643), thanks @twitu
- Upgraded Rust (MSRV) to 1.87.0
- Upgraded Cython to v3.1.0 (now stable)
- Upgraded
databentocrate to v0.26.0 - Upgraded
rediscrate to v0.31.0 - Upgraded
sqlxcrate to v0.8.6 - Upgraded
tokiocrate to v1.45.1
Fixes
- Fixed portfolio account updates leading to incorrect balances (#2632, #2637), thanks for reporting @bartolootrit and @DeirhX
- Fixed portfolio handling of
OrderExpiredevents not updating state (margin requirements may change) - Fixed event handling for
ExecutionEngineso it fully updates thePortfoliobefore to publishing execution events (#2513), thanks for reporting @stastnypremysl - Fixed PnL calculation for margin account on position flip (#2657), thanks for reporting @Egisess
- Fixed notional value pre-trade risk check when order using quote quantity (#2628), thanks for reporting @DeevsDeevs
- Fixed position snapshot cache access for
ExecutionEngine - Fixed position snapshot
SystemErrorcallingcopy.deepcopy()by simply using apickleround trip to copy the position instance - Fixed event purging edge cases for account and position where at least one event must be guaranteed
- Fixed authentication for Redis when password provided with no username
- Fixed various numpy and pandas FutureWarning(s)
- Fixed sockets exponential backoff immediate reconnect value on reset (this prevented immediate reconnects on the next reconnect sequence)
- Fixed message bus subscription matching logic in Rust (#2646), thanks @twitu
- Fixed trailing stop market fill behavior when top-level exhausted to align with market orders (#2540), thanks for reporting @stastnypremysl
- Fixed stop limit fill behavior on initial trigger where the limit order was continuing to fill as a taker beyond available liquidity, thanks for reporting @hope2see
- Fixed matching engine trade processing when aggressor side is
NO_AGGRESSOR(we can still update the matching core) - Fixed modifying and updating trailing stop orders (#2619), thanks @hope2see
- Fixed processing activated trailing stop update when no trigger price, thanks for reporting @hope2see
- Fixed terminating backtest on
AccountErrorwhen streaming, the exception needed to be reraised to interrupt the streaming of chunks (#2546), thanks for reporting @stastnypremysl - Fixed HTTP batch order operations for Bybit (#2627), thanks @sunlei
- Fixed
reduce_onlyattribute access in batch place order for Bybit - Fixed quote tick parsing for one-sided books on Polymarket
- Fixed order fill handling for limit orders with
MAKERliquidity side on Polymarket - Fixed currency parsing for
BinaryOptionon Polymarket to consistently use USDC.e (PoS USDC on Polygon) - Fixed identity error handling during keep-alive for Betfair, will now reconnect
- Updated
BinanceFuturesEventTypeenum with additional variants, thanks for reporting @miller-moore
Documentation Updates
- Added capability matrices for integration guides
- Added content to Architecture concept guide
- Added content to Live Trading concept guide
- Added content to Developer Guide
- Added errors and panics docs for most crates
- Added errors and panics docs for most crates
- Improved the clarity of various concept guides
- Fixed several errors in concept guides
Deprecations
- Deprecated support for ...
NautilusTrader 1.217.0 Beta
NautilusTrader 1.217.0 Beta
Released on 30th April 2025 (UTC).
Enhancements
- Added processing of
OrderBookDepth10forBacktestEngineandOrderMatchingEngine(#2542), thanks @limx0 - Added
Actor.subscribe_order_book_depth(...)subscription method (#2555), thanks @limx0 - Added
Actor.unsubscribe_order_book_depth(...)subscription method - Added
Actor.on_order_book_depth(...)handler method (#2555), thanks @limx0 - Added
UnixNanos::max()convenience method for the maximum valid value - Added
available_offsetfilter parameter forTardisInstrumentProvider - Added
NAUTILUS_WORKER_THREADSenvironment variable for common tokio runtime builder - Added
Quantity::non_zero(...)method - Added
Quantity::non_zero_checked(...)method - Added
round_downparam forInstrument.make_qty(...)that isFalseby default to maintain current behavior - Added WebSocket batch order operations for Bybit (#2521), thanks @sunlei
- Added mark price subscription for Binance Futures (#2548), thanks @bartolootrit
- Added
Chainstruct to represent blockchain network (#2526), thanks @filipmacek - Added
Blockprimitive for blockchain domain model (#2535), thanks @filipmacek - Added
Transactionprimitive for blockchain domain model (#2551), thanks @filipmacek - Added initial blockchain adapter with live block subscription (#2557), thanks @filipmacek
Breaking Changes
- Removed fees from locked balance calculations for
CASHaccounts - Removed fees from margin calculations for
MARGINaccounts - Renamed
idconstructor parameter toinstrument_idacross all PyO3 instruments, aligning with equivalent Cython instrument constructors
Internal Improvements
- Implemented exponential backoff and jitter for the
RetryManager(#2518), thanks @davidsblom - Simplified default locked balance and margin calculations to not include fees
- Improved handling of time range and effective date filters for
TardisInstrumentProvider - Improved reconnection robustness for Bybit private/trading channels (#2520), thanks @sunlei
- Improved logger buffers flushing post backtest
- Improved validations for Tardis trades data
- Improved correctness of client registration and deregistration for
ExecutionEngine - Improved build time by only compiling libraries (#2539), thanks @twitu
- Improved logging flush (#2568), thanks @faysou
- Improved
clear_log_fileto happen for each kernel initialization (#2569), thanks @faysou - Refined
PriceandQuantityvalidations and correctness - Filter fill events if order is already filled for dYdX (#2547), thanks @davidsblom
- Fixed some clippy lints (#2517), thanks @twitu
- Upgraded
databentocrate to v0.24.0 - Upgraded
datafusioncrate to v47.0.0 - Upgraded
rediscrate to v0.30.0 - Upgraded
sqlxcrate to v0.8.5 - Upgraded
pyo3crate to v0.24.2
Fixes
- Fixed consistent ordering of execution events (#2513, #2554), thanks for reporting @stastnypremysl
- Fixed type error when generating an elapsed time for backtests with no elapsed time
- Fixed memory leak in
RetryManagerby simplifying the acquire-release pattern, avoiding the asynchronous context manager protocol that led to state sharing, thanks for reporting @DeevsDeevs - Fixed locked balance and initial margin calculations for reduce-only orders (#2505), thanks for reporting @stastnypremysl
- Fixed purging order events from position (these needed to be purged prior to removing cache index entry), thanks @DeevsDeevs
- Fixed
TypeErrorwhen formatting backtest post run timestamps which wereNone(#2514), thanks for reporting @stastnypremysl - Fixed handling of
BetfairSequenceCompletedas custom data - Fixed the instrument class of
IndexInstrument, changing toSPOTto correctly represent a spot index of underlying constituents - Fixed data range request
endhandling forDataEngine - Fixed unsubscribe instrument close for
DataEngine - Fixed network clients authentication for OKX (#2553), thanks for reporting @S3toGreen
- Fixed account balance calculation for dYdX (#2563), thanks @davidsblom
- Fixed
ts_initfor databento historical data (#2566), thanks @faysou - Fixed
RequestInstrumentinquery_catalog(#2567), thanks @faysou - Reverted removal of rotate log file on UTC date change (#2552), thanks @twitu
Documentation Updates
- Improved environment setup guide with recommended rust analyzer settings (#2538), thanks @twitu
- Fixed alignment with code for some
ExecutionEnginedocstrings
Deprecations
None
NautilusTrader 1.216.0 Beta
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
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
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
Deprecations
None
NautilusTrader 1.213.0 Beta
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 @sunlei
Documentation Updates
- Clarify docs for timestamp properties in
Data(#2450), thanks @stefansimik - Updated environment setup document (#2452), thanks @faysou
Deprecations
None