Skip to content

Releases: nautechsystems/nautilus_trader

NautilusTrader 1.230.0 Beta

Choose a tag to compare

@github-actions github-actions released this 29 Jun 12:06
Immutable release. Only release title and notes can be modified.
8160730

NautilusTrader 1.230.0 Beta

Released on 29th June 2026 (UTC).

Enhancements

  • Added v2 Python visualization (tearsheet) support with a visualization extra
  • Added non-compounding returns option for monthly and yearly tearsheet charts via compounding
  • Added spread quote vega-pricing fallback controls for missing greeks (#4328), thanks @faysou
  • Added Unix SIGTERM handling to the v2 LiveNode shutdown path (Rust)
  • Added with_clock_factory for Rust live and sandbox nodes (#4331), thanks @folknor
  • Added Betfair cricket match stream data subscriptions (Rust and Python)
  • Added Bybit instrument subscription support via instrument-info polling (#4305), thanks @dxwil
  • Added OKX region support for global, EEA, and US endpoints (#4318), thanks @dxwil

Breaking Changes

  • Changed event_store format; beta v1.227-v1.229 stores must be regenerated (#4330), thanks @folknor
  • Changed Throttler rate limit fields to non-zero accessors instead of public fields (Rust)
  • Renamed Bybit data config instrument_status_poll_secs to instrument_poll_interval_secs

Security

  • Fixed unbounded HTTP response buffering that could exhaust memory (#4332), thanks @AlaeddineMessadi
  • Removed direct bincode use from event_store on-disk envelopes (#4330), thanks @folknor

Fixes

  • Fixed LiveTimer tasks leaking after clock drop or component teardown (#4322), thanks @filipmacek
  • Fixed Strategy order-list cache visibility for live handlers (Rust)
  • Fixed Rust strategy oms_type registration for custom HEDGING position IDs (#4327), thanks for reporting @dxwil
  • Fixed duplicate realized PnLs in post-run analysis (#4344), thanks for reporting @a1zb2yc3z
  • Fixed RateOfChange period window and log calculation (#4326), thanks @Martingale42
  • Fixed VerticalHorizontalFilter and OnBalanceVolume period windows (#4333), thanks @Martingale42
  • Fixed Architect AX execution reconciliation for open positions and fills
  • Fixed Architect AX to deny unsupported order types and times in force locally
  • Fixed Architect AX to report unfilled IOC/FOK orders as canceled and flag post-only rejections
  • Fixed Architect AX market data for null ticker prices and order book snapshot requests
  • Fixed Databento adapter historical request edge cases and live state cleanup (Rust and Python)
  • Fixed Binance Futures TRADING_HALT contract status handling (Rust and Python) (#4320), thanks @YeeTsai
  • Fixed Bybit submit rejection classification and batch amend/cancel request builders (Rust)
  • Fixed Databento OPRA option expirations stamped at midnight UTC (#4321), thanks for reporting @pjlegato
  • Fixed Hyperliquid fill report decoding for new venue fill directions (#4325), thanks for reporting @magnified103
  • Fixed Interactive Brokers stock contract resolution for non-USD and cross-listed symbols (#4337), thanks @dfjmax
  • Fixed Interactive Brokers crypto quote-quantity SELL order sizing (#4309), thanks @bebop23
  • Fixed Lighter stop-market and market-if-touched order modification rejected for a missing price
  • Fixed Polymarket reconciliation producing out-of-range fill prices
  • Fixed Polymarket RTDS duplicate snapshot replay and incremental batching (#4319), thanks @graceyangfan

Internal Improvements

  • Expanded API facade surface coverage for Cache, Clock, Order, and Portfolio reads (Rust)
  • Hardened plugin ABI surface to reject manifest ABI mismatches (Rust)
  • Hardened CI release provenance checks with provenance refetch and transient 404 retries
  • Improved default Rust builds to avoid abandoned proc-macro-error2 (#4315), thanks for reporting @folknor
  • Standardized data subscription logging with a single canonical confirmation and reduced adapter log noise (Rust)
  • Optimized OrderMatchingEngine post-match actions to avoid cloning resting orders (Rust)
  • Optimized OrderMatchingEngine no-match GTD and trailing-order paths (Rust)
  • Optimized Databento adapter decode and loader paths (Rust)
  • Optimized Throttler hot paths and added Criterion benches (Rust)
  • Upgraded Cython to v3.2.6

Documentation Updates

  • Added a Lighter Rust quickstart and get-started guide
  • Standardized the request_bars callback pattern for live bar warmup (#4311), thanks @dfjmax
  • Refined Databento dataset configuration docs for schema limits and symbology inference
  • Refined event sourcing marker sidecar docs to match the shipped markers module
  • Refined Polymarket integration guide for Rust config fields and order behavior

Artifact checksums

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

Artifact SHA256
nautilus_trader-1.230.0-cp312-cp312-macosx_15_0_arm64.whl 033f6207d1c52095d64a7644f43b90cab939c2038044db70a4165f2acef3d079
nautilus_trader-1.230.0-cp312-cp312-manylinux_2_35_aarch64.whl de69df04918ad52095dca2e462f2e1e7755a53e74df13f35de9631ef71513beb
nautilus_trader-1.230.0-cp312-cp312-manylinux_2_35_x86_64.whl 8f4ff2e8af10e93ed643496eb62999b00558085f0e0bff17fc76e08809ba91b9
nautilus_trader-1.230.0-cp312-cp312-win_amd64.whl 9420b151e92a504841b7fc768ba937dc7f3bffe387096215f39b83c6fcda27e8
nautilus_trader-1.230.0-cp313-cp313-macosx_15_0_arm64.whl af8a83f7cabb91460dcf5b966259eab1f4edee7f5bba965119e70c06a876e997
nautilus_trader-1.230.0-cp313-cp313-manylinux_2_35_aarch64.whl 8143907c667fda91bb6466c02ff2ec9f6389aa2fcc35fb0843e75a2ab4e4bfa8
nautilus_trader-1.230.0-cp313-cp313-manylinux_2_35_x86_64.whl b5755ae5057b260827404aef23c3051969107d6724dd8c525f17301c9c5b24c0
nautilus_trader-1.230.0-cp313-cp313-win_amd64.whl 8817c46dc34e0aafc606948aacf1dd0fbbe1a31273c8a2f20983cf4ab2ddeef1
nautilus_trader-1.230.0-cp314-cp314-macosx_15_0_arm64.whl 4163833dc3b930d3f8a6f769eb2e7d6422c144d0db748d63ac0e5fdb1f4842b5
nautilus_trader-1.230.0-cp314-cp314-manylinux_2_35_aarch64.whl 94b0e9180a4e023f80c3e000f2039976d346387fff40987cb3525e6c11873e3f
nautilus_trader-1.230.0-cp314-cp314-manylinux_2_35_x86_64.whl 2178899b700050f931d94ab11a23bcbc4d506b200b387827431e7d6eb0cd1e44
nautilus_trader-1.230.0-cp314-cp314-win_amd64.whl 57f814d13947169538f8cedc881db72e7dc4320626c5a3f37b9ce36ed5527720
nautilus_trader-1.230.0.tar.gz cc7eaa247e640e46588094fcca44f34f4b6330eeec41e9247068f2500921757d

Verify provenance

After downloading an artifact, verify its GitHub artifact attestation:

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

NautilusTrader 1.229.0 Beta

Choose a tag to compare

@github-actions github-actions released this 26 Jun 05:06
Immutable release. Only release title and notes can be modified.
fed3955

NautilusTrader 1.229.0 Beta

Released on 25th June 2026 (UTC).

This release includes many breaking changes across the user-facing Python and Rust v2 APIs.

Enhancements

  • Added Cache::try_currency with CurrencyLookupError for typed missing-currency lookups (Rust)
  • Added Cache::try_instrument with InstrumentLookupError for typed missing-instrument lookups (Rust)
  • Added Cache::try_order with OrderLookupError for typed missing-order lookups (Rust)
  • Added negative price support for Commodity instruments in risk checks (#2330), thanks for reporting @fabz1
  • Added cache order index crash-recovery restore for Redis and Postgres adapters (Rust)
  • Added capability-aware analyze-pool(s)/sync-dex validation that fails before sync for unsupported DEXes
  • Added ProbabilityPriceFeeModel and configurable sandbox fee models (#4262), thanks @graceyangfan
  • Added SEC1 EC private key support to socket TLS configuration (Rust)
  • Added order_position_index Postgres table for the order-position index; run make init-db to migrate
  • Added add_native_exec_algorithm and ExecutionAlgorithmConfig bindings to the Python v2 backtest engine
  • Added Order::to_order_status_report conversion in Rust
  • Added with_msgbus_publisher for Rust live-node and kernel builders
  • Added benchmark-relative portfolio stats (#4251), thanks @mahimn01
  • Added SBE and Cap'n Proto encodings for Rust-native message bus publishers
  • Added SBE and Cap'n Proto support for OptionGreeks
  • Added Postgres cache position event-log persistence and restart recovery (Rust)
  • Added Redis cache adapter order, position, and order-index write persistence (Rust)
  • Added RedisCacheConfig, PostgresCacheConfig, and RedisMessageBusConfig for Rust factories
  • Added Python v2 Strategy.order_factory accessor and validating OrderFactory bindings
  • Added PyO3 cache purge APIs (#4249), thanks @graceyangfan
  • Added PyO3 instrument tick_scheme fields with Arrow persistence
  • Added Binance Futures bnfcr_currency config for Credits Trading Mode
  • Added Binance Futures funding-rate history support in Rust
  • Added Binance Futures MIN_NOTIONAL parsing for min_notional (#4280), thanks @filipmacek
  • Added Binance Futures ticker data support in Rust
  • Added Binance order-list submission in Rust
  • Added Binance market-data WebSocket fixtures for CM-UM st and ps fields (Python and Rust)
  • Added BitmexInstrumentState::Unknown to tolerate unrecognized venue states without bootstrap failure
  • Added BitMEX legacy futures, spreads, and reference basket instrument parsing
  • Added Blockchain CLI help for discoverable and snapshot-capable DEXes per chain
  • Added Databento venue_dataset_map to override the default venue-to-dataset mappings
  • Added Hyperliquid builder attribution opt-out
  • Added Hyperliquid historical trade requests
  • Added Hyperliquid minimum notional handling
  • Added Interactive Brokers trailing stop basis-point offset support (#4292), thanks @faysou
  • Added Lighter NVDA composite market maker Python v2 example
  • Added PancakeSwap V3 on-chain snapshot validation via the Uniswap V3 pool reads
  • Added PancakeSwap V3 pool-event parsers on BSC, Base, Arbitrum, and Ethereum
  • Added Polymarket RTDS custom data subscriptions (#4214), thanks @graceyangfan
  • Added Tardis Lighter venue mapping
  • Added Tardis options_chain CSV loading, streaming, and catalog conversion
  • Added Uniswap V3 SetFeeProtocol indexing so replayed snapshots carry the correct fee_protocol; run make init-db
  • Added Uniswap V3 CollectProtocol indexing so pool snapshots track protocol-fee balances; run make init-db

Breaking Changes

  • Changed backtest config builders to validate on build() and return ConfigResult (Rust)
  • Changed BacktestDataConfig to require an instrument_id, instrument_ids, or bar_types target
  • Changed example strategy and actor configs to use bon builder() instead of new()/with_* (Rust)
  • Changed Rust actor self.clock() to return ClockApi; call methods directly instead of borrowing
  • Changed Rust actor/strategy core access; use macros or native traits instead of Deref
  • Changed PyO3 DataActor/Strategy historical request start/end to require UTC datetimes
  • Changed Python NautilusDataType enum order to put OptionGreeks before InstrumentStatus
  • Changed cache database and message bus backing construction to use factory-owned config structs (Rust)
  • Changed CacheDatabaseAdapter::load_index_order_position to return position IDs instead of positions (Rust)
  • Changed default message bus/cache encoding to JSON; set encoding="msgpack" for MessagePack
  • Changed Redis cache account/order/position storage to event logs; clear old typed state (Rust)
  • Changed Rust message bus subscriber-count and presence queries to return invalid-topic errors instead of panicking
  • Changed SerializationEncoding repr order to Json=0, MsgPack=1, Capnp=2, Sbe=3
  • Changed Cap'n Proto DataAny ordinals to put OptionGreeks before instrument schemas
  • Changed SBE DataAny variants and template IDs to put OptionGreeks before instrument schemas
  • Changed Currency::from_str and Currency::is_* to return CurrencyLookupError instead of anyhow::Error (Rust)
  • Changed InstrumentId and OptionSeriesId string constructors to return typed errors (Rust)
  • Changed OrderAny::from_events to return OrderReplayError instead of anyhow::Error (Rust)
  • Changed OrderList::validate to return OrderListValidationError instead of anyhow::Error (Rust)
  • Changed SyntheticInstrument fallible methods to return SyntheticInstrumentError instead of anyhow::Error (Rust)
  • Changed tick scheme constructors and parsing to return TickSchemeError instead of anyhow::Error (Rust)
  • Changed Parquet catalog write APIs to take borrowed slices instead of owned Vec (Rust) (#4296), thanks @sunlei
  • Changed WebSocket and socket reconnect_timeout_ms to bound only connection establishment (Rust)
  • Changed plug-in loader to reject build mismatches by default; opt out with set_allow_build_mismatch (Rust)
  • Changed Binance Spot SBE WebSocket API schema to version 3:4, matching generated codecs (Rust)
  • Changed Blockchain PoolProfiler.price_sqrt_ratio_x96 to return int instead of str
  • Changed Bybit BybitHttpClient::submit_order to take trailing native TP/SL params; PyO3 defaults to None
  • Removed CacheConfig.database and MessageBusConfig.backing; pass adapters separately
  • Removed common DatabaseConfig and MessageBusBackingConfig; use Redis/Postgres configs
  • Renamed message bus database terminology to backing in Rust message bus APIs
  • Renamed add_native_actor to add_builtin_actor for bundled example actors
  • Renamed add_native_strategy to add_builtin_strategy for bundled example strategies
  • Renamed Rust/PyO3 instrument tick_scheme_name to tick_scheme; Cython keeps tick_scheme_name
  • Renamed BitmexInstrumentType::StockPerpetual to TradFiPerpetual (covers equities, FX, and commodities)

Security

  • Hardened Docker toolchain pins
  • Fixed instrument base quantity calculation panic on zero last price (Rust)
  • Fixed tick scheme navigation panics on NaN, infinite, and out-of-range prices (Rust)
  • Fixed domain value conversions to reject invalid numeric inputs instead of panicking (Rust)
  • Fixed plug-in host callbacks to return Panic errors instead of aborting the node on engine panics (Rust)
  • Fixed plug-in create, clone_handle, and drop_handle panics to recover instead of aborting the process (Rust)
  • Fixed plug-in host thunks to validate UTF-8 on plug-in strings instead of assuming it (Rust)
  • Fixed plug-in loader rejection paths to cap diagnostic reads and never dlclose initialized cdylibs (Rust)
  • Fixed event-store replay panic on captured fills carrying an invalid order side (Rust)
  • Fixed Interactive Brokers disconnect reconciliation corrupting position state (#4230), thanks @HKOWL

Fixes

  • Fixed account-currency PnL stats for NETTING accounts reusing a PositionId across cycles (#4294), thanks @faysou
  • Fixed account-currency trade PnL stats for foreign-currency instruments (#4211), thanks @faysou
  • Fixed blocking Python HTTP functions holding the GIL for the full request duration
  • Fixed custom DataType metadata ordering and shared custom-data unsubscribes (Rust)
  • Fixed data option-chain delta warmup
  • Fixed DataEngine synthetic bar subscriptions with multiple venue clients (#4279), thanks for reporting @HSGartley
  • Fixed DeFi pool profiler swap replay diverging from on-chain state at MIN/MAX-tick boundary swaps (Rust)
  • Fixed DeFi replay bootstrap gaps in PoolSwap payload exposure, block timestamp units, and actor IDs (Rust)
  • Fixed DonchianChannel period window (#4239), thanks @KaizynX
  • Fixed event-store boot recovery to repair hard-crashed run files and skip damaged ones instead of failing (Rust)
  • Fixed event-store capture duplicating order events, commands, and account states across dispatch hops (Rust)
  • Fixed event-store snapshot-anchor validation across the verifier, retention, and restore paths (Rust)
  • Fixed event-store replay, scan, marker, and halt-signal edge cases around skipped events, gaps, and reruns (Rust)
  • Fixed HTTP client errors discarding the underlying cause from the reqwest source chain (Rust)
  • Fixed HttpClient rejecting invalid response header keys instead of silently dropping them (Rust)
  • Fixed Instrument rejecting negative min_price, preventing spread instruments from loading in Python
  • Fixed live external order claim registration in Rust
  • Fixed live reconciliation logging below-cached fill mismatches as errors, halting shutdown_on_error nodes (Rust)
  • Fixed live reconciliation logging transient venue report-query failures as errors (Rust)
  • Fixed live reconciliation synthesizing phantom cancels on cancel-replace venues (#4288), thanks @filipmacek
  • Fixed local catalog queries and backtests for non-ASCII i...
Read more

NautilusTrader 1.228.0 Beta

Choose a tag to compare

@github-actions github-actions released this 08 Jun 18:55
Immutable release. Only release title and notes can be modified.
3aa1ddf

NautilusTrader 1.228.0 Beta

Released on 8th June 2026 (UTC).

Enhancements

  • Added BSC chain support to blockchain adapter with UniswapV3 and PancakeSwapV3 DEX registrations
  • Added Aerodrome Slipstream pool-event signatures and parsers for bootstrap and replay on Base
  • Added Blockchain adapter analyze-pools CLI for batch DeFi pool snapshot hydration
  • Added structured PoolProfilerError carrying pool id, block, transaction/log index, and event kind
  • Added DeFi data (DefiData) replay through the data and backtest engines as a first-class Data variant
  • Added BacktestEngine.add_defi_data for replaying DeFi block, pool, and pool-event data in backtests
  • Added funding-rate catalog replay and FundingSettlement handling for backtests (Rust)
  • Added generic structured key-value fields to LogLine (#4090), thanks @filipmacek
  • Added correlation_id field to trading and system command structs for request tracing (Rust)
  • Added checked mantissa/exponent constructors for Price and Quantity (Rust)
  • Added Cap'n Proto and adapter split propagation of trading command correlation_id
  • Added nautilus-plugin crate for loading separately compiled Rust cdylibs at live-node startup (Rust)
  • Added custom-data plug point via PluginCustomData trait and nautilus_plugin! macro (Rust)
  • Added actor plug point via PluginActor trait with lifecycle and data callbacks (Rust)
  • Added strategy plug point via PluginStrategy trait with HostVTable order-command surface (Rust)
  • Added plug-in HostVTable callbacks for cache, subscriptions, msgbus, and timers (Rust)
  • Added PluginActorAdapter and PluginStrategyAdapter wrapping plug-in cdylibs as host DataActor/Strategy (Rust)
  • Added PluginLoader::with_host so the live node can install a custom HostVTable for order-command routing (Rust)
  • Added host_vtable and plugin_loader helpers binding submit/cancel/modify order to the strategy adapter (Rust)
  • Added register_custom_data_from_manifest to register plug-in custom data with DataRegistry at load time (Rust)
  • Added config_json argument to plug-in create thunks and PluginActor::new/PluginStrategy::new (Rust)
  • Added DataEngine continuous futures historical bar requests and live bar subscriptions (Rust)
  • Added DataEngine response bounds-trim and request-pipeline fan-in with RequestJoin support (Rust)
  • Added DataEngine catalog / client response-side request splitting (Rust)
  • Added DataEngine catalog orchestration for funding rates, custom data, and instruments (Rust)
  • Added DataEngine time-range pipeline support for long historical requests (Rust)
  • Added DataEngine order book deltas request and response with catalog/client split (Rust)
  • Added DataEngine historical order book snapshot replay at UTC day boundaries (Rust)
  • Added support for mixed-instrument OrderLists at the same venue (e.g. pairs, calendar spreads, multi-leg legs)
  • Added OrderList.is_uniform_instrument and OrderList.instrument_ids helpers (Python)
  • Added deny guard for mixed-instrument order lists submitted with a position_id
  • Added portfolio PyO3 bindings and Strategy.portfolio access (#4085), thanks @ms32035
  • Added beta-weighted vega greeks against volatility index instruments (#4097), thanks @faysou
  • Added native OptionGreeks persistence and backtest replay support (#4132), thanks @Jonah-Chan
  • Added StrikeRange.delta(...) to select option-chain strikes by target delta
  • Added deterministic liquidation engine for backtests (#4077), thanks @abhishektang
  • Added configurable logging IO policies (#4158), thanks @sunlei
  • Added Binance Futures liquidation custom data subscriptions (#4095), thanks @graceyangfan
  • Added Binance Futures open interest request custom data (Rust) (#4109), thanks @graceyangfan
  • Added Binance Spot JSON public market data mode (#4178), thanks @graceyangfan
  • Added pending-resolution settlement pipeline for binary options (Rust) (#4101), thanks @graceyangfan
  • Added Serialize/Deserialize derives for PositionEvent (#4199), thanks @filipmacek
  • Added Coinbase WebSocket status channel subscription emitting InstrumentStatus events
  • Added Coinbase Python v2 factory bindings and tester examples
  • Added CryptoFuturesSpread and CryptoOptionSpread instrument types mirroring CryptoFuture/CryptoOption
  • Added Deribit option_combo and future_combo parsing as CryptoOptionSpread/CryptoFuturesSpread instruments
  • Added Deribit combo trade leg parsing (legs[], combo_id, combo_trade_id) on public trade messages
  • Added Deribit get_last_trades_by_currency HTTP endpoint for combo trade backfill
  • Added Deribit get_expirations HTTP endpoint for traded option-chain expirations
  • Added Deribit public TradeId provenance prefix (RFQ-/BLK-/COMBO-) for block, RFQ, and combo trades
  • Added Deribit subscribe_combo_legs opt-in for combo leg trade streams
  • Added Derive initial adapter (on-chain spot, perps, options)
  • Added Derive WebSocket trading API support for submit, cancel, modify, and cancel-all actions
  • Added Hyperliquid WebSocket trading API support for submit, cancel, modify, and cancel-all actions
  • Added Hyperliquid HIP-4 outcome BinaryOption.info with parsed venue description and question metadata
  • Added Hyperliquid HYPERLIQUID_ACCOUNT_ADDRESS env var fallback for HyperliquidExecClientConfig.account_address
  • Added Hyperliquid live open interest custom data from activeAssetCtx (Rust) (#4120), thanks @graceyangfan
  • Added Hyperliquid allDexsAssetCtxs custom data subscriptions (#4136), thanks @graceyangfan
  • Added Kraken WebSocket rate limiting (#4093), thanks @filipmacek
  • Added Lighter initial adapter (DEX: spot, perps)
  • Added OKX on_instrument write-through so data-client instrument updates refresh exec caches without restart
  • Added OKX spread instrument discovery as CryptoFuturesSpread instruments (Rust)
  • Added OKX Nitro spread order execution and reconciliation support (Rust)
  • Added Polymarket adapter bounded-retry auto-load with auto_load_max_retries and exponential backoff with jitter (Rust)
  • Added Polymarket condition-level resolution for expired markets (#4164), thanks @graceyangfan
  • Added Polymarket new_market fetch dedupe and bounded concurrency (#4185), thanks @graceyangfan
  • Added Polymarket POLY_1271 deposit-wallet signing support (#4053), thanks for reporting @sumuzhao and @sophyphilo
  • Added shutdown_on_error to stop Rust backtests and live nodes after error logs
  • Added Tardis option greeks ingestion to the catalog for backtest replay
  • Added Tardis extract_bbo_as_quotes to emit QuoteTick from option_summary BBO fields

Breaking Changes

  • Renamed custom-data field marker json to serde (#4133), thanks @faysou
  • Removed live engine graceful_shutdown_on_error; use node-level shutdown_on_error instead
  • Changed nautilus_pyo3.get_exchange_rate to return decimal.Decimal instead of float
  • Changed DeFi pool-event and snapshot types to require ts_event/ts_init timestamps (was optional timestamp)
  • Changed PoolProfiler::initialize and check_if_initialized to return Result rather than assert
  • Changed command new constructors to accept correlation_id: Option<UUID4>, pass None for old behavior (Rust)
  • Changed CVec to no longer implement Send; use typed wrappers for thread transfer (Rust)
  • Changed Hyperliquid HIP-4 outcome InstrumentId to {outcome_index}-{YES|NO}-OUTCOME.HYPERLIQUID
  • Changed Deribit DeribitWebSocketClient.with_credentials to accept api_key/api_secret after environment
  • Changed order event reconciliation and due_post_only from u8 to bool (changes JSON/Arrow schemas)
  • Changed Deribit combos to land as CryptoOptionSpread/CryptoFuturesSpread instead of OptionSpread/FuturesSpread; FuturesSpread/OptionSpread once again guarantee whole-contract sizing
  • Changed NautilusKernelConfig.timeout_connection default from 120 to 60 seconds (#4179)

Security

  • Added OpenSSF Scorecard workflow (#4187), thanks @pushkarm029
  • Fixed DataFFI PyCapsules to reject mismatched types and prevent repeated CVec drops
  • Fixed thread-local registry access to avoid exposing global-lifetime actor and component refs
  • Fixed OrderBookDepth10 FFI constructor to avoid unwinding across C ABI boundaries
  • Fixed StackStr::from_c_ptr_checked to return None for null C string pointers

Fixes

  • Fixed matching engine panic on mark price bars in Rust (#4189), thanks @po4yka
  • Fixed raw value boundary constants in Rust (#4188), thanks @po4yka
  • Fixed unbounded Cache VecDeque memory leak (Rust) (#4107), thanks @filipmacek
  • Fixed Throttler silently dropping buffered messages in buffer mode (Python v1) (#4221), thanks @santatic
  • Fixed Cache.reset clearing FX rate lookup for retained instruments (#4159), thanks for reporting @dfjmax
  • Fixed BacktestEngine option positions remaining open when data stops before expiry
  • Fixed BacktestEngine losing latency-deferred commands at shutdown (Rust) (#4062), thanks for reporting @zhanghaoda
  • Fixed BacktestEngine duplicate account state events on reset, thanks for reporting @dfjmax
  • Fixed calculated account state flag for cash and margin accounts (#4218), thanks @faysou
  • Fixed PortfolioStatistic.downsample_to_daily_bins to compound sub-daily returns (#4141), thanks @mahimn01
  • Fixed missing PortfolioStatistic trait methods returning None (#4174), thanks @mahimn01
  • Fixed matching engine not canceling unmatched IOC/FOK limit orders (Rust) (#4112), thanks for reporting @Jonah-Chan
  • Fixed matching engine L1 slip-through for market orders exhausting top-of-book volume (Rust)
  • Fixed multi-currency balance update violating total == locked + free (#4165), thanks for reporting @qaxayuan
  • Fixed NETTING reconciliation opening phantom reduce-only positions (#4106), thanks for reporting @M-at-ti-a
  • Fixed HEDGING margin scaling with fill count instead of net...
Read more

NautilusTrader 1.227.0 Beta

Choose a tag to compare

@github-actions github-actions released this 18 May 06:54
Immutable release. Only release title and notes can be modified.
280ae17

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 balance...
Read more

NautilusTrader 1.226.0 Beta

Choose a tag to compare

@github-actions github-actions released this 29 Apr 13:43
38b912a

NautilusTrader 1.226.0 Beta

Released on 29th April 2026 (UTC).

Enhancements

  • Added Portfolio::mark_values, equity, and missing_price_instruments queries for Rust and Python
  • Added instrument_status / instrument_statuses cache queries and auto-caching in the data engine (#3858)
  • Added environment enum config for BitMEX, Deribit, dYdX, Hyperliquid, and OKX adapters
  • Added BybitEnvironment to BybitDataClientConfig and BybitExecClientConfig
  • Added missing config values to LiveExecEngineConfig (#3841), thanks @Javdu10
  • Added calculate_commission to ExecutionClient for venue-specific reconciliation fills
  • Added PyO3 bindings for DataEngineConfig, ExecutionEngineConfig, and OrderEmulatorConfig so they can be constructed from Python
  • Added cache, msgbus, data_engine, exec_engine, and portfolio keyword arguments to BacktestEngineConfig Python constructor
  • Added MarginAccount.margin_for_currency + margin_init/maint_for_currency helpers for cross-margin queries
  • Added MarginAccount.total_margin_init(currency) / total_margin_maint(currency) summing both margin buckets
  • Added MarginAccount.account_margins, account_margins_init/maint, and clear_account_margin accessors
  • Added transport-sockudo feature with TransportBackend runtime selector for the WebSocket transport (Rust)
  • Added TransportBackend PyO3 enum and WebSocketConfig.backend kwarg for backend selection from Python
  • Added custom upgrade-header support on the sockudo backend so adapters carry the same User-Agent and per-venue headers on both backends (#3932), thanks @sunlei
  • Added WebSocketConfig.proxy_url for HTTP CONNECT proxy tunneling with basic-auth support
  • Added Betfair tiered tick scheme to BettingInstrument for ladder-snapped pricing
  • Added Binance Futures use_trade_lite config to opt into low-latency TRADE_LITE fills (Rust, default False)
  • Added Binance proxy_url plumbing for market and user-data WS streams (#3937), thanks for reporting @huangqingchi
  • Added Bybit user-related endpoints (#3894), thanks @sunlei
  • Added Bybit BybitPositionIdx enum and bybit_resolve_position_idx PyO3 helper
  • Added Coinbase initial integration adapter (Rust)
  • Added DydxNetwork re-export on the nautilus_trader.adapters.dydx package
  • Added Hyperliquid historical funding rates via fundingHistory info endpoint
  • Added Hyperliquid configurable MARKET slippage (market_order_slippage_bps) with per-order override
  • Added Hyperliquid OrderBookDepth10 subscription backed by the l2Book feed
  • Added Hyperliquid nSigFigs / mantissa L2 precision controls via subscribe_params
  • Added Interactive Brokers Rust adapter with PyO3 compatibility layer (#3864), thanks @faysou
  • Added Kraken xStocks tokenized asset support for spot market data, order submission, and futures instruments
  • Added OKX option greeks support for both Black-Scholes and price-adjusted conventions on every tick
  • Added OKX params["greeks_convention"] (string or list) to narrow option greeks subscriptions
  • Added OKX transport_backend config to switch websockets between Tungstenite and Sockudo backends
  • Added Polymarket game_id and fee_schedule to instrument info (#3811), thanks @Javdu10
  • Added Polymarket batch SubmitOrderList via POST /orders for limit-order batches (Rust)
  • Added Polymarket WebSocket idle_timeout_ms for zombie detection (#3908), thanks for reporting @camarigor
  • Added Polymarket WebSocket proxy_url plumbing
  • Added Polymarket pUSD collateral currency (Currency::pUSD() in Rust, pUSD in Python) for the CLOB V2 cutover
  • Added configurable compression for Tardis Machine replay, defaulting to zstd
  • Added ExecutionReport::OrderWithFills and send_order_with_fills emitter for bundled status + fill reconciliation
  • Added ADL / liquidation detection and logging across Binance, Bybit, OKX, BitMEX, Hyperliquid, Deribit, and dYdX
  • Added Binance Futures COIN-M delivery_autoclose- prefix recognition for expiring contract auto-close events
  • Added Bybit adlRankIndicator warning log when an open position is ranked 4 or higher (next to deleverage)
  • Added Hyperliquid liquidation metadata logging on fills and userEvents.liquidation routing
  • Added Hyperliquid Auto-Deleveraging fill detection with warn logging on HTTP and WebSocket paths

Breaking Changes

  • Added Option<&AccountId> to Rust Portfolio::unrealized_pnls, realized_pnls, total_pnls; pass None to keep prior behavior
  • Added backend: TransportBackend to WebSocketConfig; struct-literal callers must add the field (Rust)
  • Added proxy_url: Option<String> to WebSocketConfig; struct-literal callers must add the field (Rust)
  • Migrated Polymarket adapter to CLOB V2: new EIP-712 domain version 2, new exchange contract addresses, timestamp/metadata/builder order fields replace taker/nonce/feeRateBps, and pUSD replaces USDC.e as collateral; the Python adapter now uses py-clob-client-v2
  • Consolidated adapter HTTP and WebSocket proxy plumbing onto a single proxy_url field, replacing the prior http_proxy_url / ws_proxy_url split across adapter Rust and Python configs
  • Removed DockerizedIBGatewayConfig::from_env_or_defaults (Rust); use the bon builder or Default::default, which still falls back to TWS_USERNAME/TWS_PASSWORD
  • Removed OrderMatchingEngineConfig::new and with_price_protection_points (Rust); use OrderMatchingEngineConfig::builder() instead
  • Removed BlockchainDataClientConfig::new, BlockchainExecutionClientConfig::new, and DexPoolFilters::new (Rust); use the corresponding ::builder() instead
  • Removed DeribitExecClientConfig::new and HyperliquidExecClientConfig::new convenience constructors (Rust); use the ::builder() instead
  • Removed DataEngineConfig::new 12-arg positional constructor (Rust); use DataEngineConfig::builder() instead
  • Removed synthetic ACCOUNT-* placeholders from margin adapters; MarginBalance emits with currency only
  • Removed nautilus_system::factories module; import factory traits from nautilus_common::factories (Rust)
  • Removed indicators from nautilus-common default features; enable with features = ["indicators"] (Rust)
  • Renamed Python DatabaseConfig.timeout to connection_timeout and response_timeout to match the Redis/PyO3 wire schema
  • Replaced is_sandbox: bool with environment: AxEnvironment on AxDataClientConfig and AxExecClientConfig (Rust and Python), aligning with the Binance/Bybit/Kraken adapter pattern. Default is Sandbox.
  • Changed BacktestEngine::add_venue and SimulatedExchange::new (Rust) to take SimulatedVenueConfig (bon builder)
  • Changed Interactive Brokers Rust configs to use bon builders: InteractiveBrokersDataClientConfig, InteractiveBrokersExecClientConfig, InteractiveBrokersInstrumentProviderConfig, and DockerizedIBGatewayConfig
  • Changed get_cached_bybit_http_client signature: replaced demo/testnet bools with environment: BybitEnvironment
  • Changed UnsubscribeBookSnapshots to require interval_ms for exact snapshot interval unsubscribe (Rust)
  • Changed OrderError::Invariant variant to wrap CorrectnessError instead of anyhow::Error (Rust)
  • Changed HyperliquidEip712Signer::new() to return Result and take &EvmPrivateKey (Rust)
  • Changed HyperliquidExchangeRequest::new/with_vault to accept HyperliquidSignature directly (Rust)
  • Changed Binance USD-M Futures WebSocket URLs from /ws to /market/ws and /private/ws
  • Changed Cap'n Proto and SBE wire formats to preserve Option state (unstable, may change)
  • Changed Python and Serde-backed Rust config decoding to reject unknown fields, so stale or misspelled keys now fail fast during config parsing
  • Changed MarginBalance.instrument_id to optional; None marks account-wide (cross margin) entries keyed by currency
  • Changed MarginAccount.margins_init/margins_maint to per-instrument only; use account_margins_* for cross margin
  • Changed Binance Futures COIN-M to emit one MarginBalance per base coin (previously hardcoded USDT)
  • Changed matching-engine TradeId format to T-{hash}-{count} from {venue}-{raw_id}-{count}; ts_init-keyed
  • Changed use_random_ids to no longer govern TradeId; flag still affects VenueOrderId and PositionId
  • Changed workspace nautilus-live to default-features = false; enable features = ["node"] for LiveNode (Rust)
  • Changed adapter LiveNode examples to require --features examples to build (Rust)
  • Changed ParquetDataCatalog::to_object_path and to_object_path_parsed to return anyhow::Result so cross-store URIs surface as errors instead of silently rewriting against the catalog bucket (Rust)
  • Changed prefixed remote catalogs (s3://bucket/base/path, etc.) to read and write under their declared URI prefix; data previously written to the bucket root by the prior buggy behavior will not be discovered after upgrading and must be moved into the prefix (#3930)

Security

  • Hardened Binance Ed25519 credential detection so base64 HMAC secrets no longer pass as Ed25519 keys (Rust)
  • Hardened Binance HTTP request signing by URL-encoding Ed25519 signatures in query strings (Rust)
  • Replaced the third-party urlencoding crate with the in-tree nautilus_core::urlencoding to shrink the supply-chain surface (Rust)
  • Bumped pinned SHAs for security-relevant GitHub Actions (harden-runner, codeql-action, setup-uv, setup-rust-toolchain) to current upstream releases
  • Refreshed cargo-deny and osv-scanner advisory configuration; removed the stale pygments advisory ignore now that upstream is patched

Fixes

  • Fixed sockudo WebSocket backend dropping handshake leftover bytes when the server piggybacks the first frame on the 101 response (#3932), thanks @sunlei
  • Fixed account state regeneration dropping account-wide margins on every fill across live and backtest paths
  • Fixed AccountState ...
Read more

NautilusTrader 1.225.0 Beta

Choose a tag to compare

@github-actions github-actions released this 06 Apr 09:36
48d1c12

NautilusTrader 1.225.0 Beta

Released on 6th April 2026 (UTC).

Enhancements

  • Added option chains and greeks in Rust (#3637), thanks @filipmacek
  • Added option chains and greeks in Python (#3677), thanks @filipmacek
  • Added cached futures-spread support to GreeksCalculator (#3792), thanks @faysou
  • Added custom data registration, persistence, and routing in Rust (#3542), thanks @faysou
  • Added nautilus_actor! macro in nautilus_common for Deref/DerefMut boilerplate on actor types (Rust)
  • Added nautilus_strategy! macro in nautilus_trading for Deref/DerefMut and Strategy trait boilerplate on strategy types, with optional block for hook overrides (Rust)
  • Added cache.orders_active_local(...) function in Rust (#3716), thanks @Javdu10
  • Added interval field to FundingRateUpdate (#3694), thanks @dxwil
  • Added BookImbalanceActor example actor for order book quoted volume imbalance in Rust
  • Added ExecTesterConfig.test_reject_post_only implicitly setting post_only on orders without requiring use_post_only (Python and Rust)
  • Added TieredTickScheme and TickScheme::Tiered for price-dependent tick sizes (Rust)
  • Added TokenizedAsset instrument type with configurable asset_class field for tokenized equities, ETFs, commodities, and other real-world assets
  • Added Betfair backtest example streaming raw .gz data through BacktestEngine (Rust)
  • Added Binance decode_binance_spot_client_order_id and decode_binance_futures_client_order_id utility functions for decoding Link & Trade encoded clientOrderId values from raw Binance API responses
  • Added Binance Futures subscribe_funding_rates and unsubscribe_funding_rates with FundingRateUpdate emission via the mark price stream (Rust)
  • Added Binance Futures exchange-generated order handling for liquidation, ADL, and settlement fills with client order ID prefix detection and FillReport/OrderStatusReport emission (Rust)
  • Added Binance Futures use_position_ids config for hedging position IDs derived from instrument and position side on exchange-generated fills (Rust)
  • Added Binance Futures default_taker_fee config with commission fallback estimation for exchange-generated fills when venue omits commission fields (Rust, USD-M only)
  • Added Binance NewAdl, NewInsurance, and PendingNew variants to BinanceOrderStatus (Rust)
  • Added Binance Rpi time-in-force, PreSettle/Settling/Close contract statuses, None/Decrement/Transfer STP modes, and income type variants (Rust)
  • Added Binance instrument status polling in Rust
  • Added Arrow schema support for BinanceBar and BinanceFuturesMarkPriceUpdate (#3749), thanks @twitu
  • Added Binance Futures close_position parameter for algo stop orders to close an entire position at trigger price (Python and Rust) (#3751), thanks for reporting @dodge-basic
  • Added Bybit native TP/SL params for order placement (#3754), thanks @jindrichsirucek
  • Added Bybit instrument status polling and subscription (#3738), thanks @filipmacek
  • Added Bybit options trade subscriptions using baseCoin topic with per-instrument filtering
  • Added Bybit option instrument fee rate population from /v5/account/fee-rate
  • Added Bybit submit_order_list via WebSocket batch API with TP/SL support and HTTP demo fallback (Rust)
  • Added Bybit query_order via HTTP with open order and history fallback (Rust)
  • Added Databento Arrow serialization for imbalance and statistics (#3689), thanks for reporting @GianC0
  • Added Deribit LimitIfTouched and MarketIfTouched order type support (take_limit/take_market)
  • Added Hyperliquid agent wallet support (#3668), thanks @oh92
  • Added Hyperliquid product type config for live clients (#3783), thanks @lisiyuan656
  • Added Kraken FOK, LimitIfTouched orders, and batch submit
  • Added Kraken tokenized equity (xStocks) support via aclass_base=tokenized_asset with automatic dual-fetch on instrument loading (#3455), thanks for reporting @jilongjia
  • Added Kraken request_book_snapshot for spot and futures via HTTP depth endpoints
  • Added Kraken request_funding_rates for futures with client-side start/end/limit filtering
  • Added Kraken subscribe_instrument_status for spot and futures (polling-based detection)
  • Added Kraken spot trailing stop and trailing stop limit order submission with trailing_offset and limit_offset fields
  • Added Kraken spot trigger parameter for conditional orders (last or index price reference)
  • Added Kraken spot quote quantity orders via viqc order flag
  • Added Kraken spot iceberg orders via displayvol parameter
  • Added OKX submit_order_list via WebSocket batch endpoint for regular GTC orders
  • Added OKX support for bracket order submission with attached TP/SL (#3701), thanks @Nickonomic
  • Added OKX subscribe_option_greeks for venue-provided Greeks via the opt-summary WebSocket channel
  • Added OKX configurable ws_auth_timeout_secs for WebSocket authentication (#3727), thanks for reporting @Stamppot82
  • Added OKX fwdPx (forward price) to OKXOptionSummaryMsg and mapped to underlying_price on OptionGreeks for ATM tracking
  • Added OKX request_orderbook_snapshot and request_funding_rates to Python data client via PyO3 bindings
  • Added OKX options trading execution with limit orders, px_usd/px_vol pricing modes, OpFok order type, and MarketToLimit/conditional order rejection
  • Added OKX options position-level Black-Scholes Greeks (delta_bs, gamma_bs, theta_bs, vega_bs) to position data
  • Added OKX determine_order_type_with_alt for correct order type classification when options use alternative pricing fields
  • Added DeltaNeutralVol strategy strangle entry via px_vol limit orders with configurable IV offset, time-in-force, and cache-based re-entry guard
  • Added OKX missing WebSocket message fields across all channel structs
  • Added Polymarket instrument provider and filters in Rust (#3708), thanks @filipmacek
  • Added Polymarket strategy-driven data subscriptions (#3806), thanks @Javdu10
  • Added Tardis MarkPriceUpdate and IndexPriceUpdate parsing from derivative_ticker messages in Rust
  • Added Tardis DerivativeTickerCache for deduplicating unchanged funding rate, mark price, and index price updates
  • Added Tardis TardisDataType enum for normalized Tardis Machine data type identifiers
  • Added Tardis live streaming support via stream_options config with automatic reconnection and exponential backoff
  • Added Tardis raw provider metadata to Instrument.info (#3730), thanks for reporting @volemont

Breaking Changes

  • Removed deprecated convert_quote_qty_to_base from ExecEngineConfig and LiveExecEngineConfig; adapters now handle quote-to-base conversion directly
  • Removed TARDIS_BASE_URL constant from nautilus_tardis::http - use nautilus_tardis::common::urls::TARDIS_HTTP_BASE_URL
  • Removed Hyperliquid revoke_hyperliquid_builder_fee function and builder fee revoke scripts
  • Removed DatabentoLiveClient.key property (Python)
  • Renamed OrderEvent.kind() to type_name() in Rust
  • Renamed instrument type_str PyO3 getter to type_name
  • Renamed DatabentoHistoricalClient.key property to api_key (Python)
  • Renamed ParquetDataCatalogV2 to ParquetDataCatalog and StreamingFeatherWriterV2 to StreamingFeatherWriter (PyO3 persistence classes)
  • Changed Tardis HTTP client from reqwest::Client to nautilus_network::http::HttpClient with rate limiting
  • Changed ExecutionEngine.register_client to error when a venue is already routed to another client (Rust)
  • Changed ExecutionEngine.register_venue_routing to error when re-routing a venue to a different client (Rust)
  • Changed collection-cloning PyO3 getters to methods: Position.events(), adjustments(), client_order_ids(), venue_order_ids(), trade_ids(); and events() on all order types
  • Changed config structs to use bon::Builder defaults as single source of truth; Default impls now delegate to Self::builder().build()
  • Changed config fields that always had a sensible default from Option<T> to plain T with #[builder(default)] across all adapter, live, and engine configs (Rust)
  • Changed Option<T> fields retained only where None carries distinct meaning (feature disabled, unbounded, etc.)

Security

  • Hardened Docker Compose to bind all ports to localhost and add no-new-privileges to all services
  • Hardened CI egress policy to block by default and fall back to audit mode for fork pull requests
  • Upgraded all nautilustrader.io URLs from HTTP to HTTPS (#3686), thanks @04cb
  • Documented aws-lc-rs non-FIPS mode rationale (FIPS 140-3 module requires Go toolchain)

Fixes

  • Fixed OrderBook L1 stale event mutation corrupting bid/ask (#3790), thanks for reporting @linimin
  • Fixed position index blob pollution in update_position (#3791), thanks @YeeTsai
  • Fixed purge_order KeyError for position/exec_algorithm index access (#3799)
  • Fixed strategy receiving historical events during startup reconciliation (#3793), thanks @filipmacek
  • Fixed Trader::add_exec_algorithm not registering the {id}.execute msgbus endpoint, causing orders with exec_algorithm_id to be silently dropped
  • Fixed Trader::clear_exec_algorithms and dispose_components not deregistering {id}.execute msgbus endpoints for removed algorithms
  • Fixed TopicRouter stale index cache panic when unsubscribing one pattern invalidated indices for unrelated cached topics (#3755), thanks for reporting @Javdu10
  • Fixed PRICE_UNDEF panic in OrderBookDelta.to_pyo3_list Cython conversion (#3697), thanks @zshuang15
  • Fixed ExecutionEngine silently dropping SubmitOrder and SubmitOrderList commands when no execution client can be resolved; now emits OrderDenied (Rust)
  • Fixed RiskEngine RefCell re-entrancy panic on order denial (#3680), thanks @husariancom
  • Fixed reconciliation when trigger_price is set for non-conditional orders (#3673), thanks @husariancom
  • Fixed `s...
Read more

NautilusTrader 1.224.0 Beta

Choose a tag to compare

@github-actions github-actions released this 03 Mar 07:48
076fe37

NautilusTrader 1.224.0 Beta

Released on 3rd March 2026 (UTC).

Enhancements

  • Added matching engine L1 quote-based queue position tracking for backtests
  • Added fill_limit_inside_spread to FillModel and MatchingCore for at-or-inside-spread limit fill control
  • Added synthetic book support for binary markets (#3495), thanks @Javdu10
  • Added get_target_px_for_quantity method on OrderBook (#3627), thanks @Javdu10
  • Added Betfair batch submit and cancel order support
  • Added BitMEX dead man's switch (cancelAllAfter) support (Rust and Python)
  • Added BitMEX grid market maker example (Rust)
  • Added BitMEX instrument status subscription support (Rust and Python)
  • Added Bybit book snapshot and funding rate request support (Rust)
  • Added Databento skip_on_error flag for load_instruments to skip unparsable definitions (#3657), thanks for reporting @davidsblom
  • Added Deribit instrument status subscription support (Rust and Python)
  • Added dYdX instrument status subscription support (Rust and Python)
  • Added Hyperliquid order modify support (Rust and Python)
  • Added OKX trailing stop market order support (Rust and Python)
  • Added OKX algo order amend support (Rust and Python)
  • Added OKX instrument status updates from WebSocket instruments channel (Rust)
  • Added OKX index price subscriptions with base-pair remapping to derivatives (Rust)
  • Added OKX book snapshot and funding rate request support (Rust)
  • Removed Hyperliquid builder fee charges (builder-fee approval no longer required)

Breaking Changes

  • Removed Coinbase International (COINBASE_INTX) adapter, see RFC (#3555)
  • Removed Binance BINANCE_ED25519_* env vars for Spot/Margin (use BINANCE_API_KEY/BINANCE_API_SECRET; Futures deprecated with warning)
  • Removed Hyperliquid builder_fee_refresh_mins config option (builder fees no longer charged)
  • Removed Polymarket fetch_orderbook_history, load_orderbook_snapshots, fetch_price_history and related methods (endpoints decommissioned, #3635)

Security

  • Added pip-audit to security audit pipeline
  • Added Docker image cosign signing and SBOM generation
  • Standardized credential zeroization across all adapters (Ustr replaced with Box<str> for API keys)
  • Standardized secret redaction in Debug impls across all adapter credentials
  • Updated SECURITY.md with expanded scope, reporting guidelines, and responsible disclosure policy
  • Bumped all eligible GitHub Actions pinned SHAs to latest versions (2-week release policy)

Fixes

  • Fixed matching engine applying order book deltas for L1 books (#3615), thanks @maksym-mikheienko
  • Fixed streaming backtest producing dummy bars past batch data exhaustion (#3628), thanks for reporting @cauta
  • Fixed OrderEmulator trailing stop activation ignoring LAST_PRICE trigger type (#3629), thanks for reporting @HaakonFlaaronning
  • Fixed LiveExecEngine position reconciliation infinite loop when venue reports flat (#3622), thanks for reporting @mrbaron3
  • Fixed CryptoOption instrument pyo3 transform for (#3626), thanks @davidsblom
  • Fixed StreamingFeatherWriter duplicate events from multiple message bus topics (#3625), thanks for reporting @fomotoshi
  • Fixed VolumeImbalanceBarAggregator and VolumeRunsBarAggregator integer overflow for step >= 923 in high-precision mode (#3658), thanks for reporting @honvl
  • Fixed InstrumentProvider load_ids_async loading all instruments instead of filtering to requested IDs (affected dYdX, Kraken, AX, Hyperliquid)
  • Fixed Python WS callbacks running off asyncio event-loop thread in Rust adapters (#3653), thanks for reporting @camilorodegheri
  • Fixed Binance Futures algo order serde field renames for WS and HTTP parsing (#3624), thanks for reporting @qu1zzyboy
  • Fixed Binance silent HMAC fallback when using encrypted Ed25519 PEM keys (now warns)
  • Fixed BinanceSymbol COIN-M perpetual symbol conversion (#3641), thanks @YeeTsai
  • Fixed Binance algo order cancellation parsing (#3646), thanks @qu1zzyboy
  • Fixed Binance Spot testnet WebSocket API URL (#3661), thanks @penguinwokrs
  • Fixed Hyperliquid stop/trigger order price derivation (#3611), thanks for reporting @h-tsun3
  • Fixed Hyperliquid price normalization and inner error detection (#3612), thanks for reporting @h-tsun3
  • Fixed Interactive Brokers BarType/str comparison in get_historical_bars (#3616), thanks @powerseed
  • Fixed Interactive Brokers historical bar processing crash (#3619), thanks @shzhng
  • Fixed Interactive Brokers contract details parsing (#3638), thanks @davidsblom
  • Fixed Kraken Spot and Futures execution clients not loading instruments during connect (#3644), thanks for reporting @husariancom
  • Fixed Kraken Spot execution client HTTP client created without credentials (#3650), thanks for reporting @husariancom
  • Fixed Kraken sequential ClientOrderId exceeding cl_ord_id 18-char free-text limit (#3651), thanks for reporting @husariancom
  • Fixed Kraken missing account state registration during connect (#3652), thanks for reporting @husariancom
  • Fixed Polymarket Gamma API load_ids path skipping sibling tokens (#3654), thanks for reporting @likenji
  • Fixed Polymarket loader to use Data API trades instead of decommissioned orderbook/price history endpoints (#3635), thanks for reporting @JSai23
  • Fixed Binance Spot testnet WebSocket API URL (legacy URL removed by Binance in May 2025) (#3660)
  • Fixed pre-commit hooks portability for Windows (#3617), thanks for reporting @powerseed
  • Fixed LiveNode startup RefCell panic when execution reports arrive during connect()
  • Fixed dYdX new instrument discovery flooding logs with inactive/delisted markets
  • Fixed dYdX fills and orders API requests missing required marketType parameter

Internal Improvements

  • Added catalog deduplication functionality (#3613), thanks @ms32035
  • Extracted common SBE decoder to nautilus-serialization crate
  • Implemented BacktestNode with catalog streaming in Rust
  • Improved OrderBookImbalance example strategy
  • Improved BestPriceFillModel to fill inside bid ask spread (#3428), thanks @faysou
  • Standardized use of atomic clock across adapters
  • Standardized adapter credentials handling and testing
  • Refined build script for Windows (#3636), thanks @faysou
  • Optimized matching engine _seed_trade_consumption to use range-bounded FFI queries for deep books
  • Optimized backtest engine settle loop to avoid Python list allocation on idle ticks
  • Optimized MatchingCore.iterate to avoid list concatenation on every call
  • Upgraded databento crate to v0.42.0
  • Upgraded datafusion crate to v52.2.0

Documentation Updates

  • Added AX Exchange gold perps book imbalance tutorial
  • Added AX Exchange spot FX bars mean reversion tutorial
  • Added BitMEX grid market maker tutorial
  • Added adapter data and execution testing specifications
  • Added order book concepts documentation
  • Improved backtesting mermaid diagram and tutorial formatting

NautilusTrader 1.223.0 Beta

Choose a tag to compare

@github-actions github-actions released this 21 Feb 10:54
2b2e6a9

NautilusTrader 1.223.0 Beta

Released on 21st February 2026 (UTC).

Enhancements

  • Added bulk_read_batch_size option to CacheConfig for batched Redis bulk reads, thanks @shzhng
  • Added sandbox execution adapter in Rust
  • Added multi-account execution support (#3194), thanks @faysou
  • Added Nasdaq ITCH 5.0 parser
  • Added grid market maker example strategy in Rust
  • Added OrderBookDeltas historical request support (#3438), thanks @faysou
  • Added market_exit() method for Strategy with configurable market_exit_time_in_force and market_exit_reduce_only options (supports venues requiring IOC for market orders)
  • Added manage_stop config option to StrategyConfig for automatic market exit on stop
  • Added matching engine queue_position tracking heuristic for backtests
  • Added matching engine trade consumption seeding for L2/L3 book backtests
  • Added tracing subscriber for external Rust library logs (use_tracing=True in LoggingConfig, filter with RUST_LOG env var)
  • Added use_market_order_acks venue config option to generate OrderAccepted events for market orders before filling (mimics behavior of venues like Binance)
  • Added oto_trigger_mode venue config option to control whether OTO child orders activate on partial fills (PARTIAL) or only after full fill (FULL) (default PARTIAL) (#3454), thanks @godnight10061
  • Added request_funding_rates and FundingRateUpdate Arrow serialization (#3467), thanks @dxwil
  • Added optimize_file_loading as BacktestDataConfig parameter (#3518), thanks @faysou
  • Added bulk_read_batch_size option to CacheConfig for batched Redis bulk reads (#3535), thanks @shzhng
  • Added PerpetualContract instrument for asset-class agnostic perpetual swaps
  • Added Ichimoku Cloud indicator (#3552), thanks @faysou
  • Added Betfair RCM parsing for TPD race data
  • Added Betfair race stream subscription via subscribe_race_data config
  • Added Betfair market version price protection for orders
  • Added Betfair BetfairOrderVoided custom data type for VAR voids
  • Added BetfairOrderVoided custom data type for VAR voids
  • Added Binance BinanceEnvironment enum with LIVE, TESTNET, DEMO variants for explicit environment selection
  • Added Binance environment config field to BinanceDataClientConfig and BinanceExecClientConfig
  • Added Binance Demo environment support with BINANCE_DEMO_API_KEY/BINANCE_DEMO_API_SECRET env vars
  • Added BitMEX trailing stop support
  • Added BitMEX pegged order (BBO) support via params
  • Added Bybit mark price subscriptions support
  • Added Bybit index price subscriptions support
  • Added Databento bulk subscription and historical request support (#3490), thanks @shzhng
  • Added Databento support for conversion of OPRA venues (#3605), thanks @faysou
  • Added Interactive Brokers subscribe index price functionality (#3514), thanks @Murph24
  • Added Interactive Brokers TotalCashValue to account summary info dict, exposing actual cash balance (#3567), thanks @shzhng
  • Added Interactive Brokers request_timeout_secs config to InteractiveBrokersExecClientConfig and consolidated all IB request timeouts into a single configurable value (#3602), thanks @shzhng
  • Added OKX batch cancel support for conditional (algo) orders
  • Added Polymarket data loader event-level API support (#3484), thanks @jsemldonado
  • Added Polymarket event_slug_builder support (#3501), thanks @jsemldonado
  • Added Polymarket batch order support (#3506), thanks @loafer-19
  • Added Tardis data client with factory in Rust
  • Improved tearsheet with dynamic Nautilus version and refined run info table (#3396), thanks @KaulSe

Breaking Changes

  • Removed dYdX v3 (legacy) Python adapter (the v3 exchange was decommissioned at end of 2024)
  • Removed dydx optional install extra (the v4 Rust-backed adapter has no additional Python dependencies)
  • Renamed nautilus_trader.adapters.dydx_v4 module to nautilus_trader.adapters.dydx and standardized class names to Dydx prefix (e.g. DydxDataClientConfig, DydxLiveDataClientFactory)
  • Removed dead subscribe_order_book_snapshots and unsubscribe_order_book_snapshots methods from LiveMarketDataClient (were never called by the data engine)
  • Removed OKX URL environment variable overrides (OKX_BASE_URL_HTTP, OKX_BASE_URL_WS_*, OKX_DEMO_BASE_URL_WS_*); use config base_url_* fields instead
  • Removed deprecated get_ws_base_url function from OKX Rust adapter; use get_ws_base_url_private or get_ws_base_url_public instead
  • Removed AddAssign, SubAssign, MulAssign trait implementations from Price, Quantity, and Money types (Rust); use x = x + y instead of x += y
  • Removed add_assign and sub_assign cdef methods from Price, Quantity, and Money types (Cython); use x = x + y instead
  • Renamed subscribed_order_book_snapshots to subscribed_order_book_depth for consistency with data engine routing
  • Removed listen_key_ping_max_failures from BinanceExecClientConfig (listenKey flow replaced by WebSocket API)
  • Changed Price, Quantity, and Money arithmetic to use max precision instead of panicking on precision mismatch
  • Changed Quantity + Quantity, Quantity - Quantity, Price + Price, Price - Price, Money + Money, and Money - Money Python operators to return the same type instead of Decimal (Quantity - Quantity raises ValueError if result would be negative)
  • Changed trade_execution default from False to True for consistency with bar_execution; users who want to isolate execution to L1 book data only must now explicitly set trade_execution=False
  • Changed price-protected market orders to no longer emit OrderAccepted by default; set use_market_order_acks=True to restore previous behavior
  • Changed adapter implementations should now override _subscribe_order_book_depth and _unsubscribe_order_book_depth for OrderBookDepth10 subscriptions
  • Changed Binance execution clients now use WebSocket API authentication instead of listenKey REST API; both HMAC and Ed25519 keys are auto-detected from the api_secret format (no key_type config needed). Note: Futures with HMAC keys automatically fall back to REST listenKey management (Binance Futures WS API only supports Ed25519 for session.logon)
  • Changed Binance execution clients now source credentials from the standard BINANCE_API_KEY/BINANCE_API_SECRET environment variables (or testnet equivalents)
  • Changed Polymarket instrument provider config from instrument_provider to instrument_config on PolymarketDataClientConfig and PolymarketExecClientConfig; use PolymarketInstrumentProviderConfig instead of InstrumentProviderConfig

Security

  • Upgraded arc-swap to 1.8.1 fixing potential use-after-free in debt mechanism (memory ordering fix)
  • Fixed CVec::empty() to use dangling pointer instead of null, avoiding undefined behavior in Vec::from_raw_parts
  • Fixed credential and auth header leaks in trace logging
  • Masked Binance listen keys in execution client logs
  • Refactored supply chain security checks and update dependencies
  • Improved TLS cert loading and socket suffix validation
  • Hardened Postgres SQL and credential security

Fixes

  • Fixed matching engine liquidity consumption using cumulative book quantity
  • Fixed matching engine liquidity consumption tracking for MAKER fills
  • Fixed matching engine trade execution fills discarded with liquidity_consumption
  • Fixed matching engine trade execution fill model and FOK/IOC handling
  • Fixed matching engine trade ticks updating L1 book and triggering fills when trade_execution=False
  • Fixed matching engine MAKER limit orders over-filling on L1 books when liquidity_consumption=True
  • Fixed inverse instrument base_currency access across accounting
  • Fixed logic and control flow bugs in core platform (#3585), thanks for reporting @pandashark
  • Fixed cache reset and missing f-string prefixes (#3585), thanks for reporting @pandashark
  • Fixed missing raise and divide-by-zero guards (#3598), thanks @pandashark
  • Fixed account balance rounding mismatch for zero-precision currencies (#3579), thanks for reporting @penguinwokrs
  • Fixed Position spot base currency commission sign (#3546), thanks for reporting @gaye746560359
  • Fixed Position flat detection for floating-point edge cases
  • Fixed UnsubscribeInstrumentClose message handler routing
  • Fixed order cancel not releasing locked balance in backtest (#3525), thanks for reporting @dennisnissle
  • Fixed remaining F_LAST flag checks to use proper bitmask comparison
  • Fixed MarketIfTouchedOrder (MIT) filling at bar extremes instead of trigger price during backtesting (#3461, #3462), thanks @HaakonFlaaronning
  • Fixed OTO child order sizing with rapid parent fills (#3435), thanks for reporting @dxwil
  • Fixed ExecAlgorithm spawn quantity accounting (will now restore quantity from denied/rejected spawned orders)
  • Fixed GreeksCalculator to use index price for index instruments (#3541), thanks @shzhng
  • Fixed GreeksCalculator min->max DTE clamping (#3582), thanks @pandashark
  • Fixed itm_prob calculation to use N(d2) instead of normalized delta (#3554), thanks @shzhng
  • Fixed reconciliation venue_order_id indexing and validation
  • Fixed analyzer epoch timestamp from empty shell positions
  • Fixed backtest clock monotonicity with time alerts (#3384), thanks @draphi
  • Fixed order updated panic during reconciliation (#3380), thanks for reporting @santivazq
  • Fixed missing currency registration when adding instruments to cache (#3400), thanks @filipmacek
  • Fixed trailing stops default price type (#3379), thanks @KaulSe
  • Fixed typo in OrderBook.simulate_fills error message (#3405), thanks @Johnkhk
  • Fixed registering msgbus with OptionExerciseModule (#3383), thanks @davidsblom
  • Fixed directory URI handling in ParquetDataCatalog for S3 and cloud storage (#3378),...
Read more

NautilusTrader 1.222.0 Beta

Choose a tag to compare

@github-actions github-actions released this 02 Jan 05:23
a46dd15

NautilusTrader 1.222.0 Beta

Released on 1st January 2026 (UTC).

This release adds support for Python 3.14 with the following limitations:

  • dYdX adapter extras ([dydx]) unavailable due to upstream coincurve compatibility (available on Python 3.12-3.13)
  • Interactive Brokers adapter extras ([ib]) unavailable due to upstream nautilus-ibapi compatibility (available on Python 3.12-3.13)

Enhancements

  • Added support for Python 3.14
  • Added Kraken integration adapter
  • Added Cap'n Proto (capnp) serialization for efficient zero-copy data interchange (opt-in via capnp feature flag in nautilus-serialization crate)
  • Added initial backtest visualization tearsheets with plotly
  • Added matching engine liquidity_consumption config option to track per-level consumption and prevent overfilling displayed book liquidity (default False to retain current behavior)
  • Added matching engine trade consumption tracking (when liquidity_consumption=True and trade_execution=True) to prevent multiple orders matching the same trade tick from collectively overfilling
  • Added theme support to bars_with_fills chart (#3329), thanks @faysou
  • Added price protection support for market orders (#3065), thanks @Antifrajz
  • Added Quantity.from_decimal constructor (#3189), thanks @faysou
  • Added Price.from_decimal constructor
  • Added Money.from_decimal constructor
  • Added create_bars_with_fills to Tearsheet (#3137), thanks @faysou
  • Added proxy_url support for HTTP clients
  • Added CAGR portfolio statistic
  • Added CalmarRatio portfolio statistic
  • Added MaxDrawdown portfolio statistic
  • Added quote_quantity parameter for close_position(...) and close_all_positions(...) strategy methods
  • Added remaining bar aggregation methods: TICK_IMBALANCE, TICK_RUNS, VOLUME_IMBALANCE, VOLUME_RUNS, VALUE_IMBALANCE, VALUE_RUNS (#3217), thanks @NicolaD
  • Added ParquetDataCatalog.query_first_timestamp (#3253), thanks @MK27MK
  • Added PolymarketDataLoader for loading historical data with docs and example
  • Added Binance accurate commission rates per symbol (#3208), thanks @delusionpig
  • Added Binance cross-margin info to AccountState
  • Added BinanceInstrumentProviderConfig to support the query_commission_rates config option
  • Added Bybit spot margin auto-borrow and auto-repay with auto_repay_spot_borrows config option
  • Added Bybit spot margin manual operations (BybitMarginAction) for strategy-controlled borrow/repay via query_account
  • Added Bybit HTTP request_tickers support (#3241), thanks @TaiShanQ
  • Added Databento subscription acknowledgement handling (#3337), thanks @shzhng
  • Added Databento historical client consolidated schema support (#3338), thanks @shzhng
  • Added Interactive Brokers optional exchange param for spread contracts (#3319), thanks @faysou
  • Added Polymarket Gamma API support for instrument loading (#3141), thanks @DeirhX
  • Added OKX historical trades requests
  • Added Tardis book_snapshot_output config option for tardis machine replays (default deltas to retain current behavior)
  • Added allow_overfills config option to ExecEngineConfig (default False) to handle order fills exceeding order quantity with warning instead of raising
  • Added overfill_qty field to orders for tracking fill quantities exceeding original order quantity
  • Introduced PositionAdjusted events for tracking quantity/PnL changes outside normal order fills (base currency commissions, funding payments, manual adjustments)
  • Upgraded continuous reconciliation for execution engine using position reports to detect missed fills

Breaking Changes

  • Dropped support for Python 3.11

  • Removed prob_fill_on_stop parameter from FillModel and FillModelConfig (stop orders have no queue position to simulate as triggers are deterministic when price reaches the trigger level)

  • Removed use_ws_trade_api config option from Bybit execution client (using WebSocket trade API only)

  • Renamed parse_instrument to parse_polymarket_instrument in Polymarket adapter for clarity

  • Renamed ExecTesterConfig.enable_buys to enable_limit_buys

  • Renamed ExecTesterConfig.enable_sells to enable_limit_sells

  • Changed ParquetDataCatalog.register_data to now treat files=[] as registering no files; pass files=None (default) to include all files

  • Standardized data catalog directory naming: Order book data directory names now use plural forms to align with the Rust catalog and Tardis Machine conventions; this ensures data written by the Python StreamingFeatherWriter can be read by the Rust catalog

    • order_book_delta/order_book_deltas/
    • order_book_depth10/order_book_depths/

    Migration: Rename existing data directories to use plural forms:

    # If you have existing order book data, rename the directories:
    mv <your_data_path>/order_book_delta <your_data_path>/order_book_deltas
    mv <your_data_path>/order_book_depth10 <your_data_path>/order_book_depths

Security

  • Added osv-scanner for Python dependency vulnerability scanning in pre-commit
  • Added cargo-vet for Rust supply chain security auditing
  • Hardened unsafe code with runtime checks and #![deny(unsafe_op_in_unsafe_fn)] lint
  • Hardened datetime conversions with overflow protection
  • Hardened CI workflows by pinning Docker images to SHA digests
  • Improved actor/component registry safety with ActorRef guards and runtime borrow tracking
  • Fixed code scanning security alerts

Fixes

  • Fixed uint64_t truncation bug in determine_trade_fill_qty for trade execution with high-precision mode
  • Fixed stop market order fill price in L1_MBP mode
  • Fixed cache dropped same-timestamp market data on insert
  • Fixed race condition in InstrumentProvider causing duplicate instrument initialization in shared providers
  • Fixed portfolio statistics various bugs and edge cases
  • Fixed SyntheticInstrument formula error during parsing with hyphened InstrumentId (#3257), thanks @Javdu10
  • Fixed balance recalculation to use raw fixed-point (#3356), thanks @kirill-gr1
  • Fixed matching engine GTD order expiry key mismatch (#3272), thanks for reporting @linimin
  • Fixed matching engine order modification for partial fills
  • Fixed matching engine L2/L3 partial fill quantity calculation on subsequent book updates
  • Fixed NETTING position flip snapshots and cache index cleanup (#3081), thanks @SarunasSS
  • Fixed incorrect handling of data responses in msgbus (#3310), thanks @filipmacek
  • Fixed data engine to use separate aggregators for historical data (#3326), thanks @faysou
  • Fixed bar execution generating fractional fill quantities (#3352), thanks @Johnkhk
  • Fixed BacktestResult.total_positions to match tearsheet count (#3148), thanks for reporting @2-5
  • Fixed risk engine negative price handling for spread instruments (#3136), thanks for reporting @q351941406
  • Fixed risk engine trailing stop order risk validations (#3160), thanks for reporting @GianC0
  • Fixed risk engine balance checks for cash borrowing
  • Fixed risk engine balance checks for position-reducing SELL orders (#3256), thanks for reporting @GianC0
  • Fixed spawned order client_id caching in ExecAlgorithm (#3122), thanks for reporting @kirill-gr1
  • Fixed parse_dates parameter in CSV loaders (#3132), thanks @maomao9-0
  • Fixed GreeksCalculator handling of missing price data (#3116), thanks for reporting @q351941406
  • Fixed StreamingFeatherWriter _setup_streaming with replace_existing config (#3234), thanks @cauta
  • Fixed conversion of streamed instruments to catalog (#3235), thanks @faysou
  • Fixed active liquidity calculation Pool profiler simulation (#3165), thanks @filipmacek
  • Fixed duplicate on_instrument callback in request flow for Python adapters (#3323), thanks @filipmacek
  • Fixed Redis index key parsing with use_instance_id
  • Fixed Betfair datetime encoding error in order status reports
  • Fixed Betfair login race condition during concurrent connections
  • Fixed Betfair parsing errors for undocumented codes
  • Fixed Betfair duplicate fills on startup/reconnect
  • Fixed Binance instrument info dict JSON serialization (#3128), thanks for reporting @woung717
  • Fixed Binance ADL orders with TRADE execution type
  • Fixed Binance Futures Algo Order API for conditional orders (#3287), thanks for reporting @KaizynX
  • Fixed Bybit historical bars requests partial (unclosed) bar filtering
  • Fixed Bybit WebSocket bars to respect timestamp_on_close config
  • Fixed BybitHttpClient type stub pyi signatures (#3238), thanks @sunlei
  • Fixed Databento historical client to support consolidated schemas (cmbp-1, cbbo-1s, cbbo-1m) in quote requests
  • Fixed Databento MBO data decoding when PRICE_UNDEF appears with non-zero precision
  • Fixed Databento Arrow serialization for PRICE_UNDEF (#3183), thanks for reporting @marloncalvo
  • Fixed Databento quote decoding with undefined bid/ask prices
  • Fixed Interactive Brokers quote tick subscriptions to use tick-by-tick data (#3135), thanks for reporting @genliusrocks
  • Fixed Interactive Brokers serialization of IBContractDetails (#3181), thanks @faysou
  • Fixed Interactive Brokers parsing of invalid prices (#3246), thanks @faysou
  • Fixed OKX pre-open instrument parsing and standardize enum usage (#3134), thanks for reporting @3wtz
  • Fixed OKX request_bars pagination halting prematurely in Range mode (#3145), thanks for reporting @3wtz
  • Fixed OKX request_bars pagination using correct backwards API semantics (#3145), thanks for reporting @3wtz
  • Fixed OKX FOK/IOC order type preservation across parsers (#3182), thanks @CuBeof
  • Fixed OKX fee rate sign convention for backtesting (#3260), thanks @GhostLee
  • Fixed Polymarket maker fill order side inversion (#3126), thanks for reporting @santivazq
  • Fixed Polymarket instrument provider market filtering (#3133), thanks @MisterMM23
  • Fixed Polymarket websocket client cancellation on concurrent subscriptions (#3169), thanks @DeirhX
  • Fixed Polymark...
Read more

NautilusTrader 1.221.0 Beta

Choose a tag to compare

@github-actions github-actions released this 26 Oct 14:41
dffc3cb

NautilusTrader 1.221.0 Beta

Released on 26th October 2025 (UTC).

This will be the final release with support for Python 3.11.

Enhancements

  • Added support for OrderBookDepth10 requests (#2955), thanks @faysou
  • Added support for quotes from book depths (#2977), thanks @faysou
  • Added support for quotes from order book deltas updates (#3106), thanks @faysou
  • Added execution engine rate limiting for single-order reconciliation queries
  • Added subscribe_order_fills(...) and unsubscribe_order_fills(...) for Actor allowing to subscribe to all fills for an instrument ID
  • Added on_order_filled(...) for Actor
  • Added Renko bar aggregator (#2941), thanks @faysou
  • Added time_range_generator for on-the-fly data data subscriptions (#2952), thanks @faysou
  • Added __repr__ to NewsEvent (#2958), thanks @MK27MK
  • Added convert_quote_qty_to_base config option to ExecEngineConfig (default True to retain current behavior) allows adapters to keep quote-denominated sizes when needed
  • Added contingent order fields parent_order_id and linked_order_ids for OrderStatusReport and reconciliation
  • Added fs_rust_storage_options to Python catalog (#3008), thanks @faysou and @Johnkhk
  • Added matching engine fallback to default order book for custom fill models (#3039), thanks @Hamish-Leahy
  • Added filesystem parameter to parquet in the consolidate functions (#3097), thanks @huracosunah
  • Added azure support for az protocol (#3102), thanks @huracosunah
  • Added Binance BBO price_match parameter support for order submission
  • Added BitMEX conditional orders support
  • Added BitMEX batch cancel support
  • Added BitMEX contingent orders support (OCO, OTO, brackets)
  • Added BitMEX historical data requests (trades and bars)
  • Added BitMEX configurable recv_window_ms for signed HTTP request expiration
  • Added Bybit SPOT position reports with opt-in use_spot_position_reports config option for BybitExecClientConfig
  • Added Bybit ignore_uncached_instrument_executions config option for BybitExecClientConfig (default False to retain current behavior)
  • Added Databento CME sandbox example
  • Added Interactive Brokers cache config support for historical provider (#2942), thanks @ms32035
  • Added Interactive Brokers support for fetching orders from all clients (#2948), thanks @dinana
  • Added Interactive Brokers order conditions (#2988), thanks @faysou
  • Added Interactive Brokers generate_fill_reports implementation (#2989), thanks @faysou
  • Added OKX conditional trigger orders support
  • Added OKX trade mode per order via params using td_mode key
  • Added OKX margin configuration and spot margin support
  • Added OKX demo account support
  • Added OKX batch cancel support
  • Added Polymarket native market orders support

Breaking Changes

  • Removed nautilus_trader.analysis.statistics subpackage - all statistics are now implemented in Rust and must be imported from nautilus_trader.analysis (e.g., from nautilus_trader.analysis import WinRate)
  • Removed partial bar functionality from bar aggregators and subscription APIs (#3020), thanks @faysou
  • Renamed nautilus-cli crate feature flag from hypersync to defi (gates blockchain/DeFi commands)
  • Polymarket execution client no longer accepts market BUY orders unless quote_quantity=True

Security

  • Fixed non-executable stack for Cython extensions to support hardened Linux systems
  • Fixed divide-by-zero and overflow bugs in model crate that could cause crashes
  • Fixed core arithmetic operations to reject NaN/Infinity values and improve overflow handling

Fixes

  • Fixed reduce-only order panic when quantity exceeds position
  • Fixed position purge logic to prevent purging re-opened position
  • Fixed Position.purge_events_for_order to properly rebuild state from remaining order fills
  • Fixed cache index cleanup bugs in purge_order operations
  • Fixed order average price calculation that was double-counting current fill in weighted average
  • Fixed own order book cleanup for terminal orders and inflight handling
  • Fixed order book depth snapshot processing to avoid padding levels and metadata tracking for L1 top-of-book ticks
  • Fixed crypto instruments PyO3 -> Cython conversion for lot_size where it was not being passed through
  • Fixed serialization crate bugs and improve error handling
  • Fixed PyO3 interpreter lifecycle for async shutdown preventing edge case "interpreter not initialized" panics during shutdown
  • Fixed RiskEngine reduce-only cash exits (#2986), thanks for reporting @dennisnissle
  • Fixed RiskEngine quote quantity validation
  • Fixed BacktestEngine to retain instruments on reset (#3096), thanks for reporting @woung717
  • Fixed overflow in NautilusKernel build time calculation due to negative duration (#2998), thanks for reporting @HaakonFlaaronning
  • Fixed handling of asyncio.CancelledError in execution reconciliation (#3073), thanks @dinana
  • Fixed edge case where rejected orders can remain in own order book
  • Fixed Currency registration to synchronize between Cython and PyO3 runtimes via new register_currency() helper
  • Fixed Databento CMBP-1/CBBO/TBBO symbology resolution
  • Fixed on_load called before strategy added bug (#2953), thanks @lisiyuan656
  • Fixed filesystem usage in catalog for isfile and isdir (#2954), thanks @limx0
  • Fixed SandboxExecutionClient instrument data handling
  • Fixed AccountState Arrow serialization (#3005), thanks for reporting @nikzasel
  • Fixed CryptoOption Arrow schema option_kind field to accept string values
  • Fixed FuturesSpread Arrow schema missing max/min quantity and price fields
  • Fixed OptionSpread Arrow schema missing max/min quantity and price fields
  • Fixed Commodity Arrow schema to match from_dict requirements
  • Fixed safe encoded symbols (#2964), thanks @ms32035
  • Fixed msgspec encoding for type objects with qualified names
  • Fixed nautilus CLI macOS compatibility with regex unicode-perl feature (#2969), thanks @learnerLj
  • Fixed fuzzy candlesticks indicator bugs (#3021), thanks @benhaben
  • Fixed return type annotation for ArrowSerializer.deserialize (#3076), thanks @MK27MK
  • Fixed initializing of sqrt price setting flow when Pool profiling (#3100), thanks @filipmacek
  • Fixed Redis multi-stream consumer skipping messages (#3094), thanks for reporting @kirill-gr1
  • Fixed Binance duplicate OrderSubmitted event generation for order lists (#2994), thanks @sunlei
  • Fixed Binance websocket fill message parsing for Binance US with extra fields (#3006), thanks for reporting @bmlquant
  • Fixed Binance order status parsing for external orders (#3006), thanks for reporting @bmlquant
  • Fixed Binance execution handling for self-trade prevention and liquidations (#3006), thanks for reporting @bmlquant
  • Fixed Binance trailing stop to use server-side activation price (#3056), thanks for reporting @hope2see
  • Fixed Binance Futures reconciliation duplicated position bug (#3067), thanks @lisiyuan656
  • Fixed Binance price_match order price synchronization (#3074)
  • Fixed Binance Futures position risk query to use v3 API returning only symbols with positions or open orders (#3062), thanks for reporting @woung717
  • Fixed Binance Futures liquidation and ADL fill handling
  • Fixed BitMEX testnet support
  • Fixed BitMEX instrument parsing of lot size
  • Fixed BitMEX order rejection handling and response parsing
  • Fixed Blockchain adapter out of gas RPC error in Multicall for problematic contracts (#3086), thanks @filipmacek
  • Fixed Bybit currency parsing from venue resulting in incorrectly low precision (e.g., USDT precision 4 rather than 8)
  • Fixed Bybit handling of OrderModifyRejected events from pending updates
  • Fixed Bybit account endpoint pagination handling
  • Fixed Coinbase Intx API credentials handling to allow passing explicitly
  • Fixed Databento MBO Clear actions and improve docs
  • Fixed Hyperliquid L1 signing with direct MessagePack serialization (#3087), thanks @NicolaD
  • Fixed Interactive Brokers tick level historical data downloading (#2956), thanks @DracheShiki
  • Fixed Interactive Brokers instrument provider TypeError when load_ids/contracts are None, thanks for reporting @FGU1
  • Fixed Interactive Brokers modify bracket order (#2979), thanks @faysou
  • Fixed Interactive Brokers historical bars resubscription failure after connection loss (#3002), thanks @Johnkhk
  • Fixed Interactive Brokers flat position reconciliation and instrument loading (#3023), thanks @idobz
  • Fixed Interactive Brokers bars response handling by removing partial bar (#3040), thanks @sunlei
  • Fixed Interactive Brokers account summary handling (#3052), thanks @shinhwasbiz02
  • Fixed Interactive Brokers account balance calculation (#3064), thanks @sunlei
  • Fixed OKX spot margin quote quantity order handling
  • Fixed OKX API credentials handling to allow passing explicitly
  • Fixed OKX fee calculations to account for negative fees
  • Fixed OKX parsing for tick_sz across instrument types
  • Fixed OKX parsing for instruments multiplier field
  • Fixed OKX WebSocket heartbeat and standardize logging
  • Fixed Polymarket handling of one-sided quotes (#2950), thanks for reporting @thefabus
  • Fixed Polymarket websocket message handling (#2963, #2968), thanks @thefabus
  • Fixed Polymarket tick size change handling for quotes (#2980), thanks for reporting @santivazq
  • Fixed Polymarket market order submission to use native CLOB market orders (#2984), thanks for reporting @njkds
  • Fixed Polymarket maker fill order side inversion (#3077), thanks for reporting @DarioHett
  • Fixed Polymarket neg_risk order parameter handling
  • Fixed Tardis instruments lot_size mapping
  • Fixed Tardis adapter error handling and connection robustness
  • Fixed Tardis replay to use catalog-compatible filenames

Internal Improvements

  • Added ARM64 support to Docker builds
  • Added BitMEX adapter integration tests
  • Added OKX adapter integration tests
  • Added turmoil network simulation testing to network crate
  • Adde...
Read more