mirror of
https://github.com/freqtrade/freqtrade.git
synced 2025-11-29 08:33:07 +00:00
feat: fall back to rest API by catching all exceptions
This commit is contained in:
@@ -42,26 +42,31 @@ async def fetch_ohlcv(
|
|||||||
:return: the date range is between [since_ms, until_ms),
|
:return: the date range is between [since_ms, until_ms),
|
||||||
return and empty DataFrame if no data available in the time range
|
return and empty DataFrame if no data available in the time range
|
||||||
"""
|
"""
|
||||||
if candle_type == CandleType.SPOT:
|
try:
|
||||||
asset_type = "spot"
|
if candle_type == CandleType.SPOT:
|
||||||
elif candle_type == CandleType.FUTURES:
|
asset_type = "spot"
|
||||||
asset_type = "futures/um"
|
elif candle_type == CandleType.FUTURES:
|
||||||
else:
|
asset_type = "futures/um"
|
||||||
raise ValueError(f"Unsupported CandleType: {candle_type}")
|
else:
|
||||||
symbol = symbol_ccxt_to_binance(pair)
|
raise ValueError(f"Unsupported CandleType: {candle_type}")
|
||||||
start = dt_from_ts(since_ms)
|
symbol = symbol_ccxt_to_binance(pair)
|
||||||
end = dt_from_ts(until_ms) if until_ms else dt_now()
|
start = dt_from_ts(since_ms)
|
||||||
|
end = dt_from_ts(until_ms) if until_ms else dt_now()
|
||||||
|
|
||||||
|
# We use two days ago as the last available day because the daily archives are daily
|
||||||
|
# uploaded and have several hours delay
|
||||||
|
last_available_date = dt_now() - datetime.timedelta(days=2)
|
||||||
|
end = min(end, last_available_date)
|
||||||
|
if start >= end:
|
||||||
|
return DataFrame()
|
||||||
|
df = await _fetch_ohlcv(asset_type, symbol, timeframe, start, end, stop_on_404)
|
||||||
|
logger.info(
|
||||||
|
f"Downloaded data for {pair} from https://data.binance.vision/ with length {len(df)}."
|
||||||
|
)
|
||||||
|
except Exception as e:
|
||||||
|
logger.debug("An exception occurred", exc_info=e)
|
||||||
|
df = DataFrame()
|
||||||
|
|
||||||
# We use two days ago as the last available day because the daily archives are daily uploaded
|
|
||||||
# and have several hours delay
|
|
||||||
last_available_date = dt_now() - datetime.timedelta(days=2)
|
|
||||||
end = min(end, last_available_date)
|
|
||||||
if start >= end:
|
|
||||||
return DataFrame()
|
|
||||||
df = await _fetch_ohlcv(asset_type, symbol, timeframe, start, end, stop_on_404)
|
|
||||||
logger.info(
|
|
||||||
f"Downloaded data for {pair} from https://data.binance.vision/ with length {len(df)}."
|
|
||||||
)
|
|
||||||
if not df.empty:
|
if not df.empty:
|
||||||
return df.loc[(df["date"] >= start) & (df["date"] < end)]
|
return df.loc[(df["date"] >= start) & (df["date"] < end)]
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -209,17 +209,14 @@ async def test_fetch_ohlcv(mocker, candle_type, since, until, first_date, last_d
|
|||||||
"aiohttp.ClientSession.get", side_effect=make_response_from_url(history_start, history_end)
|
"aiohttp.ClientSession.get", side_effect=make_response_from_url(history_start, history_end)
|
||||||
)
|
)
|
||||||
|
|
||||||
if candle_type in [CandleType.SPOT, CandleType.FUTURES]:
|
df = await fetch_ohlcv(candle_type, pair, timeframe, since_ms, until_ms, stop_on_404)
|
||||||
df = await fetch_ohlcv(candle_type, pair, timeframe, since_ms, until_ms, stop_on_404)
|
|
||||||
|
|
||||||
if df.empty:
|
if df.empty:
|
||||||
assert first_date is None and last_date is None
|
assert first_date is None and last_date is None
|
||||||
else:
|
|
||||||
assert df["date"].iloc[0] == first_date
|
|
||||||
assert df["date"].iloc[-1] == last_date
|
|
||||||
else:
|
else:
|
||||||
with pytest.raises(ValueError):
|
assert candle_type in [CandleType.SPOT, CandleType.FUTURES]
|
||||||
await fetch_ohlcv(candle_type, pair, timeframe, since_ms, until_ms, stop_on_404)
|
assert df["date"].iloc[0] == first_date
|
||||||
|
assert df["date"].iloc[-1] == last_date
|
||||||
|
|
||||||
|
|
||||||
async def test_fetch_ohlcv_exc(mocker):
|
async def test_fetch_ohlcv_exc(mocker):
|
||||||
|
|||||||
Reference in New Issue
Block a user