NautilusTrader 1.227.0 Beta
Released on 18th May 2026 (UTC).
Enhancements
- Added continuous futures support for aggregated bars (#3921), thanks @faysou
- Added
purge_instrumentcache method for trimming unused instruments (#3945), thanks for reporting @fedoraiver - Added
LoggerConfig.file_configandclear_log_filesupport to the RustLiveNoderuntime (#3955), thanks @filipmacek - Added
LoggerConfigPython constructor for direct construction withoutfrom_spec(#3955), thanks @filipmacek - Added
limit_aggressiveandtest_modify_rejectedflags toExecTesterConfigfor marketable/modify-rejection tests - Added
CompositeMarketMakerexample strategy with book-mid quoting and synthetic-signal skew (Rust) - Added
#[custom_data_field(json)]for JSON-backed Arrow Serde fields and PyO3IndexMap/HashMapdict conversion (#4003), thanks @faysou - Added
priorityparameter toDataActor.subscribe_signalfor ordered dispatch between subscribers (Rust and PyO3) - Added
Cache::order_ownedreturning an ownedOrderAnysnapshot for boundary handover (Rust) - Added
Cache::account_mut,account_owned,account_for_venue_ownedwithAccountRefMut/AccountAnyreturns (Rust) - Added
Cache::position_mutandposition_ownedwithPositionRefMut/Positionreturns (Rust) - Added
PortfolioSnapshotevent for per-account mark-to-market emission, gated bysnapshot_interval_ms(Rust) - Added
Portfolio::build_snapshotandPortfolio::snapshotsaccessors with a bounded per-account ring (Rust) - Added
subscribe_portfolio_snapshotandpublish_portfolio_snapshotmessage bus API onevents.portfolio(Rust) - Added
subscribe_positionsmessage bus function (Rust) - Added
InstrumentId::parse_parent_componentsandInstrumentClassparent suffix conversion methods, exposed via PyO3 (Rust) - Added serde
Deserializesupport forLiveNodeConfigand adapter client configs to enable loading from TOML - Added Betfair Rust adapter post-reconnect mass-status reconciliation that halts submits via
STREAM_RECONCILING - Added Betfair Rust adapter
stream_gap_recovery_lookback_minsconfig for the reconciliation lookback window - Added Binance Spot
expiryReasonfield capture on schema 3:4 SBE order responses (Rust) - Added Binance Spot
serverShutdownevent handling on market-data and trading WebSocket streams (Rust) - Added Binance USDM mark price moving average (
ap) field onBinanceFuturesMarkPriceMsg(Rust) - Added Bybit hedge-mode venue position IDs for order, position, and fill events
- Added Bybit BBO order support for linear and inverse limit-style orders
- Added Bybit
flattenbinary that cancels working orders and flattens Linear/Inverse positions - Added Bybit instrument-info
symbolId,symbolType(withxstocks/stock/forex/commodity), and spotxstockMultiplierfields (Rust) - Added Bybit position
openTimefield on RESTBybitPositionand WSBybitWsAccountPosition(Rust) - Added Bybit
execution.fastprivate WebSocket channel support with slim payload struct andFillReportdispatch (Rust) - Added Coinbase liquidation/ADL warning on forced-close order events
- Added Coinbase CFM liquidation buffer warning when buffer drops below 20%
- Added Databento
set_price_precisionandget_price_precisionsmethods on the data loader and historical client - Added Deribit
auto_load_missing_instrumentsconfig flag to lazy-load uncached instruments on subscribe - Added Deribit DVOL custom data subscriptions (#4069), thanks @graceyangfan
- Added dYdX historical funding rate requests via the
request_funding_ratesHTTP method and PyO3 binding - Added Hyperliquid HIP-4 outcome instruments:
+E/#Eencoding, USDH settlement, and per-side BinaryOption modeling - Added Hyperliquid HIP-4 outcome reconciliation via spot balances;
outcomeMetasettlement dispatch on the Rust client - Added Hyperliquid HIP-4
userOutcomeactions (split, merge, mergeQuestion, negate) and venueSettlementfill parsing - Added Hyperliquid
allMidscustom data subscriptions with optional dex metadata (#4067), thanks @graceyangfan - Added Kraken Spot margin trading support (#3965), thanks @mcgrj
- Added Kraken Spot L3 order book support via WebSocket v2 (#4041), thanks @mcgrj
- Added Kraken Spot WebSocket v2 order submission (#4007), thanks @mcgrj
- Added OKX X-Perp (
ruleType=xperp) futures support with funding-rate subscriptions - Added OKX
slippagePctparameter for market orders via theslippage_pctorder param - Added OKX event contracts support
- Added Polymarket
OrderStatusReport.filled_qtydust snap at terminalFilledstatus to absorb venue truncation - Added Polymarket
PolymarketFeeModelbacktest fee model with maker-rebate inference - Added Polymarket
PolymarketDataLoader.sanitize_infoflag to strip resolution fields on resolved markets
Breaking Changes
- Removed legacy adapter environment flags per previous deprecation; use
environmentenum - Removed
From<OrderInitialized>for order types; useTryFromto surface invariant errors viatry_from/try_into - Removed Polymarket
SNAP_UNDERFILL_ULPSandSNAP_OVERFILL_ULPS; reverting to singleDUST_SNAP_THRESHOLDconstant - Removed stale Tardis
crypto-com-derivativesexchange variant - Renamed Binance and Kraken environments from
Mainnet/MAINNETtoLive/LIVE - Renamed
time_bars_originsconfig param totime_bars_origin_offsetinDataEngineConfig/LiveDataEngineConfig(Rust) - Renamed
Cache::mut_ordertoorder_mut; takes&mut Cacheand returnsOrderRefMut<'_>(Rust) - Changed
Cache::orderandorders_*to returnOrderRef<'_>(newtype borrow, was&OrderAny) (Rust) - Changed
Cache::account,account_for_venue,accountsto returnAccountRef<'_>(was&AccountAny) (Rust) - Changed
Cache::position,position_for_order,positions_*to returnPositionRef<'_>(was&Position) (Rust) - Changed
Cache::take_accountto move the account out of its cell and panic on alias instead of cloning (Rust) - Changed to deny
submit_order/submit_order_listwith a customposition_idunderNETTINGOMS; useHEDGINGfor custom position IDs - Changed JSON log file extension from
.jsonto.jsonl; update log shippers watching.json(#3955), thanks @filipmacek - Changed Python order
create()methods to raiseValueErroron invalidOrderInitializedinstead of panicking - Changed default
TransportBackendtoSockudo; setbackend = Tungsteniteto keep the previous default - Changed
nautilus-networkdefault Cargo features to includetransport-sockudo - Changed
nautilus-modelarrowto an optional feature; enablearrow(orpython-arrow) for prior behavior (#4008), thanks @sunlei - Changed
OrderMatchingEngineConfigdefaults to match the Cython per-engine constructor (Rust) - Changed
Strategyorder methods to takeOption<Params>to avoid unnecessaryIndexMapallocations (Rust); useNoneorSome(params) - Changed
Strategy::cancel_orderandmodify_orderto takeClientOrderIdinstead ofOrderAny(Rust v2) - Changed
Strategy::cancel_ordersto takeVec<ClientOrderId>instead ofVec<OrderAny>(Rust v2) - Changed Rust strategy registration to append
order_id_tagto explicit strategy IDs, matching Cython - Changed Binance Futures to prefer
DEMOendpoints for simulated trading - Changed Databento data loaders to error on unresolved precision; pass
price_precisionor callset_price_precision - Changed Kraken Spot to reject
DEMO; demo remains Futures-only - Changed
nautilus_core::from_pydictfromPy<PyDict>to&Py<PyDict>to avoid moving the input dict (Rust) (#4003), thanks @faysou - Changed
DataActor::subscribe_signalto takepriority: Option<u32>; existing callers must passNone(Rust) - Changed message bus subscription
priorityfromu8tou32to match Cythonint priorityparity (Rust) - Changed
OrderFactory::bracketto abonbuilder with per-legentry_*/tp_*/sl_*setters; usefactory.bracket()...call()(Rust)
Security
- Added Sigstore SBOM attestation for Docker container images at the published digest
- Added CI smoke tests verifying wheel, sdist, and Docker image signatures after publish
- Removed long-lived
PACKAGES_TOKENPAT in favor of per-job GHCRGITHUB_TOKEN - Hardened CI release signing chain: pinned cosign tooling,
harden-runneron merge jobs - Hardened nightly-merge auth by storing token in git extraheader rather than remote URL
- Hardened PyPI publishing with OIDC trusted publishing, eliminating long-lived API tokens
- Hardened Python deps: pinned every third-party package in
[tool.uv].no-build-packageso lost wheels failuv locknot build sdist - Upgraded
urllib3to v2.7.0 (GHSA-mf9v-mfxr-j63j decompression-bomb bypass, GHSA-qccp-gfcp-xxvc cross-host proxy header leak) - Fixed
DatabaseConfigrepr to fully redact passwords (#4028), thanks @faysou - Documented Sigstore signature and SBOM verification commands in
SECURITY.md
Fixes
- Fixed
RefCellreentrancy panic inExecutionEngine::handle_order_fillfor OTO parent fills (#3981), thanks for reporting @GreatLandmark - Fixed
RefCellreentrancy inExecutionEngine::load_cachenestedborrow_mutcalls - Fixed
RefCelldouble-borrow panic inPortfolio::update_positionwhencalculate_account_stateis true - Fixed identifier deserialization inside
#[serde(tag = "type")]enums andserde_json::ValueviaCow<'de, str>owned-string support - Fixed
AccountsManager::update_balancesdiscarding recalculated balances by mutating a dropped clone - Fixed margin account balance not applying realized price PnL on close and reversal fills (#4056), thanks @faysou
- Fixed Rust portfolio account event clone overhead (#4004), thanks for reporting @magnified103
- Fixed margin
AccountStateevents emitting empty balances when balances were populated - Fixed
allow_cash_borrowingnot applied to cached cash accounts during simulated venue initialization - Fixed cache venue order ID updates and own-book cleanup for cancel-replace flows (Rust)
- Fixed
Cache::orders_for_exec_algorithmdiscarding query filters when applying intersection (Rust) - Fixed
OwnOrderBooktracking for reconciled external open orders (Rust) - Fixed
OrderAny::from_eventspanic on malformedOrderInitialized; reconciliation returnsErrinstead of crashing - Fixed
BacktestEnginenot enablingcalculate_account_stateon accounts (#3988), thanks for reporting @magnified103 - Fixed
BacktestEnginenot settlingon_stopcommands before shutdown (#4062), thanks for reporting @zhanghaoda - Fixed
MessageBuslate wildcard subscriptions missing events on already-cached topics (#3942), thanks for reporting @graceyangfan - Fixed
OrderMatchingEngineto propagate tick-size toMatchingCore(#3942), thanks for reporting @graceyangfan - Fixed
OrderMatchingEngineduplicate fills from closed matching-core orders (#4075) - Fixed
OrderMatchingEngine.resetleakingOrderBook.ts_lastacross resets (Python) (#3992), thanks @YeeTsai - Fixed sandbox tick-size precision race that could panic on stale ticks (#3994), thanks @graceyangfan
- Fixed matching engine and sandbox handling of stale-precision quote and trade ticks (#4044), thanks @graceyangfan
- Fixed bracket SL/TP rejected by matching engine on submit (Rust) (#4040), thanks for reporting @maximsamsonov
- Fixed
ExecutionEnginereconciliation skippingOrderUpdatedwhen both report and order were alreadyACCEPTED - Fixed
ExecutionEnginesubscribe_venue_instrumentsrouting through the typed publisher so adapters receive instrument updates - Fixed execution fill reconciliation account scoping and duplicate trade IDs (Rust)
- Fixed reconciliation drift when a venue snapshot carries both a fill mismatch and a quantity/price amendment (Rust)
- Fixed reconciliation premature
OrderUpdatedemission for pending venue states before venue confirmation (Rust) - Fixed reconciliation missing
MarketIfTouched/LimitIfTouchedprice and trigger drift detection (Rust) - Fixed live position reconciliation conflating positions across accounts (#4029), thanks @faysou
- Fixed live position reconciliation retry/throttle leaking across accounts on the same instrument (Python and Rust)
- Fixed live position reconciliation collapsing multi-account positions on the same instrument (Rust)
- Fixed
Strategy/Actorclock callback leak on dispose (#3967), thanks for reporting @frslvr - Fixed
Strategypending cancel and pending update events before order commands (Rust) - Fixed
Strategysubmit methods to publishOrderInitializedbefore cache updates (Rust) - Fixed
ExecTesterLIT pricing direction so reconciled BUY/SELL LIT orders satisfy thetrigger_priceinvariant - Fixed wrangler v2 timestamp resolution to force nanoseconds before the int64 cast for pandas 3 compatibility (#3970), thanks @gzenz
- Fixed custom data parquet schema registration and multi-file query (#4021), thanks @faysou
- Fixed
custom_datamacro PyO3 stub generation: ordergen_stubabovepyo3attributes and detectcfg_attr-wrapped invocations - Fixed catalog
consolidate_data_by_periodcleanup for skipped targets (#4080), thanks @arpankapoor - Fixed SQL
ParserErrorfor symbols containing ampersand (#4025), thanks @arpankapoor - Fixed
DataEngineto route subscribe/unsubscribe commands to theBACKTESTclient when registered (Rust) - Fixed
DataEngineto applyvalidate_data_sequenceto bars emitted by internal aggregators (Rust) - Fixed
emit_quotes_from_bookandemit_quotes_from_book_depthsconfig flags being silently ignored (Rust) - Fixed
DataEnginecomposite book subscriptions not routing per-underlying deltas/depth to per-underlying books (Rust) - Fixed
DataEnginecomposite + exact book subscription overlap double-applying to the shared cache book (Rust) - Fixed
DataEngineunsubscribe detaching the client while exact-topic subscribers remained (Rust) - Fixed
DataEnginebar aggregator quote/trade subscription priority (Rust) - Fixed
DataEngine::resetleaking book and option-chain state across resets (Rust) - Fixed
DataActorcomposite book delta subscriptions not receiving per-underlying publishes (Rust) - Fixed Architect AX
GET /order-statusto useoid/cidper v14.0.1; legacyorder_id/client_order_idnow return HTTP 400 - Fixed Binance Futures reduce-only orders not reconciling venue-side quantity (Python and Rust) (#3983), thanks for reporting @KaizynX
- Fixed Binance Spot inflight REST polls for pruned IOC orders (#4072), thanks for reporting @marcelmdn
- Fixed Binance WebSocket pong unhandled
RuntimeErrorblocking reconnect after server close (#4020), thanks for reporting @M-at-ti-a - Fixed Bybit ambiguous submit failures to await reconciliation, thanks for reporting @Shorino
- Fixed Bybit BBO orders not reconciling the venue-resolved price in cached order state (Rust and Python)
- Fixed Bybit funding rate parsing for dated futures on shared
tickers.linearWS topic; gates toCryptoPerpetualonly (#4084) - Fixed Betfair Rust adapter dropped fills on reconnect by resyncing the fill tracker from cache
- Fixed Betfair Rust adapter panic on blank
customerOrderRef/rfoby normalizing empty strings toNone - Fixed Betfair Rust adapter spurious
OrderRejectedafter OCM already reported a terminal state - Fixed Betfair Rust adapter
ignore_external_ordersto treat emptyrfostrings the same as missing - Fixed Databento market data price precision preservation (#4002), thanks @faysou
- Fixed Databento MBP10 panic on undefined depth levels (#4046), thanks for reporting @prajjwal23
- Fixed Databento decoder gaps on dbn 0.58 wire data: skip
'I'(Index) classes and map new stat types 14-20 - Fixed dYdX FOK and DAY time-in-force orders to reject pre-submission instead of failing at the venue or mapping to GTC
- Fixed dYdX MIT/LIT round-tripping on reconcile when the Indexer collapses both variants under
TAKE_PROFIT - Fixed dYdX GTD expiry to surface
OrderExpiredon both WS and HTTP reconciliation paths - Fixed dYdX
TriggerTypedefault whencondition_typeis unset so reconciliation no longer rejects the report - Fixed dYdX
TAKE_PROFITorder type deserialization (the Indexer omits the_LIMITsuffix) - Fixed dYdX reconciliation noise by dropping reports for orders already in a terminal state in the local cache
- Fixed dYdX Python
_request_instrument(s)to pass the full_handle_data_responseargument set - Fixed dYdX Python
_subscribe_order_book_depthto log a graceful warning instead of raisingNotImplementedError - Fixed Deribit
StopMarketOrderRejectedwhen the order response omitsfilled_amount(#3995), thanks for reporting @marco-rigoni - Fixed Deribit cross-margin overcounting; reports
equityfor total andavailable_withdrawal_fundsfor free (#4009), thanks @filipmacek - Fixed Deribit subscriptions silently dropping data for uncached instruments (#4035), thanks for reporting @linimin
- Fixed Deribit funding rate log spam from perpetual channel updates emitting info/debug on every tick (#4083)
- Fixed Deribit and Hyperliquid custom data builds without the
arrowfeature - Fixed Hyperliquid modify-after-partial-fill sending absolute quantity to the cancel-replace leg, causing engine overfill (#3986)
- Fixed Hyperliquid testnet orders rejected with "Builder fee has not been approved" by omitting builder attribution like vault orders (#3989)
- Fixed Hyperliquid spurious
OrderCanceledon concurrent modifies (Python and Rust) (#3971), thanks @M-Advis - Fixed Hyperliquid cancel-replace fill race emitting
OrderFilledagainst stale local order state (Python and Rust) (#3972) - Fixed Hyperliquid dropping
FillReportbefore order cached; fills now buffered and drained onOrderAccepted(#4076), thanks @M-Advis - Fixed Hyperliquid terminal rejections on submit/cancel/modify failures; defers to WS reconciliation (Python and Rust), thanks @M-Advis
- Fixed Hyperliquid Rust data client reconnect leaving the consumption loop on a cancelled token after disconnect
- Fixed Interactive Brokers spread fill races (#3957), thanks @taozle
- Fixed Interactive Brokers callback ordering races (#3976), thanks @faysou
- Fixed Interactive Brokers market data farm reconnects not resubscribing feeds (#3968), thanks @onixenix
- Fixed Interactive Brokers market data dispatch on fractional tick sizes (#4022), thanks @faysou
- Fixed Interactive Brokers shutdown reader
RuntimeErroron stop and dispose (#4023), thanks @faysou - Fixed Interactive Brokers reconnect before server version handshake (#4027), thanks @faysou
- Fixed Interactive Brokers SMART stock venue resolution (#4061), thanks @faysou
- Fixed Kraken Spot margin wallet balances for multi-asset collateral (#3997), thanks @mcgrj
- Fixed Kraken symbol normalization for WS v2 compatibility (#3961), thanks @mcgrj
- Fixed Kraken Spot WebSocket dispatch dropping delta-only execution frames that omit
symbol(#4052), thanks @mcgrj - Fixed Kraken Futures order-update batches failing to deserialize on venue-emitted
"unknown"enum values - Fixed OKX missing
post_onlyinstrument status (#3966), thanks @jhavie - Fixed OKX missing
rebaseinstrument status (#3998), thanks @jhavie - Fixed OKX future instrument status parsing (#4005), thanks @cryptoSUN2049
- Fixed Polymarket V2 BUY overfill rejection via overfill-only
last_qtysnap on WS, REST, and buffered drain paths - Fixed Polymarket REST fill paths bypassing dust normalization, causing engine state to diverge from venue across paths
- Fixed Polymarket residual
ACCEPTEDorders via trade-history recovery (#4024), thanks for reporting @fedoraiver - Fixed Polymarket adapter book resync on
tick_size_change(#3942), thanks for reporting @graceyangfan - Fixed Polymarket no-op
tick_size_changeclearing local book and queuing a redundant snapshot (Python and Rust) - Fixed Polymarket stale local book and last quote leaked across unsubscribe cycles (Python and Rust)
- Fixed Polymarket auto-loaded instrument subscriptions not receiving live data (#4050), thanks for reporting @d0dge
- Fixed Polymarket auto-load dropping subscriptions on CLOB transient 404 and empty
token_idfor newly-minted markets - Fixed Polymarket market IOC orders submitting as FOK (#4006), thanks for reporting @fedoraiver
- Fixed Polymarket WS order parsing of venue cancellations with reason suffix (#3987), thanks for reporting @Javdu10
- Fixed Polymarket WebSocket parse-error logging raising a secondary exception on non-UTF8 payloads (#4038), thanks @graceyangfan
- Fixed Polymarket
parse_tradesTradeId collisions on multi-filltransactionHash(Python and Rust) - Fixed Polymarket
parse_tradests_eventcollisions on same-second fills (Python and Rust) - Fixed Polymarket
fetch_tradesaborting on historical-offset ceiling; warns and returns partial (Python and Rust) - Fixed Polymarket
load_tradesnon-deterministic same-second ordering across pages (Python and Rust) - Fixed Polymarket Gamma instrument loading capped at 100 markets (#4086), thanks for reporting @haimgel
- Fixed Tardis instrument metadata parsing for numeric fields encoded as strings
Internal Improvements
- Added
OrderMatchingCore::update_price_incrementprimitive for tick-size propagation parity (Rust) - Added
iter_*API onOrderMatchingCorefor zero-allocation read-only iteration of resting orders (Rust) - Added Criterion bench suite for
OrderMatchingCorecovering add/get/delete/iterate hot paths (Rust) - Added
OwnOrderBookproperty tests for Rust model invariants - Added
ContinuousFutureAdjustmentTypeenum andBarBuilderprice adjustment pipeline (Rust) - Added native
is_externally_aggregated/is_internally_aggregatedmethods onBarType(Rust) - Added live node stress harness with
trade_burstandcancel_starvationscenarios (Rust) - Added
DataEngineandAsyncRunnerper-stage benches for the trade-to-cache path (Rust) - Added Python
TradingNodeparity stress harness for v1 vs v2 comparison - Added
cargo-flamegraphto workspace tools with pinned version - Added
simulationfeature onnautilus-liveso the stress harness runs undercfg(madsim)for DST validation - Added
NautilusKernel::with_cache_databasebuilder setter and constructor variant for cache database adapter injection (Rust) - Added
nautilus-event-storesnapshot capture/restore/replay viaNautilusKernelfor durable cache state across runs (Rust) - Added automatic
Tungstenitefallback whenWebSocketConfig.proxy_urlis set with Sockudo selected (Rust) - Added typed publish_instrument() to message bus (#4081), thanks @filipmacek
- Added Binance Futures
-4531(UM/CMdualSidePositionsync) error classifier with hedge-mode hint (Rust) - Added
BinanceSpotUserDataEventTypeenum for typed Spot user-data event dispatch (Rust) - Added Interactive Brokers PyO3 live client config support in
TradingNodeConfig(#3964), thanks @faysou - Added Interactive Brokers Rust adapter support for v2 live trading (#3974), thanks @faysou
- Added Interactive Brokers per-order exchange routing params (#4079), thanks @faysou
- Improved
#[custom_data]to support live-only JSON types without Arrow registration - Improved
DataEngine.resetto clear book updaters, snapshotters, option chain managers, and timers (Rust) - Improved
DataEngineto create per-underlying books for composite-symbol book subscriptions (Rust) - Improved object materialization in Rust stream Feather to parquet conversion (#3954), thanks @faysou
- Improved cache order storage to per-order
Rc<RefCell<OrderAny>>cells, closing stale-clone bug class (Rust) - Improved
OwnBookLadderto defer error logging to callers, removing duplicate own-book error noise - Improved
DataEngine/DataActorbulky responses: summaries at debug, full at trace; same for raw WS frames in Bybit, OKX, BitMEX - Improved
OrderMatchingEnginetrailing-stop activation to use theOrderMatchingCoreiter_*API (Rust) - Improved
OrderMatchingEngine.iterateper-order loop to align trailing-stop and GTD timing with Cython (Rust) - Improved
OrderMatchingEnginequeue-position fill gating to match Cython on cross-through trades (Rust) - Improved
OrderMatchingEngine.iteratebid/ask reset gate to honor in-flight trade overrides (Rust) - Improved
update_balance_multi_currencyto delegate negative-balance enforcement to per-accountupdate_balances - Improved live exec clients to log ERROR with
timeout_post_stophint when cancel tasks abort on disconnect - Improved
ExecTesterto refresh tracked orders from cache before modify/cancel-replace so they see venue acks - Improved
make buildto leave the venv able to importnautilus_traderfrom any cwd via a local editable.pth - Improved Betfair Rust adapter to suppress late HTTP acceptance at debug level
- Improved Betfair Rust adapter to suppress noisy
instrument_closesubscribe/unsubscribe warnings - Improved Betfair Rust HTTP client
connect()to short-circuit when authenticated and serialise concurrent callers - Improved Betfair Rust HTTP client
disconnect()to cancel in-flight retries and install a fresh cancellation token - Improved Betfair Rust
unsubscribe_book_deltaslog level towarnto match Python visibility - Improved Betfair Rust adapter with explicit info-level no-op overrides for unsupported unsubscribe methods
- Improved Betfair Rust integration test coverage to cover OCM, replace flow, batch ops, and session recovery
- Improved Hyperliquid data client to track spawned subscribe tasks for abort on disconnect/reset (Rust)
- Improved Interactive Brokers Python 3.14 installation and integration test coverage
- Regenerated Binance Spot SBE codecs against schema 3:4
- Refined data engine request workflow (#3928), thanks @faysou
- Refined Hyperliquid data client by extracting
parse_l2_book_snapshothelper for direct unit testing (Rust) - Optimized
Cacheorder and position query methods to a single size-ordered intersection pass (Rust) - Optimized
Cache::*_countmethods to count via index without materializing a sortedVec(Rust) - Optimized
OrderMatchingCorestorage to splitBTreeMaplimit/stop books per side for price-time priority (Rust) - Optimized live node biased select to dispatch exec commands ahead of market data (Rust)
- Optimized live node loop by collapsing six maintenance timers into one shared maintenance dispatcher (Rust)
- Ported Interactive Brokers adapter hardening fixes to Rust (#4073)
- Upgraded
alloycrate to v2.0.4 - Upgraded
databentocrate to v0.51.0 - Upgraded
rediscrate to v1.2.1 - Upgraded
tokiocrate to v1.52.3 (fixes a performance regression)
Documentation Updates
- Added DST docs caveats for process-global lazy state RNG consumption and
CacheViewfactory blocker - Added Bybit hedge-mode docs with official
positionIdxAPI links - Added Bybit BBO order docs with params and examples
- Added Databento docs for price precision precedence and publisher mappings
- Added Deribit DVOL and Hyperliquid
allMidsadapter docs - Added Polymarket fill quantity normalization section explaining the dust snap, deferred dust, and commission semantics
- Added dYdX adapter notes for FOK deprecation, DAY rejection, equity-tier limit, and MIT/LIT round-tripping
- Added adapter timestamp conversion conventions covering ms-to-ns helpers and
ts_eventvsts_init - Added Rust shared-mutability storage guide with
Rc<RefCell<T>>decision tree to the developer guide - Improved Hyperliquid integration guide flagging Rust-only execution config options and scoped slippage note
- Added
Shutdown semanticsto the backtesting guide coveringon_stopcommand settlement - Updated adapter docs and examples to use environment enums instead of legacy test flags
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.comRelease 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_dataSeven 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-analysisnautilus-commonnautilus-executionnautilus-networknautilus-portfolionautilus-testkitnautilus-trading
Script patched before v1.228.0.