async def test_add_exchange(self): config = await self.init_default() exchange_manager_binance = ExchangeManager(config, "binance") await exchange_manager_binance.initialize() Exchanges.instance().add_exchange(exchange_manager_binance, "") exchange_manager_bitmex = ExchangeManager(config, "bitmex") await exchange_manager_bitmex.initialize() Exchanges.instance().add_exchange(exchange_manager_bitmex, "") exchange_manager_poloniex = ExchangeManager(config, "poloniex") await exchange_manager_poloniex.initialize() Exchanges.instance().add_exchange(exchange_manager_poloniex, "") assert "binance" in Exchanges.instance().exchanges assert "bitmex" in Exchanges.instance().exchanges assert "poloniex" in Exchanges.instance().exchanges assert "test" not in Exchanges.instance().exchanges await exchange_manager_binance.stop() await exchange_manager_bitmex.stop() await exchange_manager_poloniex.stop() cancel_ccxt_throttle_task() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def test_traded_pairs_with_invalid_wildcard(self): config = load_test_config() # missing quote key config[CONFIG_CRYPTO_CURRENCIES] = { "Bitcoin": { "pairs": ["*"] }, "Ethereum": { "enabled": True, "pairs": ["*"], "quote": "ETH" } } _, exchange_manager = await self.init_default(config=config) assert "ETC/ETH" in exchange_manager.exchange_config.traded_symbol_pairs assert "ADA/ETH" in exchange_manager.exchange_config.traded_symbol_pairs assert "BNB/ETH" in exchange_manager.exchange_config.all_config_symbol_pairs assert "ADA/ETH" in exchange_manager.exchange_config.all_config_symbol_pairs assert "Ethereum" in exchange_manager.exchange_config.traded_cryptocurrencies # invalid BTC wildcard config assert "Bitcoin" not in exchange_manager.exchange_config.traded_cryptocurrencies cancel_ccxt_throttle_task() await exchange_manager.stop()
async def test_traded_pairs_with_add(self): config = load_test_config() config[CONFIG_CRYPTO_CURRENCIES] = { "Bitcoin": { "pairs": "*", "quote": "BTC", "add": ["BTC/USDT"] } } _, exchange_manager = await self.init_default(config=config) assert "ICX/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "NEO/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "VEN/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "XLM/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "ONT/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "BTC/USDT" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "ETH/USDT" not in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "NEO/BNB" not in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] cancel_ccxt_throttle_task() await exchange_manager.stop()
async def test_get_exchange(self): config = await self.init_default() exchange_manager_binance = ExchangeManager(config, "binance") await exchange_manager_binance.initialize() Exchanges.instance().add_exchange(exchange_manager_binance, "") exchange_manager_bitmex = ExchangeManager(config, "bitmex") await exchange_manager_bitmex.initialize() Exchanges.instance().add_exchange(exchange_manager_bitmex, "") exchange_manager_poloniex = ExchangeManager(config, "poloniex") await exchange_manager_poloniex.initialize() Exchanges.instance().add_exchange(exchange_manager_poloniex, "") assert Exchanges.instance().get_exchanges_list( "binance")[0].exchange_manager is exchange_manager_binance assert Exchanges.instance().get_exchanges_list( "bitmex")[0].exchange_manager is exchange_manager_bitmex assert Exchanges.instance().get_exchanges_list( "poloniex")[0].exchange_manager is exchange_manager_poloniex with pytest.raises(KeyError): assert Exchanges.instance().get_exchanges_list("test") await exchange_manager_binance.stop() await exchange_manager_bitmex.stop() await exchange_manager_poloniex.stop() cancel_ccxt_throttle_task() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def test_traded_pairs(self): config = load_test_config() config[CONFIG_CRYPTO_CURRENCIES] = { "Neo": { "pairs": ["NEO/BTC"] }, "Ethereum": { "enabled": True, "pairs": ["ETH/USDT"] }, "Icon": { "enabled": False, "pairs": ["ICX/BTC"] } } _, exchange_manager = await self.init_default(config=config) assert exchange_manager.exchange_config.traded_cryptocurrencies == { "Ethereum": ["ETH/USDT"], "Neo": ["NEO/BTC"] } all_pairs = sorted(["NEO/BTC", "ETH/USDT", "ICX/BTC"]) all_enabled_pairs = sorted(["NEO/BTC", "ETH/USDT"]) assert sorted(exchange_manager.exchange_config.traded_symbol_pairs ) == all_enabled_pairs assert sorted(exchange_manager.exchange_config.all_config_symbol_pairs ) == all_pairs cancel_ccxt_throttle_task() await exchange_manager.stop()
async def test_create_exchange(self): # simulated config, exchange_manager = await self.init_default(simulated=True, backtesting=True) assert exchange_manager is not None assert exchange_manager.exchange_name is TestExchangeManager.EXCHANGE_NAME assert exchange_manager.exchange.authenticated() is False assert exchange_manager.config is config assert isinstance(exchange_manager.exchange, SpotExchangeSimulator) await exchange_manager.stop() # real config, exchange_manager = await self.init_default(simulated=False) assert exchange_manager is not None assert exchange_manager.exchange_name is TestExchangeManager.EXCHANGE_NAME assert exchange_manager.config is config assert isinstance(exchange_manager.exchange, SpotExchange) cancel_ccxt_throttle_task() await exchange_manager.stop()
async def test_create_basic(exchange_builder): exchange_builder.disable_trading_mode() exchange_manager = await exchange_builder.build() assert exchange_manager is not None assert exchange_manager.exchange_name == "bitmex" cancel_ccxt_throttle_task() await exchange_manager.stop()
async def future_exchange_manager(): exchange_manager_instance = ExchangeManager(load_test_config(), DEFAULT_EXCHANGE_NAME) exchange_manager_instance.is_spot_only = False exchange_manager_instance.is_future = True await exchange_manager_instance.initialize() yield exchange_manager_instance cancel_ccxt_throttle_task() await exchange_manager_instance.stop() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def get_exchange_manager(exchange_name, config=None): config = config or load_test_config() if exchange_name not in config[CONFIG_EXCHANGES]: config[CONFIG_EXCHANGES][exchange_name] = {} exchange_manager_instance = ExchangeManager(config, exchange_name) await exchange_manager_instance.initialize() try: yield exchange_manager_instance finally: await exchange_manager_instance.stop() cancel_ccxt_throttle_task() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def simulated_exchange_manager(request): config = load_test_config() exchange_name = "binance" if hasattr(request, "param"): config, exchange_name = request.param exchange_manager_instance = ExchangeManager(config, exchange_name) exchange_manager_instance.is_simulated = True await exchange_manager_instance.initialize() yield exchange_manager_instance cancel_ccxt_throttle_task() await exchange_manager_instance.stop() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def exchange_manager(request): config = None exchange_name = "binance" if hasattr(request, "param"): config, exchange_name = request.param exchange_manager_instance = ExchangeManager( config if config is not None else load_test_config(), exchange_name) await exchange_manager_instance.initialize() yield exchange_manager_instance await exchange_manager_instance.stop() cancel_ccxt_throttle_task() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def test_traded_pairs_with_add(self): config = load_test_config() config[CONFIG_CRYPTO_CURRENCIES] = { "Bitcoin": { "pairs": ["*"], "quote": "BTC", "add": ["BTC/USDT"] }, "Ethereum": { "enabled": False, "pairs": ["*"], "quote": "ETH", "add": ["ETH/USDT"] } } _, exchange_manager = await self.init_default(config=config) assert "ICX/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "NEO/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "VEN/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "XLM/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "ONT/BTC" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "BTC/USDT" in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "ETH/USDT" not in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "NEO/BNB" not in exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] assert "BTC/USDT" in exchange_manager.exchange_config.traded_symbol_pairs assert "BTC/USDT" in exchange_manager.exchange_config.all_config_symbol_pairs # disabled assert "Ethereum" not in exchange_manager.exchange_config.traded_cryptocurrencies assert "ADA/ETH" not in exchange_manager.exchange_config.traded_symbol_pairs assert "ADA/ETH" in exchange_manager.exchange_config.all_config_symbol_pairs assert "ETH/USDT" not in exchange_manager.exchange_config.traded_symbol_pairs assert "ETH/USDT" in exchange_manager.exchange_config.all_config_symbol_pairs cancel_ccxt_throttle_task() await exchange_manager.stop()
async def exchange_manager(request): config = None exchange_name = DEFAULT_EXCHANGE_NAME is_spot = True is_margin = False is_future = False if hasattr(request, "param"): config, exchange_name, is_spot, is_margin, is_future = request.param exchange_manager_instance = ExchangeManager(config if config is not None else load_test_config(), exchange_name) exchange_manager_instance.is_spot_only = is_spot exchange_manager_instance.is_margin = is_margin exchange_manager_instance.is_future = is_future await exchange_manager_instance.initialize() yield exchange_manager_instance cancel_ccxt_throttle_task() await exchange_manager_instance.stop() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def stop_bot(bot): # force all logger enable to display any error stop_logger = get_logger("StopBotLogger") import logging for logger in logging.Logger.manager.loggerDict.values(): logger.disabled = False stop_logger.info("Stopping tasks...") await bot.stop() if bot.task_manager.tools_task_group: bot.task_manager.tools_task_group.cancel() # close community session if bot.community_handler: await bot.community_handler.stop_task() cancel_ccxt_throttle_task() stop_logger.info("Tasks stopped.")
async def test_get_is_overloaded(self): # simulated config, exchange_manager = await self.init_default(simulated=True, backtesting=True) # few traded elements exchange_manager.exchange_config.traded_symbol_pairs = [0] * 3 exchange_manager.exchange_config.traded_time_frames = [0] * 3 assert exchange_manager.get_currently_handled_pair_with_time_frame( ) == 3 * 3 assert not exchange_manager.get_is_overloaded() # too many traded elements exchange_manager.exchange_config.traded_symbol_pairs = [0] * 99 exchange_manager.exchange_config.traded_time_frames = [0] * 99 assert exchange_manager.get_currently_handled_pair_with_time_frame( ) == 99 * 99 # not overloaded since exchange simulator is not limited in term of traded elements assert not exchange_manager.get_is_overloaded() await exchange_manager.stop() # real config, exchange_manager = await self.init_default(simulated=False) # few traded elements exchange_manager.exchange_config.traded_symbol_pairs = [0] * 3 exchange_manager.exchange_config.traded_time_frames = [0] * 3 assert exchange_manager.get_currently_handled_pair_with_time_frame( ) == 3 * 3 assert not exchange_manager.get_is_overloaded() # too many traded elements exchange_manager.exchange_config.traded_symbol_pairs = [0] * 99 exchange_manager.exchange_config.traded_time_frames = [0] * 99 assert exchange_manager.get_currently_handled_pair_with_time_frame( ) == 99 * 99 # overloaded since exchange simulator is limited in term of traded elements assert exchange_manager.get_is_overloaded() cancel_ccxt_throttle_task() await exchange_manager.stop()
async def test_traded_pairs_with_redundancy(self): config = load_test_config() config[CONFIG_CRYPTO_CURRENCIES] = { "Binance Coin": { "pairs": ["BNB/USDT"] }, "Binance USD": { "pairs": ["BNB/BUSD"] }, "Bitcoin": { "enabled": True, "pairs": ["BNB/BTC"] }, "Tether": { "enabled": True, "pairs": ["BNB/USDT"] } } _, exchange_manager = await self.init_default(config=config) assert exchange_manager.exchange_config.traded_cryptocurrencies[ "Binance Coin"] == ["BNB/USDT"] assert exchange_manager.exchange_config.traded_cryptocurrencies[ "Binance USD"] == ["BNB/BUSD"] assert exchange_manager.exchange_config.traded_cryptocurrencies[ "Bitcoin"] == ["BNB/BTC"] assert exchange_manager.exchange_config.traded_cryptocurrencies[ "Tether"] == ["BNB/USDT"] sorted_pairs_without_redundancy = sorted( ["BNB/USDT", "BNB/BUSD", "BNB/BTC"]) assert sorted(exchange_manager.exchange_config.traded_symbol_pairs ) == sorted_pairs_without_redundancy assert sorted(exchange_manager.exchange_config.all_config_symbol_pairs ) == sorted_pairs_without_redundancy cancel_ccxt_throttle_task() await exchange_manager.stop()
async def test_traded_pairs(self): config = load_test_config() config[CONFIG_CRYPTO_CURRENCIES] = { "Neo": { "pairs": ["NEO/BTC"] }, "Ethereum": { "pairs": ["ETH/USDT"] }, "Icon": { "pairs": ["ICX/BTC"] } } _, exchange_manager = await self.init_default(config=config) assert exchange_manager.exchange_config.traded_cryptocurrencies == { "Ethereum": ["ETH/USDT"], "Icon": ["ICX/BTC"], "Neo": ["NEO/BTC"] } cancel_ccxt_throttle_task() await exchange_manager.stop()
async def stop(exchange_manager): cancel_ccxt_throttle_task() await exchange_manager.stop() # let updaters gracefully shutdown await wait_asyncio_next_cycle()
async def test_stop(backtesting_trader): _, exchange_manager, trader_inst = backtesting_trader await exchange_manager.exchange.stop() cancel_ccxt_throttle_task() assert not exchange_manager.exchange.backtesting assert not exchange_manager.exchange.exchange_importers
async def test_ready(self): _, exchange_manager = await self.init_default() assert exchange_manager.is_ready cancel_ccxt_throttle_task() await exchange_manager.stop()
async def stop(exchange_manager): cancel_ccxt_throttle_task() await exchange_manager.stop()