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
def balance(self, option: str = None, args: List[str] = None): if threading.current_thread() != threading.main_thread(): self.ev_loop.call_soon_threadsafe(self.balance, option, args) return self.app.clear_input() if option is None: safe_ensure_future(self.show_balances()) elif option in OPTIONS: config_map = global_config_map file_path = GLOBAL_CONFIG_PATH if option == "limit": config_var = config_map["balance_asset_limit"] if args is None or len(args) == 0: safe_ensure_future(self.show_asset_limits()) return if len(args) != 3 or validate_exchange( args[0]) is not None or validate_decimal( args[2]) is not None: self._notify("Error: Invalid command arguments") self.notify_balance_limit_set() return exchange = args[0] asset = args[1].upper() amount = float(args[2]) if exchange not in config_var.value or config_var.value[ exchange] is None: config_var.value[exchange] = {} if amount < 0 and asset in config_var.value[exchange].keys(): config_var.value[exchange].pop(asset) self._notify( f"Limit for {asset} on {exchange} exchange removed.") elif amount >= 0: config_var.value[exchange][asset] = amount self._notify( f"Limit for {asset} on {exchange} exchange set to {amount}" ) save_to_yml(file_path, config_map) elif option == "paper": config_var = config_map["paper_trade_account_balance"] if args is None or len(args) == 0: safe_ensure_future(self.show_paper_account_balance()) return if len(args) != 2 or validate_decimal(args[1]) is not None: self._notify("Error: Invalid command arguments") self.notify_balance_paper_set() return asset = args[0].upper() amount = float(args[1]) paper_balances = dict( config_var.value) if config_var.value else {} paper_balances[asset] = amount config_var.value = paper_balances self._notify( f"Paper balance for {asset} token set to {amount}") save_to_yml(file_path, config_map)
def test_validate_exchange_connector_does_not_exist(self): non_existant_exchange = "TEST_NON_EXISTANT_EXCHANGE" validation_error = config_validators.validate_exchange( non_existant_exchange) self.assertEqual( validation_error, f"Invalid exchange, please choose value from {AllConnectorSettings.get_exchange_names()}" )
def balance( self, # type: HummingbotApplication option: str = None, args: List[str] = None): if threading.current_thread() != threading.main_thread(): self.ev_loop.call_soon_threadsafe(self.balance, option, args) return self.app.clear_input() if option is None: safe_ensure_future(self.show_balances()) elif option in OPTIONS: if option == "limit": balance_asset_limit = self.client_config_map.balance_asset_limit if args is None or len(args) == 0: safe_ensure_future(self.show_asset_limits()) return if len(args) != 3 or validate_exchange( args[0]) is not None or validate_decimal( args[2]) is not None: self.notify("Error: Invalid command arguments") self.notify_balance_limit_set() return exchange = args[0] asset = args[1].upper() amount = float(args[2]) if balance_asset_limit.get(exchange) is None: balance_asset_limit[exchange] = {} if amount < 0 and asset in balance_asset_limit[exchange].keys( ): balance_asset_limit[exchange].pop(asset) self.notify( f"Limit for {asset} on {exchange} exchange removed.") elif amount >= 0: balance_asset_limit[exchange][asset] = amount self.notify( f"Limit for {asset} on {exchange} exchange set to {amount}" ) self.save_client_config() elif option == "paper": paper_balances = self.client_config_map.paper_trade.paper_trade_account_balance if args is None or len(args) == 0: safe_ensure_future(self.show_paper_account_balance()) return if len(args) != 2 or validate_decimal(args[1]) is not None: self.notify("Error: Invalid command arguments") self.notify_balance_paper_set() return asset = args[0].upper() amount = float(args[1]) paper_balances[asset] = amount self.notify(f"Paper balance for {asset} token set to {amount}") self.save_client_config()
def validate_exchange(cls, v: str): """Used for client-friendly error output.""" ret = validate_exchange(v) if ret is not None: raise ValueError(ret) cls.__fields__[ "exchange"].type_ = ClientConfigEnum( # rebuild the exchanges enum value="Exchanges", # noqa: F821 names={ e: e for e in AllConnectorSettings.get_all_connectors() }, type=str, ) return v
def validate_price_source_derivative(value: str) -> Optional[str]: if value == perpetual_market_making_config_map.get("derivative").value: return "Price source derivative cannot be the same as maker derivative." if validate_derivative(value) is not None and validate_exchange( value) is not None: return "Price source must must be a valid exchange or derivative connector."
def validate_price_source_exchange(value: str) -> Optional[str]: if value == pure_market_making_config_map.get("exchange").value: return "Price source exchange cannot be the same as maker exchange." return validate_exchange(value)
def test_validate_exchange_connector_exist(self): exchange = "binance" self.assertIsNone(config_validators.validate_exchange(exchange))
def validate_price_source_exchange(value: str) -> Optional[str]: return validate_exchange(value)