Add validation to make sure strategies work on that exchange
This commit is contained in:
parent
223f0cd4d3
commit
73f5bff9c5
@ -228,6 +228,7 @@ class Exchange:
|
|||||||
self.validate_pairs(config['exchange']['pair_whitelist'])
|
self.validate_pairs(config['exchange']['pair_whitelist'])
|
||||||
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', {}))
|
||||||
|
self.validate_required_startup_candles(config.get('startup_candle_count', 0))
|
||||||
|
|
||||||
# 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(
|
||||||
@ -443,6 +444,15 @@ class Exchange:
|
|||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
f'Time in force policies are not supported for {self.name} yet.')
|
f'Time in force policies are not supported for {self.name} yet.')
|
||||||
|
|
||||||
|
def validate_required_startup_candles(self, startup_candles) -> None:
|
||||||
|
"""
|
||||||
|
Checks if required startup_candles is more than ohlcv_candle_limit.
|
||||||
|
"""
|
||||||
|
if startup_candles + 5 > self._ft_has['ohlcv_candle_limit']:
|
||||||
|
raise OperationalException(
|
||||||
|
f"This strategy requires {startup_candles} candles to start. "
|
||||||
|
f"{self.name} only provides {self._ft_has['ohlcv_candle_limit']}.")
|
||||||
|
|
||||||
def exchange_has(self, endpoint: str) -> bool:
|
def exchange_has(self, endpoint: str) -> bool:
|
||||||
"""
|
"""
|
||||||
Checks if exchange implements a specific API endpoint.
|
Checks if exchange implements a specific API endpoint.
|
||||||
|
@ -57,6 +57,7 @@ class StrategyResolver(IResolver):
|
|||||||
("order_time_in_force", None, False),
|
("order_time_in_force", None, False),
|
||||||
("stake_currency", None, False),
|
("stake_currency", None, False),
|
||||||
("stake_amount", None, False),
|
("stake_amount", None, False),
|
||||||
|
("startup_candle_count", None, False),
|
||||||
("use_sell_signal", True, True),
|
("use_sell_signal", True, True),
|
||||||
("sell_profit_only", False, True),
|
("sell_profit_only", False, True),
|
||||||
("ignore_roi_if_buy_signal", False, True),
|
("ignore_roi_if_buy_signal", False, True),
|
||||||
|
@ -533,6 +533,20 @@ def test_validate_order_types_not_in_config(default_conf, mocker):
|
|||||||
Exchange(conf)
|
Exchange(conf)
|
||||||
|
|
||||||
|
|
||||||
|
def test_validate_required_startup_candles(default_conf, mocker, caplog):
|
||||||
|
api_mock = MagicMock()
|
||||||
|
default_conf['startup_candle_count'] = 2000
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange.name', PropertyMock(return_value='Binance'))
|
||||||
|
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange._init_ccxt', api_mock)
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange.validate_timeframes', MagicMock())
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange._load_async_markets', MagicMock())
|
||||||
|
mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock())
|
||||||
|
|
||||||
|
with pytest.raises(OperationalException, match=r'This strategy requires 2000.*'):
|
||||||
|
Exchange(default_conf)
|
||||||
|
|
||||||
|
|
||||||
def test_exchange_has(default_conf, mocker):
|
def test_exchange_has(default_conf, mocker):
|
||||||
exchange = get_patched_exchange(mocker, default_conf)
|
exchange = get_patched_exchange(mocker, default_conf)
|
||||||
assert not exchange.exchange_has('ASDFASDF')
|
assert not exchange.exchange_has('ASDFASDF')
|
||||||
|
Loading…
Reference in New Issue
Block a user