Skip to content

Commit ea441c3

Browse files
authored
1.104.0
2 parents a25dfe0 + 2f5b7b2 commit ea441c3

35 files changed

+851
-557
lines changed

examples/backtest/fx_market_maker_gbpusd_bars.py

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
# limitations under the License.
1515
# -------------------------------------------------------------------------------------------------
1616

17+
from datetime import datetime
1718
from decimal import Decimal
1819
import os
1920
import pathlib

nautilus_trader/adapters/ccxt/data.pxd

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@
1414
# -------------------------------------------------------------------------------------------------
1515

1616
from nautilus_trader.adapters.ccxt.providers cimport CCXTInstrumentProvider
17-
from nautilus_trader.live.data_client cimport LiveDataClient
17+
from nautilus_trader.live.data_client cimport LiveMarketDataClient
1818
from nautilus_trader.model.bar cimport Bar
1919
from nautilus_trader.model.bar cimport BarSpecification
2020
from nautilus_trader.model.bar cimport BarType
2121
from nautilus_trader.model.identifiers cimport Symbol
2222
from nautilus_trader.model.tick cimport TradeTick
2323

2424

25-
cdef class CCXTDataClient(LiveDataClient):
25+
cdef class CCXTDataClient(LiveMarketDataClient):
2626
cdef object _client
2727
cdef CCXTInstrumentProvider _instrument_provider
2828

nautilus_trader/adapters/ccxt/data.pyx

+3-4
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ from nautilus_trader.core.correctness cimport Condition
2828
from nautilus_trader.core.datetime cimport from_unix_time_ms
2929
from nautilus_trader.core.datetime cimport to_unix_time_ms
3030
from nautilus_trader.core.uuid cimport UUID
31-
from nautilus_trader.live.data_client cimport LiveDataClient
31+
from nautilus_trader.live.data_client cimport LiveMarketDataClient
3232
from nautilus_trader.live.data_engine cimport LiveDataEngine
3333
from nautilus_trader.model.bar cimport Bar
3434
from nautilus_trader.model.bar cimport BarSpecification
@@ -40,7 +40,6 @@ from nautilus_trader.model.c_enums.price_type cimport PriceType
4040
from nautilus_trader.model.c_enums.price_type cimport PriceTypeParser
4141
from nautilus_trader.model.identifiers cimport Symbol
4242
from nautilus_trader.model.identifiers cimport TradeMatchId
43-
from nautilus_trader.model.identifiers cimport Venue
4443
from nautilus_trader.model.instrument cimport Instrument
4544
from nautilus_trader.model.objects cimport Price
4645
from nautilus_trader.model.objects cimport Quantity
@@ -52,7 +51,7 @@ from nautilus_trader.model.tick cimport TradeTick
5251
cdef int _SECONDS_IN_HOUR = 60 * 60
5352

5453

55-
cdef class CCXTDataClient(LiveDataClient):
54+
cdef class CCXTDataClient(LiveMarketDataClient):
5655
"""
5756
Provides a data client for the unified CCXT Pro API.
5857
"""
@@ -85,7 +84,7 @@ cdef class CCXTDataClient(LiveDataClient):
8584
8685
"""
8786
super().__init__(
88-
Venue(client.name.upper()),
87+
client.name.upper(),
8988
engine,
9089
clock,
9190
logger,

nautilus_trader/adapters/oanda/data.pxd

+2-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import threading
1919

2020
from nautilus_trader.adapters.oanda.providers cimport OandaInstrumentProvider
2121
from nautilus_trader.core.uuid cimport UUID
22-
from nautilus_trader.live.data_client cimport LiveDataClient
22+
from nautilus_trader.live.data_client cimport LiveMarketDataClient
2323
from nautilus_trader.model.bar cimport Bar
2424
from nautilus_trader.model.bar cimport BarType
2525
from nautilus_trader.model.c_enums.price_type cimport PriceType
@@ -29,7 +29,7 @@ from nautilus_trader.model.tick cimport QuoteTick
2929
from nautilus_trader.model.tick cimport TradeTick
3030

3131

32-
cdef class OandaDataClient(LiveDataClient):
32+
cdef class OandaDataClient(LiveMarketDataClient):
3333
cdef object _client
3434
cdef str _account_id
3535
cdef set _subscribed_instruments

nautilus_trader/adapters/oanda/data.pyx

+3-4
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ from nautilus_trader.core.constants cimport * # str constants only
3232
from nautilus_trader.core.correctness cimport Condition
3333
from nautilus_trader.core.datetime cimport format_iso8601
3434
from nautilus_trader.core.uuid cimport UUID
35-
from nautilus_trader.live.data_client cimport LiveDataClient
35+
from nautilus_trader.live.data_client cimport LiveMarketDataClient
3636
from nautilus_trader.live.data_engine cimport LiveDataEngine
3737
from nautilus_trader.model.bar cimport Bar
3838
from nautilus_trader.model.bar cimport BarData
@@ -42,7 +42,6 @@ from nautilus_trader.model.c_enums.bar_aggregation cimport BarAggregationParser
4242
from nautilus_trader.model.c_enums.price_type cimport PriceType
4343
from nautilus_trader.model.c_enums.price_type cimport PriceTypeParser
4444
from nautilus_trader.model.identifiers cimport Symbol
45-
from nautilus_trader.model.identifiers cimport Venue
4645
from nautilus_trader.model.instrument cimport Instrument
4746
from nautilus_trader.model.objects cimport Price
4847
from nautilus_trader.model.objects cimport Quantity
@@ -52,7 +51,7 @@ from nautilus_trader.model.tick cimport QuoteTick
5251
cdef int _SECONDS_IN_HOUR = 60 * 60
5352

5453

55-
cdef class OandaDataClient(LiveDataClient):
54+
cdef class OandaDataClient(LiveMarketDataClient):
5655
"""
5756
Provides a data client for the `Oanda` brokerage.
5857
"""
@@ -83,7 +82,7 @@ cdef class OandaDataClient(LiveDataClient):
8382
8483
"""
8584
super().__init__(
86-
Venue("OANDA"),
85+
"OANDA",
8786
engine,
8887
clock,
8988
logger,

nautilus_trader/backtest/data_client.pxd

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313
# limitations under the License.
1414
# -------------------------------------------------------------------------------------------------
1515

16-
from nautilus_trader.data.client cimport DataClient
16+
from nautilus_trader.data.client cimport MarketDataClient
1717

1818

19-
cdef class BacktestDataClient(DataClient):
19+
cdef class BacktestMarketDataClient(MarketDataClient):
2020
cdef dict _instruments
2121
cdef bint _is_connected

nautilus_trader/backtest/data_client.pyx

+11-6
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,22 @@ from nautilus_trader.common.clock cimport Clock
2323
from nautilus_trader.common.logging cimport Logger
2424
from nautilus_trader.core.correctness cimport Condition
2525
from nautilus_trader.core.uuid cimport UUID
26-
from nautilus_trader.data.client cimport DataClient
26+
from nautilus_trader.data.client cimport MarketDataClient
2727
from nautilus_trader.data.engine cimport DataEngine
2828
from nautilus_trader.model.bar cimport BarType
2929
from nautilus_trader.model.identifiers cimport Symbol
30-
from nautilus_trader.model.identifiers cimport Venue
3130
from nautilus_trader.model.instrument cimport Instrument
3231

3332

34-
cdef class BacktestDataClient(DataClient):
33+
cdef class BacktestMarketDataClient(MarketDataClient):
3534
"""
3635
Provides an implementation of `DataClient` for backtesting.
3736
"""
3837

3938
def __init__(
4039
self,
4140
list instruments not None,
42-
Venue venue not None,
41+
str name not None,
4342
DataEngine engine not None,
4443
Clock clock not None,
4544
Logger logger not None,
@@ -60,15 +59,21 @@ cdef class BacktestDataClient(DataClient):
6059
6160
"""
6261
super().__init__(
63-
venue,
62+
name,
6463
engine,
6564
clock,
6665
logger,
6766
)
6867

6968
self._instruments = {}
7069
for instrument in instruments:
71-
Condition.equal(instrument.symbol.venue, self.venue, "instrument.symbol.venue", "self.venue")
70+
# Check the instrument is for the correct client
71+
Condition.equal(
72+
instrument.symbol.venue.value,
73+
self.name,
74+
"instrument.symbol.venue.value",
75+
"self.name",
76+
)
7277
self._instruments[instrument.symbol] = instrument
7378

7479
self.is_connected = False

nautilus_trader/backtest/engine.pyx

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import pytz
1818
from cpython.datetime cimport datetime
1919

2020
from nautilus_trader.analysis.performance cimport PerformanceAnalyzer
21-
from nautilus_trader.backtest.data_client cimport BacktestDataClient
21+
from nautilus_trader.backtest.data_client cimport BacktestMarketDataClient
2222
from nautilus_trader.backtest.data_container cimport BacktestDataContainer
2323
from nautilus_trader.backtest.data_producer cimport BacktestDataProducer
2424
from nautilus_trader.backtest.data_producer cimport CachedProducer
@@ -238,9 +238,9 @@ cdef class BacktestEngine:
238238
if instrument.symbol.venue == venue:
239239
instruments.append(instrument)
240240

241-
data_client = BacktestDataClient(
241+
data_client = BacktestMarketDataClient(
242242
instruments=instruments,
243-
venue=venue,
243+
name=venue.value,
244244
engine=self._data_engine,
245245
clock=self._test_clock,
246246
logger=self._test_logger,

nautilus_trader/data/base.pxd

+14
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,20 @@ from nautilus_trader.model.tick cimport QuoteTick
2727
from nautilus_trader.model.tick cimport TradeTick
2828

2929

30+
cdef class Data:
31+
cdef readonly DataType data_type
32+
"""The data type for the data.\n\n:returns: `DataType`"""
33+
cdef readonly object data
34+
"""The data.\n\n:returns: `object`"""
35+
36+
37+
cdef class DataType:
38+
cdef readonly type type
39+
"""The type of the data.\n\n:returns: `type`"""
40+
cdef readonly dict metadata
41+
"""The data types metadata.\n\n:returns: `dict[str, object]`"""
42+
43+
3044
cdef class DataCacheFacade:
3145

3246
# -- QUERIES --------------------------------------------------------------------------------------- # noqa

nautilus_trader/data/base.pyx

+60
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,66 @@ from nautilus_trader.model.tick cimport QuoteTick
2525
from nautilus_trader.model.tick cimport TradeTick
2626

2727

28+
cdef class Data:
29+
"""
30+
Represents wrapped data which includes data type information.
31+
"""
32+
33+
def __init__(self, DataType data_type not None, data not None):
34+
"""
35+
Initialize a new instance of the `Data` class.
36+
37+
Parameters
38+
----------
39+
data_type : DataType
40+
The data type.
41+
data : object
42+
The data object to wrap.
43+
44+
"""
45+
self.data_type = data_type
46+
self.data = data
47+
48+
49+
cdef class DataType:
50+
"""
51+
Represents a data type including its metadata.
52+
"""
53+
54+
def __init__(self, type data_type not None, dict metadata=None):
55+
"""
56+
Initialize a new instance of the `DataType` class.
57+
58+
Parameters
59+
----------
60+
data_type : type
61+
The PyObject type of the data.
62+
metadata : dict
63+
The data types metadata.
64+
65+
"""
66+
if metadata is None:
67+
metadata = {}
68+
69+
self.type = data_type
70+
self.metadata = metadata
71+
72+
def __eq__(self, DataType other) -> bool:
73+
return self.type == other.type and self.metadata == other.metadata
74+
75+
def __ne__(self, DataType other) -> bool:
76+
return self.type != other.type or self.metadata != other.metadata
77+
78+
def __hash__(self) -> int:
79+
return hash((self.type, self.metadata))
80+
81+
def __str__(self) -> str:
82+
return f"<{self.type.__name__}> {self.metadata}"
83+
84+
def __repr__(self) -> str:
85+
return f"{type(self).__name__}(type={self.type.__name__}, metadata={self.metadata})"
86+
87+
2888
cdef class DataCacheFacade:
2989
"""
3090
Provides a read-only facade for a `DataCache`.

nautilus_trader/data/client.pxd

+21-4
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@ from nautilus_trader.common.clock cimport Clock
1919
from nautilus_trader.common.logging cimport LoggerAdapter
2020
from nautilus_trader.common.uuid cimport UUIDFactory
2121
from nautilus_trader.core.uuid cimport UUID
22+
from nautilus_trader.data.base cimport DataType
2223
from nautilus_trader.data.engine cimport DataEngine
2324
from nautilus_trader.model.bar cimport Bar
2425
from nautilus_trader.model.bar cimport BarType
2526
from nautilus_trader.model.identifiers cimport Symbol
26-
from nautilus_trader.model.identifiers cimport Venue
2727
from nautilus_trader.model.instrument cimport Instrument
2828
from nautilus_trader.model.order_book cimport OrderBook
2929
from nautilus_trader.model.tick cimport QuoteTick
@@ -37,18 +37,35 @@ cdef class DataClient:
3737
cdef DataEngine _engine
3838
cdef dict _config
3939

40-
cdef readonly Venue venue
40+
cdef readonly str name
4141
"""The clients venue.\n\n:returns: `Venue`"""
4242
cdef readonly bint is_connected
4343
"""If the client is connected.\n\n:returns: `bool`"""
4444

45-
cpdef list unavailable_methods(self)
46-
4745
cpdef void connect(self) except *
4846
cpdef void disconnect(self) except *
4947
cpdef void reset(self) except *
5048
cpdef void dispose(self) except *
5149

50+
# -- SUBSCRIPTIONS ---------------------------------------------------------------------------------
51+
52+
cpdef void subscribe(self, DataType data_type) except *
53+
cpdef void unsubscribe(self, DataType data_type) except *
54+
55+
# -- REQUEST HANDLERS ------------------------------------------------------------------------------
56+
57+
cpdef void request(self, DataType data_type, UUID correlation_id) except *
58+
59+
# -- DATA HANDLERS ---------------------------------------------------------------------------------
60+
61+
cdef void _handle_data(self, DataType data_type, data) except *
62+
cdef void _handle_data_response(self, DataType data_type, data, UUID correlation_id) except *
63+
64+
65+
cdef class MarketDataClient(DataClient):
66+
67+
cpdef list unavailable_methods(self)
68+
5269
# -- SUBSCRIPTIONS ---------------------------------------------------------------------------------
5370

5471
cpdef void subscribe_instrument(self, Symbol symbol) except *

0 commit comments

Comments
 (0)