feat: fall back to rest API by catching all exceptions

This commit is contained in:
Meng Xiangzhuo
2024-11-02 05:17:16 +08:00
parent 76187d31cf
commit e2ee7f7b2f
2 changed files with 30 additions and 28 deletions

View File

@@ -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:

View File

@@ -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):