예제 #1
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": ""}
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()}"
예제 #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(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)
예제 #4
0
    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))