A high-performance algorithmic trading platform and event-driven backtester
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 options contract activation and expiration simulationParquetDataCatalog
S3 support (#1620), thanks @benjaminsingletonBar.from_raw_arrays_to_list
(#1623), thanks @rsmb7zSandboxExecutionClientConfig.bar_execution
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
param 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_str
TimeEvent
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 PythonOrderBookDelta
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.add
flags
parameter to OrderBook.update
flags
parameter to OrderBook.delete
info
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 param 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 the report @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)Binance
bar (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)InteractiveBrokersEWrapper
, thanks @rsmb7zredis
crate to 0.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
option for pyo3 based logging initialization (worse performance but allows visibility into logs originating from Rust)exchange
field to FuturesContract
, FuturesSpread
, OptionsContract
and OptionsSpread
(optional)exchange
field for FuturesContract
, FuturesSpread
, OptionsContract
and OptionsSpread
MessageBus
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 typeOptionsSpread
instrument typeInstrumentClass.FUTURE_SPREAD
InstrumentClass.OPTION_SPREAD
managed
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 system)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
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_TYPES
StreamingConfig.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 @rsmb7z