# ] # strategies_cfd = [] # for symbol in symbols_cfd: # strategies_fx.append(EMACrossPy( # symbol, # BAR_SPEC_CFD, # risk_bp=10.0, # fast_ema=10, # slow_ema=20, # atr_period=20)) strategies = strategies_fx # + strategies_cfd if __name__ == "__main__": node = TradingNode(config_path='config.json', strategies=strategies) node.connect() time.sleep(1) node.start() input() node.stop() input() node.disconnect() input() node.dispose()
class TradingNodeOperationTests(unittest.TestCase): def setUp(self): # Fixture Setup # Fresh isolated loop testing pattern self.loop = asyncio.new_event_loop() asyncio.set_event_loop(self.loop) config = { "trader": { "name": "tester", "id_tag": "000", }, "logging": { "log_level_console": "INF", "log_level_file": "DBG", "log_level_store": "WRN", }, "exec_database": { "type": "in-memory", }, "strategy": { "load_state": True, "save_state": True, }, "data_clients": {}, "exec_clients": {}, } self.node = TradingNode( strategies=[TradingStrategy("000")], config=config, ) def test_get_event_loop_returns_a_loop(self): # Arrange # Act loop = self.node.get_event_loop() # Assert self.assertTrue(isinstance(loop, asyncio.AbstractEventLoop)) def test_start(self): # Arrange run = threading.Thread(target=self.node.start, daemon=True) run.start() time.sleep(0.3) # Act # Assert self.assertEqual(ComponentState.RUNNING, self.node.trader.state) self.node.stop() def test_stop(self): # Arrange run = threading.Thread(target=self.node.start, daemon=True) run.start() # Allow node to start time.sleep(0.3) self.loop.call_soon_threadsafe(self.node.stop) # Allow node to stop time.sleep(3) # Act # Assert self.assertEqual(ComponentState.STOPPED, self.node.trader.state) def test_dispose(self): # Arrange run = threading.Thread(target=self.node.start, daemon=True) run.start() # Allow node to start time.sleep(0.3) self.loop.call_soon_threadsafe(self.node.stop) # Allow node to stop time.sleep(3) self.node.dispose() # Act # Assert self.assertEqual(ComponentState.DISPOSED, self.node.trader.state)
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