async def fetch_all(self): tasks = [] fetched_connectors = [] for conn_setting in CONNECTOR_SETTINGS.values(): module_name = f"{conn_setting.base_name()}_connector" if conn_setting.type is ConnectorType.Connector \ else f"{conn_setting.base_name()}_api_order_book_data_source" module_path = f"hummingbot.connector.{conn_setting.type.name.lower()}." \ f"{conn_setting.base_name()}.{module_name}" class_name = "".join([o.capitalize() for o in conn_setting.base_name().split("_")]) + \ "APIOrderBookDataSource" if conn_setting.type is not ConnectorType.Connector \ else "".join([o.capitalize() for o in conn_setting.base_name().split("_")]) + "Connector" module = getattr(importlib.import_module(module_path), class_name) args = {} args = conn_setting.add_domain_parameter(args) tasks.append( asyncio.wait_for(asyncio.shield( module.fetch_trading_pairs(**args)), timeout=3)) fetched_connectors.append(conn_setting.name) results = await safe_gather(*tasks, return_exceptions=True) self.trading_pairs = dict(zip(fetched_connectors, results)) # In case trading pair fetching returned timeout, using empty list for connector, result in self.trading_pairs.items(): if isinstance(result, asyncio.TimeoutError): self.trading_pairs[connector] = [] self.ready = True
async def get_current_balances( self, # type: HummingbotApplication market: str): if market in self.markets and self.markets[market].ready: return self.markets[market].get_all_balances() elif "Paper" in market: paper_balances = global_config_map[ "paper_trade_account_balance"].value if paper_balances is None: return {} return { token: Decimal(str(bal)) for token, bal in paper_balances.items() } elif "perpetual_finance" == market: return await UserBalances.xdai_balances() else: gateway_eth_connectors = [ cs.name for cs in CONNECTOR_SETTINGS.values() if cs.use_ethereum_wallet and cs.type == ConnectorType.Connector ] if market in gateway_eth_connectors: return await UserBalances.instance().eth_n_erc20_balances() else: await UserBalances.instance().update_exchange_balance(market) return UserBalances.instance().all_balances(market)
async def update_exchanges( self, reconnect: bool = False, exchanges: List[str] = []) -> Dict[str, Optional[str]]: tasks = [] # Update user balances, except connectors that use Ethereum wallet. if len(exchanges) == 0: exchanges = [cs.name for cs in CONNECTOR_SETTINGS.values()] exchanges = [ cs.name for cs in CONNECTOR_SETTINGS.values() if not cs.use_ethereum_wallet and cs.name in exchanges ] if reconnect: self._markets.clear() for exchange in exchanges: tasks.append(self.update_exchange_balance(exchange)) results = await safe_gather(*tasks) return {ex: err_msg for ex, err_msg in zip(exchanges, results)}
async def fetch_all(self): for conn_setting in CONNECTOR_SETTINGS.values(): module_name = f"{conn_setting.base_name()}_connector" if conn_setting.type is ConnectorType.Connector \ else f"{conn_setting.base_name()}_api_order_book_data_source" module_path = f"hummingbot.connector.{conn_setting.type.name.lower()}." \ f"{conn_setting.base_name()}.{module_name}" class_name = "".join([o.capitalize() for o in conn_setting.base_name().split("_")]) + \ "APIOrderBookDataSource" if conn_setting.type is not ConnectorType.Connector \ else "".join([o.capitalize() for o in conn_setting.base_name().split("_")]) + "Connector" module = getattr(importlib.import_module(module_path), class_name) args = {} args = conn_setting.add_domain_parameter(args) safe_ensure_future( self.call_fetch_pairs(module.fetch_trading_pairs(**args), conn_setting.name)) self.ready = True
async def get_current_balances(self, # type: HummingbotApplication market: str): paper_trade_suffix = '_PaperTrade' if market in self.markets and self.markets[market].ready: return self.markets[market].get_all_balances() elif paper_trade_suffix in market: return self.markets[market[:-len(paper_trade_suffix)]].get_all_balances() elif "perpetual_finance" == market: return await UserBalances.xdai_balances() else: gateway_eth_connectors = [cs.name for cs in CONNECTOR_SETTINGS.values() if cs.use_ethereum_wallet and cs.type == ConnectorType.Connector] if market in gateway_eth_connectors: return await UserBalances.instance().eth_n_erc20_balances() else: await UserBalances.instance().update_exchange_balance(market) return UserBalances.instance().all_balances(market)
async def fetch_all(self): tasks = [] fetched_connectors = [] for conn_setting in CONNECTOR_SETTINGS.values(): module_name = f"{conn_setting.base_name()}_utils" if conn_setting.type is ConnectorType.Connector \ else f"{conn_setting.base_name()}_api_order_book_data_source" module_path = f"hummingbot.connector.{conn_setting.type.name.lower()}." \ f"{conn_setting.base_name()}.{module_name}" if conn_setting.type is ConnectorType.Connector: module = importlib.import_module(module_path) else: class_name = "".join([o.capitalize() for o in conn_setting.base_name().split("_")]) + \ "APIOrderBookDataSource" module = getattr(importlib.import_module(module_path), class_name) args = {} args = conn_setting.add_domain_parameter(args) tasks.append(module.fetch_trading_pairs(**args)) fetched_connectors.append(conn_setting.name) results = await safe_gather(*tasks, return_exceptions=True) self.trading_pairs = dict(zip(fetched_connectors, results)) self.ready = True
from hummingbot.client.command.connect_command import OPTIONS as CONNECT_OPTIONS from hummingbot.core.rate_oracle.rate_oracle import RateOracleSource def file_name_list(path, file_extension): if not exists(path): return [] return sorted([ f for f in listdir(path) if isfile(join(path, f)) and f.endswith(file_extension) ]) SPOT_PROTOCOL_CONNECTOR = { x.name for x in CONNECTOR_SETTINGS.values() if x.type == ConnectorType.Connector } DERIVATIVE_PROTOCOL_CONNECTOR = { x.name for x in CONNECTOR_SETTINGS.values() if x.type == ConnectorType.Derivative and not x.centralised } class HummingbotCompleter(Completer): def __init__(self, hummingbot_application): super(HummingbotCompleter, self).__init__() self.hummingbot_application = hummingbot_application self._path_completer = WordCompleter( file_name_list(CONF_FILE_PATH, "yml")) self._command_completer = WordCompleter(self.parser.commands,