Skip to content

Commit d8995b5

Browse files
authored
1.109.0
See release notes.
2 parents 82dd10c + 1b504aa commit d8995b5

File tree

87 files changed

+570
-270
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+570
-270
lines changed

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,4 @@ To contribute, the following steps should be followed;
4040
- Keep PR's small and focused.
4141
- Reference the related GitHub issue(s) in the PR comment.
4242

43-
Thank you for your interest in _NautilusTrader_!
43+
Thank you for your interest in NautilusTrader!

RELEASES.md

+23
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,26 @@
1+
# NautilusTrader 1.109.0 Beta - Release Notes
2+
3+
The main thrust of this release is to refine and further bed down the changes
4+
to the identifier model via `Security`, and fix some bugs.
5+
6+
Errors in the CCXT clients caused by the last release have been addressed.
7+
8+
## Breaking Changes
9+
- `Security` now takes first class value object `Symbol`.
10+
- `Security` `asset_class` and `asset_type` no longer optional.
11+
- `SimulatedExchange.venue` changed to `SimulatedExchange.id`.
12+
13+
## Enhancements
14+
- Ensure `TestTimer` advances monotonically increase.
15+
- Add `AssetClass.BETTING`.
16+
17+
## Fixes
18+
- CCXT data and execution clients regarding `security` vs `symbol` naming.
19+
- `Security` equality and hashing.
20+
- Various docstrings.
21+
22+
---
23+
124
# NautilusTrader 1.108.0 Beta - Release Notes
225

326
This release executes a major refactoring of `Symbol` and how securities are

examples/backtest/crypto_ema_cross_ethusdt_trade_ticks.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,9 @@
3636
from nautilus_trader.model.enums import BarAggregation
3737
from nautilus_trader.model.enums import OMSType
3838
from nautilus_trader.model.enums import PriceType
39+
from nautilus_trader.model.identifiers import Exchange
3940
from nautilus_trader.model.identifiers import Security
40-
from nautilus_trader.model.identifiers import Venue
41+
from nautilus_trader.model.identifiers import Symbol
4142
from nautilus_trader.model.objects import Money
4243
from tests.test_kit.providers import TestDataProvider
4344

@@ -48,8 +49,15 @@
4849
print("Loading instruments...")
4950
instruments = CCXTInstrumentProvider(client=ccxt.binance(), load_all=True)
5051

51-
BINANCE = Venue("BINANCE")
52-
ETHUSDT_BINANCE = instruments.get(Security("ETH/USDT", BINANCE, AssetClass.CRYPTO, AssetType.SPOT))
52+
BINANCE = Exchange("BINANCE")
53+
security = Security(
54+
symbol=Symbol("ETH/USDT"),
55+
venue=BINANCE,
56+
asset_class=AssetClass.CRYPTO,
57+
asset_type=AssetType.SPOT,
58+
)
59+
60+
ETHUSDT_BINANCE = instruments.get(security)
5361

5462
# Setup data container
5563
data = BacktestDataContainer()

examples/live/binance_ema_cross.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from nautilus_trader.model.enums import PriceType
3030
from nautilus_trader.model.identifiers import Exchange
3131
from nautilus_trader.model.identifiers import Security
32+
from nautilus_trader.model.identifiers import Symbol
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
3435
# file. Here it is hardcoded into the example for clarity.
@@ -80,8 +81,16 @@
8081
# Instantiate your strategies to pass into the trading node. You could add
8182
# custom options into the configuration file or even use another configuration
8283
# file.
84+
85+
security = Security(
86+
symbol=Symbol("ETH/USDT"),
87+
venue=Exchange("BINANCE"),
88+
asset_class=AssetClass.CRYPTO,
89+
asset_type=AssetType.SPOT,
90+
)
91+
8392
strategy = EMACross(
84-
security=Security("ETH/USDT", Exchange("BINANCE"), AssetClass.CRYPTO, AssetType.SPOT),
93+
security=security,
8594
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
8695
fast_ema_period=10,
8796
slow_ema_period=20,

examples/live/binance_market_maker.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727
from nautilus_trader.model.enums import AssetType
2828
from nautilus_trader.model.enums import BarAggregation
2929
from nautilus_trader.model.enums import PriceType
30+
from nautilus_trader.model.identifiers import Exchange
3031
from nautilus_trader.model.identifiers import Security
31-
from nautilus_trader.model.identifiers import Venue
32+
from nautilus_trader.model.identifiers import Symbol
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
3435
# file. Here it is hardcoded into the example for clarity.
@@ -80,8 +81,16 @@
8081
# Instantiate your strategies to pass into the trading node. You could add
8182
# custom options into the configuration file or even use another configuration
8283
# file.
84+
85+
security = Security(
86+
symbol=Symbol("ETH/USDT"),
87+
venue=Exchange("BINANCE"),
88+
asset_class=AssetClass.CRYPTO,
89+
asset_type=AssetType.SPOT,
90+
)
91+
8392
strategy = VolatilityMarketMaker(
84-
security=Security("ETH/USDT", Venue("BINANCE"), AssetClass.CRYPTO, AssetType.SPOT),
93+
security=security,
8594
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
8695
trade_size=Decimal("0.05"),
8796
atr_period=20,

examples/live/bitmex_ema_cross.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727
from nautilus_trader.model.enums import AssetType
2828
from nautilus_trader.model.enums import BarAggregation
2929
from nautilus_trader.model.enums import PriceType
30+
from nautilus_trader.model.identifiers import Exchange
3031
from nautilus_trader.model.identifiers import Security
31-
from nautilus_trader.model.identifiers import Venue
32+
from nautilus_trader.model.identifiers import Symbol
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
3435
# file. Here it is hardcoded into the example for clarity.
@@ -80,8 +81,16 @@
8081
# Instantiate your strategies to pass into the trading node. You could add
8182
# custom options into the configuration file or even use another configuration
8283
# file.
84+
85+
security = Security(
86+
symbol=Symbol("BTC/USD"),
87+
venue=Exchange("BITMEX"),
88+
asset_class=AssetClass.CRYPTO,
89+
asset_type=AssetType.SWAP,
90+
)
91+
8392
strategy = EMACross(
84-
security=Security("BTC/USD", Venue("BITMEX"), AssetClass.CRYPTO, AssetType.SWAP),
93+
security=security,
8594
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
8695
fast_ema_period=10,
8796
slow_ema_period=20,

examples/live/bitmex_ema_cross_stop_entry_with_trail.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727
from nautilus_trader.model.enums import AssetType
2828
from nautilus_trader.model.enums import BarAggregation
2929
from nautilus_trader.model.enums import PriceType
30+
from nautilus_trader.model.identifiers import Exchange
3031
from nautilus_trader.model.identifiers import Security
31-
from nautilus_trader.model.identifiers import Venue
32+
from nautilus_trader.model.identifiers import Symbol
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
3435
# file. Here it is hardcoded into the example for clarity.
@@ -79,8 +80,16 @@
7980
# Instantiate your strategies to pass into the trading node. You could add
8081
# custom options into the configuration file or even use another configuration
8182
# file.
83+
84+
security = Security(
85+
symbol=Symbol("BTC/USD"),
86+
venue=Exchange("BITMEX"),
87+
asset_class=AssetClass.CRYPTO,
88+
asset_type=AssetType.SWAP,
89+
)
90+
8291
strategy = EMACrossStopEntryTrail(
83-
security=Security("BTC/USD", Venue("BITMEX"), AssetClass.CRYPTO, AssetType.SWAP),
92+
security=security,
8493
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
8594
trade_size=Decimal("100"),
8695
fast_ema_period=10,

examples/live/bitmex_market_maker.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727
from nautilus_trader.model.enums import AssetType
2828
from nautilus_trader.model.enums import BarAggregation
2929
from nautilus_trader.model.enums import PriceType
30+
from nautilus_trader.model.identifiers import Exchange
3031
from nautilus_trader.model.identifiers import Security
31-
from nautilus_trader.model.identifiers import Venue
32+
from nautilus_trader.model.identifiers import Symbol
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
3435
# file. Here it is hardcoded into the example for clarity.
@@ -80,8 +81,16 @@
8081
# Instantiate your strategies to pass into the trading node. You could add
8182
# custom options into the configuration file or even use another configuration
8283
# file.
84+
85+
security = Security(
86+
symbol=Symbol("BTC/USD"),
87+
venue=Exchange("BITMEX"),
88+
asset_class=AssetClass.CRYPTO,
89+
asset_type=AssetType.SWAP,
90+
)
91+
8392
strategy = VolatilityMarketMaker(
84-
security=Security("BTC/USD", Venue("BITMEX"), AssetClass.CRYPTO, AssetType.SWAP),
93+
security=security,
8594
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
8695
trade_size=Decimal("100"),
8796
atr_period=20,

examples/live/bitmex_testnet_market_maker.py

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@
2727
from nautilus_trader.model.enums import AssetType
2828
from nautilus_trader.model.enums import BarAggregation
2929
from nautilus_trader.model.enums import PriceType
30+
from nautilus_trader.model.identifiers import Exchange
3031
from nautilus_trader.model.identifiers import Security
31-
from nautilus_trader.model.identifiers import Venue
32+
from nautilus_trader.model.identifiers import Symbol
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
3435
# file. Here it is hardcoded into the example for clarity.
@@ -80,8 +81,16 @@
8081
# Instantiate your strategies to pass into the trading node. You could add
8182
# custom options into the configuration file or even use another configuration
8283
# file.
84+
85+
security = Security(
86+
symbol=Symbol("BTC/USD"),
87+
venue=Exchange("BITMEX"),
88+
asset_class=AssetClass.CRYPTO,
89+
asset_type=AssetType.SWAP,
90+
)
91+
8392
strategy = VolatilityMarketMaker(
84-
security=Security("BTC/USD", Venue("BITMEX"), AssetClass.CRYPTO, AssetType.SWAP),
93+
security=security,
8594
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
8695
trade_size=Decimal("10"),
8796
atr_period=20,

examples/live/multi_venue_ema_cross_stop_entry_with_trail.py

+22-3
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@
2828
from nautilus_trader.model.enums import AssetType
2929
from nautilus_trader.model.enums import BarAggregation
3030
from nautilus_trader.model.enums import PriceType
31+
from nautilus_trader.model.identifiers import Exchange
3132
from nautilus_trader.model.identifiers import Security
32-
from nautilus_trader.model.identifiers import Venue
33+
from nautilus_trader.model.identifiers import Symbol
3334

3435
# The configuration dictionary can come from anywhere such as a JSON or YAML
3536
# file. Here it is hardcoded into the example for clarity.
@@ -87,17 +88,34 @@
8788
# Instantiate your strategies to pass into the trading node. You could add
8889
# custom options into the configuration file or even use another configuration
8990
# file.
91+
92+
security1 = Security(
93+
symbol=Symbol("ETH/USDT"),
94+
venue=Exchange("BINANCE"),
95+
asset_class=AssetClass.CRYPTO,
96+
asset_type=AssetType.SPOT,
97+
)
98+
9099
strategy1 = EMACross(
91-
security=Security("ETH/USDT", Venue("BINANCE"), AssetClass.CRYPTO, AssetType.SPOT),
100+
security=security1,
92101
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
93102
trade_size=Decimal("0.02"),
94103
fast_ema_period=10,
95104
slow_ema_period=20,
96105
order_id_tag="003",
97106
)
98107

108+
# ------------------------------------------------------------------------------
109+
110+
security2 = Security(
111+
symbol=Symbol("BTC/USD"),
112+
venue=Exchange("BITMEX"),
113+
asset_class=AssetClass.CRYPTO,
114+
asset_type=AssetType.SWAP,
115+
)
116+
99117
strategy2 = EMACrossStopEntryTrail(
100-
security=Security("BTC/USD", Venue("BITMEX"), AssetClass.CRYPTO, AssetType.SWAP),
118+
security=security2,
101119
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST),
102120
trade_size=Decimal("100"),
103121
fast_ema_period=10,
@@ -107,6 +125,7 @@
107125
order_id_tag="004",
108126
)
109127

128+
# ------------------------------------------------------------------------------
110129
# Instantiate the node passing a list of strategies and configuration
111130
node = TradingNode(strategies=[strategy1, strategy2], config=config)
112131

examples/live/oanda_ema_cross.py

+30-3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from nautilus_trader.model.enums import BarAggregation
2929
from nautilus_trader.model.enums import PriceType
3030
from nautilus_trader.model.identifiers import Security
31+
from nautilus_trader.model.identifiers import Symbol
3132
from nautilus_trader.model.identifiers import Venue
3233

3334
# The configuration dictionary can come from anywhere such as a JSON or YAML
@@ -78,26 +79,52 @@
7879
# Instantiate your strategies to pass into the trading node. You could add
7980
# custom options into the configuration file or even use another configuration
8081
# file.
82+
83+
security1 = Security(
84+
symbol=Symbol("AUD/USD"),
85+
venue=Venue("OANDA"),
86+
asset_class=AssetClass.FX,
87+
asset_type=AssetType.SPOT,
88+
)
89+
8190
strategy1 = EMACross(
82-
security=Security("AUD/USD", Venue("OANDA"), AssetClass.FX, AssetType.SPOT),
91+
security=security1,
8392
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.MID),
8493
fast_ema_period=10,
8594
slow_ema_period=20,
8695
trade_size=Decimal(10000),
8796
order_id_tag="001",
8897
)
8998

99+
# ------------------------------------------------------------------------------
100+
101+
security2 = Security(
102+
symbol=Symbol("EUR/USD"),
103+
venue=Venue("OANDA"),
104+
asset_class=AssetClass.FX,
105+
asset_type=AssetType.SPOT,
106+
)
107+
90108
strategy2 = EMACross(
91-
security=Security("EUR/USD", Venue("OANDA"), AssetClass.FX, AssetType.SPOT),
109+
security=security2,
92110
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.MID),
93111
fast_ema_period=10,
94112
slow_ema_period=20,
95113
trade_size=Decimal(10000),
96114
order_id_tag="002",
97115
)
98116

117+
# ------------------------------------------------------------------------------
118+
119+
security3 = Security(
120+
symbol=Symbol("GBP/USD"),
121+
venue=Venue("OANDA"),
122+
asset_class=AssetClass.FX,
123+
asset_type=AssetType.SPOT,
124+
)
125+
99126
strategy3 = EMACross(
100-
security=Security("GBP/USD", Venue("OANDA"), AssetClass.FX, AssetType.SPOT),
127+
security=security3,
101128
bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.MID),
102129
fast_ema_period=10,
103130
slow_ema_period=20,

examples/strategies/blank.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ def __init__(self, security: Security):
3434
Parameters
3535
----------
3636
security : Security
37-
The security for the strategy.
37+
The security identifier for the strategy.
3838
3939
"""
4040
# The order_id_tag should be unique at the 'trader level', here we are

nautilus_trader/adapters/binance/execution.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ cdef class BinanceExecutionClient(CCXTExecutionClient):
115115
try:
116116
# Submit order and await response
117117
await self._client.create_order(
118-
symbol=order.security.symbol,
118+
symbol=order.security.symbol.value,
119119
type=order_type,
120120
side=OrderSideParser.to_str(order.side),
121121
amount=str(order.quantity),

nautilus_trader/adapters/bitmex/execution.pyx

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ cdef class BitmexExecutionClient(CCXTExecutionClient):
119119
try:
120120
# Submit order and await response
121121
await self._client.create_order(
122-
symbol=order.security.symbol,
122+
symbol=order.security.symbol.value,
123123
type=order_type,
124124
side=OrderSideParser.to_str(order.side).capitalize(),
125125
amount=str(order.quantity),

0 commit comments

Comments
 (0)