github nautechsystems/nautilus_trader v1.227.0
NautilusTrader 1.227.0 Beta

6 hours ago

NautilusTrader 1.227.0 Beta

Released on 18th May 2026 (UTC).

Enhancements

  • Added continuous futures support for aggregated bars (#3921), thanks @faysou
  • Added purge_instrument cache method for trimming unused instruments (#3945), thanks for reporting @fedoraiver
  • Added LoggerConfig.file_config and clear_log_file support to the Rust LiveNode runtime (#3955), thanks @filipmacek
  • Added LoggerConfig Python constructor for direct construction without from_spec (#3955), thanks @filipmacek
  • Added limit_aggressive and test_modify_rejected flags to ExecTesterConfig for marketable/modify-rejection tests
  • Added CompositeMarketMaker example strategy with book-mid quoting and synthetic-signal skew (Rust)
  • Added #[custom_data_field(json)] for JSON-backed Arrow Serde fields and PyO3 IndexMap/HashMap dict conversion (#4003), thanks @faysou
  • Added priority parameter to DataActor.subscribe_signal for ordered dispatch between subscribers (Rust and PyO3)
  • Added Cache::order_owned returning an owned OrderAny snapshot for boundary handover (Rust)
  • Added Cache::account_mut, account_owned, account_for_venue_owned with AccountRefMut/AccountAny returns (Rust)
  • Added Cache::position_mut and position_owned with PositionRefMut/Position returns (Rust)
  • Added PortfolioSnapshot event for per-account mark-to-market emission, gated by snapshot_interval_ms (Rust)
  • Added Portfolio::build_snapshot and Portfolio::snapshots accessors with a bounded per-account ring (Rust)
  • Added subscribe_portfolio_snapshot and publish_portfolio_snapshot message bus API on events.portfolio (Rust)
  • Added subscribe_positions message bus function (Rust)
  • Added InstrumentId::parse_parent_components and InstrumentClass parent suffix conversion methods, exposed via PyO3 (Rust)
  • Added serde Deserialize support for LiveNodeConfig and 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_mins config for the reconciliation lookback window
  • Added Binance Spot expiryReason field capture on schema 3:4 SBE order responses (Rust)
  • Added Binance Spot serverShutdown event handling on market-data and trading WebSocket streams (Rust)
  • Added Binance USDM mark price moving average (ap) field on BinanceFuturesMarkPriceMsg (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 flatten binary that cancels working orders and flattens Linear/Inverse positions
  • Added Bybit instrument-info symbolId, symbolType (with xstocks/stock/forex/commodity), and spot xstockMultiplier fields (Rust)
  • Added Bybit position openTime field on REST BybitPosition and WS BybitWsAccountPosition (Rust)
  • Added Bybit execution.fast private WebSocket channel support with slim payload struct and FillReport dispatch (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_precision and get_price_precisions methods on the data loader and historical client
  • Added Deribit auto_load_missing_instruments config 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_rates HTTP method and PyO3 binding
  • Added Hyperliquid HIP-4 outcome instruments: +E/#E encoding, USDH settlement, and per-side BinaryOption modeling
  • Added Hyperliquid HIP-4 outcome reconciliation via spot balances; outcomeMeta settlement dispatch on the Rust client
  • Added Hyperliquid HIP-4 userOutcome actions (split, merge, mergeQuestion, negate) and venue Settlement fill parsing
  • Added Hyperliquid allMids custom 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 slippagePct parameter for market orders via the slippage_pct order param
  • Added OKX event contracts support
  • Added Polymarket OrderStatusReport.filled_qty dust snap at terminal Filled status to absorb venue truncation
  • Added Polymarket PolymarketFeeModel backtest fee model with maker-rebate inference
  • Added Polymarket PolymarketDataLoader.sanitize_info flag to strip resolution fields on resolved markets

Breaking Changes

  • Removed legacy adapter environment flags per previous deprecation; use environment enum
  • Removed From<OrderInitialized> for order types; use TryFrom to surface invariant errors via try_from/try_into
  • Removed Polymarket SNAP_UNDERFILL_ULPS and SNAP_OVERFILL_ULPS; reverting to single DUST_SNAP_THRESHOLD constant
  • Removed stale Tardis crypto-com-derivatives exchange variant
  • Renamed Binance and Kraken environments from Mainnet/MAINNET to Live/LIVE
  • Renamed time_bars_origins config param to time_bars_origin_offset in DataEngineConfig/LiveDataEngineConfig (Rust)
  • Renamed Cache::mut_order to order_mut; takes &mut Cache and returns OrderRefMut<'_> (Rust)
  • Changed Cache::order and orders_* to return OrderRef<'_> (newtype borrow, was &OrderAny) (Rust)
  • Changed Cache::account, account_for_venue, accounts to return AccountRef<'_> (was &AccountAny) (Rust)
  • Changed Cache::position, position_for_order, positions_* to return PositionRef<'_> (was &Position) (Rust)
  • Changed Cache::take_account to move the account out of its cell and panic on alias instead of cloning (Rust)
  • Changed to deny submit_order/submit_order_list with a custom position_id under NETTING OMS; use HEDGING for custom position IDs
  • Changed JSON log file extension from .json to .jsonl; update log shippers watching .json (#3955), thanks @filipmacek
  • Changed Python order create() methods to raise ValueError on invalid OrderInitialized instead of panicking
  • Changed default TransportBackend to Sockudo; set backend = Tungstenite to keep the previous default
  • Changed nautilus-network default Cargo features to include transport-sockudo
  • Changed nautilus-model arrow to an optional feature; enable arrow (or python-arrow) for prior behavior (#4008), thanks @sunlei
  • Changed OrderMatchingEngineConfig defaults to match the Cython per-engine constructor (Rust)
  • Changed Strategy order methods to take Option<Params> to avoid unnecessary IndexMap allocations (Rust); use None or Some(params)
  • Changed Strategy::cancel_order and modify_order to take ClientOrderId instead of OrderAny (Rust v2)
  • Changed Strategy::cancel_orders to take Vec<ClientOrderId> instead of Vec<OrderAny> (Rust v2)
  • Changed Rust strategy registration to append order_id_tag to explicit strategy IDs, matching Cython
  • Changed Binance Futures to prefer DEMO endpoints for simulated trading
  • Changed Databento data loaders to error on unresolved precision; pass price_precision or call set_price_precision
  • Changed Kraken Spot to reject DEMO; demo remains Futures-only
  • Changed nautilus_core::from_pydict from Py<PyDict> to &Py<PyDict> to avoid moving the input dict (Rust) (#4003), thanks @faysou
  • Changed DataActor::subscribe_signal to take priority: Option<u32>; existing callers must pass None (Rust)
  • Changed message bus subscription priority from u8 to u32 to match Cython int priority parity (Rust)
  • Changed OrderFactory::bracket to a bon builder with per-leg entry_*/tp_*/sl_* setters; use factory.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_TOKEN PAT in favor of per-job GHCR GITHUB_TOKEN
  • Hardened CI release signing chain: pinned cosign tooling, harden-runner on 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-package so lost wheels fail uv lock not build sdist
  • Upgraded urllib3 to v2.7.0 (GHSA-mf9v-mfxr-j63j decompression-bomb bypass, GHSA-qccp-gfcp-xxvc cross-host proxy header leak)
  • Fixed DatabaseConfig repr to fully redact passwords (#4028), thanks @faysou
  • Documented Sigstore signature and SBOM verification commands in SECURITY.md

Fixes

  • Fixed RefCell reentrancy panic in ExecutionEngine::handle_order_fill for OTO parent fills (#3981), thanks for reporting @GreatLandmark
  • Fixed RefCell reentrancy in ExecutionEngine::load_cache nested borrow_mut calls
  • Fixed RefCell double-borrow panic in Portfolio::update_position when calculate_account_state is true
  • Fixed identifier deserialization inside #[serde(tag = "type")] enums and serde_json::Value via Cow<'de, str> owned-string support
  • Fixed AccountsManager::update_balances discarding 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 AccountState events emitting empty balances when balances were populated
  • Fixed allow_cash_borrowing not 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_algorithm discarding query filters when applying intersection (Rust)
  • Fixed OwnOrderBook tracking for reconciled external open orders (Rust)
  • Fixed OrderAny::from_events panic on malformed OrderInitialized; reconciliation returns Err instead of crashing
  • Fixed BacktestEngine not enabling calculate_account_state on accounts (#3988), thanks for reporting @magnified103
  • Fixed BacktestEngine not settling on_stop commands before shutdown (#4062), thanks for reporting @zhanghaoda
  • Fixed MessageBus late wildcard subscriptions missing events on already-cached topics (#3942), thanks for reporting @graceyangfan
  • Fixed OrderMatchingEngine to propagate tick-size to MatchingCore (#3942), thanks for reporting @graceyangfan
  • Fixed OrderMatchingEngine duplicate fills from closed matching-core orders (#4075)
  • Fixed OrderMatchingEngine.reset leaking OrderBook.ts_last across 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 ExecutionEngine reconciliation skipping OrderUpdated when both report and order were already ACCEPTED
  • Fixed ExecutionEngine subscribe_venue_instruments routing 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 OrderUpdated emission for pending venue states before venue confirmation (Rust)
  • Fixed reconciliation missing MarketIfTouched/LimitIfTouched price 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/Actor clock callback leak on dispose (#3967), thanks for reporting @frslvr
  • Fixed Strategy pending cancel and pending update events before order commands (Rust)
  • Fixed Strategy submit methods to publish OrderInitialized before cache updates (Rust)
  • Fixed ExecTester LIT pricing direction so reconciled BUY/SELL LIT orders satisfy the trigger_price invariant
  • 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_data macro PyO3 stub generation: order gen_stub above pyo3 attributes and detect cfg_attr-wrapped invocations
  • Fixed catalog consolidate_data_by_period cleanup for skipped targets (#4080), thanks @arpankapoor
  • Fixed SQL ParserError for symbols containing ampersand (#4025), thanks @arpankapoor
  • Fixed DataEngine to route subscribe/unsubscribe commands to the BACKTEST client when registered (Rust)
  • Fixed DataEngine to apply validate_data_sequence to bars emitted by internal aggregators (Rust)
  • Fixed emit_quotes_from_book and emit_quotes_from_book_depths config flags being silently ignored (Rust)
  • Fixed DataEngine composite book subscriptions not routing per-underlying deltas/depth to per-underlying books (Rust)
  • Fixed DataEngine composite + exact book subscription overlap double-applying to the shared cache book (Rust)
  • Fixed DataEngine unsubscribe detaching the client while exact-topic subscribers remained (Rust)
  • Fixed DataEngine bar aggregator quote/trade subscription priority (Rust)
  • Fixed DataEngine::reset leaking book and option-chain state across resets (Rust)
  • Fixed DataActor composite book delta subscriptions not receiving per-underlying publishes (Rust)
  • Fixed Architect AX GET /order-status to use oid/cid per v14.0.1; legacy order_id/client_order_id now 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 RuntimeError blocking 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.linear WS topic; gates to CryptoPerpetual only (#4084)
  • Fixed Betfair Rust adapter dropped fills on reconnect by resyncing the fill tracker from cache
  • Fixed Betfair Rust adapter panic on blank customerOrderRef/rfo by normalizing empty strings to None
  • Fixed Betfair Rust adapter spurious OrderRejected after OCM already reported a terminal state
  • Fixed Betfair Rust adapter ignore_external_orders to treat empty rfo strings 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 OrderExpired on both WS and HTTP reconciliation paths
  • Fixed dYdX TriggerType default when condition_type is unset so reconciliation no longer rejects the report
  • Fixed dYdX TAKE_PROFIT order type deserialization (the Indexer omits the _LIMIT suffix)
  • 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_response argument set
  • Fixed dYdX Python _subscribe_order_book_depth to log a graceful warning instead of raising NotImplementedError
  • Fixed Deribit StopMarket OrderRejected when the order response omits filled_amount (#3995), thanks for reporting @marco-rigoni
  • Fixed Deribit cross-margin overcounting; reports equity for total and available_withdrawal_funds for 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 arrow feature
  • 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 OrderCanceled on concurrent modifies (Python and Rust) (#3971), thanks @M-Advis
  • Fixed Hyperliquid cancel-replace fill race emitting OrderFilled against stale local order state (Python and Rust) (#3972)
  • Fixed Hyperliquid dropping FillReport before order cached; fills now buffered and drained on OrderAccepted (#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 RuntimeError on 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_only instrument status (#3966), thanks @jhavie
  • Fixed OKX missing rebase instrument status (#3998), thanks @jhavie
  • Fixed OKX future instrument status parsing (#4005), thanks @cryptoSUN2049
  • Fixed Polymarket V2 BUY overfill rejection via overfill-only last_qty snap 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 ACCEPTED orders 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_change clearing 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_id for 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_trades TradeId collisions on multi-fill transactionHash (Python and Rust)
  • Fixed Polymarket parse_trades ts_event collisions on same-second fills (Python and Rust)
  • Fixed Polymarket fetch_trades aborting on historical-offset ceiling; warns and returns partial (Python and Rust)
  • Fixed Polymarket load_trades non-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_increment primitive for tick-size propagation parity (Rust)
  • Added iter_* API on OrderMatchingCore for zero-allocation read-only iteration of resting orders (Rust)
  • Added Criterion bench suite for OrderMatchingCore covering add/get/delete/iterate hot paths (Rust)
  • Added OwnOrderBook property tests for Rust model invariants
  • Added ContinuousFutureAdjustmentType enum and BarBuilder price adjustment pipeline (Rust)
  • Added native is_externally_aggregated/is_internally_aggregated methods on BarType (Rust)
  • Added live node stress harness with trade_burst and cancel_starvation scenarios (Rust)
  • Added DataEngine and AsyncRunner per-stage benches for the trade-to-cache path (Rust)
  • Added Python TradingNode parity stress harness for v1 vs v2 comparison
  • Added cargo-flamegraph to workspace tools with pinned version
  • Added simulation feature on nautilus-live so the stress harness runs under cfg(madsim) for DST validation
  • Added NautilusKernel::with_cache_database builder setter and constructor variant for cache database adapter injection (Rust)
  • Added nautilus-event-store snapshot capture/restore/replay via NautilusKernel for durable cache state across runs (Rust)
  • Added automatic Tungstenite fallback when WebSocketConfig.proxy_url is set with Sockudo selected (Rust)
  • Added typed publish_instrument() to message bus (#4081), thanks @filipmacek
  • Added Binance Futures -4531 (UM/CM dualSidePosition sync) error classifier with hedge-mode hint (Rust)
  • Added BinanceSpotUserDataEventType enum 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.reset to clear book updaters, snapshotters, option chain managers, and timers (Rust)
  • Improved DataEngine to 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 OwnBookLadder to defer error logging to callers, removing duplicate own-book error noise
  • Improved DataEngine/DataActor bulky responses: summaries at debug, full at trace; same for raw WS frames in Bybit, OKX, BitMEX
  • Improved OrderMatchingEngine trailing-stop activation to use the OrderMatchingCore iter_* API (Rust)
  • Improved OrderMatchingEngine.iterate per-order loop to align trailing-stop and GTD timing with Cython (Rust)
  • Improved OrderMatchingEngine queue-position fill gating to match Cython on cross-through trades (Rust)
  • Improved OrderMatchingEngine.iterate bid/ask reset gate to honor in-flight trade overrides (Rust)
  • Improved update_balance_multi_currency to delegate negative-balance enforcement to per-account update_balances
  • Improved live exec clients to log ERROR with timeout_post_stop hint when cancel tasks abort on disconnect
  • Improved ExecTester to refresh tracked orders from cache before modify/cancel-replace so they see venue acks
  • Improved make build to leave the venv able to import nautilus_trader from 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_close subscribe/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_deltas log level to warn to 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_snapshot helper for direct unit testing (Rust)
  • Optimized Cache order and position query methods to a single size-ordered intersection pass (Rust)
  • Optimized Cache::*_count methods to count via index without materializing a sorted Vec (Rust)
  • Optimized OrderMatchingCore storage to split BTreeMap limit/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 alloy crate to v2.0.4
  • Upgraded databento crate to v0.51.0
  • Upgraded redis crate to v1.2.1
  • Upgraded tokio crate to v1.52.3 (fixes a performance regression)

Documentation Updates

  • Added DST docs caveats for process-global lazy state RNG consumption and CacheView factory blocker
  • Added Bybit hedge-mode docs with official positionIdx API 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 allMids adapter 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_event vs ts_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 semantics to the backtesting guide covering on_stop command settlement
  • Updated adapter docs and examples to use environment enums instead of legacy test flags

Artifact checksums

SHA256 checksums are attached as SHA256SUMS, per-asset .sha256 files, and dist-manifest.json.

Artifact SHA256
nautilus_trader-1.227.0-cp312-cp312-macosx_15_0_arm64.whl 735fbbc0737be8f945ee641aeb0dbf0ea6b4c6111f11f10c244fe198f8158953
nautilus_trader-1.227.0-cp312-cp312-manylinux_2_35_aarch64.whl a557ae2e109c5a7f38e6115aff123d3a793c111f1712e333befe218f47d06187
nautilus_trader-1.227.0-cp312-cp312-manylinux_2_35_x86_64.whl 19482db9166560fc415019ddb1d7775c70b6b268bd0629da5c1ee20d951bf3d8
nautilus_trader-1.227.0-cp312-cp312-win_amd64.whl 777bd0693abceebd1cfc835ce1b411fe7f448cb8288a37e0db16753e6a4c9e7d
nautilus_trader-1.227.0-cp313-cp313-macosx_15_0_arm64.whl 66bdd6ead6e278852dde8d1bdaea665757a1fd6dea37066f79ae3769c2dea80c
nautilus_trader-1.227.0-cp313-cp313-manylinux_2_35_aarch64.whl c3e83dcb8bdb27b5b7f33da21c5ab82784ff6ff95abf01b03a1cd1dbb3703d22
nautilus_trader-1.227.0-cp313-cp313-manylinux_2_35_x86_64.whl 4d1f16442744696919e6351ce6a720a47b944d392568d9f528694f35ed63e159
nautilus_trader-1.227.0-cp313-cp313-win_amd64.whl 9525878ba8b3fe3f378336c1242d116e72956f775e86c326f425fd6ca9c11492
nautilus_trader-1.227.0-cp314-cp314-macosx_15_0_arm64.whl 72e9fd76e78be9567ba3cd798b31e9240abc548ae605f8629007b93ccacd9321
nautilus_trader-1.227.0-cp314-cp314-manylinux_2_35_aarch64.whl d9073b14cc3554eda89fae110a2b4ae79bffcd141c61c0fdc20b481e524d90b2
nautilus_trader-1.227.0-cp314-cp314-manylinux_2_35_x86_64.whl 763bdd81d54feba7ae280c96f6da251dff9bd86430232975bebe50dab4f2ad11
nautilus_trader-1.227.0-cp314-cp314-win_amd64.whl 5d1f1b8cd7844e4418535e1b9a43042551716b76904fa37ab0462abf965c47f0
nautilus_trader-1.227.0.tar.gz fbb9c1194f1f50f14fbf0933c35b81e05ea522ab944f584be3c75efb36887ca7

Verify provenance

After downloading an artifact, verify its GitHub artifact attestation:

gh attestation verify <artifact> \
  --repo nautechsystems/nautilus_trader \
  --cert-identity "https://github.com/nautechsystems/nautilus_trader/.github/workflows/build.yml@refs/heads/master" \
  --cert-oidc-issuer https://token.actions.githubusercontent.com

Release integrity addendum

Two integrity assets normally shipped with each release are absent here: crates-manifest.json, and .sigstore/.intoto.jsonl
siblings for each wheel and the sdist. The release was flipped to non-draft before publish-release-integrity retried,
freezing the asset set under immutability. Underlying attestations remain valid at PyPI and the GitHub attestation store.

Verify Python provenance:

uvx --from pypi-attestations pypi-attestations verify pypi \
  --repository https://github.com/nautechsystems/nautilus_trader \
  <pypi-url>

Verify crates:

curl -sS https://crates.io/api/v1/crates/nautilus-core/0.57.0 | jq .version.trustpub_data

Seven crates at 0.57.0 were published via crates.io API token rather than OIDC trusted publishing, as a one-off recovery from
a topo-sort bug in publish-cargo-crates.sh. They show trustpub_data: null:

  • nautilus-analysis
  • nautilus-common
  • nautilus-execution
  • nautilus-network
  • nautilus-portfolio
  • nautilus-testkit
  • nautilus-trading

Script patched before v1.228.0.

Don't miss a new nautilus_trader release

NewReleases is sending notifications on new releases.