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)
Example #2
0
    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
Example #3
0
 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,
                                             ignore_case=True)
     self._exchange_completer = WordCompleter(sorted(
         CONNECTOR_SETTINGS.keys()),
                                              ignore_case=True)
     self._spot_completer = WordCompleter(sorted(
         EXCHANGES.union(SPOT_PROTOCOL_CONNECTOR)),
                                          ignore_case=True)
     self._spot_exchange_completer = WordCompleter(sorted(EXCHANGES),
                                                   ignore_case=True)
     self._derivative_completer = WordCompleter(DERIVATIVES,
                                                ignore_case=True)
     self._derivative_exchange_completer = WordCompleter(
         DERIVATIVES.difference(DERIVATIVE_PROTOCOL_CONNECTOR),
         ignore_case=True)
     self._connect_option_completer = WordCompleter(CONNECT_OPTIONS,
                                                    ignore_case=True)
     self._export_completer = WordCompleter(["keys", "trades"],
                                            ignore_case=True)
     self._balance_completer = WordCompleter(["limit", "paper"],
                                             ignore_case=True)
     self._history_completer = WordCompleter(
         ["--days", "--verbose", "--precision"], ignore_case=True)
     self._gateway_completer = WordCompleter(
         ["generate_certs", "list-configs", "update"], ignore_case=True)
     self._strategy_completer = WordCompleter(STRATEGIES, ignore_case=True)
     self._py_file_completer = WordCompleter(
         file_name_list(SCRIPTS_PATH, "py"))
     self._rate_oracle_completer = WordCompleter(
         [r.name for r in RateOracleSource], ignore_case=True)
Example #4
0
 async def gas_price_update_loop(self):
     while True:
         try:
             url = ETH_GASSTATION_API_URL.format(self.api_key)
             async with aiohttp.ClientSession() as client:
                 response = await client.get(url=url)
                 if response.status != 200:
                     raise IOError(f"Error fetching current gas prices. "
                                   f"HTTP status is {response.status}.")
                 resp_data: Dict[str, Any] = await response.json()
                 for key, value in resp_data.items():
                     if key in GasLevel.__members__:
                         self._gas_prices[GasLevel[key]] = Decimal(
                             str(value)) / Decimal("10")
                 prices_str = ', '.join([
                     k.name + ': ' + str(v)
                     for k, v in self._gas_prices.items()
                 ])
                 self.logger().info(f"Gas levels: [{prices_str}]")
                 for name, con_setting in CONNECTOR_SETTINGS.items():
                     if con_setting.use_eth_gas_lookup:
                         self._gas_limits[name] = get_gas_limit(name)
                         self.logger().info(
                             f"{name} Gas estimate:"
                             f" limit = {self._gas_limits[name]:.0f},"
                             f" price = {self.gas_level.name},"
                             f" estimated cost = {get_gas_price(False) * self._gas_limits[name]:.5f} ETH"
                         )
                 await asyncio.sleep(self.refresh_time)
         except asyncio.CancelledError:
             raise
         except Exception:
             self.logger().network("Unexpected error running logging task.",
                                   exc_info=True)
             await asyncio.sleep(self.refresh_time)
Example #5
0
 def _trading_pair_completer(self) -> Completer:
     trading_pair_fetcher = TradingPairFetcher.get_instance()
     for exchange in sorted(list(CONNECTOR_SETTINGS.keys()), key=len, reverse=True):
         if exchange in self.prompt_text:
             market = exchange
             break
     trading_pairs = trading_pair_fetcher.trading_pairs.get(market, []) if trading_pair_fetcher.ready else []
     return WordCompleter(trading_pairs, ignore_case=True, sentence=True)
 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)}
def fee_overrides_dict():
    all_dict = {}
    # all_connector_types = get_exchanges_and_derivatives()
    for name, setting in CONNECTOR_SETTINGS.items():
        key_suffix = None
        if setting.fee_type is TradeFeeType.Percent:
            key_suffix = "fee"
        elif setting.fee_type is TradeFeeType.FlatFee:
            key_suffix = "fee_amount"
        maker_key = f"{name}_maker_{key_suffix}"
        taker_key = f"{name}_taker_{key_suffix}"
        all_dict.update({maker_key: new_fee_config_var(maker_key)})
        all_dict.update({taker_key: new_fee_config_var(taker_key)})
    return all_dict
Example #8
0
 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, ignore_case=True)
     self._connector_completer = WordCompleter(CONNECTOR_SETTINGS.keys(), ignore_case=True)
     self._exchange_completer = WordCompleter(EXCHANGES, ignore_case=True)
     self._derivative_completer = WordCompleter(DERIVATIVES, ignore_case=True)
     self._connect_option_completer = WordCompleter(CONNECT_OPTIONS, ignore_case=True)
     self._export_completer = WordCompleter(["keys", "trades"], ignore_case=True)
     self._balance_completer = WordCompleter(["limit", "paper"], ignore_case=True)
     self._history_completer = WordCompleter(["--days", "--verbose", "--precision"], ignore_case=True)
     self._strategy_completer = WordCompleter(STRATEGIES, ignore_case=True)
     self._py_file_completer = WordCompleter(file_name_list(SCRIPTS_PATH, "py"))
    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
Example #10
0
    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)
Example #11
0
    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
Example #12
0
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,