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": ""}
def validate_derivative(value: str) -> Optional[str]: """ restrict valid derivatives to the derivative file names """ from hummingbot.client.settings import AllConnectorSettings if value not in AllConnectorSettings.get_derivative_names(): return f"Invalid derivative, please choose value from {AllConnectorSettings.get_derivative_names()}"
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)
def report_performance_by_market( self, # type: HummingbotApplication market: str, trading_pair: str, perf: PerformanceMetrics, precision: int): lines = [] base, quote = trading_pair.split("-") lines.extend([f"\n{market} / {trading_pair}"]) trades_columns = ["", "buy", "sell", "total"] trades_data = [ [ f"{'Number of trades':<27}", perf.num_buys, perf.num_sells, perf.num_trades ], [ f"{f'Total trade volume ({base})':<27}", PerformanceMetrics.smart_round(perf.b_vol_base, precision), PerformanceMetrics.smart_round(perf.s_vol_base, precision), PerformanceMetrics.smart_round(perf.tot_vol_base, precision) ], [ f"{f'Total trade volume ({quote})':<27}", PerformanceMetrics.smart_round(perf.b_vol_quote, precision), PerformanceMetrics.smart_round(perf.s_vol_quote, precision), PerformanceMetrics.smart_round(perf.tot_vol_quote, precision) ], [ f"{'Avg price':<27}", PerformanceMetrics.smart_round(perf.avg_b_price, precision), PerformanceMetrics.smart_round(perf.avg_s_price, precision), PerformanceMetrics.smart_round(perf.avg_tot_price, precision) ], ] trades_df: pd.DataFrame = pd.DataFrame(data=trades_data, columns=trades_columns) lines.extend(["", " Trades:"] + [ " " + line for line in trades_df.to_string(index=False).split("\n") ]) assets_columns = ["", "start", "current", "change"] assets_data = [ [f"{base:<17}", "-", "-", "-"] if market in AllConnectorSettings.get_derivative_names() else # No base asset for derivatives because they are margined [ f"{base:<17}", PerformanceMetrics.smart_round(perf.start_base_bal, precision), PerformanceMetrics.smart_round(perf.cur_base_bal, precision), PerformanceMetrics.smart_round(perf.tot_vol_base, precision) ], [ f"{quote:<17}", PerformanceMetrics.smart_round(perf.start_quote_bal, precision), PerformanceMetrics.smart_round(perf.cur_quote_bal, precision), PerformanceMetrics.smart_round(perf.tot_vol_quote, precision) ], [ f"{trading_pair + ' price':<17}", PerformanceMetrics.smart_round(perf.start_price), PerformanceMetrics.smart_round(perf.cur_price), PerformanceMetrics.smart_round(perf.cur_price - perf.start_price) ], [f"{'Base asset %':<17}", "-", "-", "-"] if market in AllConnectorSettings.get_derivative_names() else # No base asset for derivatives because they are margined [ f"{'Base asset %':<17}", f"{perf.start_base_ratio_pct:.2%}", f"{perf.cur_base_ratio_pct:.2%}", f"{perf.cur_base_ratio_pct - perf.start_base_ratio_pct:.2%}" ], ] assets_df: pd.DataFrame = pd.DataFrame(data=assets_data, columns=assets_columns) lines.extend(["", " Assets:"] + [ " " + line for line in assets_df.to_string(index=False).split("\n") ]) perf_data = [ [ "Hold portfolio value ", f"{PerformanceMetrics.smart_round(perf.hold_value, precision)} {quote}" ], [ "Current portfolio value ", f"{PerformanceMetrics.smart_round(perf.cur_value, precision)} {quote}" ], [ "Trade P&L ", f"{PerformanceMetrics.smart_round(perf.trade_pnl, precision)} {quote}" ] ] perf_data.extend([ "Fees paid ", f"{PerformanceMetrics.smart_round(fee_amount, precision)} {fee_token}" ] for fee_token, fee_amount in perf.fees.items()) perf_data.extend([[ "Total P&L ", f"{PerformanceMetrics.smart_round(perf.total_pnl, precision)} {quote}" ], ["Return % ", f"{perf.return_pct:.2%}"]]) perf_df: pd.DataFrame = pd.DataFrame(data=perf_data) lines.extend(["", " Performance:"] + [ " " + line for line in perf_df.to_string( index=False, header=False).split("\n") ]) self.notify("\n".join(lines))