Update some ohlcv_candle_limit calls
This commit is contained in:
parent
111b04c9e6
commit
bb1b283d95
@ -310,7 +310,7 @@ class Exchange:
|
|||||||
logger.info(f"API {endpoint}: {response}")
|
logger.info(f"API {endpoint}: {response}")
|
||||||
|
|
||||||
def ohlcv_candle_limit(
|
def ohlcv_candle_limit(
|
||||||
self, timeframe: str, candle_type: CandleType, since_ms: Optional[int]) -> int:
|
self, timeframe: str, candle_type: CandleType, since_ms: Optional[int] = None) -> int:
|
||||||
"""
|
"""
|
||||||
Exchange ohlcv candle limit
|
Exchange ohlcv candle limit
|
||||||
Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits
|
Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits
|
||||||
|
@ -41,7 +41,7 @@ class Okx(Exchange):
|
|||||||
net_only = True
|
net_only = True
|
||||||
|
|
||||||
def ohlcv_candle_limit(
|
def ohlcv_candle_limit(
|
||||||
self, timeframe: str, candle_type: CandleType, since_ms: Optional[int]) -> int:
|
self, timeframe: str, candle_type: CandleType, since_ms: Optional[int] = None) -> int:
|
||||||
"""
|
"""
|
||||||
Exchange ohlcv candle limit
|
Exchange ohlcv candle limit
|
||||||
Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits
|
Uses ohlcv_candle_limit_per_timeframe if the exchange has different limits
|
||||||
|
@ -32,18 +32,19 @@ class AgeFilter(IPairList):
|
|||||||
self._min_days_listed = pairlistconfig.get('min_days_listed', 10)
|
self._min_days_listed = pairlistconfig.get('min_days_listed', 10)
|
||||||
self._max_days_listed = pairlistconfig.get('max_days_listed', None)
|
self._max_days_listed = pairlistconfig.get('max_days_listed', None)
|
||||||
|
|
||||||
|
candle_limit = exchange.ohlcv_candle_limit('1d', self._config['candle_type_def'])
|
||||||
if self._min_days_listed < 1:
|
if self._min_days_listed < 1:
|
||||||
raise OperationalException("AgeFilter requires min_days_listed to be >= 1")
|
raise OperationalException("AgeFilter requires min_days_listed to be >= 1")
|
||||||
if self._min_days_listed > exchange.ohlcv_candle_limit('1d'):
|
if self._min_days_listed > candle_limit:
|
||||||
raise OperationalException("AgeFilter requires min_days_listed to not exceed "
|
raise OperationalException("AgeFilter requires min_days_listed to not exceed "
|
||||||
"exchange max request size "
|
"exchange max request size "
|
||||||
f"({exchange.ohlcv_candle_limit('1d')})")
|
f"({candle_limit})")
|
||||||
if self._max_days_listed and self._max_days_listed <= self._min_days_listed:
|
if self._max_days_listed and self._max_days_listed <= self._min_days_listed:
|
||||||
raise OperationalException("AgeFilter max_days_listed <= min_days_listed not permitted")
|
raise OperationalException("AgeFilter max_days_listed <= min_days_listed not permitted")
|
||||||
if self._max_days_listed and self._max_days_listed > exchange.ohlcv_candle_limit('1d'):
|
if self._max_days_listed and self._max_days_listed > candle_limit:
|
||||||
raise OperationalException("AgeFilter requires max_days_listed to not exceed "
|
raise OperationalException("AgeFilter requires max_days_listed to not exceed "
|
||||||
"exchange max request size "
|
"exchange max request size "
|
||||||
f"({exchange.ohlcv_candle_limit('1d')})")
|
f"({candle_limit})")
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def needstickers(self) -> bool:
|
def needstickers(self) -> bool:
|
||||||
|
@ -38,12 +38,12 @@ class VolatilityFilter(IPairList):
|
|||||||
|
|
||||||
self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period)
|
self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period)
|
||||||
|
|
||||||
|
candle_limit = exchange.ohlcv_candle_limit('1d', self._config['candle_type_def'])
|
||||||
if self._days < 1:
|
if self._days < 1:
|
||||||
raise OperationalException("VolatilityFilter requires lookback_days to be >= 1")
|
raise OperationalException("VolatilityFilter requires lookback_days to be >= 1")
|
||||||
if self._days > exchange.ohlcv_candle_limit('1d'):
|
if self._days > candle_limit:
|
||||||
raise OperationalException("VolatilityFilter requires lookback_days to not "
|
raise OperationalException("VolatilityFilter requires lookback_days to not "
|
||||||
"exceed exchange max request size "
|
f"exceed exchange max request size ({candle_limit})")
|
||||||
f"({exchange.ohlcv_candle_limit('1d')})")
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def needstickers(self) -> bool:
|
def needstickers(self) -> bool:
|
||||||
|
@ -84,12 +84,13 @@ class VolumePairList(IPairList):
|
|||||||
raise OperationalException(
|
raise OperationalException(
|
||||||
f'key {self._sort_key} not in {SORT_VALUES}')
|
f'key {self._sort_key} not in {SORT_VALUES}')
|
||||||
|
|
||||||
|
candle_limit = exchange.ohlcv_candle_limit(
|
||||||
|
self._lookback_timeframe, self._config['candle_type_def'])
|
||||||
if self._lookback_period < 0:
|
if self._lookback_period < 0:
|
||||||
raise OperationalException("VolumeFilter requires lookback_period to be >= 0")
|
raise OperationalException("VolumeFilter requires lookback_period to be >= 0")
|
||||||
if self._lookback_period > exchange.ohlcv_candle_limit(self._lookback_timeframe):
|
if self._lookback_period > candle_limit:
|
||||||
raise OperationalException("VolumeFilter requires lookback_period to not "
|
raise OperationalException("VolumeFilter requires lookback_period to not "
|
||||||
"exceed exchange max request size "
|
f"exceed exchange max request size ({candle_limit})")
|
||||||
f"({exchange.ohlcv_candle_limit(self._lookback_timeframe)})")
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def needstickers(self) -> bool:
|
def needstickers(self) -> bool:
|
||||||
|
@ -33,12 +33,12 @@ class RangeStabilityFilter(IPairList):
|
|||||||
|
|
||||||
self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period)
|
self._pair_cache: TTLCache = TTLCache(maxsize=1000, ttl=self._refresh_period)
|
||||||
|
|
||||||
|
candle_limit = exchange.ohlcv_candle_limit('1d', self._config['candle_type_def'])
|
||||||
if self._days < 1:
|
if self._days < 1:
|
||||||
raise OperationalException("RangeStabilityFilter requires lookback_days to be >= 1")
|
raise OperationalException("RangeStabilityFilter requires lookback_days to be >= 1")
|
||||||
if self._days > exchange.ohlcv_candle_limit('1d'):
|
if self._days > candle_limit:
|
||||||
raise OperationalException("RangeStabilityFilter requires lookback_days to not "
|
raise OperationalException("RangeStabilityFilter requires lookback_days to not "
|
||||||
"exceed exchange max request size "
|
f"exceed exchange max request size ({candle_limit})")
|
||||||
f"({exchange.ohlcv_candle_limit('1d')})")
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def needstickers(self) -> bool:
|
def needstickers(self) -> bool:
|
||||||
|
@ -232,7 +232,8 @@ class TestCCXTExchange():
|
|||||||
assert len(ohlcv[pair_tf]) == len(exchange.klines(pair_tf))
|
assert len(ohlcv[pair_tf]) == len(exchange.klines(pair_tf))
|
||||||
# assert len(exchange.klines(pair_tf)) > 200
|
# assert len(exchange.klines(pair_tf)) > 200
|
||||||
# Assume 90% uptime ...
|
# Assume 90% uptime ...
|
||||||
assert len(exchange.klines(pair_tf)) > exchange.ohlcv_candle_limit(timeframe) * 0.90
|
assert len(exchange.klines(pair_tf)) > exchange.ohlcv_candle_limit(
|
||||||
|
timeframe, CandleType.SPOT) * 0.90
|
||||||
# Check if last-timeframe is within the last 2 intervals
|
# Check if last-timeframe is within the last 2 intervals
|
||||||
now = datetime.now(timezone.utc) - timedelta(minutes=(timeframe_to_minutes(timeframe) * 2))
|
now = datetime.now(timezone.utc) - timedelta(minutes=(timeframe_to_minutes(timeframe) * 2))
|
||||||
assert exchange.klines(pair_tf).iloc[-1]['date'] >= timeframe_to_prev_date(timeframe, now)
|
assert exchange.klines(pair_tf).iloc[-1]['date'] >= timeframe_to_prev_date(timeframe, now)
|
||||||
|
@ -1882,7 +1882,7 @@ def test_get_historic_ohlcv(default_conf, mocker, caplog, exchange_name, candle_
|
|||||||
exchange._async_get_candle_history = Mock(wraps=mock_candle_hist)
|
exchange._async_get_candle_history = Mock(wraps=mock_candle_hist)
|
||||||
# one_call calculation * 1.8 should do 2 calls
|
# one_call calculation * 1.8 should do 2 calls
|
||||||
|
|
||||||
since = 5 * 60 * exchange.ohlcv_candle_limit('5m') * 1.8
|
since = 5 * 60 * exchange.ohlcv_candle_limit('5m', CandleType.SPOT) * 1.8
|
||||||
ret = exchange.get_historic_ohlcv(
|
ret = exchange.get_historic_ohlcv(
|
||||||
pair,
|
pair,
|
||||||
"5m",
|
"5m",
|
||||||
@ -1948,7 +1948,7 @@ def test_get_historic_ohlcv_as_df(default_conf, mocker, exchange_name, candle_ty
|
|||||||
exchange._async_get_candle_history = Mock(wraps=mock_candle_hist)
|
exchange._async_get_candle_history = Mock(wraps=mock_candle_hist)
|
||||||
# one_call calculation * 1.8 should do 2 calls
|
# one_call calculation * 1.8 should do 2 calls
|
||||||
|
|
||||||
since = 5 * 60 * exchange.ohlcv_candle_limit('5m') * 1.8
|
since = 5 * 60 * exchange.ohlcv_candle_limit('5m', CandleType.SPOT) * 1.8
|
||||||
ret = exchange.get_historic_ohlcv_as_df(
|
ret = exchange.get_historic_ohlcv_as_df(
|
||||||
pair,
|
pair,
|
||||||
"5m",
|
"5m",
|
||||||
@ -2002,7 +2002,7 @@ async def test__async_get_historic_ohlcv(default_conf, mocker, caplog, exchange_
|
|||||||
)
|
)
|
||||||
# Required candles
|
# Required candles
|
||||||
candles = (end_ts - start_ts) / 300_000
|
candles = (end_ts - start_ts) / 300_000
|
||||||
exp = candles // exchange.ohlcv_candle_limit('5m') + 1
|
exp = candles // exchange.ohlcv_candle_limit('5m', CandleType.SPOT) + 1
|
||||||
|
|
||||||
# Depending on the exchange, this should be called between 1 and 6 times.
|
# Depending on the exchange, this should be called between 1 and 6 times.
|
||||||
assert exchange._api_async.fetch_ohlcv.call_count == exp
|
assert exchange._api_async.fetch_ohlcv.call_count == exp
|
||||||
@ -3349,7 +3349,7 @@ def test_ohlcv_candle_limit(default_conf, mocker, exchange_name):
|
|||||||
expected = exchange._ft_has['ohlcv_candle_limit_per_timeframe'][timeframe]
|
expected = exchange._ft_has['ohlcv_candle_limit_per_timeframe'][timeframe]
|
||||||
# This should only run for bittrex
|
# This should only run for bittrex
|
||||||
assert exchange_name == 'bittrex'
|
assert exchange_name == 'bittrex'
|
||||||
assert exchange.ohlcv_candle_limit(timeframe) == expected
|
assert exchange.ohlcv_candle_limit(timeframe, CandleType.SPOT) == expected
|
||||||
|
|
||||||
|
|
||||||
def test_timeframe_to_minutes():
|
def test_timeframe_to_minutes():
|
||||||
|
Loading…
Reference in New Issue
Block a user