"api_key": "BINANCE_API_KEY", # value is the environment variable key "api_secret": "BINANCE_API_SECRET", # value is the environment variable key "sandbox_mode": False, # If clients use the testnet }, }, } # Instantiate your strategies to pass into the trading node. You could add # custom options into the configuration file or even use another configuration # file. strategy = EMACross( symbol=Symbol("ETH/USDT", Venue("BINANCE")), bar_spec=BarSpecification(1, BarAggregation.MINUTE, PriceType.LAST), fast_ema_period=10, slow_ema_period=20, trade_size=Decimal("0.05"), order_id_tag="001", ) # Instantiate the node passing a list of strategies and configuration node = TradingNode(strategies=[strategy], config=config) # Stop and dispose of the node with SIGINT/CTRL+C if __name__ == "__main__": try: node.start() finally: node.dispose()
class TestTradingNodeOperation: def setup(self): # Fixture Setup self.node = TradingNode() def test_get_event_loop_returns_a_loop(self): # Arrange node = TradingNode() # Act loop = node.get_event_loop() # Assert assert isinstance(loop, asyncio.AbstractEventLoop) def test_build_called_twice_raises_runtime_error(self): # Arrange, # Act with pytest.raises(RuntimeError): self.node.build() self.node.build() def test_start_when_not_built_raises_runtime_error(self): # Arrange, # Act with pytest.raises(RuntimeError): self.node.start() def test_add_data_client_factory(self): # Arrange, # Act self.node.add_data_client_factory("BETFAIR", BetfairLiveDataClientFactory) self.node.build() # TODO(cs): Assert existence of client def test_add_exec_client_factory(self): # Arrange, # Act self.node.add_exec_client_factory("BETFAIR", BetfairLiveExecutionClientFactory) self.node.build() # TODO(cs): Assert existence of client def test_build_with_multiple_clients(self): # Arrange, # Act self.node.add_data_client_factory("BETFAIR", BetfairLiveDataClientFactory) self.node.add_exec_client_factory("BETFAIR", BetfairLiveExecutionClientFactory) self.node.build() # TODO(cs): Assert existence of client @pytest.mark.asyncio async def test_register_log_sink(self): # Arrange sink = [] # Act self.node.add_log_sink(sink.append) self.node.build() self.node.start() await asyncio.sleep(1) # Assert: Log record received assert sink[-1]["trader_id"] == self.node.trader_id.value assert sink[-1]["machine_id"] == self.node.machine_id assert sink[-1]["instance_id"] == self.node.instance_id.value @pytest.mark.asyncio async def test_start(self): # Arrange self.node.build() # Act self.node.start() await asyncio.sleep(2) # Assert assert self.node.trader.is_running @pytest.mark.asyncio async def test_stop(self): # Arrange self.node.build() self.node.start() await asyncio.sleep(2) # Allow node to start # Act self.node.stop() await asyncio.sleep(3) # Allow node to stop # Assert assert self.node.trader.is_stopped @pytest.mark.skip(reason="refactor TradingNode coroutines") @pytest.mark.asyncio async def test_dispose(self): # Arrange self.node.build() self.node.start() await asyncio.sleep(2) # Allow node to start self.node.stop() await asyncio.sleep(2) # Allow node to stop # Act self.node.dispose() await asyncio.sleep(1) # Allow node to dispose # Assert assert self.node.trader.is_disposed