Core Concepts ¶
There are three main use cases for this software package:
-
Backtesting trading systems with historical data (
backtest
) -
Testing trading systems with real-time data and simulated execution (
sandbox
) -
Deploying trading systems with real-time data and executing on venues with real (or paper) accounts (
live
)
The projects codebase provides a framework for implementing the software layer of systems which achieve the above. You will find
the default
backtest
and
live
system implementations in their respectively named subpackages. A
sandbox
environment can
be built using the sandbox adapter.
Note
All examples will utilize these default system implementations.
Note
We consider trading strategies to be subcomponents of end-to-end trading systems, these systems include the application and infrastructure layers.
Distributed ¶
The platform is designed to be easily integrated into a larger distributed system. To facilitate this, nearly all configuration and domain objects can be serialized using JSON, MessagePack or Apache Arrow (Feather) for communication over the network.
Common core ¶
The common system core is utilized by both the backtest, sandbox, and live trading nodes. User-defined Actor and Strategy components are managed consistently across these environment contexts.
Backtesting ¶
Backtesting can be achieved by first making data available to a
BacktestEngine
either directly or via
a higher level
BacktestNode
and
ParquetDataCatalog
, and then running the data through the system with nanosecond resolution.
Live trading ¶
A
TradingNode
can ingest data and events from multiple data and execution clients.
Live deployments can use both demo/paper trading accounts, or real accounts.
For live trading, a
TradingNode
can ingest data and events from multiple data and execution clients.
The system supports both demo/paper trading accounts and real accounts. High performance can be achieved by running
asynchronously on a single
event loop
,
with the potential to further boost performance by leveraging the
uvloop
implementation (available for Linux and macOS).
Domain model ¶
The platform features a comprehensive trading domain model that includes various value types such as
Price
and
Quantity
, as well as more complex entities such as
Order
and
Position
objects,
which are used to aggregate multiple events to determine state.
Data Types ¶
The following market data types can be requested historically, and also subscribed to as live streams when available from a data publisher, and implemented in an integrations adapter.
-
OrderBookDelta
-
OrderBookDeltas
(L1/L2/L3) -
OrderBookSnapshot
(L1/L2/L3) -
Ticker
-
QuoteTick
-
TradeTick
-
Bar
-
Instrument
-
VenueStatusUpdate
-
InstrumentStatusUpdate
The following PriceType options can be used for bar aggregations;
-
BID
-
ASK
-
MID
-
LAST
The following BarAggregation options are possible;
-
MILLISECOND
-
SECOND
-
MINUTE
-
HOUR
-
DAY
-
WEEK
-
MONTH
-
TICK
-
VOLUME
-
VALUE
(a.k.a Dollar bars) -
TICK_IMBALANCE
-
TICK_RUNS
-
VOLUME_IMBALANCE
-
VOLUME_RUNS
-
VALUE_IMBALANCE
-
VALUE_RUNS
The price types and bar aggregations can be combined with step sizes >= 1 in any way through a
BarSpecification
.
This enables maximum flexibility and now allows alternative bars to be aggregated for live trading.
Account Types ¶
The following account types are available for both live and backtest environments;
-
Cash
single-currency (base currency) -
Cash
multi-currency -
Margin
single-currency (base currency) -
Margin
multi-currency -
Betting
single-currency
Order Types ¶
The following order types are available (when possible on an exchange);
-
MARKET
-
LIMIT
-
STOP_MARKET
-
STOP_LIMIT
-
MARKET_TO_LIMIT
-
MARKET_IF_TOUCHED
-
LIMIT_IF_TOUCHED
-
TRAILING_STOP_MARKET
-
TRAILING_STOP_LIMIT