v1.227.0

ShenhanQian/GaussianAvatarsv1.227.0May 18, 2026by github-actions[bot]

AI Summary

A comprehensive beta release introducing continuous futures support, extensive enhancements to multiple exchange integrations (Binance, Bybit, Kraken, etc.), and new Rust runtime features, accompanied by significant breaking changes to the API and configuration.

Key Highlights

  • Added continuous futures support for aggregated bars
  • Enhanced Rust `LiveNode` with `LoggerConfig` support
  • Added `purge_instrument` cache method
  • Expanded support for Binance, Bybit, and Kraken exchanges

Breaking Changes

  • Removed legacy adapter environment flags in favor of `environment` enum
  • Removed `From<OrderInitialized>` for order types, use `TryFrom` instead
  • Renamed `time_bars_origins` to `time_bars_origin_offset`
  • Renamed `Cache::mut_order` to `order_mut` and changed cache return types to newtypes
  • Changed JSON log file extension from `.json` to `.jsonl`
  • Changed default `TransportBackend` to `Sockudo`
  • Changed `nautilus-model` `arrow` feature to optional

New Features

  • Continuous futures support for aggregated bars
  • Added `purge_instrument` cache method
  • Added `LoggerConfig` and `clear_log_file` support to Rust `LiveNode`
  • Added `limit_aggressive` and `test_modify_rejected` flags to `ExecTesterConfig`
  • Added `CompositeMarketMaker` example strategy
  • Added `priority` parameter to `DataActor.subscribe_signal`
  • Added `PortfolioSnapshot` event and message bus API
  • Added `InstrumentId::parse_parent_components` method
  • Added serde `Deserialize` support for config loading
  • Added Betfair post-reconnect mass-status reconciliation
  • Added Binance Spot `expiryReason` and `serverShutdown` handling
  • Added Bybit `flatten` binary and `execution.fast` channel
  • Added Coinbase liquidation/ADL warnings
  • Added Databento `set_price_precision` methods
  • Added Deribit DVOL custom data subscriptions
  • Added dYdX historical funding rate requests
  • Added Hyperliquid HIP-4 outcome instruments
  • Added Kraken Spot margin trading and L3 order book support
  • Added OKX X-Perp futures and `slippagePct` parameter
  • Added Polymarket fee models and fee inference

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 -->