v1.227.0

CaviraOSS/LongMemoryv1.227.0May 18, 2026by github-actions[bot]

AI Summary

Beta release with extensive futures support, new adapters, and significant changes to cache APIs and configuration.

Key Highlights

  • Added continuous futures support for aggregated bars and new portfolio snapshot events.
  • Expanded adapter support including Betfair, Binance, Kraken, and Hyperliquid features.
  • New Rust strategy examples and data loader improvements.

Breaking Changes

  • Renamed cache methods (e.g., `mut_order` to `order_mut`) and changed return types to newtype references (`OrderRef`, `AccountRef`, `PositionRef`).
  • Changed default `TransportBackend` to `Sockudo`.
  • Changed JSON log file extension from `.json` to `.jsonl`.
  • Changed Python order `create()` methods to raise `ValueError` instead of panicking.
  • Renamed Binance and Kraken environments from `Mainnet`/`MAINNET` to `Live`/`LIVE`.
  • Changed `nautilus-model` `arrow` feature to optional.
  • Changed `Strategy` method signatures to use `Option<Params>` and `ClientOrderId`.

New Features

  • Continuous futures support
  • Portfolio snapshot events
  • New adapters (Betfair, Binance, Kraken, Hyperliquid, etc.)
  • CompositeMarketMaker example strategy

Full Release Notes

# 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





<!-- release-checksums:start -->
## 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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0-cp312-cp312-manylinux_2_35_x86_64.whl) | 19482db9166560fc415019ddb1d7775c70b6b268bd0629da5c1ee20d951bf3d8 |
| [nautilus_trader-1.227.0-cp312-cp312-win_amd64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0-cp312-cp312-win_amd64.whl) | 777bd0693abceebd1cfc835ce1b411fe7f448cb8288a37e0db16753e6a4c9e7d |
| [nautilus_trader-1.227.0-cp313-cp313-macosx_15_0_arm64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0-cp313-cp313-manylinux_2_35_x86_64.whl) | 4d1f16442744696919e6351ce6a720a47b944d392568d9f528694f35ed63e159 |
| [nautilus_trader-1.227.0-cp313-cp313-win_amd64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0-cp313-cp313-win_amd64.whl) | 9525878ba8b3fe3f378336c1242d116e72956f775e86c326f425fd6ca9c11492 |
| [nautilus_trader-1.227.0-cp314-cp314-macosx_15_0_arm64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/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](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0-cp314-cp314-manylinux_2_35_x86_64.whl) | 763bdd81d54feba7ae280c96f6da251dff9bd86430232975bebe50dab4f2ad11 |
| [nautilus_trader-1.227.0-cp314-cp314-win_amd64.whl](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0-cp314-cp314-win_amd64.whl) | 5d1f1b8cd7844e4418535e1b9a43042551716b76904fa37ab0462abf965c47f0 |
| [nautilus_trader-1.227.0.tar.gz](https://github.com/nautechsystems/nautilus_trader/releases/download/v1.227.0/nautilus_trader-1.227.0.tar.gz) | fbb9c1194f1f50f14fbf0933c35b81e05ea522ab944f584be3c75efb36887ca7 |

### Verify provenance

After downloading an artifact, verify its GitHub artifact attestation:

```bash
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-checksums:end -->

<!-- release-integrity-addendum:start -->

### 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:**

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

**Verify crates:**

```bash
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.

<!-- release-integrity-addendum:end -->