Refactor list-timeframes command with the use of the Exchange class methods
This commit is contained in:
parent
448b09d7b6
commit
75446d8195
@ -133,6 +133,9 @@ class Exchange:
|
|||||||
|
|
||||||
logger.info('Using Exchange "%s"', self.name)
|
logger.info('Using Exchange "%s"', self.name)
|
||||||
|
|
||||||
|
# Check if timeframe is available
|
||||||
|
self.validate_timeframes(config.get('ticker_interval'))
|
||||||
|
|
||||||
# Converts the interval provided in minutes in config to seconds
|
# Converts the interval provided in minutes in config to seconds
|
||||||
self.markets_refresh_interval: int = exchange_config.get(
|
self.markets_refresh_interval: int = exchange_config.get(
|
||||||
"markets_refresh_interval", 60) * 60
|
"markets_refresh_interval", 60) * 60
|
||||||
@ -144,10 +147,6 @@ class Exchange:
|
|||||||
self.validate_ordertypes(config.get('order_types', {}))
|
self.validate_ordertypes(config.get('order_types', {}))
|
||||||
self.validate_order_time_in_force(config.get('order_time_in_force', {}))
|
self.validate_order_time_in_force(config.get('order_time_in_force', {}))
|
||||||
|
|
||||||
if config.get('ticker_interval'):
|
|
||||||
# Check if timeframe is available
|
|
||||||
self.validate_timeframes(config['ticker_interval'])
|
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
"""
|
"""
|
||||||
Destructor - clean up async stuff
|
Destructor - clean up async stuff
|
||||||
@ -199,6 +198,10 @@ class Exchange:
|
|||||||
"""exchange ccxt id"""
|
"""exchange ccxt id"""
|
||||||
return self._api.id
|
return self._api.id
|
||||||
|
|
||||||
|
@property
|
||||||
|
def timeframes(self) -> List[str]:
|
||||||
|
return list((self._api.timeframes or {}).keys())
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def markets(self) -> Dict:
|
def markets(self) -> Dict:
|
||||||
"""exchange ccxt markets"""
|
"""exchange ccxt markets"""
|
||||||
@ -291,7 +294,7 @@ class Exchange:
|
|||||||
return pair
|
return pair
|
||||||
raise DependencyException(f"Could not combine {curr_1} and {curr_2} to get a valid pair.")
|
raise DependencyException(f"Could not combine {curr_1} and {curr_2} to get a valid pair.")
|
||||||
|
|
||||||
def validate_timeframes(self, timeframe: List[str]) -> None:
|
def validate_timeframes(self, timeframe: Optional[str]) -> None:
|
||||||
"""
|
"""
|
||||||
Checks if ticker interval from config is a supported timeframe on the exchange
|
Checks if ticker interval from config is a supported timeframe on the exchange
|
||||||
"""
|
"""
|
||||||
@ -304,10 +307,9 @@ class Exchange:
|
|||||||
f"for the exchange \"{self.name}\" and this exchange "
|
f"for the exchange \"{self.name}\" and this exchange "
|
||||||
f"is therefore not supported. ccxt fetchOHLCV: {self.exchange_has('fetchOHLCV')}")
|
f"is therefore not supported. ccxt fetchOHLCV: {self.exchange_has('fetchOHLCV')}")
|
||||||
|
|
||||||
timeframes = self._api.timeframes
|
if timeframe and (timeframe not in self.timeframes):
|
||||||
if timeframe not in timeframes:
|
|
||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
f'Invalid ticker {timeframe}, this Exchange supports {timeframes}')
|
f"Invalid ticker interval '{timeframe}'. This exchange supports: {self.timeframes}")
|
||||||
|
|
||||||
def validate_ordertypes(self, order_types: Dict) -> None:
|
def validate_ordertypes(self, order_types: Dict) -> None:
|
||||||
"""
|
"""
|
||||||
|
@ -104,19 +104,14 @@ def start_list_timeframes(args: Dict[str, Any]) -> None:
|
|||||||
Print ticker intervals (timeframes) available on Exchange
|
Print ticker intervals (timeframes) available on Exchange
|
||||||
"""
|
"""
|
||||||
config = setup_utils_configuration(args, RunMode.OTHER)
|
config = setup_utils_configuration(args, RunMode.OTHER)
|
||||||
|
# Do not use ticker_interval set in the config
|
||||||
|
config['ticker_interval'] = None
|
||||||
|
|
||||||
# Init exchange
|
# Init exchange
|
||||||
exchange = ExchangeResolver(config['exchange']['name'], config).exchange
|
exchange = ExchangeResolver(config['exchange']['name'], config).exchange
|
||||||
|
|
||||||
timeframes = list((exchange._api.timeframes or {}).keys())
|
if args['print_one_column']:
|
||||||
|
print('\n'.join(exchange.timeframes))
|
||||||
if not timeframes:
|
|
||||||
logger.warning("List of timeframes available for exchange "
|
|
||||||
f"`{config['exchange']['name']}` is empty. "
|
|
||||||
"This exchange does not support fetching OHLCV data.")
|
|
||||||
else:
|
else:
|
||||||
if args['print_one_column']:
|
print(f"Timeframes available for the exchange `{config['exchange']['name']}`: "
|
||||||
print('\n'.join(timeframes))
|
f"{', '.join(exchange.timeframes)}")
|
||||||
else:
|
|
||||||
print(f"Timeframes available for the exchange `{config['exchange']['name']}`: "
|
|
||||||
f"{', '.join(timeframes)}")
|
|
||||||
|
@ -409,7 +409,8 @@ def test_validate_timeframes_failed(default_conf, mocker):
|
|||||||
mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock))
|
mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock))
|
||||||
mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={}))
|
mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={}))
|
||||||
mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock())
|
mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock())
|
||||||
with pytest.raises(OperationalException, match=r'Invalid ticker 3m, this Exchange supports.*'):
|
with pytest.raises(OperationalException,
|
||||||
|
match=r"Invalid ticker interval '3m'. This exchange supports.*"):
|
||||||
Exchange(default_conf)
|
Exchange(default_conf)
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user