def validate_exchange(cls, v: str, field: Field):
     """Used for client-friendly error output."""
     ret = validate_exchange(v)
     if ret is not None:
         raise ValueError(ret)
     if field.name == "maker_market_trading_pair":
         cls.__fields__[
             "maker_market"].type_ = ClientConfigEnum(  # rebuild the exchanges enum
                 value="Exchanges",  # noqa: F821
                 names={
                     e: e
                     for e in
                     AllConnectorSettings.get_connector_settings().keys()
                 },
                 type=str,
             )
     if field.name == "taker_market_trading_pair":
         cls.__fields__[
             "taker_market"].type_ = ClientConfigEnum(  # rebuild the exchanges enum
                 value="Exchanges",  # noqa: F821
                 names={
                     e: e
                     for e in
                     AllConnectorSettings.get_connector_settings().keys()
                 },
                 type=str,
             )
     return v
Beispiel #2
0
def build_perpetual_trade_fee(
        exchange: str,
        is_maker: bool,
        position_action: PositionAction,
        base_currency: str,
        quote_currency: str,
        order_type: OrderType,
        order_side: TradeType,
        amount: Decimal,
        price: Decimal = Decimal("NaN"),
) -> TradeFeeBase:
    """
    WARNING: Do not use this method for order sizing. Use the `BudgetChecker` instead.

    Uses the exchange's `TradeFeeSchema` to build a `TradeFee`, given the trade parameters.
    """
    if exchange not in AllConnectorSettings.get_connector_settings():
        raise Exception(
            f"Invalid connector. {exchange} does not exist in AllConnectorSettings"
        )
    trade_fee_schema = AllConnectorSettings.get_connector_settings(
    )[exchange].trade_fee_schema
    trade_fee_schema = _superimpose_overrides(exchange, trade_fee_schema)
    percent = trade_fee_schema.maker_percent_fee_decimal if is_maker else trade_fee_schema.taker_percent_fee_decimal
    fee_cls = (AddedToCostTradeFee if position_action == PositionAction.OPEN
               or trade_fee_schema.percent_fee_token is not None else
               DeductedFromReturnsTradeFee)
    fixed_fees = trade_fee_schema.maker_fixed_fees if is_maker else trade_fee_schema.taker_fixed_fees
    trade_fee = fee_cls(percent, trade_fee_schema.percent_fee_token,
                        fixed_fees)
    return trade_fee
Beispiel #3
0
    async def update_exchanges(
            self,
            client_config_map: ClientConfigMap,
            reconnect: bool = False,
            exchanges: Optional[List[str]] = None) -> Dict[str, Optional[str]]:
        exchanges = exchanges or []
        tasks = []
        # Update user balances
        if len(exchanges) == 0:
            exchanges = [
                cs.name for cs in
                AllConnectorSettings.get_connector_settings().values()
            ]
        exchanges: List[str] = [
            cs.name
            for cs in AllConnectorSettings.get_connector_settings().values()
            if not cs.use_ethereum_wallet and cs.name in exchanges
            and not cs.name.endswith("paper_trade")
        ]

        if reconnect:
            self._markets.clear()
        for exchange in exchanges:
            tasks.append(
                self.update_exchange_balance(exchange, client_config_map))
        results = await safe_gather(*tasks)
        return {ex: err_msg for ex, err_msg in zip(exchanges, results)}
 def configured_schema_for_exchange(cls,
                                    exchange_name: str) -> TradeFeeSchema:
     if exchange_name not in AllConnectorSettings.get_connector_settings():
         raise Exception(
             f"Invalid connector. {exchange_name} does not exist in AllConnectorSettings"
         )
     trade_fee_schema = AllConnectorSettings.get_connector_settings(
     )[exchange_name].trade_fee_schema
     trade_fee_schema = cls._superimpose_overrides(exchange_name,
                                                   trade_fee_schema)
     return trade_fee_schema
def connector_keys():
    from hummingbot.client.settings import AllConnectorSettings
    all_keys = {}
    for connector_setting in AllConnectorSettings.get_connector_settings(
    ).values():
        all_keys.update(connector_setting.config_keys)
    return all_keys
def validate_connector(value: str) -> Optional[str]:
    """
    Restrict valid derivatives to the connector file names
    """
    from hummingbot.client.settings import AllConnectorSettings
    if value not in AllConnectorSettings.get_connector_settings() and value != "celo":
        return f"Invalid connector, please choose value from {AllConnectorSettings.get_connector_settings().keys()}"
    async def fetch_all(self):
        for conn_setting in AllConnectorSettings.get_connector_settings(
        ).values():
            if conn_setting.base_name().endswith("paper_trade"):
                if conn_setting.parent_name in self.trading_pairs:
                    self.trading_pairs[conn_setting.base_name(
                    )] = self.trading_pairs[conn_setting.parent_name]
                    continue
                exchange_name = conn_setting.parent_name
            else:
                exchange_name = conn_setting.base_name()

            module_name = f"{exchange_name}_connector" if conn_setting.type is ConnectorType.Connector \
                else f"{exchange_name}_api_order_book_data_source"
            module_path = f"hummingbot.connector.{conn_setting.type.name.lower()}." \
                          f"{exchange_name}.{module_name}"
            class_name = "".join([o.capitalize() for o in exchange_name.split("_")]) + \
                         "APIOrderBookDataSource" if conn_setting.type is not ConnectorType.Connector \
                         else "".join([o.capitalize() for o in exchange_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_last_price(exchange: str,
                         trading_pair: str) -> Optional[Decimal]:
    if exchange in AllConnectorSettings.get_connector_settings():
        conn_setting = AllConnectorSettings.get_connector_settings()[exchange]
        if AllConnectorSettings.get_connector_settings()[exchange].type in [
                ConnectorType.Exchange, ConnectorType.Derivative
        ]:
            try:
                connector = conn_setting.non_trading_connector_instance_with_default_configuration(
                )
                last_prices = await connector.get_last_traded_prices(
                    trading_pairs=[trading_pair])
                if last_prices:
                    return Decimal(str(last_prices[trading_pair]))
            except ModuleNotFoundError:
                pass
Beispiel #9
0
 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
             AllConnectorSettings.get_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)
Beispiel #10
0
async def get_last_price(exchange: str, trading_pair: str) -> Optional[Decimal]:
    if exchange in AllConnectorSettings.get_connector_settings():
        conn_setting = AllConnectorSettings.get_connector_settings()[exchange]
        if AllConnectorSettings.get_connector_settings()[exchange].type in (ConnectorType.Exchange, ConnectorType.Derivative):
            module_name = f"{conn_setting.base_name()}_api_order_book_data_source"
            class_name = "".join([o.capitalize() for o in conn_setting.base_name().split("_")]) + \
                         "APIOrderBookDataSource"
            module_path = f"hummingbot.connector.{conn_setting.type.name.lower()}." \
                          f"{conn_setting.base_name()}.{module_name}"
            module = getattr(importlib.import_module(module_path), class_name)
            args = {"trading_pairs": [trading_pair]}
            if conn_setting.is_sub_domain:
                args["domain"] = conn_setting.domain_parameter
            last_prices = await module.get_last_traded_prices(**args)
            if last_prices:
                return Decimal(str(last_prices[trading_pair]))
Beispiel #11
0
def fee_overrides_dict():
    all_dict = {}
    # all_connector_types = get_exchanges_and_derivatives()
    for name in AllConnectorSettings.get_connector_settings().keys():
        all_dict.update({
            f"{name}_percent_fee_token":
            new_fee_config_var(f"{name}_percent_fee_token", type_str="str")
        })
        all_dict.update({
            f"{name}_maker_percent_fee":
            new_fee_config_var(f"{name}_maker_percent_fee", type_str="decimal")
        })
        all_dict.update({
            f"{name}_taker_percent_fee":
            new_fee_config_var(f"{name}_taker_percent_fee", type_str="decimal")
        })
        fee_application = f"{name}_buy_percent_fee_deducted_from_returns"
        all_dict.update({
            fee_application:
            new_fee_config_var(fee_application, type_str="bool")
        })
        all_dict.update({
            f"{name}_maker_fixed_fees":
            new_fee_config_var(f"{name}_maker_fixed_fees", type_str="list")
        })
        all_dict.update({
            f"{name}_taker_fixed_fees":
            new_fee_config_var(f"{name}_taker_fixed_fees", type_str="list")
        })
    return all_dict
Beispiel #12
0
 def __init__(self, hummingbot_application):
     super(HummingbotCompleter, self).__init__()
     self.hummingbot_application = hummingbot_application
     self._path_completer = WordCompleter(file_name_list(str(STRATEGIES_CONF_DIR_PATH), "yml"))
     self._command_completer = WordCompleter(self.parser.commands, ignore_case=True)
     self._exchange_completer = WordCompleter(sorted(AllConnectorSettings.get_connector_settings().keys()), ignore_case=True)
     self._spot_exchange_completer = WordCompleter(sorted(AllConnectorSettings.get_exchange_names()), ignore_case=True)
     self._exchange_amm_completer = WordCompleter(sorted(AllConnectorSettings.get_exchange_names().union(AllConnectorSettings.get_gateway_evm_amm_connector_names())), ignore_case=True)
     self._evm_amm_lp_completer = WordCompleter(sorted(AllConnectorSettings.get_gateway_evm_amm_lp_connector_names()), ignore_case=True)
     self._trading_timeframe_completer = WordCompleter(["infinite", "from_date_to_date", "daily_between_times"], ignore_case=True)
     self._derivative_completer = WordCompleter(AllConnectorSettings.get_derivative_names(), ignore_case=True)
     self._derivative_exchange_completer = WordCompleter(AllConnectorSettings.get_derivative_names().difference(AllConnectorSettings.get_derivative_dex_names()), 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(["create", "config", "connect", "connector-tokens", "generate-certs", "status", "test-connection", "start", "stop"], ignore_case=True)
     self._gateway_connect_completer = WordCompleter(GATEWAY_CONNECTORS, ignore_case=True)
     self._gateway_connector_tokens_completer = WordCompleter(sorted(AllConnectorSettings.get_gateway_evm_amm_connector_names()), ignore_case=True)
     self._gateway_config_completer = WordCompleter(hummingbot_application.gateway_config_keys, ignore_case=True)
     self._strategy_completer = WordCompleter(STRATEGIES, ignore_case=True)
     self._py_file_completer = WordCompleter(file_name_list(str(PMM_SCRIPTS_PATH), "py"))
     self._script_strategy_completer = WordCompleter(file_name_list(str(SCRIPT_STRATEGIES_PATH), "py"))
     self._rate_oracle_completer = WordCompleter([r.name for r in RateOracleSource], ignore_case=True)
     self._gateway_networks = []
     self._list_gateway_wallets_parameters = {"wallets": [], "chain": ""}
Beispiel #13
0
    def _initialize_markets(self, market_names: List[Tuple[str, List[str]]]):
        # aggregate trading_pairs if there are duplicate markets

        for market_name, trading_pairs in market_names:
            if market_name not in self.market_trading_pairs_map:
                self.market_trading_pairs_map[market_name] = []
            for hb_trading_pair in trading_pairs:
                self.market_trading_pairs_map[market_name].append(hb_trading_pair)

        for connector_name, trading_pairs in self.market_trading_pairs_map.items():
            conn_setting = AllConnectorSettings.get_connector_settings()[connector_name]

            if connector_name.endswith("paper_trade") and conn_setting.type == ConnectorType.Exchange:
                connector = create_paper_trade_market(conn_setting.parent_name, self.client_config_map, trading_pairs)
                paper_trade_account_balance = self.client_config_map.paper_trade.paper_trade_account_balance
                if paper_trade_account_balance is not None:
                    for asset, balance in paper_trade_account_balance.items():
                        connector.set_balance(asset, balance)
            else:
                keys = Security.api_keys(connector_name)
                init_params = conn_setting.conn_init_parameters(keys)
                init_params.update(trading_pairs=trading_pairs, trading_required=self._trading_required)
                connector_class = get_connector_class(connector_name)
                read_only_config = ReadOnlyClientConfigAdapter.lock_config(self.client_config_map)
                connector = connector_class(read_only_config, **init_params)
            self.markets[connector_name] = connector

        self.markets_recorder = MarketsRecorder(
            self.trade_fill_db,
            list(self.markets.values()),
            self.strategy_file_name,
            self.strategy_name,
        )
        self.markets_recorder.start()
Beispiel #14
0
 def connect_market(exchange, **api_details):
     connector = None
     conn_setting = AllConnectorSettings.get_connector_settings()[exchange]
     if not conn_setting.use_ethereum_wallet:
         connector_class = get_connector_class(exchange)
         init_params = conn_setting.conn_init_parameters(api_details)
         connector = connector_class(**init_params)
     return connector
Beispiel #15
0
def create_paper_trade_market(exchange_name: str, trading_pairs: List[str]):
    obt_class = get_order_book_tracker_class(exchange_name)
    conn_setting = AllConnectorSettings.get_connector_settings()[exchange_name]
    obt_params = {"trading_pairs": trading_pairs}
    obt_kwargs = conn_setting.add_domain_parameter(obt_params)
    obt_obj = obt_class(**obt_kwargs)
    return PaperTradeExchange(obt_obj,
                              get_connector_class(exchange_name))
def get_order_book_tracker(connector_name: str, trading_pairs: List[str]) -> OrderBookTracker:
    conn_setting = AllConnectorSettings.get_connector_settings()[connector_name]
    try:
        connector_instance = conn_setting.non_trading_connector_instance_with_default_configuration(
            trading_pairs=trading_pairs)
        return connector_instance.order_book_tracker
    except Exception as exception:
        raise Exception(f"Connector {connector_name} OrderBookTracker class not found ({exception})")
Beispiel #17
0
 async def api_keys(cls, exchange):
     await cls.wait_til_decryption_done()
     exchange_configs = [
         c for c in global_config_map.values()
         if c.key in AllConnectorSettings.get_connector_settings()
         [exchange].config_keys and c.key in cls._secure_configs
     ]
     return {c.key: cls.decrypted_value(c.key) for c in exchange_configs}
Beispiel #18
0
 def _trading_pair_completer(self) -> Completer:
     trading_pair_fetcher = TradingPairFetcher.get_instance()
     market = ""
     for exchange in sorted(list(AllConnectorSettings.get_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 and market else []
     return WordCompleter(trading_pairs, ignore_case=True, sentence=True)
    def _initialize_markets(self, market_names: List[Tuple[str, List[str]]]):
        # aggregate trading_pairs if there are duplicate markets

        for market_name, trading_pairs in market_names:
            if market_name not in self.market_trading_pairs_map:
                self.market_trading_pairs_map[market_name] = []
            for hb_trading_pair in trading_pairs:
                self.market_trading_pairs_map[market_name].append(
                    hb_trading_pair)

        for connector_name, trading_pairs in self.market_trading_pairs_map.items(
        ):
            conn_setting = AllConnectorSettings.get_connector_settings(
            )[connector_name]

            if connector_name.endswith(
                    "paper_trade"
            ) and conn_setting.type == ConnectorType.Exchange:
                connector = create_paper_trade_market(conn_setting.parent_name,
                                                      trading_pairs)
                paper_trade_account_balance = global_config_map.get(
                    "paper_trade_account_balance").value
                if paper_trade_account_balance is not None:
                    for asset, balance in paper_trade_account_balance.items():
                        connector.set_balance(asset, balance)
            else:
                Security.update_config_map(global_config_map)
                keys = {
                    key: config.value
                    for key, config in global_config_map.items()
                    if key in conn_setting.config_keys
                }
                init_params = conn_setting.conn_init_parameters(keys)
                init_params.update(trading_pairs=trading_pairs,
                                   trading_required=self._trading_required)
                if conn_setting.use_ethereum_wallet:
                    ethereum_rpc_url = global_config_map.get(
                        "ethereum_rpc_url").value
                    # Todo: Hard coded this execption for now until we figure out how to handle all ethereum connectors.
                    if connector_name in [
                            "balancer", "uniswap", "uniswap_v3",
                            "perpetual_finance"
                    ]:
                        private_key = get_eth_wallet_private_key()
                        init_params.update(wallet_private_key=private_key,
                                           ethereum_rpc_url=ethereum_rpc_url)
                connector_class = get_connector_class(connector_name)
                connector = connector_class(**init_params)
            self.markets[connector_name] = connector

        self.markets_recorder = MarketsRecorder(
            self.trade_fill_db,
            list(self.markets.values()),
            self.strategy_file_name,
            self.strategy_name,
        )
        self.markets_recorder.start()
Beispiel #20
0
 def connect_market(exchange, **api_details):
     connector = None
     conn_setting = AllConnectorSettings.get_connector_settings()[exchange]
     if api_details or conn_setting.uses_gateway_generic_connector():
         connector_class = get_connector_class(exchange)
         init_params = conn_setting.conn_init_parameters(api_details)
         init_params.update(trading_pairs=gateway_connector_trading_pairs(
             conn_setting.name))
         connector = connector_class(**init_params)
     return connector
Beispiel #21
0
def get_order_book_tracker_class(connector_name: str) -> Callable:
    conn_setting = AllConnectorSettings.get_connector_settings()[connector_name]
    module_name = f"{conn_setting.base_name()}_order_book_tracker"
    class_name = "".join([o.capitalize() for o in module_name.split("_")])
    try:
        mod = __import__(f'hummingbot.connector.{conn_setting.type.name.lower()}.{conn_setting.base_name()}.'
                         f'{module_name}',
                         fromlist=[class_name])
        return getattr(mod, class_name)
    except Exception:
        pass
    raise Exception(f"Connector {connector_name} OrderBookTracker class not found")
Beispiel #22
0
 async def connect_exchange(self,  # type: HummingbotApplication
                            exchange):
     self.app.clear_input()
     self.placeholder_mode = True
     self.app.hide_input = True
     if exchange == "kraken":
         self._notify("Reminder: Please ensure your Kraken API Key Nonce Window is at least 10.")
     exchange_configs = [c for c in global_config_map.values()
                         if c.key in AllConnectorSettings.get_connector_settings()[exchange].config_keys and c.is_connect_key]
     to_connect = True
     if Security.encrypted_file_exists(exchange_configs[0].key):
         await Security.wait_til_decryption_done()
         api_key_config = [c for c in exchange_configs if "api_key" in c.key]
         if api_key_config:
             api_key_config = api_key_config[0]
             api_key = Security.decrypted_value(api_key_config.key)
             prompt = f"Would you like to replace your existing {exchange} API key {api_key} (Yes/No)? >>> "
         else:
             prompt = f"Would you like to replace your existing {exchange_configs[0].key} (Yes/No)? >>> "
         answer = await self.app.prompt(prompt=prompt)
         if self.app.to_stop_config:
             self.app.to_stop_config = False
             return
         if answer.lower() not in ("yes", "y"):
             to_connect = False
     if to_connect:
         for config in exchange_configs:
             await self.prompt_a_config(config)
             if self.app.to_stop_config:
                 self.app.to_stop_config = False
                 return
             Security.update_secure_config(config.key, config.value)
         api_keys = await Security.api_keys(exchange)
         network_timeout = float(global_config_map["other_commands_timeout"].value)
         try:
             err_msg = await asyncio.wait_for(
                 UserBalances.instance().add_exchange(exchange, **api_keys), network_timeout
             )
         except asyncio.TimeoutError:
             self._notify("\nA network error prevented the connection to complete. See logs for more details.")
             self.placeholder_mode = False
             self.app.hide_input = False
             self.app.change_prompt(prompt=">>> ")
             raise
         if err_msg is None:
             self._notify(f"\nYou are now connected to {exchange}.")
         else:
             self._notify(f"\nError: {err_msg}")
     self.placeholder_mode = False
     self.app.hide_input = False
     self.app.change_prompt(prompt=">>> ")
Beispiel #23
0
    async def exchange_balances_extra_df(
            self,  # type: HummingbotApplication
            exchange: str,
            ex_balances: Dict[str, Decimal],
            ex_avai_balances: Dict[str, Decimal]):
        conn_setting = AllConnectorSettings.get_connector_settings()[exchange]
        total_col_name = f"Total ({RateOracle.global_token_symbol})"
        allocated_total = Decimal("0")
        rows = []
        for token, bal in ex_balances.items():
            avai = Decimal(ex_avai_balances.get(
                token.upper(),
                0)) if ex_avai_balances is not None else Decimal(0)
            # show zero balances if it is a gateway connector (the user manually
            # chose to show those values with 'gateway connector-tokens')
            if conn_setting.uses_gateway_generic_connector():
                if bal == Decimal(0):
                    allocated = "0%"
                else:
                    allocated = f"{(bal - avai) / bal:.0%}"
            else:
                # the exchange is CEX. Only show balance if non-zero.
                if bal == Decimal(0):
                    continue
                allocated = f"{(bal - avai) / bal:.0%}"

            rate = await RateOracle.global_rate(token)
            rate = Decimal("0") if rate is None else rate
            global_value = rate * bal
            allocated_total += rate * (bal - avai)
            rows.append({
                "Asset":
                token.upper(),
                "Total":
                round(bal, 4),
                total_col_name:
                PerformanceMetrics.smart_round(global_value),
                "sum_not_for_show":
                global_value,
                "Allocated":
                allocated,
            })
        df = pd.DataFrame(data=rows,
                          columns=[
                              "Asset", "Total", total_col_name,
                              "sum_not_for_show", "Allocated"
                          ])
        df.sort_values(by=["Asset"], inplace=True)
        return df, allocated_total
Beispiel #24
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(AllConnectorSettings.get_connector_settings().keys()), ignore_case=True)
     self._spot_completer = WordCompleter(sorted(AllConnectorSettings.get_exchange_names().union(SPOT_PROTOCOL_CONNECTOR)), ignore_case=True)
     self._spot_exchange_completer = WordCompleter(sorted(AllConnectorSettings.get_exchange_names()), ignore_case=True)
     self._trading_timeframe_completer = WordCompleter(["infinite", "from_date_to_date", "daily_between_times"], ignore_case=True)
     self._derivative_completer = WordCompleter(AllConnectorSettings.get_derivative_names(), ignore_case=True)
     self._derivative_exchange_completer = WordCompleter(AllConnectorSettings.get_derivative_names().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)
Beispiel #25
0
    async def fetch_all(self):
        for conn_setting in AllConnectorSettings.get_connector_settings(
        ).values():
            if conn_setting.base_name().endswith("paper_trade"):
                if conn_setting.parent_name in self.trading_pairs:
                    self.trading_pairs[conn_setting.base_name(
                    )] = self.trading_pairs[conn_setting.parent_name]
                    continue
                exchange_name = conn_setting.parent_name
            else:
                exchange_name = conn_setting.base_name()

            module_name = f"{exchange_name}_api_order_book_data_source"
            module_path = f"hummingbot.connector.{conn_setting.type.name.lower()}." \
                          f"{exchange_name}.{module_name}" if not conn_setting.uses_gateway_generic_connector() \
                          else conn_setting.module_path()
            class_name = "".join([o.capitalize() for o in exchange_name.split("_")]) + \
                         "APIOrderBookDataSource" if not conn_setting.uses_gateway_generic_connector() \
                         else conn_setting.class_name()

            # XXX(martin_kou): Some connectors, e.g. uniswap v3, aren't completed yet. Ignore if you can't find the
            # data source module for them.
            try:
                module = getattr(importlib.import_module(module_path),
                                 class_name)
            except ModuleNotFoundError:
                continue
            args = {}
            args = conn_setting.add_domain_parameter(args)
            if conn_setting.uses_gateway_generic_connector():
                connector_params = conn_setting.name.split("_")
                safe_ensure_future(
                    self.call_fetch_pairs(
                        module.fetch_trading_pairs(connector_params[1],
                                                   connector_params[2]),
                        conn_setting.name))
            else:
                safe_ensure_future(
                    self.call_fetch_pairs(module.fetch_trading_pairs(**args),
                                          conn_setting.name))

        self.ready = True
Beispiel #26
0
def fee_overrides_dict() -> Dict[str, ConfigVar]:
    all_configs: Dict[str, ConfigVar] = {}
    for name in AllConnectorSettings.get_connector_settings().keys():
        all_configs.update({
            f"{name}_percent_fee_token":
            new_fee_config_var(f"{name}_percent_fee_token", type_str="str"),
            f"{name}_maker_percent_fee":
            new_fee_config_var(f"{name}_maker_percent_fee",
                               type_str="decimal"),
            f"{name}_taker_percent_fee":
            new_fee_config_var(f"{name}_taker_percent_fee",
                               type_str="decimal"),
            f"{name}_buy_percent_fee_deducted_from_returns":
            new_fee_config_var(f"{name}_buy_percent_fee_deducted_from_returns",
                               type_str="bool"),
            f"{name}_maker_fixed_fees":
            new_fee_config_var(f"{name}_maker_fixed_fees", type_str="list"),
            f"{name}_taker_fixed_fees":
            new_fee_config_var(f"{name}_taker_fixed_fees", type_str="list"),
        })
    return all_configs
Beispiel #27
0
def get_order_book_tracker(connector_name: str, trading_pairs: List[str]) -> OrderBookTracker:
    conn_setting = AllConnectorSettings.get_connector_settings()[connector_name]
    tracker_params = {"trading_pairs": trading_pairs}
    tracker_kwargs = conn_setting.add_domain_parameter(tracker_params)

    module_name = f"{conn_setting.base_name()}_order_book_tracker"
    class_name = "".join([o.capitalize() for o in module_name.split("_")])
    try:
        mod = importlib.import_module(f'hummingbot.connector.{conn_setting.type.name.lower()}.'
                                      f'{conn_setting.base_name()}.{module_name}')
        tracker_class = getattr(mod, class_name)
        return tracker_class(**tracker_kwargs)
    except ModuleNotFoundError:
        module_name = f"{conn_setting.base_name()}_api_order_book_data_source"
        class_name = f"{conn_setting.base_name().capitalize()}APIOrderBookDataSource"
        mod = importlib.import_module(f'hummingbot.connector.{conn_setting.type.name.lower()}.'
                                      f'{conn_setting.base_name()}.{module_name}')
        data_source_class = getattr(mod, class_name)
        data_source = data_source_class(**tracker_kwargs)
        return OrderBookTracker(data_source=data_source, **tracker_kwargs)
    except Exception as exception:
        raise Exception(f"Connector {connector_name} OrderBookTracker class not found ({exception})")
Beispiel #28
0
    def connect_market(exchange, client_config_map: ClientConfigMap,
                       **api_details):
        connector = None
        conn_setting = AllConnectorSettings.get_connector_settings()[exchange]
        if api_details or conn_setting.uses_gateway_generic_connector():
            connector_class = get_connector_class(exchange)
            init_params = conn_setting.conn_init_parameters(api_details)

            # collect trading pairs from the gateway connector settings
            trading_pairs: List[str] = gateway_connector_trading_pairs(
                conn_setting.name)

            # collect unique trading pairs that are for balance reporting only
            config: Optional[Dict[
                str,
                str]] = GatewayConnectionSetting.get_connector_spec_from_market_name(
                    conn_setting.name)
            if config is not None:
                existing_pairs = set(
                    flatten([x.split("-") for x in trading_pairs]))

                other_tokens: Set[str] = set(
                    config.get("tokens", "").split(","))
                other_tokens.discard("")
                tokens: List[str] = [
                    t for t in other_tokens if t not in existing_pairs
                ]
                if tokens != [""]:
                    trading_pairs.append("-".join(tokens))

            read_only_client_config = ReadOnlyClientConfigAdapter.lock_config(
                client_config_map)
            init_params.update(
                trading_pairs=gateway_connector_trading_pairs(
                    conn_setting.name),
                client_config_map=read_only_client_config,
            )
            connector = connector_class(**init_params)
        return connector
Beispiel #29
0
 def _all_connector_settings(self) -> Dict[str, ConnectorSetting]:
     # Method created to enabling patching in unit tests
     return AllConnectorSettings.get_connector_settings()
from typing import TYPE_CHECKING, Optional
from hummingbot.client.settings import AllConnectorSettings, GLOBAL_CONFIG_PATH

from hummingbot.client.config.security import Security
from hummingbot.core.utils.async_utils import safe_ensure_future
from hummingbot.client.config.global_config_map import global_config_map
from hummingbot.user.user_balances import UserBalances
from hummingbot.client.config.config_helpers import save_to_yml
from hummingbot.connector.other.celo.celo_cli import CeloCLI
from hummingbot.connector.connector_status import get_connector_status
if TYPE_CHECKING:
    from hummingbot.client.hummingbot_application import HummingbotApplication

OPTIONS = {
    cs.name
    for cs in AllConnectorSettings.get_connector_settings().values()
    if not cs.use_ethereum_wallet
}.union({"ethereum", "celo"})


class ConnectCommand:
    def connect(
            self,  # type: HummingbotApplication
            option: str):
        if option is None:
            safe_ensure_future(self.show_connections())
        elif option == "ethereum":
            safe_ensure_future(self.connect_ethereum())
        elif option == "celo":
            safe_ensure_future(self.connect_celo())
        else: