RELEASES.md
Released on 29th April 2026 (UTC).
Portfolio::mark_values, equity, and missing_price_instruments queries for Rust and Pythoninstrument_status / instrument_statuses cache queries and auto-caching in the data engine (#3858)environment enum config for BitMEX, Deribit, dYdX, Hyperliquid, and OKX adaptersBybitEnvironment to BybitDataClientConfig and BybitExecClientConfigLiveExecEngineConfig (#3841), thanks @Javdu10calculate_commission to ExecutionClient for venue-specific reconciliation fillsDataEngineConfig, ExecutionEngineConfig, and OrderEmulatorConfig so they can be constructed from Pythoncache, msgbus, data_engine, exec_engine, and portfolio keyword arguments to BacktestEngineConfig Python constructorMarginAccount.margin_for_currency + margin_init/maint_for_currency helpers for cross-margin queriesMarginAccount.total_margin_init(currency) / total_margin_maint(currency) summing both margin bucketsMarginAccount.account_margins, account_margins_init/maint, and clear_account_margin accessorstransport-sockudo feature with TransportBackend runtime selector for the WebSocket transport (Rust)TransportBackend PyO3 enum and WebSocketConfig.backend kwarg for backend selection from PythonUser-Agent and per-venue headers on both backends (#3932), thanks @sunleiWebSocketConfig.proxy_url for HTTP CONNECT proxy tunneling with basic-auth supportBettingInstrument for ladder-snapped pricinguse_trade_lite config to opt into low-latency TRADE_LITE fills (Rust, default False)proxy_url plumbing for market and user-data WS streams (#3937), thanks for reporting @huangqingchiBybitPositionIdx enum and bybit_resolve_position_idx PyO3 helperDydxNetwork re-export on the nautilus_trader.adapters.dydx packagefundingHistory info endpointmarket_order_slippage_bps) with per-order overrideOrderBookDepth10 subscription backed by the l2Book feednSigFigs / mantissa L2 precision controls via subscribe_paramsparams["greeks_convention"] (string or list) to narrow option greeks subscriptionstransport_backend config to switch websockets between Tungstenite and Sockudo backendsSubmitOrderList via POST /orders for limit-order batches (Rust)idle_timeout_ms for zombie detection (#3908), thanks for reporting @camarigorproxy_url plumbingpUSD collateral currency (Currency::pUSD() in Rust, pUSD in Python) for the CLOB V2 cutovercompression for Tardis Machine replay, defaulting to zstdExecutionReport::OrderWithFills and send_order_with_fills emitter for bundled status + fill reconciliationdelivery_autoclose- prefix recognition for expiring contract auto-close eventsadlRankIndicator warning log when an open position is ranked 4 or higher (next to deleverage)userEvents.liquidation routingAuto-Deleveraging fill detection with warn logging on HTTP and WebSocket pathsOption<&AccountId> to Rust Portfolio::unrealized_pnls, realized_pnls, total_pnls; pass None to keep prior behaviorbackend: TransportBackend to WebSocketConfig; struct-literal callers must add the field (Rust)proxy_url: Option<String> to WebSocketConfig; struct-literal callers must add the field (Rust)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-v2proxy_url field, replacing the prior http_proxy_url / ws_proxy_url split across adapter Rust and Python configsDockerizedIBGatewayConfig::from_env_or_defaults (Rust); use the bon builder or Default::default, which still falls back to TWS_USERNAME/TWS_PASSWORDOrderMatchingEngineConfig::new and with_price_protection_points (Rust); use OrderMatchingEngineConfig::builder() insteadBlockchainDataClientConfig::new, BlockchainExecutionClientConfig::new, and DexPoolFilters::new (Rust); use the corresponding ::builder() insteadDeribitExecClientConfig::new and HyperliquidExecClientConfig::new convenience constructors (Rust); use the ::builder() insteadDataEngineConfig::new 12-arg positional constructor (Rust); use DataEngineConfig::builder() insteadACCOUNT-* placeholders from margin adapters; MarginBalance emits with currency onlynautilus_system::factories module; import factory traits from nautilus_common::factories (Rust)indicators from nautilus-common default features; enable with features = ["indicators"] (Rust)DatabaseConfig.timeout to connection_timeout and response_timeout to match the Redis/PyO3 wire schemais_sandbox: bool with environment: AxEnvironment on AxDataClientConfig and AxExecClientConfig (Rust and Python), aligning with the Binance/Bybit/Kraken adapter pattern. Default is Sandbox.BacktestEngine::add_venue and SimulatedExchange::new (Rust) to take SimulatedVenueConfig (bon builder)InteractiveBrokersDataClientConfig, InteractiveBrokersExecClientConfig, InteractiveBrokersInstrumentProviderConfig, and DockerizedIBGatewayConfigget_cached_bybit_http_client signature: replaced demo/testnet bools with environment: BybitEnvironmentUnsubscribeBookSnapshots to require interval_ms for exact snapshot interval unsubscribe (Rust)OrderError::Invariant variant to wrap CorrectnessError instead of anyhow::Error (Rust)HyperliquidEip712Signer::new() to return Result and take &EvmPrivateKey (Rust)HyperliquidExchangeRequest::new/with_vault to accept HyperliquidSignature directly (Rust)/ws to /market/ws and /private/wsOption state (unstable, may change)MarginBalance.instrument_id to optional; None marks account-wide (cross margin) entries keyed by currencyMarginAccount.margins_init/margins_maint to per-instrument only; use account_margins_* for cross marginMarginBalance per base coin (previously hardcoded USDT)TradeId format to T-{hash}-{count} from {venue}-{raw_id}-{count}; ts_init-keyeduse_random_ids to no longer govern TradeId; flag still affects VenueOrderId and PositionIdnautilus-live to default-features = false; enable features = ["node"] for LiveNode (Rust)LiveNode examples to require --features examples to build (Rust)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)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)urlencoding crate with the in-tree nautilus_core::urlencoding to shrink the supply-chain surface (Rust)harden-runner, codeql-action, setup-uv, setup-rust-toolchain) to current upstream releasescargo-deny and osv-scanner advisory configuration; removed the stale pygments advisory ignore now that upstream is patchedAccountState to accept empty balances and marginsFillModel determinism via IndexMap in OrderMatchingEngine (#3914), thanks for reporting @timkoopmansquote_quantity propagation in execution algorithm spawn orders (#3845), thanks @dxwilFORCE_STOP (#3920)mark_values/equity keying by base currency when conversion is off; now keys by settlement currencyPortfolioAnalyzer AttributeError on MaxDrawdown/CAGR/CalmarRatio (#3941), thanks for reporting @a1zb2yc3zstop_timer in TimeBarAggregator (#3822), thanks @faysouRiskEngine applying base min_quantity/max_quantity bounds to quote-denominated ordersOrderMatchingEngine treating quote_quantity=True orders as base quantity; the quote notional is now converted to a base quantity before fill simulation (#3873), thanks for reporting @fedoraiversubscribe_option_chain hanging on bootstrap in backtest (#3938), thanks for reporting @aaurixDataBackendSession GIL deadlock when streaming custom data types (#3847), thanks for reporting @GianC0BacktestNode streaming with mixed built-in and custom data types (#3853), thanks for reporting @GianC0DataBackendSession chunked streaming memory leak causing RSS growth (#3889), thanks for reporting @GianC0(instrument_id, interval_ms) semantics for shared intervals and exact unsubscribe handling (Rust) (#3823), thanks for reporting @dwolfesbergeridle_timeout_ms reset on Ping/Pong keep-alive frames (#3907), thanks for reporting @camarigorTradingNodeConfig.parse dropping importable live client config path and factory fields during raw config decodingOrderTriggered ValueError on market-style stop orders (#3812), thanks for reporting @jindrichsirucekconsolidate_data_by_period pairwise merging on fragment-per-flush catalogs (#3857), thanks for reporting @M-Advisconsolidate_data_by_period destroying data on repeat runs and when straddling files spanned the consolidation window, mirrored in the Rust catalog backend (#3883), thanks @M-AdvisParquetDataCatalog.get_intervals(identifier=None) on per-identifier data (#3903), thanks for reporting @GianC0ParquetDataCatalog.consolidate_data raising IndexError when the start/end range did not overlap any files, and consolidate_catalog_by_period aborting the loop on the first unrecognized directory rather than skipping it (#3910), thanks for reporting @M-Adviss3://bucket/base/path (and other remote schemes) no longer collapse to the bucket root (#3930), thanks @fedoraiverFeatherWriter writing 0-precision metadata on leading CLEAR delta (#3913), thanks for reporting @fedoraiverTradingNode clean shutdown from CancelledError (#3862), thanks for reporting @jxstanfordSymbol and PositionId deserialize of non-ASCII escaped strings (#3893), thanks for reporting @volemontposition_id from submit_order (Rust)ExecutionEngine leg-fill position events not publishing to subscribers (#3939)position_id after a partial fill-time crash (Rust)TestDataGenerator.generate_trade_ticks using random UUID4; now sequences deterministic T-{idx} IDsOrderStatusReport now propagates fill price to avg_px for downstream inferred fillsreconcile_fill_report dropping fills for unknown orders; now bootstraps external orders for venue closuresInstrumentStatus persistence and backtest streaming through ParquetDataCatalog (#3855)LiveNode request_bars() historical callbacks dropped during startup warmup (#3825), thanks @BurnOutTraderDataActor missing on_historical_funding_rates and on_historical_data forwarding Nonefrom_dict for unregistered base/underlying codes (#3882), thanks for reporting @volemontinstruments() failing on unregistered currencies (#3898), thanks for reporting @volemontfrom_dict on non-ASCII strings via ensure_ascii=False in json.dumps (#3895), thanks @costajohntInstrument now emits before InstrumentStatus/InstrumentClose within each MCMRemoved/RemovedVacant) emitting close only at market close; now fire immediatelyerrorMessage detailquery_order to emit status reports via customer_order_ref and bet_id lookups (Rust)@aggTrade (#3861), thanks for reporting @KaizynXtrade_id and commission by bundling status + fillcancel_all_orders silently failing; routes through HTTP (WS API does not support it)TRADE_LITE user data events logging "Unknown event type" warnings on every fillfstream-mm and fstream-auth hoststrdMatchID missing; now hashed from trade fieldsPreClose when scheduled for delisting (#3829), thanks @dxwilload_all_async dropping base_coin filter for options (#3865), thanks for reporting @BaerensteinInstrumentStatus messages silently dropped instead of forwarded to the data enginesubscribe_option_chain call (#3887), thanks @sunleipositionIdx rejection when position_mode set (#3944), thanks for reporting @pusteckiystart_ns after session start; now logs error (#3877), thanks for reporting @jxstanfordStopMarket OrderRejected on market_price price field (#3925), thanks for reporting @marco-rigonigenerate_order_status_report fetching only the first order and missing later matches in the responseF_SNAPSHOT flag on deltas; empty-book Clear now emits F_SNAPSHOT | F_LASTF_SNAPSHOT from synthetic uncrossing deltas and the terminatorend block from fixed block-time estimatef64 subtraction; now uses Decimal at full precisionside from size sign; venue side now preserved end-to-endDydxAdapterConfig defaulting to mainnet URLs regardless of network; added for_network helperLiveNode bootstrap panic on HIP-3 instrument symbols containing */? (e.g. dex:STREAMABCD****-USD-PERP) by substituting wildcard bytes with x in InstrumentId.symbol while preserving the venue-official name on raw_symbol (#3896), thanks for reporting @daiwanweiOrderCanceled (#3827), thanks for reporting @P1YU5H-50N1query_order handler to emit status reports (#3879), thanks for reporting @pusteckiyrequest_account_state discarding parsed margins (#3725), thanks for reporting @marco-rigonicancel_all_orders dropping per-order rejection events on partial or transport failurerequest_trades silently returning empty; now bails explicitlyAuto-Deleveraging fill direction deserialization (#3922), thanks for reporting @AlphaTraderKTypeError when priceMagnifier is None (#3885), thanks @davidsblomOrderUpdated panic from wire stop_price: 0.0 treated as trigger priceAccountBalance invariant (total == locked + free) when Kraken's af field and the derived amount - af round independently at the currency precisionQuoteTick.ts_event using local init time instead of the exchange timestamp field (#3926), thanks @ptzafosAccountBalance invariant panic on margin parse (#3868), thanks @Stamppot82cdef subscription attributeBlackScholes convention regardless of subscribed greeks typeCurrencyPair with USDT/USDC/USD quote over alternativestrade_id using deterministic synthesized id instead of random UUIDOrderStatus and empty OptionType values via TryFrom conversion (Rust)InstrumentStatus messages logged as unhandled instead of forwarded to the data enginequery_order to emit status reports by merging regular and algo order lookups (Rust)min_quantity denying market orders via limit-order shares rule (#3874), thanks for reporting @fedoraiverrequest_instrument(s) dropping WS via stale token_meta (#3900), thanks for reporting @fedoraiverparse_to_quote_ticks using changed level as top of book (#3905), thanks for reporting @camarigorparse_to_snapshot missing F_SNAPSHOT flag on CLEAR and intermediate ADD deltasparse_to_deltas flagging F_LAST on every delta instead of only the final oneparse_to_trade_tick using uuid.uuid4(), producing non-deterministic trade IDsbook_snapshot_* levels (#3953), thanks for reporting @a1zb2yc3zid missing/empty (CSV and WebSocket parsers)AccountBalance::from_total_and_locked and AccountBalance::from_total_and_free, and migrated adapter balance parsing to preserve the total == locked + free invariant at currency precision (Rust)CorrectnessError enum to replace anyhow::Error in correctness helpers (Rust)CorrectnessResultExt::expect_display for display-formatted panics on typed correctness errors (Rust)simulation feature (Rust)wall_clock_now seam in nautilus-core for virtual time under simulation (Rust)biased to tokio::select! blocks in network and live crates for deterministic poll ordernautilus_network::transport module with Message/TransportError/WsTransport for future backend swap (Rust)Message/TransportError re-exports on nautilus_network to ease future backend swaps (Rust)LiveNodeBuilder (#3848), thanks @BurnOutTraderparams() accessor to SubscribeCommand and TradingCommand (#3846), thanks @faysouShutdownSystem handling via commands.system.shutdown pub/sub topic, wired to kernel, backtest, and live (Rust)DataActor parity with v1 for publish_data, publish_signal, subscribe_signal, unsubscribe_signal, add_synthetic, and update_synthetic (Rust)MarginAccount, routing event margins by instrument_id presencegenerate_order_status_report showing filter scope and page_full on None resultsdetermine_trade_id helper with FNV-1a (Rust) and blake2b (Python) deterministic hashinghandle_l2_book routingminTradeSpotNtlRejected order status and Unknown liquidation method fallbackderive_trade_id FNV-1a helpers in BitMEX and Tardis common parse modules for deterministic fallbackderive_cmbp_trade_id in Databento decode for schemas without a native trade IDTradeId format across language bindingsnode feature to nautilus-live gating builder, config, manager, and node modules (default on)nautilus-live/defi to no longer pull LiveNode orchestration depssetup-uv auto mode to skip GHA uploads on self-hosted runners (#3933), thanks @sunleiWebSocketClient onto the WsTransport trait, decoupling reconnect/auth from tungstenite types (Rust)PolymarketQuote.best_bid/best_ask to optional, matching the Rust Option<String> schemaMarginBalance entriesreconciliation module into types, ids, positions, and orders submodules (Rust)futures::conversions module (Rust)AHashMap/AHashSet with IndexMap/IndexSet in ExecutionManager for deterministic ordering in simulations (Rust)nautilus-system to optional in adapter crates (gated by python); default builds drop heavy transitive depsIndexMap in OrderMatchingEngineAuthTracker with is_authenticated/wait_until_authenticated Python APIsPrivateKeySigner and EIP-712 domain (#3851)ClientOrderId generation with cached prefix buffer (#3935), thanks @sunleiOrderListId and PositionId generation with cached prefix buffers (Rust)alloy crate to v2.0.1capnp crate to v0.25.4 (regenerated schemas with 4-space indents and version headers)databento crate to v0.48.0datafusion crate to v53.1.0msgspec to v0.21.1pyarrow to v24.0.0tokio crate to v1.52.1environment, subaccount, base_url_grpc)demo/testnet bools on BybitDataClientConfig/BybitExecClientConfig - use environmentis_demo on OKXDataClientConfig/OKXExecClientConfig - use environmenttestnet on HyperliquidDataClientConfig/HyperliquidExecClientConfig - use environmentis_testnet on DeribitDataClientConfig/DeribitExecClientConfig - use environmentis_testnet on DydxDataClientConfig/DydxExecClientConfig - use environmenttestnet on BitmexDataClientConfig/BitmexExecClientConfig - use environmentReleased on 6th April 2026 (UTC).
GreeksCalculator (#3792), thanks @faysounautilus_actor! macro in nautilus_common for Deref/DerefMut boilerplate on actor types (Rust)nautilus_strategy! macro in nautilus_trading for Deref/DerefMut and Strategy trait boilerplate on strategy types, with optional block for hook overrides (Rust)cache.orders_active_local(...) function in Rust (#3716), thanks @Javdu10interval field to FundingRateUpdate (#3694), thanks @dxwilBookImbalanceActor example actor for order book quoted volume imbalance in RustExecTesterConfig.test_reject_post_only implicitly setting post_only on orders without requiring use_post_only (Python and Rust)TieredTickScheme and TickScheme::Tiered for price-dependent tick sizes (Rust)TokenizedAsset instrument type with configurable asset_class field for tokenized equities, ETFs, commodities, and other real-world assets.gz data through BacktestEngine (Rust)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 responsessubscribe_funding_rates and unsubscribe_funding_rates with FundingRateUpdate emission via the mark price stream (Rust)FillReport/OrderStatusReport emission (Rust)use_position_ids config for hedging position IDs derived from instrument and position side on exchange-generated fills (Rust)default_taker_fee config with commission fallback estimation for exchange-generated fills when venue omits commission fields (Rust, USD-M only)NewAdl, NewInsurance, and PendingNew variants to BinanceOrderStatus (Rust)Rpi time-in-force, PreSettle/Settling/Close contract statuses, None/Decrement/Transfer STP modes, and income type variants (Rust)BinanceBar and BinanceFuturesMarkPriceUpdate (#3749), thanks @twituclose_position parameter for algo stop orders to close an entire position at trigger price (Python and Rust) (#3751), thanks for reporting @dodge-basicbaseCoin topic with per-instrument filtering/v5/account/fee-ratesubmit_order_list via WebSocket batch API with TP/SL support and HTTP demo fallback (Rust)query_order via HTTP with open order and history fallback (Rust)LimitIfTouched and MarketIfTouched order type support (take_limit/take_market)LimitIfTouched orders, and batch submitaclass_base=tokenized_asset with automatic dual-fetch on instrument loading (#3455), thanks for reporting @jilongjiarequest_book_snapshot for spot and futures via HTTP depth endpointsrequest_funding_rates for futures with client-side start/end/limit filteringsubscribe_instrument_status for spot and futures (polling-based detection)trailing_offset and limit_offset fieldstrigger parameter for conditional orders (last or index price reference)viqc order flagdisplayvol parametersubmit_order_list via WebSocket batch endpoint for regular GTC orderssubscribe_option_greeks for venue-provided Greeks via the opt-summary WebSocket channelws_auth_timeout_secs for WebSocket authentication (#3727), thanks for reporting @Stamppot82fwdPx (forward price) to OKXOptionSummaryMsg and mapped to underlying_price on OptionGreeks for ATM trackingrequest_orderbook_snapshot and request_funding_rates to Python data client via PyO3 bindingspx_usd/px_vol pricing modes, OpFok order type, and MarketToLimit/conditional order rejectiondelta_bs, gamma_bs, theta_bs, vega_bs) to position datadetermine_order_type_with_alt for correct order type classification when options use alternative pricing fieldsDeltaNeutralVol strategy strangle entry via px_vol limit orders with configurable IV offset, time-in-force, and cache-based re-entry guardMarkPriceUpdate and IndexPriceUpdate parsing from derivative_ticker messages in RustDerivativeTickerCache for deduplicating unchanged funding rate, mark price, and index price updatesTardisDataType enum for normalized Tardis Machine data type identifiersstream_options config with automatic reconnection and exponential backoffInstrument.info (#3730), thanks for reporting @volemontconvert_quote_qty_to_base from ExecEngineConfig and LiveExecEngineConfig; adapters now handle quote-to-base conversion directlyTARDIS_BASE_URL constant from nautilus_tardis::http - use nautilus_tardis::common::urls::TARDIS_HTTP_BASE_URLrevoke_hyperliquid_builder_fee function and builder fee revoke scriptsDatabentoLiveClient.key property (Python)OrderEvent.kind() to type_name() in Rusttype_str PyO3 getter to type_nameDatabentoHistoricalClient.key property to api_key (Python)ParquetDataCatalogV2 to ParquetDataCatalog and StreamingFeatherWriterV2 to StreamingFeatherWriter (PyO3 persistence classes)reqwest::Client to nautilus_network::http::HttpClient with rate limitingExecutionEngine.register_client to error when a venue is already routed to another client (Rust)ExecutionEngine.register_venue_routing to error when re-routing a venue to a different client (Rust)Position.events(), adjustments(), client_order_ids(), venue_order_ids(), trade_ids(); and events() on all order typesbon::Builder defaults as single source of truth; Default impls now delegate to Self::builder().build()Option<T> to plain T with #[builder(default)] across all adapter, live, and engine configs (Rust)Option<T> fields retained only where None carries distinct meaning (feature disabled, unbounded, etc.)no-new-privileges to all servicesaudit mode for fork pull requestsnautilustrader.io URLs from HTTP to HTTPS (#3686), thanks @04cbaws-lc-rs non-FIPS mode rationale (FIPS 140-3 module requires Go toolchain)OrderBook L1 stale event mutation corrupting bid/ask (#3790), thanks for reporting @liniminupdate_position (#3791), thanks @YeeTsaipurge_order KeyError for position/exec_algorithm index access (#3799)Trader::add_exec_algorithm not registering the {id}.execute msgbus endpoint, causing orders with exec_algorithm_id to be silently droppedTrader::clear_exec_algorithms and dispose_components not deregistering {id}.execute msgbus endpoints for removed algorithmsTopicRouter stale index cache panic when unsubscribing one pattern invalidated indices for unrelated cached topics (#3755), thanks for reporting @Javdu10PRICE_UNDEF panic in OrderBookDelta.to_pyo3_list Cython conversion (#3697), thanks @zshuang15ExecutionEngine silently dropping SubmitOrder and SubmitOrderList commands when no execution client can be resolved; now emits OrderDenied (Rust)RiskEngine RefCell re-entrancy panic on order denial (#3680), thanks @husariancomsubscribe_instruments using exact topic instead of wildcard pattern, causing venue-level subscriptions to miss per-instrument publishes from DataEngine (Rust)LiveClock and TestClock (#3690), thanks @HaakonFlaaronningDataActor and Strategy timer callbacks in live mode silently lost on shared clockDataActor::handle_time_event missing not_running() state guardSimulatedExchange account balance adjustment mutation (#3704), thanks for reporting @thaning0make_dict_serializer incompatible with instance-method to_dict for @customdataclass types (#3722), thanks for reporting @Lacleman-tradingRefCell re-entrancy panic when submitting orders through ExecutionEngine in async runner (#3732), thanks for reporting @liniminL1_MBP stale bid/ask when backtesting with trade-only data (Rust and Cython)Order::calculate_overfill emitting false Quantity saturation warnings during normal partial fills (#3746), thanks for reporting @liniminaccount_id (#3705), thanks for reporting @eliotOrdersonPortfolio account-scoped net_exposure, net_exposures, and balance updates in multi-account modeRefCell borrow conflict in Portfolio::initialize_orders (#3787), thanks @filipmacekMarginAccount updates dropping initial and maintenance margins (#3725), thanks for reporting @marco-rigoniBettingInstrument.selection_handicap PyO3 namequery_account panic from block_on inside async runtime across all adapters (Rust)Quantity serialization for partial cancel size reductionset_futures_hedge_mode sending GET instead of POST to positionSide/dual endpoint (#3745), thanks for reporting @dodge-basicOrderStatusReport missing avg_px from WS order updates (Python)LIMIT_MAKER) rejection not setting due_post_only on OrderRejected events (Python and Rust)OrderRejected DashMap deadlock when cleanup_terminal ran while holding a read guardconnect() not waiting for WS session authentication before signaling connected/v5/account/fee-rate is unavailable (#3742), thanks for reporting @jindrichsirucekdisconnect(), causing REST calls to short-circuit on reconnectreq_id correlation)mark_failure recovery pathis_quote_quantity on the order, causing all spot market buys to default to quote currency quantity via the Bybit APIsubmit_order ignoring is_leverage param, hardcoding false instead of reading from order paramstrigger_type ignored on conditional orders, always submitting as LastPrice (#3794), thanks for reporting @marco-rigonitrigger_price and trigger fields in Python exec client (#3794), thanks for reporting @marco-rigoniuser.orders subscription update never arrivesOrderCanceled events when cancel RPC response and user.orders subscription both emitGenerateOrderStatusReport unable to find closed orders when only client_order_id is providednext_8_utc GTD expiry calculation panicking on edge-case timestamps outside nanosecond rangerequest_book_snapshot silently using default 8/8 precision when instrument not in cacherequest_bars ignoring limit parameterrequest_forward_prices ignoring request client_id overridereset() leaking stream tasks by replacing cancellation token without canceling the old onesend_auth_request silently dropping serialization and channel send errorssend_subscribe/send_unsubscribe leaving subscription state wedged on command send failureVenueOrderId comparison via unnecessary string conversion in fill report filteringOrderSide conversion using fragile string round-trip instead of order_side_to_pyo3 in _submit_order and _submit_order_listconnect() not clearing subscription state for manual disconnect/reconnect cyclesNewInstrumentDiscovered for uncached instruments on every v4_markets update_submit_order_list passing raw Cython orders to Rust, causing TypeError on bracket/batch orders (#3763), thanks for reporting @jindrichsirucek_modify_order OrderSide conversion using fragile string round-trip instead of order_side_to_pyo3vault_address is configured (#3762), thanks for reporting @chester0request_ticks API and add contract example (#3699), thanks @faysoudue_post_only on OrderRejected events (Spot and Futures)OrderSubmitted before anyhow::bail!, leaving orders stuck in Submitted stateMarketToLimit orders not rejected for options in HTTP and WebSocket clientsdetermine_order_type classifying IV/USD-priced option IOC orders as Market when primary px field is emptyQuoteCache for partial quote merging_subscribe_instrument_status raising NotImplementedError instead of being a no-op (status detected via polling)batch_cancel_all_orders and batch_cancel_orders not emitting OrderCancelRejected events for regular (non-algo) batch cancel failuresbatch_submit_orders not removing order_identities from dispatch state on batch submit failureparse_fill_report erroring on zero incremental fill quantity during reconnect replay instead of skipping gracefullyrequest_position_status_reports querying positions API for Spot/Margin instruments (unsupported by endpoint)cancel_all_orders and batch_cancel_orders not seeding order_identities for reconciliation-loaded orderspending_orders, pending_cancels, and pending_amends maps leaking entries on WebSocket send failuretrade_idsCode, treating venue rejections as successOrderCancelRejected events for per-item or batch-level failuressize_precision from quote-to-base divisionparse_rfc3339_timestamp silently wrapping negative i64 nanoseconds to garbage u64update_fee_fill_caches diverging from shared parse_fee_currency (missing non-zero fee warning)order_identities and order_state_cachestart/end time, dropping unchanged open positionsconnect() not passing instrument_families for OPTION instrument requests (HTTP 400 from OKX API)base_url_ws ignored for private and business WebSocket channels (#3727), thanks for reporting @Stamppot82venue_order_id not yet available, causing order to remain open until next reconciliation (Python and Rust)calculate_market_price not bailing when all book levels have zero price or sizecreated_at timestamp conversion (#3785), thanks @filipmacekts_init timestamps on reports and reconciliation (#3786), thanks @filipmacekquery_order panic from block_on inside async runtime (#3803), thanks for reporting @Javdu10LiveNode event loopstop()/disconnect() lifecycle leaving tasks alive or is_connected stalederivative_ticker not streaming unless manually added to data_typesSpreadQuoteAggregator (#3698), thanks @faysouParams and dict field support for #[custom_data] and @customdataclass persistence (#3765), thanks @faysouBINANCE_GTX_ORDER_REJECT_CODE and BINANCE_SPOT_POST_ONLY_REJECT_MSG constants for reliable post-only rejection detection in Rustbatch_submit_limit_pair to ExecTesterConfig for order list testingLiveNode with add_strategy_from_configLiveNode with add_exec_algorithm_from_configLiveNode integration tests for actor, strategy, and exec algorithm registrationLiveNode::add_exec_algorithm for registering execution algorithms on the Rust live trading nodeLiveNode stop-handle timeout test for shutdown reliabilityExecutionEngine runtime external order creation from OrderStatusReport for exchange-generated orders (liquidation, ADL, settlement) not previously in cache (Rust)add_exec_algorithm_from_config PyO3 binding on LiveNode with ImportableExecAlgorithmConfigmsgbus::has_endpoint for endpoint existence checksFXRolloverInterestModule, PerContractFeeModel, and SimulationModule trait in Rustsubscribe_option_greeks support to DataTester in RustWebSocketClient.notify_closed() for stream-mode callers to signal reader EOF to the controllerLimitIfTouched, MarketToLimit, TrailingStopMarket, and TrailingStopLimit to transform_order_to_pyo3 Cython-to-PyO3 order converterBinanceFilterType variants and RawRequests rate limit type for complete API enum coverage (Rust)is_exchange_generated detection (Rust)resolve_commission fallback and make_venue_position_id (Rust)BybitWsFrame enum separating wire-level deserialization from public BybitWsMessage API per adapter spec patternQuoteCache integration and option greeks subscription lifecycle testsemitted_trades DashSet with atomic insert for cross-stream safetyAlgoCancelContext and dispatch_algo_cancels to centralize algo cancel partitioning and rejection handlingfill_px_vol, fill_px_usd, fill_fwd_px) and order pricing fields (px_usd, px_vol) to WebSocket and HTTP modelsplace_algo_order sCode rejection pathOKXPriceType, OKXSettlementState, OKXQuickMarginType enums for type-safe field deserializationWsDispatchState DashSet dedup with FifoCache from nautilus_common for bounded FIFO eviction with proper remove() cleanupBybitWsPublicChannel and BybitWsPrivateChannel enum referencesAtomicMap and AtomicSet type aliases with newtypes wrapping ArcSwap for ergonomic read-heavy concurrent collectionsDashMap/DashSet with AtomicMap/AtomicSet for subscription tracking sets, instrument caches, and bar type caches across all adaptersDataEngine instrument subscribers to message bus pattern, enabling execution clients to receive live instrument updates via on_instrument without polling (#3766), thanks @filipmacekTradePaginator with dedup and cursor logic shared across public trades and fill reportscommon/, machine/cache.rs)TardisDataClient with Credential::resolve(), centralized URL resolution, and AHashMapExecutionEngine in PythonLiveNode event loop to use biased select! with pinned ctrl_c for reliable signal handlingblock_length from the message header for end-of-block skip, making decoders forward-compatible with future schema additionsTimeEventHandler ordering and fixed spread quote timestamps (#3764), thanks @faysouSpreadQuoteAggregator transition from historical to live mode (#3759), thanks @faysouAtomicTime mode switching and datetime panicstype_name() across order events and instrumentsExecutionManager into live event loop with full inflight lifecycle (Rust) (#3798), thanks @filipmacekibapi to 10.45 (#3804)capnp and capnpc crates to v0.25.3 (regenerated schemas with 4-space indents and version headers)databento crate to v0.45.0datafusion crate to v53.0.0pyo3 crate to v0.28.3redis crate to v1.2.0tokio crate to v1.51.0tokio-tungstenite crate to v0.29.0DataActor walkthroughhow_to/configure_live_trading.md extracted from concepts/live.md configuration contentT vs Option<T> rules, Default delegation patternblock_on safety rules and spawn_task usage in sync trait methodsDeltaNeutralVol README updates for strangle entry flow, config fields, and usage examplesclientOrderId decoding section with usage examples to integration docsconcepts/live.md to focus on reconciliation explanation, linking to how-to for configurationon_timer and on_alert hooksReleased on 3rd March 2026 (UTC).
fill_limit_inside_spread to FillModel and MatchingCore for at-or-inside-spread limit fill controlget_target_px_for_quantity method on OrderBook (#3627), thanks @Javdu10skip_on_error flag for load_instruments to skip unparsable definitions (#3657), thanks for reporting @davidsblomCOINBASE_INTX) adapter, see RFC (#3555)BINANCE_ED25519_* env vars for Spot/Margin (use BINANCE_API_KEY/BINANCE_API_SECRET; Futures deprecated with warning)builder_fee_refresh_mins config option (builder fees no longer charged)fetch_orderbook_history, load_orderbook_snapshots, fetch_price_history and related methods (endpoints decommissioned, #3635)pip-audit to security audit pipelineUstr replaced with Box<str> for API keys)Debug impls across all adapter credentialsSECURITY.md with expanded scope, reporting guidelines, and responsible disclosure policyOrderEmulator trailing stop activation ignoring LAST_PRICE trigger type (#3629), thanks for reporting @HaakonFlaaronningLiveExecEngine position reconciliation infinite loop when venue reports flat (#3622), thanks for reporting @mrbaron3CryptoOption instrument pyo3 transform for (#3626), thanks @davidsblomStreamingFeatherWriter duplicate events from multiple message bus topics (#3625), thanks for reporting @fomotoshiVolumeImbalanceBarAggregator and VolumeRunsBarAggregator integer overflow for step >= 923 in high-precision mode (#3658), thanks for reporting @honvlInstrumentProvider load_ids_async loading all instruments instead of filtering to requested IDs (affected dYdX, Kraken, AX, Hyperliquid)ClientOrderId exceeding cl_ord_id 18-char free-text limit (#3651), thanks for reporting @husariancomload_ids path skipping sibling tokens (#3654), thanks for reporting @likenjiLiveNode startup RefCell panic when execution reports arrive during connect()marketType parameternautilus-serialization crateBacktestNode with catalog streaming in RustOrderBookImbalance example strategyBestPriceFillModel to fill inside bid ask spread (#3428), thanks @faysou_seed_trade_consumption to use range-bounded FFI queries for deep booksMatchingCore.iterate to avoid list concatenation on every calldatabento crate to v0.42.0datafusion crate to v52.2.0Released on 21st February 2026 (UTC).
bulk_read_batch_size option to CacheConfig for batched Redis bulk reads, thanks @shzhngOrderBookDeltas historical request support (#3438), thanks @faysoumarket_exit() method for Strategy with configurable market_exit_time_in_force and market_exit_reduce_only options (supports venues requiring IOC for market orders)manage_stop config option to StrategyConfig for automatic market exit on stopqueue_position tracking heuristic for backtestsuse_tracing=True in LoggingConfig, filter with RUST_LOG env var)use_market_order_acks venue config option to generate OrderAccepted events for market orders before filling (mimics behavior of venues like Binance)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 @godnight10061request_funding_rates and FundingRateUpdate Arrow serialization (#3467), thanks @dxwiloptimize_file_loading as BacktestDataConfig parameter (#3518), thanks @faysoubulk_read_batch_size option to CacheConfig for batched Redis bulk reads (#3535), thanks @shzhngPerpetualContract instrument for asset-class agnostic perpetual swapssubscribe_race_data configBetfairOrderVoided custom data type for VAR voidsBetfairOrderVoided custom data type for VAR voidsBinanceEnvironment enum with LIVE, TESTNET, DEMO variants for explicit environment selectionenvironment config field to BinanceDataClientConfig and BinanceExecClientConfigBINANCE_DEMO_API_KEY/BINANCE_DEMO_API_SECRET env varsTotalCashValue to account summary info dict, exposing actual cash balance (#3567), thanks @shzhngrequest_timeout_secs config to InteractiveBrokersExecClientConfig and consolidated all IB request timeouts into a single configurable value (#3602), thanks @shzhngevent_slug_builder support (#3501), thanks @jsemldonadodydx optional install extra (the v4 Rust-backed adapter has no additional Python dependencies)nautilus_trader.adapters.dydx_v4 module to nautilus_trader.adapters.dydx and standardized class names to Dydx prefix (e.g. DydxDataClientConfig, DydxLiveDataClientFactory)subscribe_order_book_snapshots and unsubscribe_order_book_snapshots methods from LiveMarketDataClient (were never called by the data engine)OKX_BASE_URL_HTTP, OKX_BASE_URL_WS_*, OKX_DEMO_BASE_URL_WS_*); use config base_url_* fields insteadget_ws_base_url function from OKX Rust adapter; use get_ws_base_url_private or get_ws_base_url_public insteadAddAssign, SubAssign, MulAssign trait implementations from Price, Quantity, and Money types (Rust); use x = x + y instead of x += yadd_assign and sub_assign cdef methods from Price, Quantity, and Money types (Cython); use x = x + y insteadsubscribed_order_book_snapshots to subscribed_order_book_depth for consistency with data engine routinglisten_key_ping_max_failures from BinanceExecClientConfig (listenKey flow replaced by WebSocket API)Price, Quantity, and Money arithmetic to use max precision instead of panicking on precision mismatchQuantity + 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)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=FalseOrderAccepted by default; set use_market_order_acks=True to restore previous behavior_subscribe_order_book_depth and _unsubscribe_order_book_depth for OrderBookDepth10 subscriptionsapi_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)BINANCE_API_KEY/BINANCE_API_SECRET environment variables (or testnet equivalents)instrument_provider to instrument_config on PolymarketDataClientConfig and PolymarketExecClientConfig; use PolymarketInstrumentProviderConfig instead of InstrumentProviderConfigarc-swap to 1.8.1 fixing potential use-after-free in debt mechanism (memory ordering fix)CVec::empty() to use dangling pointer instead of null, avoiding undefined behavior in Vec::from_raw_partsliquidity_consumptiontrade_execution=Falseliquidity_consumption=Truebase_currency access across accountingPosition spot base currency commission sign (#3546), thanks for reporting @gaye746560359Position flat detection for floating-point edge casesUnsubscribeInstrumentClose message handler routingF_LAST flag checks to use proper bitmask comparisonMarketIfTouchedOrder (MIT) filling at bar extremes instead of trigger price during backtesting (#3461, #3462), thanks @HaakonFlaaronningExecAlgorithm spawn quantity accounting (will now restore quantity from denied/rejected spawned orders)GreeksCalculator to use index price for index instruments (#3541), thanks @shzhngGreeksCalculator min->max DTE clamping (#3582), thanks @pandasharkitm_prob calculation to use N(d2) instead of normalized delta (#3554), thanks @shzhngvenue_order_id indexing and validationOrderBook.simulate_fills error message (#3405), thanks @JohnkhkLiveNode (Rust) startup (#3385), thanks @filipmacekrequest_order_book_snapshot and add Bybit support (#3416), thanks @dxwilAttributeError on _mem accesscancel_all_orders to route futures algo orders through correct cancel endpointOrderStatusReport.avg_px always None (#3499), thanks for reporting @mrbaron3client_order_id replaced with UUID (#3500), thanks for reporting @mrbaron3databento_data to fetch definitions for full date range (#3414), thanks @Johnkhkfetch_all_open_orders in client cache key preventing connection sharing (#3441), thanks @shzhngopenOrder callbacks after fills caused invalid PARTIALLY_FILLED -> ACCEPTED transitions, thanks @shzhng^ prefix on index underlying symbols with simplified symbology (#3540), thanks @shzhngibapi 10.43 protobuf compatibility: IBContract.strike default and ContractDetails.underConId field typo (#3599), thanks @shzhngtrack_option_exercise_from_position_update not generating FLAT reports for expired options (zero-quantity position updates were silently skipped), thanks @shzhngPLACEMENT events could arrive lateload_all_async ignoring time-based filters (#3475), thanks @Coyote-DenCommodity, IndexInstrument, and Cfd instruments in RustLiveNode (#3401), thanks @filipmacekts_init normalization option to convert_stream_to_data (#3433), thanks @faysoulistenKeyExpired event handling (#3387), thanks @JohnkhkinstIdCode support for WebSocket order operations (#3536), thanks @Add1ct1velog crate (external tracing available via use_tracing config)OrderEventEmitter in Rust (#3469), thanks @filipmacekinstrument_greeks (#3587), thanks @faysouTearsheetConfig.charts to chart objects (removed chart_args) (#3398), thanks @KaulSerfo as primary keycancel_all_orders to include inflight ordersBTreeMap for storage (#3392), thanks @faysouts_init monotonicity enforcement in convert_stream_to_data (#3600), thanks @faysouOptionExerciseModule logging and fix cache reference (#3388), thanks @davidsblomGridMarketMaker strategy and dYdX cancel handling (#3601), thanks @filipmacekDecimal deserialization (#3510), thanks @filipmacekskip_first_non_full_bar in TimeBarAggregator (#3395), thanks @faysouOptionExerciseModule (#3423), thanks @faysouis_spread() method (#3434), thanks @faysouOrderBookDeltas.batch (#3437), thanks @faysouPrice::from_decimal with integer arithmeticQuantity::from_decimal with integer arithmeticMoney::from_decimal with integer arithmeticSmallVec buffers in Rustibapi 10.43 (#3427, #3595), thanks @faysoudatabento crate to v0.41.0datafusion crate to v52.1.0pyo3 crate to v0.28.2pyo3-async-runtimes crate to v0.28.0redis crate to v1.0.4tokio crate to v1.49.0customer_order_ref truncation (first 32 characters); the adapter now uses last 32 characters for better entropy. Legacy truncation support during startup reconciliation will be removed in a future version.key_type config field; key type is now auto-detected (only needed if explicitly using RSA keys)testnet config field; use environment=BinanceEnvironment.TESTNET insteadBINANCE_ED25519_* and BINANCE_*_ED25519_* environment variables; migrate to the standard BINANCE_API_KEY/BINANCE_API_SECRET variablesReleased on 1st January 2026 (UTC).
This release adds support for Python 3.14 with the following limitations:
[dydx]) unavailable due to upstream coincurve compatibility (available on Python 3.12-3.13)[ib]) unavailable due to upstream nautilus-ibapi compatibility (available on Python 3.12-3.13)capnp) serialization for efficient zero-copy data interchange (opt-in via capnp feature flag in nautilus-serialization crate)liquidity_consumption config option to track per-level consumption and prevent overfilling displayed book liquidity (default False to retain current behavior)liquidity_consumption=True and trade_execution=True) to prevent multiple orders matching the same trade tick from collectively overfillingbars_with_fills chart (#3329), thanks @faysouQuantity.from_decimal constructor (#3189), thanks @faysouPrice.from_decimal constructorMoney.from_decimal constructorcreate_bars_with_fills to Tearsheet (#3137), thanks @faysouproxy_url support for HTTP clientsCAGR portfolio statisticCalmarRatio portfolio statisticMaxDrawdown portfolio statisticquote_quantity parameter for close_position(...) and close_all_positions(...) strategy methodsTICK_IMBALANCE, TICK_RUNS, VOLUME_IMBALANCE, VOLUME_RUNS, VALUE_IMBALANCE, VALUE_RUNS (#3217), thanks @nicoladParquetDataCatalog.query_first_timestamp (#3253), thanks @MK27MKPolymarketDataLoader for loading historical data with docs and exampleAccountStateBinanceInstrumentProviderConfig to support the query_commission_rates config optionauto_repay_spot_borrows config optionBybitMarginAction) for strategy-controlled borrow/repay via query_accountbook_snapshot_output config option for tardis machine replays (default deltas to retain current behavior)allow_overfills config option to ExecEngineConfig (default False) to handle order fills exceeding order quantity with warning instead of raisingoverfill_qty field to orders for tracking fill quantities exceeding original order quantityPositionAdjusted events for tracking quantity/PnL changes outside normal order fills (base currency commissions, funding payments, manual adjustments)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); this inadvertently broke demo trading since Bybit demo does not support WebSocket Trade API
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
osv-scanner for Python dependency vulnerability scanning in pre-commitcargo-vet for Rust supply chain security auditing#![deny(unsafe_op_in_unsafe_fn)] lintActorRef guards and runtime borrow trackinguint64_t truncation bug in determine_trade_fill_qty for trade execution with high-precision modeL1_MBP modeBacktestResult.total_positions to match tearsheet count (#3148), thanks for reporting @2-5ExecAlgorithm (#3122), thanks for reporting @kirill-gr1GreeksCalculator handling of missing price data (#3116), thanks for reporting @q351941406StreamingFeatherWriter _setup_streaming with replace_existing config (#3234), thanks @cautaon_instrument callback in request flow for Python adapters (#3323), thanks @filipmacekuse_instance_idtimestamp_on_close configBybitHttpClient type stub pyi signatures (#3238), thanks @sunleicmbp-1, cbbo-1s, cbbo-1m) in quote requestsPRICE_UNDEF appears with non-zero precisionPRICE_UNDEF (#3183), thanks for reporting @marloncalvoIBContractDetails (#3181), thanks @faysourequest_bars pagination halting prematurely in Range mode (#3145), thanks for reporting @3wtzrequest_bars pagination using correct backwards API semantics (#3145), thanks for reporting @3wtzallow_overfills execution engine config option (#3221), thanks for reporting @Javdu10match_time timestamp parsing (#3273), thanks for reporting @santivazqPoolProfiler simulation (#3186), thanks @filipmacekLatencyModel to trait with StaticLatencyModel impl (#3369), thanks @marcus-sahttp, socket, and websocketSpreadQuoteAggregator (#3312), thanks @faysouHistoricInteractiveBrokersClient (#3261), thanks @faysoutrade_execution=True mode, ensuring limit orders fill correctly when trades occur at the limit priceNone handling in equality and comparison methodsActor.request_bars to enforce standard bar types (#3216), thanks @faysouHistoricInteractiveBrokersClient (#3187), thanks @faysouBacktestDataIterator docstrings (#3264), thanks @faysouBacktestDataConfig.query (#3266), thanks @faysouUstr usageTCP_NODELAY (#3156), thanks @sunleiAccountPosition message parsing (#3147), thanks @sunleiget_account_details (#3219), thanks @sunleiset_position_mode (#3220), thanks @sunleidatabento crate to v0.37.0datafusion crate to v51.0.0msgspec to v0.20.0pyo3 crate to v0.27.2pyo3-async-runtimes crate to v0.27.0redis crate to v1.0.2bars_with_fills tearsheet featureNone
Released on 26th October 2025 (UTC).
This will be the final release with support for Python 3.11.
OrderBookDepth10 requests (#2955), thanks @faysousubscribe_order_fills(...) and unsubscribe_order_fills(...) for Actor allowing to subscribe to all fills for an instrument IDon_order_filled(...) for Actortime_range_generator for on-the-fly data data subscriptions (#2952), thanks @faysou__repr__ to NewsEvent (#2958), thanks @MK27MKconvert_quote_qty_to_base config option to ExecEngineConfig (default True to retain current behavior) allows adapters to keep quote-denominated sizes when neededparent_order_id and linked_order_ids for OrderStatusReport and reconciliationfs_rust_storage_options to Python catalog (#3008), thanks @faysou and @Johnkhkprice_match parameter support for order submissionrecv_window_ms for signed HTTP request expirationuse_spot_position_reports config option for BybitExecClientConfigignore_uncached_instrument_executions config option for BybitExecClientConfig (default False to retain current behavior)generate_fill_reports implementation (#2989), thanks @faysouparams using td_mode keynautilus_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)nautilus-cli crate feature flag from hypersync to defi (gates blockchain/DeFi commands)quote_quantity=TruePosition.purge_events_for_order to properly rebuild state from remaining order fillslot_size where it was not being passed throughserialization crate bugs and improve error handling"interpreter not initialized" panics during shutdownRiskEngine reduce-only cash exits (#2986), thanks for reporting @dennisnissleRiskEngine quote quantity validationBacktestEngine to retain instruments on reset (#3096), thanks for reporting @woung717NautilusKernel build time calculation due to negative duration (#2998), thanks for reporting @HaakonFlaaronningregister_currency() helperon_load called before strategy added bug (#2953), thanks @lisiyuan656isfile and isdir (#2954), thanks @limx0ParquetDataCatalog.from_uri to support Windows paths (#3283), thanks @nikitiumSandboxExecutionClient instrument data handlingAccountState Arrow serialization (#3005), thanks for reporting @nikzaselCryptoOption Arrow schema option_kind field to accept string valuesFuturesSpread Arrow schema missing max/min quantity and price fieldsOptionSpread Arrow schema missing max/min quantity and price fieldsCommodity Arrow schema to match from_dict requirementsArrowSerializer.deserialize (#3076), thanks @MK27MKPool profiling (#3100), thanks @filipmacekOrderSubmitted event generation for order lists (#2994), thanks @sunleiprice_match order price synchronization (#3074)OrderModifyRejected events from pending updatesClear actions and improve docsTypeError when load_ids/contracts are None, thanks for reporting @FGU1tick_sz across instrument typesmultiplier fieldneg_risk order parameter handlinglot_size mappingfilter_sec_types config to skip unsupported IB instrument types (#3108), thanks @sunleiPortfolioAnalyzer and all portfolio statistics to RustPoolFlash event in blockchain adapter (#3055, #3058), thanks @filipmacekInstrumentProvider / definitions parsing (#2992), thanks @nicoladSymbol, Currency, and InstrumentId string validation from ASCII to UTF-8, fixing Binance compatibility with Chinese symbolsPositionId validation check from ASCII to UTF-8, fixing Binance compatibility with Chinese symbols (#3105), thanks @OsubActorExecutor lifecycle and concurrency handlingNoOrderSide deltasnode_test script (#3092), thanks @filipmacekMoney.from_str to ensure no rounding errorsreset_data_file_names method (#3071), thanks @adrianbeer and @faysouExecutionEngine hot path with topic caching and reduced cache lookupsdatabento crate to v0.35.0datafusion crate to v50.3.0pyo3 and pyo3-async-runtimes crates to v0.26.0redis crate to v0.32.7tokio crate to v1.48.0uvloop to v0.22.1 (upgrades libuv to v1.49.0)convert_quote_qty_to_base; disable (False) to maintain consistent behaviour going forwards. Automatic conversion will be removed in a future version.Released on 9th September 2025 (UTC).
FundingRateUpdate data type with caching support through data enginesubscribe_funding_rates(...) and unsubscribe_funding_rates(...) methods for actorson_funding_rate(...) handler for actorsfunding_rate(...) and add_funding_rate(...) for Cachedue_post_only field for OrderRejected event, only properly populated for Binance and Bybit for nowlog_rejected_due_post_only_as_warning config option for StrategyConfig (default True to retain current behavior)log_rejected_due_post_only_as_warning config option for BinanceExecClientConfig (default True to retain current behavior)log_components_only config option for Logger (#2931), thanks @faysouCMBP_1, CBBO_1S, CBBO_1M, TCBBO, and OHLCV_EODTBBO/TCBBO for efficient combined data feedsrequest_instruments for Interactive Brokers (#2809), thanks @faysouOptionExerciseModule (#2907), thanks @faysouMarginModel concept, base models, config, and factory for backtesting (#2794), thanks @faysou and @stefansimikOrderBookDepth10DataWrangler (#2801), thanks @trylovetomgroup_size parameter for PyO3 OrderBook.pprint(...) and OwnOrderBook.pprint(...)RetryManageris_leverage order parameter supportpersist_account_events config option for CacheConfig (default True to retain current behavior)query_account method for StrategyQueryAccount execution messageTardisCSVDataLoaderBacktestEngine low-level streaming APIYEAR aggregation and improved bar specification validation (#2771), thanks @stastnypremysluse_hyphens_in_client_order_ids config option for StrategyConfiggreeks_filter function to portfolio_greeks (#2756), thanks @faysouGreeksCalculator (#2817), thanks @faysouVERBOSE option to common make targets (#2759), thanks @faysoumultiplier field for CurrencyPair instrument (required for some crypto pairs)tick_scheme_name field for instrument dictionary conversionsFixedTickScheme(s) for all valid precisionsPortfolioConfig.min_account_state_logging_interval_ms config option for throttling account state loggingallow_cash_borrowing config option for BacktestVenueConfig to enable negative balances in cash accounts.env.example template to guide environment configuration (#2877), thanks @nicoladavg_px_open field to PositionStatusReport for IB adapter (#2925), thanks @dinanamultiplier field for CurrencyPair Arrow schemastart parameter to required for Actor data request methodsdelete_account_event from cache database that was too inefficient and is now a no-op pending redesignParquetDataCatalog.reset_catalog_file_names to reset_all_file_namesBinanceAccountType.USDT_FUTURE to USDT_FUTURES for more conventional terminologyBinanceAccountType.COIN_FUTURE to COIN_FUTURES for more conventional terminologyInstrumentMiniInfo to TardisInstrumentMiniInfo to standardize adapter naming conventionscvec_drop FFI function, as it was unused and prone to misuse, potentially causing memory leaksmanaged parameter for Actor.subscribe_book_at_interval (the book must be managed by the DataEngine to provide snapshots at intervals)OwnBook group_bids and group_asks methods into bid_quantity and ask_quantity with optional depth and group_size parametersbacktest.exchange into backtest.engine to reduce binary sizebacktest.matching_engine into backtest.engine to reduce binary sizefrom nautilus_trader.indicators.atr import AverageTrueRange becomes from nautilus_trader.indicators import AverageTrueRange)NAUTILUS_CATALOG_PATH to NAUTILUS_PATH for Tardis adapter (#2850), thanks @nicoladIndicator base class from nautilus_trader.indicators.base.indicator to nautilus_trader.indicators.baseBacktestDataIterator (#2791) to consolidate data generator usage, thanks @faysouLogGuard reference counting for proper thread lifecycle management, ensuring all logs flushed before terminationSharedCell / WeakCell wrappers for ergonomic and safer handling of Rc<RefCell<T>> / Weak<RefCell<T>> pairsnautilus-cli (#2861), thanks @filipmacekBacktestDataIteratorDataTester standardized data testing actor for integration adaptersstart and stop to response data (#2748), thanks @stastnypremyslrequest_instrument (#2835), thanks @faysou_send_position_status_report to base execution client (#2926), thanks @faysoupassthrough_bar_type to TimeBarAggregator (#2929), thanks @faysoulast_qty is non-positive (#2930), thanks @GhostLeeavg_px population in order filled events for Interactive Brokers adapter (#2938), thanks @dinanaExecutionEngine and testing in Rust (#2886), thanks @dakshbtcpytest-xdist (#2808), thanks @stastnypremyslInstrumentId (#2826), thanks @filipmacekNAUTILUS_PATH env var across Tardis integration (#2850), thanks @nicoladSpreadQuoteAggregator (#2905), thanks @faysouts_init instead of ts_event (#2924), thanks @faysuoDexType and add validation (#2827), thanks @filipmacekINTERNAL-DIFF strategy ID)databento_test_request_bars example (#2762), thanks @faysouTardisInstrumentProvider datetime filter params (can be either pd.Timestamp or Unix nanos int)Credential struct (#2882), thanks @nicoladendDate (#2919), thanks @DeirhXGreeksCalculator (#2760), thanks @faysouBacktestDataConfig (#2838), thanks @faysouFillModel (#2795), thanks @faysou and @stefansimiksubscribe_bars in IB adapter (#2852), thanks @faysouget_start_time in TimeBarAggregator (#2866), thanks @faysousubscribe_historical_bars in IB adapter (#2870), thanks @faysoustart and end of instrument requests in adapters (#2867), thanks @faysourequest_aggregated_bars example (#2815), thanks @faysouweb3 for Polymarket allowances script (#2814), thanks @DeirhXdatabento crate to v0.33.1datafusion crate to v49.0.1redis crate to v0.32.5tokio crate to v1.47.1Arc<PyObject> with plain PyObject in callback-holding structs, eliminating memory leaksTimeEventHandler memory leaks with Python callback references in FFI layerPyCapsule memory leaks by adding destructors to enable proper Rust value cleanupSharedCell/WeakCell helpersPrice, Quantity, Money)cryptofacilities)skip_first_non_full_bar tolerance for near-boundary starts (#2605), thanks for reporting @stastnypremyslexecFee field was not used when available as well as incorrect fee currencyvenue_order_id handling for Polymarket order status request (#2848), thanks @DeirhXInteractiveBrokersDataClient._disconnect() (#2865), thanks @ruvrAttributeError when loading cached IBContract objects (#2862), thanks @ruvrPolymarketUserTrade.bucket_index field type that changed from str to int (#2872), thanks for reporting @thefabussubmit_order_list rejection (#2892), thanks @faysoufunding_rates for Cache Debug impl (#2894), thanks @MK27MKlog_component_levels for PyO3 logging initializationtesting.md (#2928), thanks @faysouNone
Released on 5th July 2025 (UTC).
graceful_shutdown_on_exception config option for live engines (default False to retain intended hard crash on unexpected system exceptions)purge_from_database config option for LiveExecEngineConfig to support cache backing database managementfire_immediately flag parameter for timers where a time event will be fired at the start instant and then every interval thereafter (default False to retain current behavior) (#2600), thanks for the idea @stastnypremysltime_bars_build_delay config option for DataEngineConfig (#2676), thanks @faysousubscribe_order_book_deltas support for IBKR (#2749), thanks @sunleibid_levels and ask_levels for OrderBook.pprintaccepted_buffer_ns filter param for Cache.own_bid_orders(...) and Cache.own_ask_orders(...)activation_price support in Rust (#2750), thanks @nicoladallow_past=False behavior: now validates the next_event_time instead of the start_time. This allows timers with past start times as long as their next scheduled event is still in the futureallow_past=False to permit start times in the past if the next event time is still in the futurebasename_template from ParquetDataCatalog.write_data(...), run catalog.reset_all_file_names() to update file names to the new conventionPrice, Quantity, Money value types in RustUnixNanos in RustOrderBook in RustTestTimer in Rustnetwork crate in Rustturmoil for socket clients in Rustcheck_positive_decimal correctness function and use for instrument validations (#2736), thanks @nicoladcheck_positive_money correctness function and use for instrument validations (#2738), thanks @nicoladTardisCSVDataLoader performance (~90% memory usage reduction, ~60-70% faster)aws-lc-rs cryptography for FIPS complianceFrom<Pool> -> CurrencyPair & InstrumentAny (#2693), thanks @nicoladMakefile to use new docker compose syntax (#2746), thanks @stastnypremyslCurrency equality to use strcmp to avoid C pointer comparison issues with ustr string interningMakefile to be self-documenting (#2741), thanks @sunleidatabento crate to v0.28.0datafusion crate to v48.0.0pyo3 and pyo3-async-runtimes crates to v0.25.1redis crate to v0.32.3tokio crate to v1.46.1tokio-tungstenite crate to v0.27.0AccountBalance mutation in AccountState events (#2701), thanks for reporting @DeirhXvenue_order_id was unboundedLiveDataClientgenerate_order_modify_rejected typo in Binance execution client (#2682), thanks for reporting @etienneparIndexError with empty bars requests for BinanceBinanceBarBinanceBar, thanks for reporting @miller-mooreclean and distclean make targets entering .venv and corrupting the Python virtual env, thanks @faysouexchange value for Databento US equitiesBinance, thanks @petioptrvPortfolio.set_specific_venue(...), to be removed in a future release; use Cache.set_specific_venue(...) insteadReleased on 31st May 2025 (UTC).
FillModel, LatencyModel and FeeModel in BacktestNode (#2601), thanks @faysourequest_aggregated_bars (#2649), thanks @faysouBacktestDataIterator to backtest engine to provide on-the-fly data loading (#2545), thanks @faysouMarkPriceUpdate streaming from catalog (#2582), thanks @bartolootritbars_timestamp_on_close config option for Databento which defaults to True to consistently align with Nautilus conventionsactivation_price support for trailing stop orders (#2610), thanks @hope2seeraise_exception config option for BacktestRunConfig (default False to retain current behavior) which will raise exceptions to interrupt a nodes run processUnixNanos::is_zero() convenience method to check for a zero/epoch valueOrderCancelRejectedOrderModifyRejectedactivation_price rather than trigger_price for Binance to more closely match the Binance API conventionsactivation_price str and repr tests for trailing stop orders (#2620), thanks @hope2seecontingency_type and linked_order_ids where a contingency should have associated linked order IDstracing onlyL1_MBP books, will now fill entire size when marketable as TAKER or market moves through limit as MAKERLimitOrder in Rust (#2613), thanks @nicoladLimitIfTouchedOrder in Rust (#2533), thanks @nicoladMarketIfTouchedOrder in Rust (#2577), thanks @nicoladMarketToLimitOrder in Rust (#2584), thanks @nicoladStopLimitOrder in Rust (#2593), thanks @nicoladStopMarketOrder in Rust (#2596), thanks @nicoladTrailingStopMarketOrder in Rust (#2607), thanks @nicoladAdaptiveMovingAverage (AMA) (#2626), thanks @nicoladDoubleExponentialMovingAverage (DEMA) (#2633), thanks @nicoladExponentialMovingAverage (EMA) (#2642), thanks @nicoladHullMovingAverage (HMA) (#2648), thanks @nicoladLinearRegression (#2651), thanks @nicoladWilderMovingAverage (RMA) (#2653), thanks @nicoladVariableIndexDynamicAverage (VIDYA) (#2659), thanks @nicoladSimpleMovingAverage (SMA) (#2655), thanks @nicoladVolumeWeightedAveragePrice (VWAP) (#2661), thanks @nicoladWeightedMovingAverage (WMA) (#2662), thanks @nicoladArcherMovingAveragesTrends (AMAT) (#2669), thanks @nicoladNone condition checks for value types, which now raise a TypeError instead of an obscure AttributeErrorVecDeque for fixed-capacity ArrayDeque in SMA indicator (#2666), thanks @nicoladVecDeque for fixed-capacity ArrayDeque in LinearRegression (#2667), thanks @nicolad_subscribe_instrument for dYdX and Bybit (#2636), thanks @davidsblomratelimiter quota from python flag (#2595), thanks @twituBacktestDataIterator correctness (#2591), thanks @faysoudatabento crate to v0.26.0datafusion crate to v48.0.2redis crate to v0.31.0sqlx crate to v0.8.6tokio crate to v1.45.1OrderExpired events not updating state (margin requirements may change)ExecutionEngine so it fully updates the Portfolio before to publishing execution events (#2513), thanks for reporting @stastnypremyslExecutionEngineSystemError calling copy.deepcopy() by simply using a pickle round trip to copy the position instanceNO_AGGRESSOR (we can still update the matching core)AccountError when streaming, the exception needed to be reraised to interrupt the streaming of chunks (#2546), thanks for reporting @stastnypremyslreduce_only attribute access in batch place order for BybitMAKER liquidity side on PolymarketBinaryOption on Polymarket to consistently use USDC.e (PoS USDC on Polygon)BinanceFuturesEventType enum with additional variants, thanks for reporting @miller-mooreReleased on 30th April 2025 (UTC).
OrderBookDepth10 for BacktestEngine and OrderMatchingEngine (#2542), thanks @limx0Actor.subscribe_order_book_depth(...) subscription method (#2555), thanks @limx0Actor.unsubscribe_order_book_depth(...) subscription methodActor.on_order_book_depth(...) handler method (#2555), thanks @limx0UnixNanos::max() convenience method for the maximum valid valueavailable_offset filter parameter for TardisInstrumentProviderNAUTILUS_WORKER_THREADS environment variable for common tokio runtime builderQuantity::non_zero(...) methodQuantity::non_zero_checked(...) methodround_down param for Instrument.make_qty(...) that is False by default to maintain current behaviorChain struct to represent blockchain network (#2526), thanks @filipmacekBlock primitive for blockchain domain model (#2535), thanks @filipmacekTransaction primitive for blockchain domain model (#2551), thanks @filipmacekCASH accountsMARGIN accountsid constructor parameter to instrument_id across all PyO3 instruments, aligning with equivalent Cython instrument constructorsRetryManager (#2518), thanks @davidsblomTardisInstrumentProviderExecutionEngineclear_log_file to happen for each kernel initialization (#2569), thanks @faysouPrice and Quantity validations and correctnessdatabento crate to v0.24.0datafusion crate to v47.0.0redis crate to v0.30.0sqlx crate to v0.8.5pyo3 crate to v0.24.2RetryManager by simplifying the acquire-release pattern, avoiding the asynchronous context manager protocol that led to state sharing, thanks for reporting @DeevsDeevsTypeError when formatting backtest post run timestamps which were None (#2514), thanks for reporting @stastnypremyslBetfairSequenceCompleted as custom dataIndexInstrument, changing to SPOT to correctly represent a spot index of underlying constituentsend handling for DataEngineDataEnginets_init for databento historical data (#2566), thanks @faysouRequestInstrument in query_catalog (#2567), thanks @faysouExecutionEngine docstringsNone
Released on 13th April 2025 (UTC).
This release adds support for Python 3.13 (not yet compatible with free-threading), and introduces support for Linux on ARM64 architecture.
allow_past boolean flag for Clock.set_timer(...) to control behavior with start times in the past (default True to allow start times in the past)allow_past boolean flag for Clock.set_time_alert(...) to control behavior with alert times in the past (default True to fire immediate alert)max_file_size and max_backup_count (#2468), thanks @xingyanan and @twitubars_timestamp_on_close config option for BybitDataClientConfig (default True to match Nautilus conventions)BetfairSequenceCompleted custom data type for Betfair to mark the completion of a sequence of messagesMarkPriceUpdate in RustIndexPriceUpdate in RustInstrumentClose in RustBookLevel.side propertyPosition.closing_order_side() instance methodLiveExecutionEngine, once exceeded query retries will resolve submitted orders as rejected and pending orders as canceledBacktestNode crashes with full stack trace and prettier config loggingts_event timestamping from on open to on close for BybitGreeksCalculator to Rust (#2493, #2496), thanks @faysouredis crate to v0.29.5tokio crate to v1.44.2SymbolFilterType enum member for Binance (#2495), thanks @sunleits_event for Bybit bars (#2502), thanks @davidsblomNone
Released on 5th April 2025 (UTC).
Cache.purge_closed_order(...)Cache.purge_closed_orders(...)Cache.purge_closed_position(...)Cache.purge_closed_positions(...)Cache.purge_account_events(...)Account.purge_account_events(...)purge_closed_orders_interval_mins config option for LiveExecEngineConfigpurge_closed_orders_buffer_mins config option for LiveExecEngineConfigpurge_closed_positions_interval_mins config option for LiveExecEngineConfigpurge_closed_positions_buffer_mins config option for LiveExecEngineConfigpurge_account_events_interval_mins config option for LiveExecEngineConfigpurge_account_events_lookback_mins config option for LiveExecEngineConfigOrder.ts_closed propertyinstrument_ids and bar_types for BacktestDataConfig to improve catalog query efficiency (#2478), thanks @faysouvenue_dataset_map config option for DatabentoDataConfig to override the default dataset used for a venue (#2483, #2485), thanks @faysouNone
Position.purge_events_for_order(...) for purging OrderFilled events and TradeIds associated with a client order IDConsumer for WebSocketClient (#2488), thanks @twitueffective timestamp filtering, settlement currency, increments and fees changesupdate_account_state task by logging the full stack trace on erroruse_exchange_as_venue (#2487), thanks @faysoupyo3 crate to v0.24.1PolymarketTickSizeChanged messagesize_increment was zero, now inferred from base currencyema_cross_cython strategy exampleReleased on 28th March 2025 (UTC).
time_in_force parameter for Strategy.close_position(...)time_in_force parameter for Strategy.close_all_positions(...)MarkPriceUpdate data typeIndexPriceUpdate data typeActor.subscribe_mark_prices(...)Actor.subscribe_index_prices(...)Actor.unsubscribe_mark_prices(...)Actor.unsubscribe_index_prices(...)Actor.on_mark_price(...)Actor.on_index_price(...)Cache.mark_price(...)Cache.index_price(...)Cache.mark_prices(...)Cache.index_prices(...)Cache.mark_price_count(...)Cache.index_price_count(...)Cache.has_mark_prices(...)Cache.has_index_prices(...)UnixNanos.to_rfc3339() for ISO 8601 (RFC 3339) stringsrecv_window_ms config for Bybit WebSocket order client (#2466), thanks @sunleiUnixNanos string parsing to support YYYY-MM-DD date format (interpreted as midnight UTC)Cache.add_mark_price(self, InstrumentId instrument_id, Price price) to add_mark_price(self, MarkPriceUpdate mark_price)WebSocketClient and SocketClient design with dedicated writer task and message channelanyhow::bail (#2459), thanks @faysouadd_venue for BacktestEngine in Rust (#2457), thanks @filipmacekadd_instrument for BacktestEngine in Rust (#2469), thanks @filipmacekredis crate to v0.29.2WebSocketClient and SocketClientts_snapshot value, which was always ts_last instead of timestamp when the snapshot was takeneffectiveOrderStatusReport for conditional orders of dYdX (#2467), thanks @davidsblomDecodeError for dYdX (#2472), thanks @davidsblomLIMIT_IF_TOUCHED order type enum parsing for BybitMARKET order type enum parsing for BybitNone
Released on 16th March 2025 (UTC).
CryptoOption instrument, supporting inverse and fractional sizesCache.prices(...) to return a map of latest price per instrument for a price typeuse_uuid_client_order_ids config option for StrategyConfigCurrency constantmargin_mode and position_mode config options for Bybit (#2441), thanks @sunleiNone
timeout_secs parameter to HttpClient for default timeoutsOrderMatchingEngineu64 and UnixNanosInstrumentProvider error handling when loading (#2444), thanks @davidsblompyo3 and pyo3-async-runtimes crates to v0.24.0tokio crate to v1.44.1Clock.timer_names() memory issue resulting in an empty listStrategy custom strategy_idsData (#2450), thanks @stefansimikNone
Released on 11th March 2025 (UTC).
This release introduces uv as the Python project and dependency management tool.
OwnOrderBook and OwnBookOrder to track own orders and prevent self-trades in market makingmanage_own_order_books config option for ExecEngineConfig to enable own order trackingCache.own_order_book(...), Cache.own_bid_orders(...) and Cache.own_ask_orders(...) for own order trackingTardisCSVDataLoader, where price_precision and size_precision are now optionalOrder.ts_accepted propertyOrder.ts_submitted propertyUnixNanos::to_datetime_utc() in RustMark variant for PriceType enumCacheCachePortfolioConfig for configuration settings specific to the Portfoliouse_mark_prices, use_mark_xrates and convert_to_account_base_currency options for PortfolioConfigPortfolioBarSpecification to msgspec encoding and decoding hooks (#2373), thanks @pierianeagleignore_external_orders config option for BetfairExecClientConfig, default False to retain current behaviorExchangeRateCalculator, replaced with get_exchange_rate(...) function implemented in RustForexSession enum with equivalent from PyO3ForexSessionFilter with equivalent functions from PyO3InterestRateData to YieldCurveDataCache.add_interest_rate_curve to add_yield_curveCache.interest_rate_curve to yield_curveOrderBook.count to update_count for clarityExecEngineConfig.portfolio_bar_updates config option to PortfolioConfig.bar_updatesCache benchmarking for orders (#2341), thanks @filipmacekCARGO_BUILD_TARGET environment variable in build.py (#2385), thanks @sunleioms_type for StrategyConfig which now correctly handles the OmsType enumOrderList to check all orders are for the same instrument IDController functionality with ability to create actors and strategies from configs (#2322), thanks @faysouController creation for more streamlined trader registration, and separate clock for timer namespacing (#2357), thanks @faysouOrderMatchingEngine between Cython and Rust and fix issues (#2350), thanks @filipmacek_handle_query_group to work with update_catalog (#2412), thanks @faysourequest_instruments granularity for Databento (#2347), thanks @faysoubase_template behaviour in parquet write_data (#2389), thanks @faysounext_back instead of last for identifier tag functions (#2414), thanks @twituOrderBook in RustStreamingFeatherWriter to Rust (#2292), thanks @twituupdate_limit_order for OrderMatchingEngine in Rust (#2301), thanks @filipmacekupdate_stop_market_order for OrderMatchingEngine in Rust (#2310), thanks @filipmacekupdate_stop_limit_order for OrderMatchingEngine in Rust (#2314), thanks @filipmacekOrderMatchingEngine in Rust (#2329), thanks @filipmacekOrderMatchingEngine in Rust (#2333), thanks @filipmacekOrderMatchingEngine in Rust (#2354), thanks @filipmacekOrderMatchingEngine in Rust (#2366, #2376), thanks @filipmacekOrderMatchingEngine in Rust (#2404), thanks @filipmacekpublishers.json mappings file(s)nautilus-ibapi to 10.30.1 with necessary changes for Interactive Brokers (#2420), thanks @FGU1arrow and parquet crates to v54.2.1databento crate to v0.20.0 (upgrades the dbn crate to v0.28.0)datafusion crate to v46.0.0pyo3 crate to v0.23.5tokio crate to v1.44.0Data enum variants (#2315), thanks @twitustart and end range filtering for TardisHttpClient to use API query paramsStreamingFeatherWriter, thanks for reporting @netomenociTardisCSVDataLoadereffective timestamp filtering for TardisHttpClient to now only retain latest version at or before effectiveactivation for Binance Futures, now based on the onboardDate fieldPolymarketExecutionClient_request_instrument signature (#2332), thanks @faysoubypass_logging fixture to keep log guard alive for entire test sessionts_init value in IB weekly and monthly bar (#2355), thanks @Endura2024update_bar aggregation function to guarantee high and low price invariants (#2430), thanks @hjander and @faysouemulation_trigger parameter description in docstrings (#2313), thanks @stefansimikNone
Released on 9th February 2025 (UTC).
This release introduces high-precision mode,
where value types such as Price, Quantity and Money are now backed by 128-bit integers (instead of 64-bit),
thereby increasing maximum precision to 16, and vastly expanding the allowable value ranges.
This will address precision and value range issues experienced by some crypto users, alleviate higher timeframe bar volume limitations, as well as future proofing the platform.
See the RFC for more details. For an explanation on compiling with or without high-precision mode, see the precision-mode section of the installation guide.
For migrating data catalogs due to the breaking changes, see the data migrations guide.
This release will be the final version that uses Poetry for package and dependency management.
high-precision mode for 128-bit integer backed value types (#2072), thanks @twituTardisHttpClient with optional start and end filter parametersquote_currency, base_currency, instrument_type, contract_type, active, start and end filters for TardisInstrumentProviderlog_commands config option for ActorConfig, StrategyConfig, ExecAlgorithmConfig for more efficient log filteringBettingInstrument constructorvenue_position_id parameter for OrderStatusReportPortfolio PnLs (#2239), thanks @faysouparams for Strategy order management methods (symmetry with Actor data methods) (#2251), thanks @faysoutimeout_shutdown config option for NautilusKernelConfigmin_market_start_time and max_market_start_time time range filtering for BetfairInstrumentProviderConfigdefault_min_notional config option for BetfairInstrumentProviderConfigstream_conflate_ms config option for BetfairDataClientConfigrecv_window_ms config option for BybitDataClientConfig and BybitExecClientConfigopen_check_open_only config option for LiveExecEngineConfigBetSide enum (to support Bet and BetPosition)Bet and BetPosition for betting market risk and PnL calculationstotal_pnl and total_pnls methods for Portfolioprice parameter for Portfolio unrealized PnL and net exposure methodsOptionsContract instrument to OptionContract for more technically correct terminology (singular)OptionsSpread instrument to OptionSpread for more technically correct terminology (singular)options_contract modules to option_contract (see above)options_spread modules to option_spread (see above)InstrumentClass.FUTURE_SPREAD to InstrumentClass.FUTURES_SPREAD for more technically correct terminologyevent_logging config option to log_eventsBetfairExecClientConfig.request_account_state_period to request_account_state_secsschemas/sql (reinstall the Nautilus CLI with make install-cli)OrderBookDelta Arrow schema to use FixedSizeBinary fields to support the new precision modesOrderBookDepth10 Arrow schema to use FixedSizeBinary fields to support the new precision modesQuoteTick Arrow schema to use FixedSizeBinary fields to support the new precision modesTradeTick Arrow schema to use FixedSizeBinary fields to support the new precision modesBar Arrow schema to use FixedSizeBinary fields to support the new precision modesBettingInstrument default min_notional to Nonews_connection_delay_secs for PolymarketDataClientConfig to be non-initial delay (#2271), thanks @ryantam626GATEIO Tardis venue to GATE_IO for consistency with CRYPTO_COM and BLOCKCHAIN_COMmax_ws_reconnection_tries for dYdX configs (no longer applicable with infinite retries and exponential backoff)max_ws_reconnection_tries for Bybit configs (no longer applicable with infinite retries and exponential backoff)max_ws_reconnection_tries for Bybit configs (#2290), thanks @sunleiThrottledEnqueuer for more efficient and robust live engines queue management and loggingOrderBookDeltaTestBuilder in Rust to improve testing (#2234), thanks @filipmacekSocketClient TLScheck_nonempty_string for string validation in RustWebSocketClient with state management, error handling, timeouts and robust reconnects with exponential backoffSocketClient with state management, error handling, timeouts and robust reconnects with exponential backoffTradingNode shutdown when running with asyncio.run() (more orderly handling of event loop)NautilusKernel pending tasks cancellation on shutdownTardisHttpClient requests and error handlingclean make target behavior and added distclean make target (#2286), @demonkoryuCurrency name to accept non-ASCII characters (common for foreign currencies)PerContractFeeModel (#2282), thanks @stefansimikmold as the linker in CI (#2254), thanks @sunleiOrderMatchingEngine in Rust (#2202), thanks @filipmacekOrderMatchingEngine in Rust (#2212), thanks @filipmacekOrderMatchingEngine in Rust (#2225), thanks @filipmacekCancelOrder processing for OrderMatchingEngine in Rust (#2231), thanks @filipmacekCancelAllOrders processing for OrderMatchingEngine in Rust (#2253), thanks @filipmacekBatchCancelOrders processing for OrderMatchingEngine in Rust (#2256), thanks @filipmacekOrderMatchingEngine in Rust (#2259), thanks @filipmacekOrderMatchingEngine in Rust (#2261), thanks @filipmacekSimulatedExchange in Rust (#2272), thanks @filipmacekRiskEngine to Rust (#2210), thanks @Pushkarm029ExecutionEngine to Rust (#2214), thanks @Pushkarm029OrderEmulator to Rust (#2219, #2226), thanks @Pushkarm029model crate stubs into defaults (#2235), thanks @fhill2pyo3 crate to v0.23.4pyo3-async-runtimes crate to v0.23.0LiveTimer immediate fire when start time zero (#2270), thanks for reporting @bartolootritaction vs size)PortfolioPortfolioCustomData import in DataEngine (#2207), thanks @graceyangfan and @faysouvenue_position_id (when provided), thanks for reporting @sdk451InstrumentProvider initialization behavior when reload flag True, thanks @ryantam626msgspec.DecodeError)CARGO_TARGET_DIR environment variable for build script (#2228), thanks @sunleidelta.rs doc comment (#2230), thanks @eltocieargil-refs feature (#2229), thanks for reporting @davidsblominstrument.id null dereferences in error logs (#2237), thanks for reporting @ryantam626Portfolio where flat positions were not included in cumulative sum (#2243), thanks @faysouCache for Rust (#2248), thanks @filipmacekdeltas cannot be empty panicking)Cache.bar_types aggregation_source filtering, was incorrectly using price_type (#2269), thanks @faysoucombo instrument type for Tardis integrationOrderMatchingEngine resulting in sizes below the minimum increment (#2275), thanks for reporting @miller-mooreBinanceErrorCodes requiring intBINANCE_DELIVERY venue for COIN-margined contractsInstrumentProviderConfig docstring (#2284), thanks @ikeepotick_size_change message for Polymarketstreaming parameter description (#2293), thanks @faysou and @stefansimikReleased on 10th January 2025 (UTC).
PerContractFeeModel, thanks @stefansimikDYDXInternalError and DYDXOraclaPrice data types for dYdX (#2155), thanks @davidsblomOrderBookDeltas flags parsing for BetfairDataEngineConfig.time_bars_skip_first_non_full_bar config option (#2160), thanks @faysouexecution.fast support for Bybit (#2165), thanks @sunleiNautilusKernelevent_logging config option for StrategyConfig (#2183), thanks @sunleibar_adaptive_high_low_ordering to BacktestVenueConfig (#2188), thanks @faysou and @stefansimikvalue param from UUID4 (use UUID4.from_str(...) instead), aligns with Nautilus PyO3 APIunix_nanos_to_iso8601 to output an ISO 8601 (RFC 3339) format string with nanosecond precisionformat_iso8601 to output ISO 8601 (RFC 3339) format string with nanosecond precisionformat_iso8601 dt parameter to enforce pd.Timestamp (which has nanosecond precision)TradingNode.is_built from a property to a method .is_built()TradingNode.is_running from a property to a method .is_running()OrderInitialized Arrow schema (linked_order_ids and tags data types changed from string to binary)avg_px and slippage from str to float (as out of alignment with position events)aggregation_source filter parameter for Cache.bar_types(...) to optional with default of NoneTradeTick by ensuring size is always positiveOrderBookDelta by ensuring order.size is positive when action is either ADD or UPDATEBarSpecification by ensuring step is always positiveOrderBookDeltas parsing across adapterslotSizeFilter field for Bybit (#2166), thanks @sunleirequest_aggregated_bars (#2144), thanks @faysouis_matching (#2151), thanks @ryantam626bar_adaptive_high_low_ordering (#2197), thanks @faysouOrderManager to Rust (#2161), thanks @Pushkarm029FeeModel to Rust (#2191), thanks @filipmacekOrderMatchingEngine in Rust (#2193), thanks @filipmacektokio crate to v1.43.0datafusion crate to v44.0.0DataClient on requests to support clients other than MarketDataClientOrderMatchingEngine - that could result in zero-size trades, thanks for reporting @stefansimikinstrument is None check flows for DataEngine and PolymarketExecutionClientBetfairDataClient (#2152), thanks @limx0CANCELED_MARKET_RESOLVED for PolymarketOrderStatusinit_id field from some order .to_dict() representationsDYDXOraclePrice to catalog (#2158), thanks @davidsblomOrderEmulated and OrderReleased Arrow schemasfill_order function in OrderMatchingEngine (#2189), thanks @filipmacekCache, slippage and spread handling in backtesting (#2162), thanks @stefansimikFillModel and bar based execution (#2187), thanks @stefansimikReleased on 25th December 2024 (UTC).
BybitOrderBookDeltaDataLoader with tutorial for Bybit backtesting (#2131), thanks @DeevsDeevsdepth parameter for some OrderBook methodsexchange MIC code as venue for instrument IDs with Databento GLBX dataset (#2108, #2121, #2124, #2126), thanks @faysouself.config attributes consistently (#2120), thanks @stefansimikUUID4::new() avoiding unnecessary string allocation, achieving a ~2.8x performance improvement (added benches)databento crate to v0.17.0BinanceOrderBookDeltaDataLoader from nautilus_trader.persistence.loaders to nautilus_trader.adapters.binance.loadersAtomicTime in real-time moderequest_aggregated_bars metadata handling (#2137), thanks @faysoubacktest_high_level.ipynb (#2142), thanks @stefansimikReleased on 15th December 2024 (UTC).
params for data subscriptions and requests which supports Databento bbo-1s and bbo-1m quotes (#2083, #2094), thanks @faysouSTOP_LIMIT entry order type for OrderFactory.bracket(...).group_bids(...) and .group_asks(...) for OrderBook.bids_to_dict() and .asks_to_dict() for OrderBookShutdownSystem command and shutdown_system(...) method for components (system-wide shutdown for backtest, sandbox, or live environments)max_ws_reconnection_tries to BybitDataClientConfig (#2100), thanks @sunleimax_ws_reconnection_tries to BybitExecClientConfig (#2109), thanks @sunleimargin_init, margin_maint, maker_fee, taker_fee params and attributes for FuturesContractmargin_init, margin_maint, maker_fee, taker_fee params and attributes for FuturesSpreadmargin_init, margin_maint, maker_fee, taker_fee params and attributes for OptionContractmargin_init, margin_maint, maker_fee, taker_fee params and attributes for OptionSpreadSTOP_MARKET and STOP_LIMIT orders for dYdX (#2069), thanks @Saransh-Bhandariinterval_ns (avoids panicking from Rust).bids_as_map() and .asks_as_map() for OrderBook in Rustcore subpackagecommon and model enumscommon.messagesBybitWebSocketClient private channel authentication (#2101), thanks @sunleiBybitWebSocketClient subscribe and unsubscribe (#2105), thanks @sunleiBybitEnumParser (#2107), thanks @sunleitokio crate to v1.42.0Level to BookLevel (standardizes order book type naming conventions)Ladder to BookLadder (standardizes order book type naming conventions)FuturesContract Arrow schema (added margin_init, margin_maint, maker_fee, taker_fee)FuturesSpread Arrow schema (added margin_init, margin_maint, maker_fee, taker_fee)OptionContract Arrow schema (added margin_init, margin_maint, maker_fee, taker_fee)OptionSpread Arrow schema (added margin_init, margin_maint, maker_fee, taker_fee)end with no catalog registered (comparison between pd.Timestamp and NoneType)BEST_EFFORT_CANCELED order status report for dYdX (#2082), thanks @davidsblomBEST_EFFORT_CANCELED messages of dYdX (#2095), thanks @davidsblomBybitHttpClient error handling when not a JSON string (#2096), thanks @sunleiBybitWebSocketClient private channel reconnect (#2097), thanks @sunleiBybitExecutionClient (#2098), thanks @sunleihttp_base_url for Bybit (#2110), thanks @sunleiReleased on 29th November 2024 (UTC).
metadata parameter for data requests (#2043), thanks @faysouSTOP_MARKET and STOP_LIMIT order support for dYdX (#2066), thanks @davidsblommax_reconnection_tries to data client config for dYdX (#2066), thanks @davidsblomprice_precision optional parameter for DatabentoDataLoader methodsCache behavior when adding more recent quotes, trades, or bars (now adds to cache)Portfolio and AccountManager to Rust (#2058), thanks @Pushkarm029AsRef<str> for Price, Money, and CurrencyRuntimeError)TradeId Debug implementation to display value as proper UTF-8 stringHttpClient for use directly from Rustunsafe)datafusion crate to v43.0.0 (#2056), thanks @twituTriggerType.LAST_TRADE to LAST_PRICE (more conventional terminology)price_precision, multiplier and lot_size decoding for Databento instrumentsReleased on 17th November 2024 (UTC).
TardisDataClient providing live data streams from a Tardis Machine WebSocket serverTardisInstrumentProvider providing instrument definitions from Tardis through the HTTP instrument metadata APIPortfolio.realized_pnl(...) method for per instrument realized PnL (based on positions)Portfolio.realized_pnls(...) method for per venue realized PnL (based on positions)InstrumentProvider (to warn when node starts with no instrument loading)WebSocketClient reconnection retries (#2044), thanks @davidsblomOrderCancelRejected event generation for Binance and BybitOrderModifyRejected event generation for Binance and BybitOrderRejected handling of reason string (None is now allowed which will become the string 'None')OrderCancelRejected handling of reason string (None is now allowed which will become the string 'None')OrderModifyRejected handling of reason string (None is now allowed which will become the string 'None')RiskEngine to Rust (#2035), thanks @Pushkarm029 and @twituExecutionEngine to Rust (#2048), thanks @twituAsRef<str> for a cleaner more flexible APIFrom trait implsInstrumentProvider initialization behavior and loggingLiveTimer cancel and performance testingLiveTimer cancellation model (#2046), thanks @twitumsgspec redundant import alias (#2050), thanks @sunleidatabento crate to v0.16.0None
InstrumentProviderConfigraw_symbol (was incorrectly using the normalized symbol)avg_px for Polymarket trade reportsPARTIALLY_FILLED_CANCELED status ordersBinaryOption instruments (precision 6 to match USDC.e)BacktestEngine when running with use_pyo3 logging configBybitResponse.time field as optional int (#2051), thanks @sunleiDatabentoDataClient (was incorrectly calling _handle_instruments instead of _handle_instrument), thanks for reporting @Emsufsspec recursive globbing behavior to ensure only file paths are included, and bumped dependency to version 2024.10.0Released on 3rd November 2024 (UTC).
LiveExecEngineConfig.open_check_interval_secs config option to actively reconcile open orders with the venueraise_exception optional parameter to TradingNode.run (#2021), thanks @faysouOrderBook.get_avg_px_qty_for_exposure in Rust (#1893), thanks @elementaceBar API to remove unnecessary unwrapspyo3 crate to v0.22.5pyo3-async-runtimes crate to v0.22.0tokio crate to v1.41.0DataTransformer (was being used for namespacing, so refactored to separate functions)TEST_DATA_DIR constant from tests to nautilus_trader package (#2020), thanks @faysouKEYS command which, is unsupported in cluster environments (replaced with SCAN for compatibility)OrderInitialized.to_dict() tags value type to list[str] (was a concatenated str)OrderInitialized.to_dict() linked_order_ids value type to list[str] (was a concatenated str)Released on 22nd October 2024 (UTC).
TardisCSVDataLoader for loading data from Tardis format CSV files as either legacy Cython or PyO3 objectsClock.timestamp_us() method for UNIX timestamps in microseconds (μs)bbo-1s and bbo-1m quote schemas for Databento adapter (#1990), thanks @faysoubook_type configuration vs data (prevents an issue where top-of-book data is used when order book data is expected)compute_effective_deltas config option for PolymarketDataClientConfig, reducing snapshot size (default False to retain current behavior)WebSocketClient (#1994), thanks @Pushkarm029on_signal(signal) handler for custom signal datanautilus_trader.common.events module with re-exports for TimeEvent and other system eventsOrderBookDepth10 by filling partial levels with null orders and zero countsDatabentoInstrumentProvider handling of large bulks of instrument definitions (improved parent symbol support)Throttler to Rust (#1988), thanks @Pushkarm029 and @twituBettingInstrument to RustRateLimiter for WebSocketClient and add tests (#2000), thanks @Pushkarm029WebSocketClient to close existing tasks on reconnect (#1986), thanks @davidsblomCacheDatabaseAdapter trait in Rust (#2015), thanks @filipmacekSimulatedExchange and OrderMatchingEngine to Rust (#1997, #1998, #2001, #2003, #2004, #2006, #2007, #2009, #2014), thanks @filipmacekTardisQuoteDataLoader (now redundant with new Rust implemented loader)TardisTradeDataLoader (now redundant with new Rust implemented loader)on_signal(signal) instead of on_data(data)Position.to_dict() commissions value type to list[str] (was an optional str of a list of strings)Position.to_dict() avg_px_open value type to floatPosition.to_dict() avg_px_close value type to float | NonePosition.to_dict() realized_return value type to float | NoneBettingInstrument Arrow schema fields event_open_date and market_start_time from string to uint64SocketClient TLS implementationWebSocketClient error handling on writer close, thanks for reporting @davidsblomOmsType in OrderMatchingEngine position ID processing (#2003), thanks @filipmacekTardisCSVDataLoader snapshot5 and snapshot25 parsing (#2005), thanks @Pushkarm029client_id params (which match the custom client name) to communicate with the clients, and use the same 'BINANCE' venue identifiersOrderMatchingEngine incorrectly attempting to process monthly bars for execution (which will fail, as no reasonable timedelta is available), thanks for reporting @frostRedMONTH aggregation for cache.bar_types() (sorting required an internal call for the bar intervals timedelta), thanks for reporting @frostRedReleased on 5th October 2024 (UTC).
mode parameter to ParquetDataCatalog.write_data to control data writing behavior (#1976), thanks @faysouSimulatedExchange in Rust (#1975), thanks @filipmacekSimulatedExchange in Rust (#1969), thanks @filipmacekSimulatedExchange in Rust (#1970), thanks @filipmacekDatabentoDataLoader internals to accommodate usage from RustNone
BacktestNode data sorting regression causing clock non-decreasing time assertion errorActor, thanks @limx0WebSocketClient task cleanup on disconnect (#1981), thanks @twituCondition method name collisions with C true and false macros, which occurred during compilation in profiling modeReleased on 27th September 2024 (UTC).
This will be the final release with support for Python 3.10.
The numpy version requirement has been relaxed to >= 1.26.4.
BinaryOption instrument (supports Polymarket integration)LiveExecutionEngine.inflight_check_retries config option to limit in-flight order query attemptsSymbol.root() method for obtaining the root of parent or composite symbolsSymbol.topic() method for obtaining the subscription topic of parent or composite symbolsSymbol.is_composite() method to determine if symbol is made up of parts with period (.) delimitersunderlying filter parameter for Cache.instruments(...) methodreduce_only parameter for Strategy.close_position(...) method (default True to retain current behavior)reduce_only parameter for Strategy.close_all_positions(...) method (default True to retain current behavior)PostgresCacheDatabase (#1928), thanks @filipmacekStreamingFeatherWriter with internal improvements using Clock and Cache (#1954, #1961), thanks @graceyangfanRetryManager for HTTP requests (#1941), thanks @davidsblomcontainer_image from config (#1940), thanks @rsmb7zOrderBookDeltas streaming and batching based on the F_LAST flagpublishers.jsonOrderTestBuilder to assist testing in Rust (#1952), thanks @filipmacekLogger to use unbuffered stdout/stderr writers (#1960), thanks @twitubatch_size_bytes to chunk_size (more accurate naming for number of data points to process per chunk in backtest streaming mode)OrderFactory.bracket(...) including: tp_time_in_force, tp_exec_algorithm_params, tp_tags, tp_client_order_idLoggingConfig issue for level_file when used with use_pyo3=True (was not passing through the level_file setting), thanks for reporting @xt2014ValueBarAggregator (#1927), thanks @faysouprotobuf and grpcio for dYdX (#1929), thanks @davidsblomBacktestNode prior to engine initialization would not produce logs, thanks for reporting @faysouBybitWebSocketClient private channel authentication on reconnect, thanks for reporting @miller-mooreOrderFactory.bracket(...) parameter ordering for sl_time_in_force and tp_time_in_force, thanks for reporting @marcodambrosCfd instrument Arrow schema and serializationFuturesSpread and OptionSpread instrument decoding (was not correctly handling price increments and empty underlyings)FuturesSpread serializationOptionSpread serializationReleased on 9th September 2024 (UTC).
OrderEmulatorOrderCancelRejected event generation for dYdX adapter (#1916), thanks @davidsblompycryptodome for Binance)tokio-tungstenite crate (#1902), thanks @VioletSakura-7None
BinanceFuturesEventType by adding new TRADE_LITE member, reflecting the Binance update on 2024-09-03 (UTC)Released on 7th September 2024 (UTC).
OrderBookDeltas.batch for batching groups of deltas based on record flags (batch until F_LAST)OrderBookDeltas batching support for ParquetDataCatalog (use data_cls of OrderBookDeltas to batch with the same flags method as live adapters)RetryManagerPool to abstract common retry functionality for all adaptersInstrumentClose functionality for OrderMatchingEngine, thanks @limx0BacktestRunConfig.dispose_on_completion config option to control post-run disposal behavior for each internal backtest engine (default True to retain current behavior)recv_window_ms config option for BinanceExecClientConfigsl_time_in_force and tp_time_in_force parameters to OrderFactory.bracket(...) methodclient_order_id parameters to OrderFactory methodsmultiplier parameter for CryptoPerpetual (default 1)BybitExecutionClient retry logic for submit_order, modify_order, cancel_order and cancel_all_ordersHttpClient error handling and added HttpClientError exception for Python (#1872), thanks @twituWebSocketClient error handling and added WebSocketClientError exception for Python (#1876), thanks @twituWebSocketClient.send_text efficiency (now accepts UTF-8 encoded bytes, rather than a Python string)@customdataclass decorator with date field and refined __repr__ (#1900, #1906, #1909), thanks @faysouOrderBookDeltas parsing and records flags for crypto venuesRedisMessageBusDatabase to tokio tasksRedisCacheDatabase to tokio taskstokio crate to v1.40.0heartbeat_interval to heartbeat_interval_secs (more explicitly indicates time units)heartbeat_interval_secs config option to MessageBusConfig (the message bus handles external stream processing)WebSocketClient.send_text(...) to take data as bytes rather than strCryptoPerpetual Arrow schema to include multiplier fieldCryptoFuture Arrow schema to include multiplier fieldOrderBook memory deallocation in Python finalizer (memory was not being freed on object destruction), thanks for reporting @zeyuhuanOrder tags serialization (was not concatenating to a single string), thanks for reporting @DevRosstypes_filter serialization in MessageBusConfig during kernel setupInstrumentProvider handling of load_ids_on_start when elements are already InstrumentIdsInstrumentProviderConfig hashing for filters fieldReleased on 19th August 2024 (UTC).
LiveExecEngineConfig.generate_missing_orders reconciliation config option to align internal and external position statesLogLevel::TRACE (only available in Rust for debug/development builds)Actor.subscribe_signal(...) method and Data.is_signal(...) class method (#1853), thanks @faysouHEDGE mode (#1846), thanks @DevRossBinanceExecutionClient position report requests (can now filter by instrument and includes reporting for flat positions)BybitExecutionClient position report requests (can now filter by instrument and includes reporting for flat positions)LiveExecutionEngine reconciliation robustness and recovery when internal positions do not match external positions@customdataclass decorator constructor to allow more positional arguments (#1850), thanks @faysou@customdataclass documentation (#1854), thanks @faysoudatafusion crate to v41.0.0tokio crate to v1.39.3uvloop to v0.20.0 (upgrades libuv to v1.48.0)VolumeWeightedAveragePrice calculation formula to use each bars "typical" price (#1842), thanks @evgenii-prusovOptionContract constructor parameter ordering and Arrow schema (consistently group option kind and strike price)snapshot_positions_interval to snapshot_positions_interval_secs (more explicitly indicates time units)snapshot_orders config option to ExecEngineConfig (can now be used for all environment contexts)snapshot_positions config option to ExecEngineConfig (can now be used for all environment contexts)snapshot_positions_interval_secs config option to ExecEngineConfig (can now be used for all environment contexts)Position exception type on duplicate fill (should be KeyError to align with the same error for Order)BybitPositionSide now correctly handles the empty string)Released on 9th August 2024 (UTC).
@customdataclass decorator to reduce need for boiler plate implementing custom data types (#1828), thanks @faysouNone
instrument_id folder when writing PyO3 bars in catalog (#1832), thanks @faysouStreamingFeatherWriter handling of include_types option (#1833), thanks @faysouBybitExecutionClient position reports error handling and loggingBybitExecutionClient order report handling to correctly process external ordersReleased on 2nd August 2024 (UTC).
MarketStatusAction enum (support Databento status schema)ignore_quote_tick_size_updates config option for Interactive Brokers (#1799), thanks @sunleiMessageBus v2 in Rust (#1786), thanks @twituDataEngine v2 in Rust (#1785), thanks @twituFillModel in Rust (#1801), thanks @filipmacekFixedFeeModel in Rust (#1802), thanks @filipmacekMakerTakerFeeModel in Rust (#1803), thanks @filipmacektokio crate to v1.39.2datafusion crate to v40.0.0VenueStatus and all associated methods and schemas (redundant with InstrumentStatus)QuoteTick.extract_volume(...) to .extract_size(...) (more accurate terminology)InstrumentStatus params (support Databento status schema)InstrumentStatus Arrow schemaOrderBook FFI API to take data by reference instead of by valuedecimal.Decimal internally)DataEngine unsubscribing from order book deltas (#1814), thanks @davidsblomLiveExecutionEngine handling of adapter client execution report causing None mass status (#1789), thanks for reporting @faysouInteractiveBrokersExecutionClient handling of instruments not found when generating execution reports (#1789), thanks for reporting @faysouReleased on 5th July 2024 (UTC).
request_order_book_snapshot method (#1745), thanks @graceyangfanBacktestNode when a venue book_type is L2_MBP or L3_MBOis_demo to True in configs)STOP_MARKET, STOP_LIMIT, MARKET_IF_TOUCHED, LIMIT_IF_TOUCHED, TRAILING_STOP_MARKET)AccountAny pattern in Rust (#1755), thanks @filipmacekDatabentoLiveClient to use new snapshot on subscribe featureClientOrderId, OrderId and PositionId generation)<Arc<Mutex<bool>> to AtomicBool in Rust network crate, thanks @NextThread and @twituKlingerVolumeOscillator indicator to Rust (#1724), thanks @Pushkarm029DirectionalMovement indicator to Rust (#1725), thanks @Pushkarm029ArcherMovingAveragesTrends indicator to Rust (#1726), thanks @Pushkarm029Swings indicator to Rust (#1731), thanks @Pushkarm029BollingerBands indicator to Rust (#1734), thanks @Pushkarm029VolatilityRatio indicator to Rust (#1735), thanks @Pushkarm029Stochastics indicator to Rust (#1736), thanks @Pushkarm029Pressure indicator to Rust (#1739), thanks @Pushkarm029PsychologicalLine indicator to Rust (#1740), thanks @Pushkarm029CommodityChannelIndex indicator to Rust (#1742), thanks @Pushkarm029LinearRegression indicator to Rust (#1743), thanks @Pushkarm029DonchianChannel indicator to Rust (#1744), thanks @Pushkarm029KeltnerChannel indicator to Rust (#1746), thanks @Pushkarm029RelativeVolatilityIndex indicator to Rust (#1748), thanks @Pushkarm029RateOfChange indicator to Rust (#1750), thanks @Pushkarm029MovingAverageConvergenceDivergence indicator to Rust (#1752), thanks @Pushkarm029OnBalanceVolume indicator to Rust (#1756), thanks @Pushkarm029SpreadAnalyzer indicator to Rust (#1762), thanks @Pushkarm029KeltnerPosition indicator to Rust (#1763), thanks @Pushkarm029FuzzyCandlesticks indicator to Rust (#1766), thanks @Pushkarm029Actor.subscribe_order_book_snapshots and unsubscribe_order_book_snapshots to subscribe_order_book_at_interval and unsubscribe_order_book_at_interval respectively (this clarifies the method behavior where the handler then receives OrderBook at a regular interval, distinct from a collection of deltas representing a snapshot)LIMIT order fill behavior for L2_MBP and L3_MBO book types (was not honoring limit price as maker), thanks for reporting @dpmaboCashAccount PnL calculations when opening a position with multiple fills, thanks @OtlkEnvironment enum for NautilusKernelConfigOrderMatchingEngine processing by book type for quotes and deltas (#1754), thanks @davidsblomDatabentoDataLoader.from_dbn_file for OrderBookDeltas when as_legacy_cython=FalseDatabentoDataLoader OHLCV bar schema loading (incorrectly accounting for display factor), thanks for reporting @faysouDatabentoDataLoader multiplier and round lot size decoding, thanks for reporting @faysouactive_symbols type miss matching (#1729), thanks @DevRossb buyer and a seller order IDs)BinanceFuturesInstrumentProvider parsing of min notional, thanks for reporting @AnthonyVinceBinanceSpotInstrumentProvider parsing of min and max notionalINVERSE product typeCache documentation for get (was the same as add), thanks for reporting @faysouReleased on 17th June 2024 (UTC).
IndexInstrument with support for Interactive Brokers (#1703), thanks @rsmb7zInteractiveBrokersInstrumentProvider contract loading (#1699), thanks @rsmb7zInteractiveBrokersInstrumentProvider option chain loading (#1704), thanks @rsmb7zInstrument.make_qty error clarity when a positive value is rounded to zeroDockerizedIBGatewayConfig docs (#1691), thanks @TroubladoreNone
OrderBookDeltaDataWrangler snapshot parsing (was not prepending a CLEAR action), thanks for reporting @VeraLyuInstrument.make_price and make_qty when increments have a lower precision (was not rounding to the minimum increment)EMACrossTrailingStop example strategy trailing stop logic (could submit multiple trailing stops on partial fills)TRAILING_STOP_MARKET orders (callback rounding was incorrect, was also not handling updates)Released on 31st May 2024 (UTC).
DataEngine order book deltas buffering to F_LAST flag (#1673), thanks @davidsblomDataEngineConfig.buffer_deltas config option for the above (#1670), thanks @davidsblomF_LAST flag (#1670), thanks @davidsblomSandboxExecutionClient instrument handling (instruments just need to be added to cache)VolumeWeightedAveragePrice indicator to Rust (#1665), thanks @Pushkarm029VerticalHorizontalFilter indicator to Rust (#1666), thanks @Pushkarm029None
SimulatedExchange processing of commands in real-time for sandbox modeDataEngine unsubscribe handling (edge case would attempt to unsubscribe from the client multiple times)BinanceBar streaming feather writing (was not setting up writer)Released on 24th May 2024 (UTC).
SandboxExecutionClientConfig to more closely match BacktestVenueConfig (many changes and additions)ts_init when streaming (#1656), thanks @twituReleased on 18th May 2024 (UTC).
Cfd and Commodity instruments with Interactive Brokers support (#1604), thanks @DracheShikiOrderMatchingEngine futures and option contract activation and expiration simulationParquetDataCatalog S3 support (#1620), thanks @benjaminsingletonBar.from_raw_arrays_to_list (#1623), thanks @rsmb7zSandboxExecutionClientConfig.bar_execution config option (#1646), thanks @davidsblomOrderMatchingEngine to generate multiple IDs for the same order)LiveTimer robustness and flexibility by not requiring positive intervals or stop times in the future (will immediately produce a time event), thanks for reporting @davidsblomallow_cash_positions config (simplify to the most common use case, spot trading should track positions)tags parameter and return type from str to list[str] (more naturally expresses multiple tags)Order.to_dict() commission and linked_order_id fields to lists of strings rather than comma separated stringsOrderMatchingEngine to no longer process internally aggregated bars for execution (no tests failed, but still classifying as a behavior change), thanks for reporting @davidsblomCashAccount PnL and balance calculations (was adjusting filled quantity based on open position quantity - causing a desync and incorrect balance values)from_str for Price, Quantity and Money when input string contains underscores in Rust, thanks for reporting @filipmacekMoney string parsing where the value from str(money) can now be passed to Money.from_strTimeEvent equality (now based on the event id rather than the event name)ParquetDataCatalog bar queries by instrument_id which were no longer returning data (the intent is to use bar_type, however using instrument_id now returns all matching bars)OrderMatchingEngine now caching filled quantity to prevent this) (#1642), thanks @davidsblomleaves_qty exception message underflow (now correctly displays the projected negative leaves quantity)IBOrder attributes assignment (#1634), thanks @rsmb7zfree balance with margin collateral, which could result in a negative locked balance)Released on 20th April 2024 (UTC).
FeeModel including FixedFeeModel and MakerTakerFeeModel (#1584), thanks @rsmb7zTradeTickDataWrangler.process_bar_data (#1585), thanks @rsmb7zLiveTimer efficiency and accuracy with tokio timer under the hoodQuoteTickDataWrangler and TradeTickDataWrangler (#1590), thanks @rsmb7zOrderBook designCacheDatabaseAdapter graceful close and thread joinMessageBus graceful close and thread joinmodify_order error logging when order values remain unchangedRecordFlag enum for Rust and PythonBias indicator to Rust, thanks @Pushkarm029OrderBookDelta params flags and sequence and removed default 0 values (more explicit and less chance of mismatches)OrderBook params flags and sequence and removed default 0 values (more explicit and less chance of mismatches)flags parameter to OrderBook.addflags parameter to OrderBook.updateflags parameter to OrderBook.deleteinfo binary fieldCryptoFuture: added is_inverse boolean fieldOrderBookMbo and OrderBookMbp to OrderBook (consolidated)Indicator.handle_book_mbo and Indicator.handle_book_mbp to handle_book (consolidated)register_serializable_object to register_serializable_type (also renames first parameter from obj to cls)MessageBus pattern resolving (fixes a performance regression where topics published with no subscribers would always re-resolve)BacktestNode streaming data management (was not clearing between chunks), thanks for reporting @dpmaboRiskEngine cumulative notional calculations for margin accounts (was incorrectly using base currency when selling)Equity instruments with CASH account and NETTING OMS incorrectly rejecting (should be able to reduce position)BinanceBar (kline) to use close_time for ts_event was opentime (#1591), thanks for reporting @OnlyCAccountMarginExceeded error condition (margin must actually be exceeded now, and can be zero)ParquetDataCatalog path globbing which was including all paths with substrings of specified instrument IDsReleased on 22nd March 2024 (UTC).
continuous, parent and instrument_id symbology support (will infer from symbols)DatabaseConfig.timeout config option for timeout seconds to wait for a new connectionLogGuard to ensure global logger is flushed on termination, thanks @ayush-sb and @twituDatabaseConfig.port can now be either a string or integer)ChandeMomentumOscillator indicator to Rust, thanks @Pushkarm029VIDYA indicator to Rust, thanks @Pushkarm029InteractiveBrokersEWrapper, thanks @rsmb7zredis crate to v0.25.2 which bumps up TLS dependencies, and turned on tls-rustls-webpki-roots feature flagNone
timestamp and trader\_id)DatabaseConfig port JSON parsing for Redis (was always defaulting to 6379)ChandeMomentumOscillator indicator divide by zero error (both Rust and Cython versions)Released on 15th March 2024 (UTC).
OrderMatchingEngine (will now raise a RuntimeError when a price or size precision for OrderFilled does not match the instruments precisions)LoggingConfig.use_pyo3 config option for PyO3 based logging initialization (worse performance but allows visibility into logs originating from Rust)exchange field to FuturesContract, FuturesSpread, OptionContract and OptionSpread (optional)exchange field for FuturesContract, FuturesSpread, OptionContract and OptionSpreadMessageBus handling of subscriptions after a topic has been published on (was previously dropping messages for these late subscribers)MessageBus handling of subscriptions under certain edge cases (subscriptions list could be resized on iteration causing a RuntimeError)Throttler handling of sending messages after messages have been dropped, thanks @davidsblomOrderBookDelta.to_pyo3_list using zero precision from clear deltaDataTransformer.pyo3_order_book_deltas_to_record_batch_bytes using zero precision from clear deltaOrderBookMbo and OrderBookMbp integrity check when crossed bookOrderBookMbp error when attempting to add to a L1_MBP book type (now raises RuntimeError rather than panicking)SimulationModuleConfig location and missing re-export from config subpackageStdoutWriter from also writing error logs (writers were duplicating error logs)BinanceWebSocketClient to new specification which requires responding to pings with a pong containing the pings payloadAccountBalance calculations based on wallet and available balanceExecAlgorithm circular import issue for installed wheels (importing from execution.algorithm was a circular import)Released on 25th February 2024 (UTC).
FuturesSpread instrument typeOptionSpread instrument typeInstrumentClass.FUTURE_SPREADInstrumentClass.OPTION_SPREADmanaged parameter to subscribe_order_book_deltas, default True to retain current behavior (if false then the data engine will not automatically manage a book)managed parameter to subscribe_order_book_snapshots, default True to retain current behavior (if false then the data engine will not automatically manage a book)OrderMatchingEngine (will now reject orders with incorrect price or quantity precisions)interval_ms 20 millisecond limitation for subscribe_order_book_snapshots (i.e. just needs to be positive), although we recommend you consider subscribing to deltas below 100 millisecondsLiveClock and LiveTimer implementations to RustOrderBookDeltas picklingAverageTrueRange in Rust, thanks @rsmb7zTradeId value maximum length to 36 characters (will raise a ValueError if value exceeds the maximum)TradeId memory leak due assigning unique values to the Ustr global string cache (which are never freed for the lifetime of the program)TradeTick size precision for PyO3 conversion (size precision was incorrectly price precision)RiskEngine cash value check when selling (would previously divide quantity by price which is too much), thanks for reporting @AnthonyVinceLiveClock timer behavior for small intervals causing next time to be less than now (timer then would not run)log_level_file (bug introduced in v1.187.0), thanks @twituprint_config config option (was not being passed through to the logging subsystem)TimeEvent timestamps)NETTING positions will generate account balance updates)MessageBus publishable types collection type (needed to be tuple not set)Controller registration of components to ensure all active clocks are iterated correctly during backtestsEquity short selling for CASH accounts (will now reject)ActorFactory.create JSON encoding (was missing the encoding hook)ImportableConfig.create JSON encoding (was missing the encoding hook)ImportableStrategyConfig.create JSON encoding (was missing the encoding hook)ExecAlgorithmFactory.create JSON encoding (was missing the encoding hook)ControllerConfig base class and docstringfreeze_dict function to handle fs_storage_options, thanks @dimitar-petrovReleased on 9th February 2024 (UTC).
strict_symbology config option, thanks @rsmb7z and @fhill2config module per subpackage, with re-exports from nautilus_trader.config)BacktestEngine and Trader disposal (now properly releasing resources), thanks for reporting @davidsblomReleased on 2nd February 2024 (UTC).
None
None
TimeBarAggregator handling of interval types on buildBinanceSpotExecutionClient non-existent method name, thanks @sunleipsutil import, thanks @sunleiReleased on 26th January 2024 (UTC).
bypass_logging is set true for a LIVE contextregister_serializable object to also add type to internal _EXTERNAL_PUBLIHSABLE_TYPESStreamingConfig.include_types type from tuple[str] to list[type] (better alignment with other type filters)clock module into component module (reduce binary wheel size)logging module into component module (reduce binary wheel size)OrderUpdated (trigger_price type was incorrect), thanks @benjaminsingletonStreamingConfig.include_types behavior (was not being honored for instrument writers), thanks for reporting @doublier1ImportableStrategyConfig type assignment in StrategyFactory (#1470), thanks @rsmb7zReleased on 22nd January 2024 (UTC).
LogLevel.OFF (matches the Rust tracing log levels)init_logging function with sensible defaults to initialize the Rust implemented logging subsystemBinanceFuturesContractType and BinanceFuturesPositionUpdateReasonsysinfo crate (adds swap space metrics and a PID identifier)psutilclock parameter from Logger (no dependency on Clock anymore)LoggerAdapter to Logger (and removed old Logger class)Logger component_name parameter to name (matches Python built-in logging API)OptionKind kind parameter and property to option_kind (better clarity)OptionContract Arrow schema field kind to option_kindlevel_file log level to OFF (file logging is off by default)DataEngine order book snapshot timer names (could not parse instrument IDs with hyphens), thanks for reporting @x-zho14 and @dimitar-petrovLoggingConfig parsing of WARNING log level (was not being recognized), thanks for reporting @davidsblomQuoteTick parsing to capture event time for ts_event, thanks for reporting @x-zho14Released on 12th January 2024 (UTC).
NautilusConfig.json_primitives to convert object to Python dictionary with JSON primitive valuesInstrumentClass.BONDMessageBusConfig use_trader_prefix and use_trader_id config options (provides more control over stream names)CacheConfig.drop_instruments_on_reset (default True to retain current behavior)log crate, thanks @twituRuntimeError only when needed (not when using TWS), thanks @rsmb7zhyper and reqwest, thanks @ayush-sbParquetDataCatalog custom data prefix from geneticdata_ to custom_ (you will need to rename any catalog subdirs)ComponentStateChanged Arrow schema for config from string to binaryOrderInitialized Arrow schema for options from string to binaryOrderBookDeltas dictionary representation of deltas field from JSON bytes to a list of dict (standardize with all other data types)trader-{trader_id}-{instance_id}-streams (with options allows many traders to publish to the same streams)V2 suffix for clarityGenericData to CustomData (more accurately reflects the nature of the type)DataClient.subscribed_generic_data to .subscribed_custom_dataMessageBusConfig.stream to .streams_prefix (more accurate)ParquetDataCatalog.generic_data to .custom_dataTradeReport to FillReport (more conventional terminology, and more clearly separates market data from user execution reports)asset_type to instrument_class across the codebase (more conventional terminology)AssetType enum to InstrumentClass (more conventional terminology)AssetClass.BOND to AssetClass.DEBT (more conventional terminology)AssetClass.METAL (not strictly an asset class, more a futures category)AssetClass.ENERGY (not strictly an asset class, more a futures category)multiplier parameter from Equity constructor (not applicable)size_precision, size_increment, and multiplier fields from Equity dictionary representation (not applicable)TracingConfig (now redundant with new logging implementation)Ticker data type and associated methods (not a type which can be practically normalized and so becomes adapter specific generic data)AssetClass.SPORTS_BETTING to InstrumentClass.SPORTS_BETTINGStreamingFeatherWriterBinanceSpotInstrumentProvider fee loading key error for partial instruments load, thanks for reporting @doublier1BinanceErrorCode.SERVER_BUSY (-1008), also added to the retry error codesBinanceOrderStatus.EXPIRED_IN_MATCH which is when an order was canceled by the exchange due self-trade prevention (STP), thanks for reporting @doublier1Released on 23rd December 2023 (UTC).
CacheDatabaseFacade and CacheDatabaseAdapter to abstract backing technology from Python codebaseRedisCacheDatabase implemented in Rust with separate MPSC channel thread for insert, update and delete operationsOrderBookDelta and OrderBookDeltas to serializable and publishable typesPortfolioFacade to ActorActor and Strategy usability to be more lenient to mistaken calls to clock and logger from the constructor (warnings also added to docs)redis and hiredis dependencies from Python codebaseNautilusKernelConfig.trader_id to type TraderIdBacktestDataConfig.instrument_id to type InstrumentIdActorConfig.component_id to type ComponentId | NoneStrategyConfig.strategy_id to type StrategyId | NoneInstrument, OrderFilled and AccountState info field serialization due below fix (you'll need to flush your cache)CacheConfig to take a DatabaseConfig (better symmetry with MessageBusConfig)RedisCacheDatabase data structure for currencies from hashset to simpler key-value (you'll need to clear cache or delete all currency keys)Actor state loading to now use the standard Serializerregister_json_encoding to register_config_encodingregister_json_decoding to register_config_decodingCacheDatabaseConfig (due above config change)infrastructure subpackage (now redundant with new Rust implementation)json encoding for CacheDatabaseAdapter from info field serialization fix belowInstrument, OrderFilled and AccountState info field serialization to retain JSON serializable dicts (rather than double encoding and losing information)good_till_date value when time_in_force not GTD, such as when strategy is managing the GTD (was incorrectly passing through UNIX milliseconds)Executor handling of queued task IDs (was not discarding from queued tasks on completion)DataEngine handling of order book snapshots with very small intervals (now handles as short as 20 milliseconds)BacktestEngine.clear_actors(), BacktestEngine.clear_strategies() and BacktestEngine.clear_exec_algorithms(), thanks for reporting @davidsblomBacktestEngine OrderEmulator reset, thanks @davidsblomThrottler.reset and reset of RiskEngine throttlers, thanks @davidsblomReleased on 2nd December (UTC).
This release adds support for Python 3.12.
HistoricInteractiveBrokerClient, thanks @benjaminsingleton and @limx0DataEngineConfig.time_bars_interval_type (determines the type of interval used for time aggregation left-open or right-open)LoggingConfig.log_colors to optionally use ANSI codes to produce colored logs (default True to retain current behavior)QuoteTickDataWrangler.process_bar_data options for offset_interval_ms and timestamp_is_closeOrderFactory in Rust, thanks @filipmacekWilderMovingAverage in Rust, thanks @ayush-sbHullMovingAverage in Rust, thanks @ayush-sbsqlx in Rust, thanks @filipmacekdata submodules into one data module (reduce binary wheel size)OrderBook from model.orderbook.book to model.book (subpackage only had this single module)Currency from model.currency to model.objects (consolidating modules to reduce binary wheel size)MessageBus from common.msgbus to common.component (consolidating modules to reduce binary wheel size)MsgSpecSerializer from serialization.msgpack.serializer to serialization.serializerCacheConfig snapshot_orders, snapshot_positions, snapshot_positions_interval to NautilusKernelConfig (logical applicability)MsgPackSerializer to MsgSpecSeralizer (now handles both JSON and MsgPack formats)trader_id in Position dictionary representation, thanks @filipmacekRiskEngine cumulative notional risk check for CurrencyPair SELL orders on multi-currency cash accountsReleased on 3rd November 2023 (UTC).
loop.call_soon_threadsafe(...)RedisCacheDatabase client connection error handling with retriesWebSocketClient connection headers, thanks @ruthvik125 and @twitusupport_contingent_orders config option for venues (to simulate venues which do not support contingent orders)StrategyConfig.manage_contingent_orders config option (to automatically manage open contingent orders)FuturesContract.activation_utc property which returns a pd.Timestamp tz-aware (UTC)OptionContract.activation_utc property which returns a pd.Timestamp tz-aware (UTC)CryptoFuture.activation_utc property which returns a pd.Timestamp tz-aware (UTC)FuturesContract.expiration_utc property which returns a pd.Timestamp tz-aware (UTC)OptionContract.expiration_utc property which returns a pd.Timestamp tz-aware (UTC)CryptoFuture.expiration_utc property which returns a pd.Timestamp tz-aware (UTC)FuturesContract.expiry_date to expiration_ns (and associated params) as uint64_t UNIX nanosecondsOptionContract.expiry_date to expiration_ns (and associated params) as uint64_t UNIX nanosecondsCryptoFuture.expiry_date to expiration_ns (and associated params) as uint64_t UNIX nanosecondsFuturesContract Arrow schemaOptionContract Arrow schemaCryptoFuture Arrow schemats_init timestampbatch_more option for Strategy.modify_orderInstrumentProvider.venue property (redundant as a provider may have many venues)ParquetDataCatalog file writing template, thanks @limx0start paramBacktestEngine logging error with immediate stop (caused by certain timestamps being None)BacktestNode exceptions during backtest runs preventing next sequential run, thanks for reporting @cavan-blackBinanceSpotPermission value error by relaxing typing for BinanceSpotSymbolInfo.permissionsReleased on 22nd October 2023 (UTC).
A major feature of this release is the ParquetDataCatalog version 2, which represents months of
collective effort thanks to contributions from Brad @limx0, @twitu, @ghill2 and @davidsblom.
This will be the final release with support for Python 3.9.
ParquetDataCatalog v2 supporting built-in data types OrderBookDelta, QuoteTick, TradeTick and BarStrategy specific order and position event handlersExecAlgorithm specific order and position event handlersCache.is_order_pending_cancel_local(...) (tracks local orders in cancel transition)BinanceTimeInForce.GTD enum member (futures only)BinanceExecClientConfig.use_gtd config option (to remap to GTC and locally manage GTD orders)nautilus_ibapi, thanks @rsmb7zRiskEngine min/max instrument notional limit checksController for dynamically controlling actor and strategy instances for a TraderReportProvider.generate_fills_report(...) which provides a row per individual fill event, thanks @r3k4mn14rActor (now available for Actor)WebSocketClient live subscribe and unsubscribeBinanceCommonDataClient retries for update_instrumentsTraderBookType.L1_TBBO to BookType.L1_MBP (more accurate definition, as L1 is the top-level price either side)VenueStatusUpdate -> VenueStatusInstrumentStatusUpdate -> InstrumentStatusActor.subscribe_venue_status_updates(...) to Actor.subscribe_venue_status(...)Actor.subscribe_instrument_status_updates(...) to Actor.subscribe_instrument_status(...)Actor.unsubscribe_venue_status_updates(...) to Actor.unsubscribe_venue_status(...)Actor.unsubscribe_instrument_status_updates(...) to Actor.unsubscribe_instrument_status(...)Actor.on_venue_status_update(...) to Actor.on_venue_status(...)Actor.on_instrument_status_update(...) to Actor.on_instrument_status(...)InstrumentStatus fields/schema and constructormanage_gtd_expiry from Strategy.submit_order(...) and Strategy.submit_order_list(...) to StrategyConfig (simpler and allows re-activating any GTD timers on start)LimitIfTouchedOrder.create (exec_algorithm_params were not being passed in)OrderEmulator start-up processing of OTO contingent orders (when position from parent is open)SandboxExecutionClientConfig kw_only=True to allow importing without initializingOrderBook pickling (did not include all attributes), thanks @limx0open_only flag)Strategy.cancel_order for orders in INITIALIZED state and with an emulation_trigger (was not sending command to OrderEmulator)BinanceWebSocketClient reconnect behavior (reconnect handler was not being called due event loop issue from Rust)Timer missing condition check for non-positive intervalsCondition checks involving integers, was previously defaulting to 32-bit and overflowingReportProvider.generate_order_fills_report(...) which was missing partial fills for orders not in a final FILLED status, thanks @r3k4mn14rReleased on 2nd September 2023 (UTC).
None
None
OrderBookDelta.clear method (where the sequence field was swapped with flags causing an overflow)OrderManager OTO contingency handling on fillsOrderManager duplicate order canceled events (race condition when processing contingencies)Cache loading of initialized emulated orders (were not being correctly indexed as emulated)Released on 26th August 2023 (UTC).
This release includes a large breaking change to quote tick bid and ask price property and parameter naming. This was done in the interest of maintaining our generally explicit naming standards, and has caused confusion for some users in the past. Data using 'bid' and 'ask' columns should still work with the legacy data wranglers, as columns are renamed under the hood to accommodate this change.
ActorExecutor with Actor API for creating and running threaded tasks in live environmentsOrderEmulated event and associated OrderStatus.EMULATED enum variantOrderReleased event and associated OrderStatus.RELEASED enum variantBacktestVenueConfig.use_position_ids config option (default True to retain current behavior)Cache.exec_spawn_total_quantity(...) convenience methodCache.exec_spawn_total_filled_qty(...) convenience methodCache.exec_spawn_total_leaves_qty(...) convenience methodWebSocketClient.send_text, thanks @twituTimeEventQuoteTick.bid to bid_price including all associated parameters (for explicit naming standards)QuoteTick.ask to ask_price including all associated parameters (for explicit naming standards)position_id assignment in HEDGING modeOrderMatchingEngine processing of emulated ordersOrderEmulator processing of exec algorithm ordersExecutionEngine processing of exec algorithm orders (exec spawn IDs)Cache emulated order indexing (were not being properly discarded from the set when closed)RedisCacheDatabase loading of transformed LIMIT ordersReleased on 31st July 2023 (UTC).
SyntheticInstrument capability, including dynamic derivation formulasOrder.commissions() convenience method (also added to state snapshot dictionaries)Cache position and order state snapshots (configure via CacheConfig)CacheDatabaseConfig.timestamps_as_iso8601 to persist timestamps as ISO 8601 stringsLiveExecEngineConfig.filter_position_reports to filter position reports from reconciliationStrategy.cancel_gtd_expiry to cancel managed GTD order expirationLIMIT ordersBinanceExecClientConfig.max_retries config option (for retrying order submit and cancel requests)BinanceExecClientConfig.retry_delay config option (the delay between retry attempts)BinanceExecClientConfig.use_reduce_only config option (default True to retain current behavior)BinanceExecClientConfig.use_position_ids config option (default True to retain current behavior)BinanceExecClientConfig.treat_expired_as_canceled option (default False to retain current behavior)BacktestVenueConfig.use_reduce_only config option (default True to retain current behavior)MessageBus.is_pending_request(...) methodLevel API for core OrderBook (exposes the bid and ask levels for the order book)Actor.is_pending_request(...) convenience methodActor.has_pending_requests() convenience methodActor.pending_requests() convenience methodUSDP (Pax Dollar) and TUSD (TrueUSD) stablecoinsOrderMatchingEngine handling when no fills (an error is now logged)filter_unclaimed_external_orders from ExecEngineConfig to LiveExecEngineConfigActor.request_* methods no longer take a request_id, but now return a UUID4 request IDBinanceExecClientConfig.warn_gtd_to_gtd (now always an INFO level log)Instrument.native_symbol to raw_symbol (you must manually migrate or flush your cached instruments)Position.cost_currency to settlement_currency (standardize terminology)CacheDatabaseConfig.flush to flush_on_start (for clarity)Order.ts_last to represent the UNIX nanoseconds timestamp of the last event (rather than fill)Portfolio.net_position calculation to use Decimal rather than float to avoid rounding errorsOrderFactory order identifiers generationvenue_order_id (for three order types)Currency registration with core global map on creationOrderInitialized.exec_algorithm_params to spec (bytes rather than string)PENDING_CANCEL -> EXPIRED as valid state transition (real world possibility)reduce_only orders when partially filledPositionStatusReport parsing of position sideTradeReport assignment of position ID (was hardcoded to hedging mode)InstrumentProviderTriggerType parsing #1154, thanks for reporting @davidblom603BinanceOrderType enum members to include undocumented INSURANCE_FUND, thanks for reporting @TzumxBinanceSpotPermissions enum members #1161, thanks for reporting @davidblom603Released on 16th June 2023 (UTC).
The Betfair adapter is broken for this release pending integration with the new Rust order book. We recommend you do not upgrade to this version if you're using the Betfair adapter.
OrderBook into platformOrderBookDelta data typeHttpClient based on hyper, thanks @twituWebSocketClient based on tokio-tungstenite, thanks @twituSocketClient based on tokio TcpStream, thanks @twituquote_quantity parameter to determine if order quantity is denominated in quote currencytrigger_instrument_id parameter to trigger emulated orders from alternative instrument pricesuse_random_ids to add_venue(...) method, controls whether venue order, position and trade IDs will be random UUID4s (no change to current behavior)ExecEngineConfig.filter_unclaimed_external_orders config option, if unclaimed order events with an EXTERNAL strategy ID should be filtered/droppedBinanceHttpClient to use new core HTTP clientnautilus_trader.model.data (denest namespace)nautilus_trader.model.events (denest namespace)pandas to v2OrderBookSnapshot (redundant as can be represented as an initial CLEAR followed by deltas)OrderBookData (redundant)Actor.handle_order_book_delta to handle_order_book_deltas (to more clearly reflect the OrderBookDeltas data type)Actor.on_order_book_delta to on_order_book_deltas (to more clearly reflect the OrderBookDeltas data type)inverse_as_quote to use_quote_for_inverse (ambiguous name, only applicable for notional calcs on inverse instruments)Data contract (custom data), see docsLogMessage to LogEvent to more clearly distinguish between the message field and the event struct itself (aligns with vector language)LogEvent.timestamp_ns to LogEvent.timestamp (affects field name for JSON format)LogEvent.msg to LogEvent.message (affects field name for JSON format)BinanceAccountType enum members and associated docsBinanceCommonExecutionClient iteration of OrderList ordersBinanceWebSocketClient (new Rust client now responds with pong frames)orderId, fromId, startTime and endTime (all are ints), thanks for reporting @davidsblomCurrency equality to be based on the code field (avoiding equality issues over FFI), thanks for reporting @OtlkBinanceInstrumentProvider parsing of initial and maintenance margin valuesReleased on 19th May 2023 (UTC).
model.orderbook.data into the model.data.book namespaceAccountMarginExceeded exception and refined AccountBalanceNegativeOrderEmulator releasing of already closed ordersMatchingEngine processing of reduce only for child contingent ordersMatchingEngine position ID assignment for child contingent ordersActor handling of historical data from requests (will now call on_historical_data regardless of state), thanks for reporting @miller-moorepyarrow schema dictionary index keys being too narrow (int8 -> int16), thanks for reporting @rterbushReleased on 5th May 2023 (UTC).
None
None
BacktestEngine processing of venue(s) message queue based off time event ts_initPosition.signed_decimal_qty (incorrect format precision in f-string), thanks for reporting @rsmb7zreduce_only instruction, thanks for reporting @OtlkINITIALIZED status)Released on 30th April 2023 (UTC).
clock_sync_interval_secs (redundant/unused and should be handled at system level)rate_limit config params)Future instrument to FuturesContract (avoids ambiguity)Option instrument to OptionContract (avoids ambiguity and naming conflicts in Rust)TimeEvent (rather than being invalid)external_order_claims config option for StrategyConfig (for claiming external orders per instrument)Order.signed_decimal_qty()Cache.orders_for_exec_algorithm(...)Cache.orders_for_exec_spawn(...)TWAPExecAlgorithm and TWAPExecAlgorithmConfig to examplesExecAlgorithm base class for implementing 'first class' execution algorithmsRiskEngineOrderEmulator updating of contingent orders from execution algorithmsnautilus_trader.model.instruments (denest namespace)nautilus_trader.model.orders (denest namespace)nautilus_trader.model.orderbook (denest namespace)debug Makefile convenience targetsWebSocketClient session disconnect, thanks for reporting @miller-mooreBinanceSymbolFilterType.NOTIONALMul trait for Price and Quantity (not being used in Cython/Python layer)Released on 30th March 2023 (UTC).
net_qty fields and parameters to signed_qty (more accurate naming)NautilusKernelConfig removed all log_* config options (replaced by logging with LoggingConfig)CurrencyPair instruments with a single-currency CASH account type no longer permitted (unrealistic)PositionEvent parquet schemas (renamed net_qty field to signed_qty)LoggingConfig to consolidate logging configs, offering various file options and per component level filtersBacktestVenueConfig.bar_execution to control whether bar data moves the matching engine markets (reinstated)request_id for actor data requests (aids processing responses), thanks @rsmb7zPosition.signed_decimal_qty()Portfolio net position calculation, and LiveExecutionEngine reconciliation comparisonsBacktestEngine clock and logger handling (had a redundant extra logger and not swapping live clock in post run)close_position order event publishing and cache persistence for MarketOrder and SubmitOrder, thanks for reporting @rsmb7zReleased on 11th March 2023 (UTC).
backtest.data.providers to test_kit.providersbacktest.data.wranglers to persistence.wranglers (to be consolidated)backtest.data.loaders to persistence.loaders (to be consolidated)from_datetime to start across data request methods and propertiesto_datetime to end across data request methods and propertiesRiskEngineConfig.deny_modify_pending_update (as now redundant with new pending event sequencing)DataCatalogConfig for more cohesive data catalog configurationDataEngine.register_catalog to support historical data requestscatalog_config field to base NautilusKernelConfigStrategyclient_order_id and order_list_id in StrategyOrderPendingUpdate and OrderPendingCancel in StrategyPortfolioAnalyzer PnL statistics now take optional unrealized_pnlDataEngine bar subscribe and unsubscribe logic, thanks for reporting @rsmb7zActor handling of bars, thanks @limx0CancelAllOrders command handling for contingent orders not yet in matching coreTrailingStopMarketOrder slippage calculation when no trigger_price, thanks for reporting @rsmb7zBinanceSpotInstrumentProvider parsing of quote asset (was using base), thanks for reporting @logoginPosition calculation of last_qty when commission currency was equal to base currency, thanks for reporting @rsmb7zBacktestEngine post backtest run PnL performance statistics for currencies traded per venue, thanks for reporting @rsmb7zReleased on 18th February 2023 (UTC).
NautilusConfig objects now pseudo-immutable from new msgspec 0.13.0OrderFactory.bracket parameter post_only_entry -> entry_post_only (consistency with other params)OrderFactory.bracket parameter post_only_tp -> tp_post_only (consistency with other params)build_time_bars_with_no_updates -> time_bars_build_with_no_updates (consistency with new param)OrderFactory.set_order_count() -> set_client_order_id_count() (clarity)TradingNode.start() to TradingNode.run()use_agg_trade_ticks, thanks @poshcoetime_bars_timestamp_on_close config option for bar timestamping (True by default)OrderFactory.generate_client_order_id() (calls internal generator)OrderFactory.generate_order_list_id() (calls internal generator)OrderFactory.create_list(...) as easier method for creating order lists__len__ implementation for OrderList (returns length of orders)MatchingEngine public API for custom functionalityTradingNode.run_async() for easier running from async contextTradingNode.stop_async() for easier stopping from async contextSimulationModule (and refine Actor base registration)OrderInitialized event)MARKET_TO_LIMIT orders in matching and risk engines, thanks for reporting @martinsaipReleased on 29th January 2023 (UTC).
Cache.clear_cache() (redundant with the .reset() method)Cache .add(...) and .get(...) for general 'user/custom' objects (as bytes)CacheDatabase .add(...) and .load() for general cache objects (as bytes)RedisCacheDatabase .add(...) and .load() for general Redis persisted bytes objects (as bytes)Cache.actor_ids()Actor cached state saving and loading functionalityReleased on 28th January 2023 (UTC).
OrderBookData.update_id to sequenceBookOrder.id to order_idParquetReader and ParquetWriter, thanks @twitumsgbus.is_subscribed (to check if topic and handler already subscribed)NautilusKernel redundant initialization of event loop for backtesting, thanks @limx0BacktestNode disposal sequenceReleased on 17th January 2023 (UTC).
Position.unrealized_pnl now None until any realized PnL is generated (to reduce ambiguity)DataClient, thanks @rsmb7zPosition realized_pnl and realized_return fields, which were incorrectly cumulativePosition flip logic (now correctly 'resets' position)Released on 14th January 2023 (UTC).
A number of enum variant names have been changed in favour of explicitness, and also to avoid C naming collisions.
AggressorSide.NONE to NO_AGGRESSORAggressorSide.BUY to BUYERAggressorSide.SELL to SELLERAssetClass.CRYPTO to CRYPTOCURRENCYLiquiditySide.NONE to NO_LIQUIDITY_SIDEOMSType to OmsTypeOmsType.NONE to UNSPECIFIEDOrderSide.NONE to NO_ORDER_SIDEPositionSide.NONE to NO_POSITION_SIDETrailingOffsetType.NONE to NO_TRAILING_OFFSETTrailingOffsetType.DEFAULTTriggerType.NONE to NO_TRIGGERTriggerType.LAST to LAST_TRADETriggerType.MARK to MARK_PRICETriggerType.INDEX to INDEX_PRICEComponentState.INITIALIZED to READYOrderFactory.bracket(post_only) to post_only_entrymanage_gtd_expiry to Strategy.submit_order(...) and Strategy.submit_order_list(...)BarSpecification.timedelta property, thanks @rsmb7zDataEngineConfig.build_time_bars_with_no_updates config optionOrderFactory.bracket(post_only_tp) paramOrderListIdGenerator and integrate with OrderFactoryCache.add_order_list(...)Cache.order_list(...)Cache.order_lists(...)Cache.order_list_exists(...)Cache.order_list_ids(...)OrderListId from factory to ensure uniqueness.timedelta property to BarSpecification, thanks @rsmb7zDataEngineConfig.validate_data_sequence (default False and currently only for Bar data), thanks @rsmb7zTRD_GRP_* enum variants for Binance spot permissionsPARTIALLY_FILLED -> EXPIRED order state transition, thanks @bb01100100Released on 23rd December 2022 (UTC).
None
ParquetReader and ParquetWriter (for QuoteTick and TradeTick only)MARKET_IF_TOUCHED orders for OrderFactory.bracket(..)OrderEmulator trigger event handling for live tradingOrderEmulator transformation to market orders which had a GTD time in forceOrderUpdated eventsmsgspec, thanks @limx0Released on 17th December 2022 (UTC).
None
None
MARKET_IF_TOUCHED and LIMIT_IF_TOUCHED trigger and modify behaviorMatchingEngine updates of stop order typesReleased on 12th December 2022 (UTC).
OrderFactory bracket order methods consolidated to .bracket(...)OrderFactory to provide more bracket order typesnox dependencyOrderBook sorting for bid side, thanks @gaugau3000MARKET_TO_LIMIT order initial fill behaviorBollingerBands indicator mid-band calculations, thanks zhp (Discord)Released on 10th December 2022 (UTC).
This release adds support for Python 3.11.
OrderFactory.bracket_market to OrderFactory.bracket_market_entryOrderFactory.bracket_limit to OrderFactory.bracket_limit_entryOrderFactory bracket order price and trigger_price parametersmsgspec providing better performance and correctnessOrderFactory.bracket_stop_limit_entry_stop_limit_tp(...)pydanticSTOP_MARKET order behavior to fill at market on immediate triggerSTOP_LIMIT order behavior to fill at market on immediate trigger and marketableSTOP_LIMIT order behavior to fill at market on processed trigger and marketableLIMIT_IF_TOUCHED order behavior to fill at market on immediate trigger and marketableRiskEngineConfig.bypass set to True will now correctly bypass throttlers, thanks @DownBadCapitalReleased on 28th November 2022 (UTC).
ClientOrderId and PositionOrderId)orderbook.data.Order to orderbook.data.BookOrder (reduce conflicts/confusion)Instrument.get_cost_currency(...) to Instrument.get_settlement_currency(...) (more accurate terminology)OrderEmulatortest_kit module to main package to support downstream project/package testingPositionOpened when reopening a closed positionLIMIT order fill characteristics when immediately marketable as a takerLIMIT order fill characteristics when passively filled as a maker as quotes move throughRiskEngine notional check when selling cash assets (spot currency pairs)Released on 18th November 2022 (UTC).
SubmitOrderList.list to SubmitOrderList.order_listTRAILING_STOP_MARKET orders for Binance Futures (beta)OUO One-Updates-Other ContingencyType with matching engine implementationModifyOrder message str and repr when no quantityReleased on 3rd November 2022 (UTC).
LiveExecEngineConfig.reconciliation boolean flag to control if reconciliation is activeLiveExecEngineConfig.reconciliation_auto (unclear naming and concept)BidAskMinMax indicator (to reduce total package size)HilbertPeriod indicator (to reduce total package size)HilbertSignalNoiseRatio indicator (to reduce total package size)HilbertTransform indicator (to reduce total package size)TimeEvents)reduce_only ordersActor.request_instruments(...) methodOrder.would_reduce_only(...) methodDataClient and `ActorReleased on 24th October 2022 (UTC).
MARKET and MARKET_TO_LIMIT) see docsmin_latency, max_latency and avg_latency to HttpClient base classdisplay_qty for iceberg orders, thanks @JackMaReleased on 19th October 2022 (UTC).
This will be the final release with support for Python 3.8.
OrderSide.NONE enum variantPositionSide.NO_POSITION_SIDE enum variantTriggerType enum variantsAggressorSide.UNKNOWN to AggressorSide.NONE (for consistency with other enums)Order.type to Order.order_type (reduces ambiguity and aligns with Rust struct field)OrderInitialized.type to OrderInitialized.order_type reduces ambiguity)Bar.type to Bar.bar_type (reduces ambiguity and aligns with Rust struct field)check_position_exists flaghyperopt as considered unmaintained and there are better optionsQuoteTick is now invalid (change to schema for correctness)OrderInitialized is now invalid (change to schema for emulation)side filter to numerous cache order methodsside filter to numerous cache position methodsorder_side to cancel_all_orders strategy methodposition_side to close_all_positions strategy methodRelativeVolatilityIndex indicator, thanks @graceyangfanOrderMatchingEngine from SimulatedExchange with refinementsMatchingCore from OrderMatchingEngineQuoteTick from raw valuesPosition calculations and account for when any base currency == commission currency, thanks @JackMaReleased on September 15th 2022 (UTC).
This is an early release to address some parsing bugs in the FTX adapter.
None
None
BarReleased on September 14th 2022 (UTC).
ExecEngineConfig allow_cash_positions default to True (more typical use case)check parameter from Bar (always checked for simplicity)MARKET_TO_LIMIT order implementation for SimulatedExchangeorder_id_tag truly optional and auto incrementingCASH accountsIOC and FOK behavior, thanks @limx0 for identifyingCryptoFuture instrument parsing, thanks @limx0LIMIT_IF_TOUCHEDMARKET_IF_TOUCHEDMARKET_TO_LIMITSTOP_LIMITReleased on September 6th 2022 (UTC).
None
BinanceBar to handle enormous quote volumesoverride_usd option for FTX adapterlog_warnings config option for Binance and FTX instrument providersTRD_GRP_005 enum variant for Binance spot permissionsCurrencyType variants in Rustencoding in Catalog parsing method, thanks @limx0 and @aviatorBeijingReleased on September 1st 2022 (UTC).
offset_type to trailing_offset_typeis_frozen_account to frozen_accountbar_execution from config API (implicitly turned on with bars currently)TRAILING_STOP_MARKET order implementation for SimulatedExchangeTRAILING_STOP_LIMIT order implementation for SimulatedExchangeBacktestVenueConfigLoopTimer in live clock for trading node, thanks @sidnvyReleased on August 22nd 2022 (UTC).
None
on_historical_data method with wiring for functionalityWebSocketClient base during reconnectsLatencyModel integer overflows, thanks @limx0FUNDING_FEE updatesasyncio.tasks.gather for Python 3.10+Released on August 15th 2022 (UTC).
BacktestEngine now required venues to be added prior to instrumentsBacktestEngine now requires instruments to be added prior to dataLadder.reverse to Ladder.is_reversedBacktestVenueConfig, thanks @miller-mooreTrader to run without strategies loadedInstrumentProvider base classReleased on 27th June 2022 (UTC).
Instrument.info for ParquetDataCatalogDirectionalMovementIndicator indicator, thanks @graceyangfanKlingerVolumeOscillator indicator, thanks @graceyangfanclientId and start_gateway for IB config, thanks @niks199InstrumentProvider #685, thanks @limx0Released on 30th June 2022 (UTC).
None
unix_nanos_to_iso8601 performance by 30% thanks @ghill2DataCatalog interface for ParquetDataCatalog thanks @jordanparker6AroonOscillator indicator thanks @graceyangfanArcherMovingAveragesTrends indicator thanks @graceyangfanDoubleExponentialMovingAverage indicator thanks @graceyangfanWilderMovingAverage indicator thanks @graceyangfanChandeMomentumOscillator indicator thanks @graceyangfanVerticalHorizontalFilter indicator thanks @graceyangfanBias indicator thanks @graceyangfanNone
Released on 6th June 2022 (UTC).
None
None
Released on 4th June 2022 (UTC).
None
TradingNode disposal flowCommodityChannelIndex indicator thanks @graceyangfanNone
Released on 22nd May 2022 (UTC).
AccountId constructor now takes single value stringUUIDFactory and all associated backing fields and callsClientOrderLinkId (not in use)MARGIN accountsnet_qty in PositionStatusReport thanks to @sidnvyLinearRegression indicator thanks to @graceyangfanReleased on 15th May 2022 (UTC).
This is an early release due to the build error in the sdist for 1.144.0.
The error is due to the nautilus_core Rust source not being included in the sdist package.
expire_time_ns int64 rather than a datetimeexpire_time_ns option handlingPortfolioAnalyzer moved from Trader to PortfolioPortfolioAnalyzer now available to strategies via self.portfolio.analyzerNone
Released on 10th May 2022 (UTC).
BacktestEngine.add_ticks() as redundant with .add_data()BacktestEngine.add_bars() as redundant with .add_data()BacktestEngine.add_generic_data() as redundant with .add_data()BacktestEngine.add_order_book_data() as redundant with .add_data()Position.from_order to Position.opening_order_idStreamingPersistence to StreamingFeatherWriterPersistenceConfig to StreamingConfigPersistenceConfig.flush_interval to flush_interval_msActor.publish_signal for generic dynamic signal dataWEEK and MONTH bar aggregation optionsPosition.closing_order_id propertytags parameter to Strategy.submit_ordercheck_position_exists flag to Strategy.submit_orderunsafe Rust and C null-terminated byte stringsbypass_logging config option will also now bypass the BacktestEngine loggerIOC and FOK time in force instructionsReleased on 21st April 2022 (UTC).
None
None
CashAccount.calculate_balance_locked with no base currencyReleased on 17th April 2022 (UTC).
BacktestNode now requires configs at initializationrun_configs parameter from BacktestNode.run() methodreturn_engine flagTradingStrategy to StrategyTradingStrategyConfig to StrategyConfigrealized_points concept from PositionBacktestNode.get_engines() methodBacktestNode.get_engine(run_config_id) methodActor.request_instrument() method (also applies to Strategy)Cache.snapshot_position() methodnautilus_trader.configdebug mode for engines (with extra debug logging)None
Released on 4th April 2022 (UTC).
BacktestNode.run_sync() to BacktestNode.run()flatten_position() to close_position()flatten_all_positions() to close_all_positions()Order.flatten_side() to Order.closing_side()TradingNodeConfig check_residuals_delay to timeout_post_stopSimulatedExchange will now 'receive' market data prior to the DataEngine
(note that this did not affect any test)DataType types to be subclasses of DataCacheDatabaseConfig.type now defaults to in-memoryNAUTILUS_CATALOG env var changed to NAUTILUS_PATHDataCatalog root path now located under $OLD_PATH/catalog/ from the Nautilus pathhiredis and redis are now optional extras as 'redis'hyperopt is now an optional extra as 'hyperopt'NautilusKernel across backtest and live systemsconfig subpackageBinanceFuturesMarkPriceUpdate type and data streamsubscribe and unsubscribe to templateDataCatalog (#554), (#560) by @limx0DataCatalog (#561) by @limx0CSVReader (#563) by @limx0base_currency for backtestsfully_qualified_name() formatReleased on 13th March 2022 (UTC).
This is a patch release which fixes a moderate severity security vulnerability in pillow < 9.0.1:
If the path to the temporary directory on Linux or macOS contained a space,
this would break removal of the temporary image file after im.show() (and related actions),
and potentially remove an unrelated file. This been present since PIL.
This release upgrades to pillow 9.0.1.
Note the minor version was incremented in error.
Released on 11th March 2022 (UTC).
CurrencySpot to CurrencyPairPerformanceAnalyzer to PortfolioAnalyzerBacktestDataConfig.data_cls_path to data_clsBinanceTicker to BinanceSpotTickerBinanceSpotExecutionClient to BinanceExecutionClientCryptoFuture instrumentOrderType.MARKET_TO_LIMITOrderType.MARKET_IF_TOUCHEDOrderType.LIMIT_IF_TOUCHEDMarketToLimitOrder order typeMarketIfTouchedOrder order typeLimitIfTouchedOrder order typeOrder.has_price property (convenience)Order.has_trigger_price property (convenience)msg parameter to LoggerAdapter.exception()log_send and log_recv config optionsauto_ping_interval (seconds) config optionmsgpack with msgspec (faster drop in replacement https://github.com/jcrist/msgspec)BacktestDataConfig API: now takes either a type of Data or a fully qualified path stringReleased on 15th February 2022 (UTC).
This release contains numerous method, parameter and property name changes
For consistency and standardization with other protocols, the ExecutionId type
has been renamed to TradeId as they express the same concept with a more
standardized terminology. In the interests of enforcing correctness and
safety this type is now utilized for the TradeTick.trade_id.
working orders to open orders including all associated methods and paramscompleted orders to closed orders including all associated methods and paramsactive order concept (often confused with open)trigger to trigger_priceStopMarketOrder.price to StopMarketOrder.trigger_priceStopMarketOrders price to trigger_priceExecutionId to TradeIdexecution_id to trade_idOrder.trade_id to Order.last_trade_id (for clarity)contingency to contingency_typeTradeId type to enforce trade_id typingExecEngineConfig config option allow_cash_positions (False by default)TrailingOffsetType enumTrailingStopMarketOrderTrailingStopLimitOrdertrigger_type parameter to stop ordersTriggerType enumReleased on 15th January 2022 (UTC).
This is a patch release which fixes moderate to high severity security vulnerabilities in
pillow < 9.0.0:
This release upgrades to pillow 9.0.0.
Released on 12th January 2022 (UTC).
currency parameter from AccountBalancelocal_symbol to native_symbolVenueType enum and venue_type parameter in favour of a routing bool flagaccount_id parameter from execution client factories and constructorsMarginBalance object to assist with margin account functionalityBarType with symbols including hyphens -BinanceSpotTicker __repr__ (was missing whitespace after a comma)DataEngine requests for historical TradeTickDataEngine _handle_data_response typing of data to objectReleased on 29th December 2021.
subscribe_data(...) method (client_id now optional)unsubscribe_data(...) method (client_id now optional)publish_data(...) method (added data_type)MessageBus.subscriptions method parameter to patternMessageBus.has_subscribers method parameter to patternsubscribe_strategy_data(...) methodunsubscribe_strategy_data(...) methodpublish_strategy_data(...) methodCryptoSwap to CryptoPerpetualCancelOrder to allow None venue_order_idModifyOrder to allow None venue_order_idOrderPendingUpdate to allow None venue_order_idOrderPendingCancel to allow None venue_order_idOrderCancelRejected to allow None venue_order_idOrderModifyRejected to allow None venue_order_idDataType.topic string for improved message bus handlingDataType, BarSpecification and BarTypeQuoteTickDataWrangler.process_bar_data with random_seedReleased on 13th December 2021.
match_id to trade_idDataCatalogCancelAllOrders commandcpu_freq call in logging for ARM architectureGenericData in backtestsReleased on 22nd November 2021.
hidden order option to display_qty to support iceberg ordersTrader.component_ids() to Trader.actor_ids()Trader.component_states() to Trader.actor_states()Trader.add_component() to Trader.add_actor()Trader.add_components() to Trader.add_actors()Trader.clear_components() to Trader.clear_actors()Actor clock time advancement in backtest engineReleased on 8th November 2021.
None
LatencyModel for simulated exchangelast_update_id to order booksupdate_id to order book datadepth parameter when subscribing to order book deltasClock.timestamp_ms()TestDataProvider and consolidate test dataBacktestNode fixesReleased on 24th October 2021.
Actor constructor now takes ActorConfigActorConfigImportableActorConfigActorFactoryactors to BacktestRunConfigInstrumentProviderBacktestNodeReleased on 10th October 2021.
nanos_to_unix_dt to unix_nanos_to_dt (more accurate name)Clock.set_time_alert(...) method signatureClock.set_timer(...) method signaturepd.Timestamp from TimeEventOrderList submission and OTO, OCO contingencies now operationalCache.orders_for_position(...) methodCache.position_for_order(...) methodSimulatedExchange.get_working_bid_orders(...) methodSimulatedExchange.get_working_ask_orders(...) methodrun_config_id for backtest runsBacktestResult objectClock.set_time_alert_ns(...) methodClock.set_timer_ns(...) methodfill_limit_at_price simulated exchange optionfill_stop_at_price simulated exchange optionOrderUpdated leaves quantity calculationReleased on 26th September 2021.
BacktestEngine.run method signature changeBookLevel to BookTypeFillModel paramsquantstats (removed empyrical)BacktestEngine.run_streaming()BacktestEngine.end_streaming()Portfolio.balances_locked(venue)DataCatalog functionalityBacktestEngineSimulatedExchange message processingBacktestEngine event ordering in main loopCASH accountsreduce-only ordersPositionId handling for HEDGING OMS exchangesInstrument serializationCASH account PnL calculations with base currencyReleased on 12th September 2021.
UpdateOrder to ModifyOrder (terminology standardization)DeltaType to BookAction (terminology standardization)BacktestNodeBookIntegrityError with improved integrity checks for order booksActor.register_warning_event (also applicable to TradingStrategy)Actor.deregister_warning_event (also applicable to TradingStrategy)ContingencyType enum (for contingent orders in an OrderList)reduce_only (#437)UUID4 using the Rust fastuuid Python bindingsint64_t nanosecond timestamps (#363)reduce_only orders for both submission and filling (#437)CASH accounts when commission negative (#436), thanks for reporting @imcuReleased on 30th August 2021.
This release continues the focus on the core system, with upgrades and cleanups
to the component base class. The concept of an active order has been introduced,
which is an order whose state can change (is not a completed order).
pydantic upgradeDataProducerFacade to DataProducerfill.side to fill.order_side (clarity and standardization)fill.type to fill.order_type (clarity and standardization)pydanticBacktestEngineBacktestEngine.add_bar_objects()BacktestEngine.add_bars_as_ticks()active concept, with order.is_active and cache methodsComponentStateChanged eventComponent.degrade() and Component.fault() command methodsComponent.on_degrade() and Component.on_fault() handler methodsComponentState.PRE_INITIALIZEDComponentState.DEGRADINGComponentState.DEGRADEDComponentState.FAULTINGComponentState.FAULTEDComponentTrigger.INITIALIZEComponentTrigger.DEGRADEComponentTrigger.DEGRADEDComponentTrigger.FAULTComponentTrigger.FAULTEDTicker data typeDataEngine.subscribed_bars() now reports internally aggregated bars also.Released on 17th August 2021.
This release has again focused on core areas of the platform, including a
significant overhaul of accounting and portfolio components. The wiring between
the DataEngine and DataClient(s) has also received attention, and should now
exhibit correct subscription mechanics.
The Betfair adapter has been completely re-written, providing various fixes and enhancements, increased performance, and full async support.
There has also been some further renaming to continue to align the platform as closely as possible with established terminology in the domain.
Instrument to AccountPortfolio.register_accountOrderState to OrderStatusOrder.state to Order.statusmsgbus.message_bus to msgbus.busaccounting subpackageportfolio subpackageAccount with CashAccount and MarginAccountAccountsManagerAccountFactoryAccountFactoryAccountFactoryExecutionClient.create_account for custom account classesPortfolioFacade from PortfolioDataEngineCash accounts no longer generate spurious marginsTimeBarAggregator._stored_close_ns property nameReleased on 3rd August 2021.
This is a patch release which fixes a bug involving NotImplementedError
exception handling when subscribing to order book deltas when not supported by
a client. This bug affected CCXT order book subscriptions.
None
None
DataEngine order book subscription handlingReleased on 2nd August 2021.
This release sees the completion of the initial implementation of the
MessageBus, with data now being handled by Pub/Sub patterns, along with the
additions of point-to-point and Req/Rep messaging functionality.
An Actor base class has been abstracted from TradingStrategy which allows
custom components to be added to a Trader which aren't necessarily trading
strategies, opening up further possibilities for extending NautilusTrader with
custom functionality.
For the sake of simplicity and to favour more idiomatic Python, the null object pattern is no longer utilized for handling identifiers. This has removed a layer of 'logical indirection' in certain parts of the codebase, and allows for simpler code.
An order is now considered 'in-flight' if it is actively pending a state
transition i.e. in the SUBMITTED,PENDING_UPDATE or PENDING_CANCEL states.
It is now a well established convention that all integer based timestamps are
expressed in UNIX nanoseconds, therefore the _ns postfix has now been dropped.
For clarity - time periods/intervals/objects where the units may not be obvious
have retained the _ns postfix.
The opportunity was identified to unify the parameter naming for the concept
of object instantiation by renaming timestamp_ns and ts_recv_ns to ts_init.
Along the same lines, the timestamps for both event and data occurrence have
been standardized to ts_event.
It is acknowledged that the frequent name changes and modifications to core concepts may be frustrating, however whilst still in a beta phase - we're taking the opportunity to lay a solid foundation for this project to continue to growth in the years ahead.
timestamp_ns to ts_initts_recv_ns to ts_eventts_eventActor component base classMessageBus.register()MessageBus.send()MessageBus.request()MessageBus.response()Trader.add_component()Trader.add_components()Trader.add_log_sink()ExecutionEngine position flip logic in certain edge casesReleased on 18th July 2021.
This release introduces a major re-architecture of the internal messaging system. A common message bus has been implemented which now handles all events via a Pub/Sub messaging pattern. The next release will see all data being handled by the message bus, see the related issue for further details on this enhancement.
Another notable feature is the introduction of the order 'in-flight' concept,
which is a submitted order which has not yet been acknowledged by the
trading venue. Several properties on Order, and methods on Cache, now exist
to support this.
The Throttler has been refactored and optimized further. There has also been
extensive reorganization of the model sub-package, standardization of identifiers
on events, along with numerous 'under the hood' cleanups and two bug fixes.
MessageType enum to MessageCategoryfill.order_side to fill.sidefill.order_type to fill.typeEvent serialization due to domain refactoringsMessageBus classTraderId to Order and PositionOrderType to OrderFilledOrder and CacheThrottlerstr and reprstr and reprAccount str and reprorjson over json for efficiencyBypassCacheDatabasemypy to the codebaseReleased on 6th July 2021.
This release sees the expansion of pre-trade risk check options (see
RiskEngine class documentation). There has also been extensive 'under the
hood' code cleanup and consolidation.
Position.opened_timestamp_ns to ts_opened_nsPosition.closed_timestamp_ns to ts_closed_nsPosition.open_duration_ns to duration_nsbypass_logging to bypassPositionEvent typesRiskEngine iteration 2Throttler functionality and performanceOrderInvalid state and associated codeCASH account typesReleased on 20th June 2021.
A major feature of this release is a complete re-design of serialization for the platform, along with initial support for the Parquet format. The MessagePack serialization functionality has been refined and retained.
In the interests of explicitness there is now a convention that timestamps are
named either timestamp_ns, or prepended with ts. Timestamps which are
represented with an int64 are always in nanosecond resolution, and appended
with _ns accordingly.
Initial scaffolding for new backtest data tooling has been added.
OrderState.PENDING_REPLACE to OrderState.PENDING_UPDATEtimestamp_origin_ns to ts_event_nstimestamp_ns for data to ts_recv_nsupdated_ns to ts_updated_nssubmitted_ns to ts_submitted_nsrejected_ns to ts_rejected_nsaccepted_ns to ts_accepted_nspending_ns to ts_pending_nscanceled_ns to ts_canceled_nstriggered_ns to ts_triggered_nsexpired_ns to ts_expired_nsexecution_ns to ts_filled_nsOrderBookLevel to BookLevelOrder.volume to Order.sizeto_dict() and from_dict() methodsOrder.is_pending_updateOrder.is_pending_cancelrun_analysis config option for BacktestEngineTradeMatchId in favour of bare stringpd.Timestamp when checking timestampsto_serializable_str methodsfrom_serializable_str methods__ne__ implementationsMsgPackSerializer cruftObjectCache and IdentifierCacheCCXTExecutionClientUpdateOrder handlingimport *Released on 6th June 2021.
This release includes numerous breaking changes with a view to enhancing the core functionality and API of the platform. The data and execution caches have been unified for simplicity. There have also been large changes to the accounting functionality, with 'hooks' added in preparation for accurate calculation and handling of margins.
Account.balance() to Account.balance_total()TradingStrategy.data into TradingStrategy.cacheTradingStrategy.execution into TradingStrategy.cacheredis subpackage into infrastructureInstrumentInstrument.market_value()Portfolio.market_values() to Portfolio.net_exposures()Portfolio.market_value() to Portfolio.net_exposure()InMemoryExecutionDatabase to BypassCacheDatabasePosition.relative_qty to Position.net_qtydefault_currency to base_currencycost_currency property from InstrumentExecutionClient now has the option of calculating account stateCachePortfolio component registrationCache into componentsrepr to execution messagesAccountType enumcost_currency to Positionget_cost_currency() to Instrumentget_base_currency() to InstrumentOrder.is_working for PENDING_CANCEL and PENDING_REPLACE statesReleased on 30th May 2021.
In this release there has been a major change to the use of inlines for method signatures. From the Cython docs: "Note that class-level cdef functions are handled via a virtual function table so the compiler won’t be able to inline them in almost all cases.". https://cython.readthedocs.io/en/latest/src/userguide/pyrex_differences.html?highlight=inline.
It has been found that adding inline to method signatures makes no difference
to the performance of the system - and so they have been removed to reduce
'noise' and simplify the codebase. Note that the use of inline for
module level functions will be passed to the C compiler with the expected
result of inlining the function.
BacktestEngine.add_venue added venue_type to method paramsExecutionClient added venue_type to constructor paramsTraderId instantiationStrategyId instantiationInstrument serializationPortfolio pending calculations if data not immediately availableinstruments subpackage with expanded class definitionstimestamp_origin_ns timestamp when originally occurredAccountState.is_reported flagging if reported by exchange or calculatedTraderId and StrategyId identifiersExecutionEngine order routingExecutionEngine client registrationVenueType enum and parserMoney and Quantity thousands commasTICK_SIZE precision mode - size precisions (BitMEX, FTX)This release focuses on simplifications and enhancements of existing machinery
Position now requires an Instrument paramis_inverse removed from OrderFilledClientId removed from TradingCommand and subclassesAccountId removed from TradingCommand and subclassesTradingCommand serializationInstrument methods to ExecutionCacheVenue filter to cache queriesRiskEngineRiskEngineNone
This release applies another major refactoring to the value object API for
BaseDecimal and its subclasses Price and Quantity. Previously a precision
was not explicitly required when passing in a decimal.Decimal type which
sometimes resulted in unexpected behavior when a user passed in a decimal with
a very large precision (when wrapping a float with decimal.Decimal).
Convenience methods have been added to Price and Quantity where precision
is implicitly zero for ints, or implied in the number of digits after the '.'
point for strings. Convenience methods have also been added to Instrument to
assist the UX.
The serialization of Money has been improved with the inclusion of the
currency code in the string delimited by whitespace. This avoids an additional
field for the currency code.
RiskEngine has been rewired ahead of ExecutionEngine which clarifies areas
of responsibility and cleans up the registration sequence and allows a more
natural flow of command and event messages.
MoneyPrice and QuantityBypassExecutionDatabase to BypassCacheDatabaseRiskEngine and ExecutionEngine sequenceInstrument database operationsMsgPackInstrumentSerializerPrice.from_str()Price.from_int()Quantity.zero()Quantity.from_str()Quantity.from_int()Instrument.make_price()Instrument.make_qty()Moneydecimal.Decimal values passed to value objectsThis release simplifies the backtesting workflow by removing the need for the
intermediate BacktestDataContainer. There has also been some simplifications
for OrderFill events, as well as additional order states and events.
SimulatedExchange no longer generates OrderAccepted for MarketOrderBacktestDataContainerOrderFilled.cum_qtyOrderFilled.leaves_qtyBacktestEngine constructor simplifiedBacktestMarketDataClient no longer needs instrumentsPortfolioAnalyzer.get_realized_pnls to .realized_pnlsBacktestEngine to take data directlyOrderState.PENDING_CANCELOrderState.PENDING_REPLACEOrderPendingUpdate eventOrderPendingCancel eventOrderFilled.is_buy property (with corresponding is_buy_c() fast method)OrderFilled.is_sell property (with corresponding is_sell_c() fast method)Position.is_opposite_side(OrderSide side) convenience methodOrder FSM and event handling for the aboveExecutionClient base classSimulatedExchange for greater clarityExecutionCache positions open queriesOmsType.NETTINGOmsType.NETTINGThe major thrust of this release is added support for order book data in
backtests. The SimulatedExchange now maintains order books of each instrument
and will accurately simulate market impact with L2/L3 data. For quote and trade
tick data a L1 order book is used as a proxy. A future release will include
improved fill modelling assumptions and customizations.
OrderBook.create now takes Instrument and BookLevelSimulatedExchange now maintains order books internallyLiveLogger now exhibits better blocking behavior and loggingAnnouncing official Windows 64-bit support.
Several bugs have been identified and fixed.
None
Queue.peek() to high-performance queueOrderBook.create for BookLevel.L3 now returns correct bookThis release includes substantial breaking changes.
Further fundamental changes to the core API have been made.
ClientId for data and execution client identificationOrderBookOperation to OrderBookDeltaOrderBookOperations to OrderBookDeltasOrderBookOperationType to OrderBookDeltaTypeNone
None
This release includes substantial breaking changes.
Due to recent feedback and much further thought - a major renaming has been carried
out involving order identifiers. The Order is the only domain object in the
model which is identified with more than one ID. Due to this, more explicitness
helps to ensure correct logic. Previously the OrderId was
implicitly assumed to be the one assigned by the trading venue. This has been
clarified by renaming the identifier to VenueOrderId. Following this, it no
longer made sense to refer to it through Order.id, and so this was changed to
its full name Order.venue_order_id. This naturally resulted in ClientOrderId(s)
being renamed in properties and variables from cl_ord_id to client_order_id.
OrderId to VenueOrderIdOrder.id to Order.venue_order_idOrder.cl_ord_id to Order.client_order_idAssetClass.STOCK to AssetClass.EQUITYgenerate_position_ids (handled by OmsType)AssetClass.METAL and AssetClass.ENERGYVenueStatusEvent, InstrumentStatusEvent and InstrumentClosePricenp.ndarray to improve function and indicator performanceThis release includes substantial breaking changes.
Further standardization of naming conventions along with internal refinements and fixes.
AmendOrder to UpdateOrderOrderAmended to OrderUpdatedamend and amended related methods to update and updatedOrderCancelReject to OrderCancelRejected (standardize tense)Logger and general system loggingstdout and stderr log streams with configurationOrderBookData base classGenericData and OrderBook related dataDataClient creation logic prevented client registeringThis release includes substantial breaking changes.
Further standardization of naming conventions along with internal refinements and fixes.
AmendOrder to UpdateOrderOrderAmended to OrderUpdatedamend and amended related methods to update and updatedOrderCancelReject to OrderCancelRejected (standardize tense)OrderUpdateRejected, event separated for clarityQueueBacktestEngineVenueOrderId equality when applying order eventsUNDEFINED enum values. Do not allow invalid values to be represented
in the system (prefer throwing exceptions)This release includes substantial breaking changes.
The platforms internal timestamping has been standardized to nanoseconds. This
decision was made to increase the accuracy of backtests to nanosecond precision,
improve data handling including order book and custom data for backtesting, and
to future-proof the platform to a more professional standard. The top-level user
API still takes datetime and timedelta objects for usability.
There has also been some standardization of naming conventions to align more closely with established financial market terminology with reference to the FIX5.0 SP2 specification, and CME MDP 3.0.
BarType into Bar as a propertyBar handling methods due to aboveInstrument.leverage (incorrect place for concept)ExecutionClient.venue as a Venue to ExecutionClient.name as a strint64OrderFilled.filled_qty to OrderFilled.last_qtyOrderFilled.filled_price to OrderFilled.last_pxavg_price to avg_px in methods and propertiesavg_open to avg_px_open in methods and propertiesavg_close to avg_px_close in methods and propertiesPosition.relative_quantity to Position.relative_qtyPosition.peak_quantity to Position.peak_qtynautilus_trader.core.datetimebroker property to Venue to assist with routingLiveExecutionEngine and LiveExecutionClientDataCache incorrectly caching barsThis release adds further enhancements to the platform.
None
RiskEngine built out including configuration options hook and
LiveRiskEngine implementationThrottlerdict to instrument_id related requests to cover IB futures
contractsput coroutines in live engines when blocking at maxlen was not
creating a task on the event loop.This release applies one more major change to the identifier API. Security has
been renamed to InstrumentId for greater clarity that the object is an identifier,
and to group the concept of an instrument with its identifier.
Data objects in the framework have been further abstracted to prepare for the handling of custom data in backtests.
A RiskEngine base class has also been scaffolded.
Security renamed to InstrumentIdInstrument.security renamed to Instrument.idData becomes an abstract base class with timestamp and unix_timestamp
propertiesData and DataType moved to model.dataon_data methods now take GenericDataGenericDataFuture instrumentNone
The main thrust of this release is to refine and further bed down the changes
to the identifier model via InstrumentId, and fix some bugs.
Errors in the CCXT clients caused by the last release have been addressed.
InstrumentId now takes first class value object SymbolInstrumentId asset_class and asset_type no longer optionalSimulatedExchange.venue changed to SimulatedExchange.idTestTimer advances monotonically increaseAssetClass.BETTINGinstrument_id vs symbol namingInstrumentId equality and hashingThis release executes a major refactoring of Symbol and how securities are
generally identified within the platform. This will allow a smoother integration
with Interactive Brokers and other exchanges, brokerages and trading
counterparties.
Previously the Symbol identifier also included a venue which confused the concept.
The replacement Security identifier more clearly expresses the domain with a
symbol string, a primary Venue, AssetClass and AssetType properties.
Security replaces Symbol with expanded propertiesAssetClass.EQUITY changed to AssetClass.STOCKfrom_serializable_string changed to from_serializable_strto_serializable_string changed to to_serializable_strAssetType.WARRANTStopLimitOrder serializationThis is a patch release which applies various fixes and refactorings.
The behavior of the StopLimitOrder continued to be fixed and refined.
SimulatedExchange was refactored further to reduce complexity.
None
None
TRIGGERED states in order FSMStopLimitOrder triggering behaviorOrderFactory.stop_limit missing post_only and hiddenOrder and StopLimitOrder __repr__ string (duplicate id)The main thrust of this release is to refine some subtleties relating to order
matching and amendment behavior for improved realism. This involved a fairly substantial refactoring
of SimulatedExchange to manage its complexity, and support extending the order types.
The post_only flag for LIMIT orders now results in the expected behavior regarding
when a marketable limit order will become a liquidity TAKER during order placement
and amendment.
Test coverage was moderately increased.
None
SimulatedExchange order matching and amendment logicrisk subpackage to group risk componentsStopLimitOrder triggering behaviorThe main thrust of this release is to introduce the Interactive Brokers integration, and begin adding platform capabilities to support this effort.
from_serializable_string methods changed to from_serializable_stradapters/ibFuture instrument typeStopLimitOrder order typeData and DataType types to support custom data handlingInstrumentId identifier types initial implementation to support extending the platforms capabilitiesBracketOrder correctness