Esempio n. 1
0
# ]

# 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)
Esempio n. 3
0
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