diff --git a/freqtrade/exchange/binance_public_data.py b/freqtrade/exchange/binance_public_data.py index cf47fc0c9..a8231d2b6 100644 --- a/freqtrade/exchange/binance_public_data.py +++ b/freqtrade/exchange/binance_public_data.py @@ -64,9 +64,9 @@ async def download_archive_ohlcv( """ try: if candle_type == CandleType.SPOT: - asset_type = "spot" + asset_type_url_segment = "spot" elif candle_type == CandleType.FUTURES: - asset_type = "futures/um" + asset_type_url_segment = "futures/um" else: raise ValueError(f"Unsupported CandleType: {candle_type}") @@ -87,7 +87,7 @@ async def download_archive_ohlcv( if start >= end: return DataFrame() df = await _download_archive_ohlcv( - asset_type, symbol, pair, timeframe, start, end, stop_on_404 + asset_type_url_segment, symbol, pair, timeframe, start, end, stop_on_404 ) logger.debug( f"Downloaded data for {pair} from https://data.binance.vision with length {len(df)}." @@ -111,7 +111,7 @@ def concat(dfs) -> DataFrame: async def _download_archive_ohlcv( - asset_type: str, + asset_type_url_segment: str, symbol: str, pair: str, timeframe: str, @@ -129,7 +129,9 @@ async def _download_archive_ohlcv( # the HTTP connections has been throttled by TCPConnector for dates in chunks(list(date_range(start, end)), 1000): tasks = [ - asyncio.create_task(get_daily_ohlcv(asset_type, symbol, timeframe, date, session)) + asyncio.create_task( + get_daily_ohlcv(asset_type_url_segment, symbol, timeframe, date, session) + ) for date in dates ] for task in tasks: @@ -198,21 +200,21 @@ def zip_name(symbol: str, timeframe: str, date: datetime.date) -> str: return f"{symbol}-{timeframe}-{format_date(date)}.zip" -def zip_url(asset_type: str, symbol: str, timeframe: str, date: datetime.date) -> str: +def zip_url(asset_type_url_segment: str, symbol: str, timeframe: str, date: datetime.date) -> str: """ example urls: https://data.binance.vision/data/spot/daily/klines/BTCUSDT/1s/BTCUSDT-1s-2023-10-27.zip https://data.binance.vision/data/futures/um/daily/klines/BTCUSDT/1h/BTCUSDT-1h-2023-10-27.zip """ url = ( - f"https://data.binance.vision/data/{asset_type}/daily/klines/{symbol}/{timeframe}/" - f"{zip_name(symbol, timeframe, date)}" + f"https://data.binance.vision/data/{asset_type_url_segment}/daily/klines/{symbol}" + f"/{timeframe}/{zip_name(symbol, timeframe, date)}" ) return url async def get_daily_ohlcv( - asset_type: str, + asset_type_url_segment: str, symbol: str, timeframe: str, date: datetime.date, @@ -224,7 +226,7 @@ async def get_daily_ohlcv( Get daily OHLCV from https://data.binance.vision See https://github.com/binance/binance-public-data - :asset_type: `spot` or `futures/um` + :asset_type_url_segment: `spot` or `futures/um` :symbol: binance symbol name, e.g. BTCUSDT :timeframe: e.g. 1m, 1h :date: the returned DataFrame will cover the entire day of `date` in UTC @@ -234,7 +236,7 @@ async def get_daily_ohlcv( :return: This function won't raise any exceptions, it will catch and return them """ - url = zip_url(asset_type, symbol, timeframe, date) + url = zip_url(asset_type_url_segment, symbol, timeframe, date) logger.debug(f"download data from binance: {url}") diff --git a/tests/exchange/test_binance_public_data.py b/tests/exchange/test_binance_public_data.py index ef8a938dd..6b23cb2d6 100644 --- a/tests/exchange/test_binance_public_data.py +++ b/tests/exchange/test_binance_public_data.py @@ -51,11 +51,11 @@ def make_daily_df(date, timeframe): return df -def make_daily_zip(asset_type, symbol, timeframe, date) -> bytes: +def make_daily_zip(asset_type_url_segment, symbol, timeframe, date) -> bytes: df = make_daily_df(date, timeframe) - if asset_type == "spot": + if asset_type_url_segment == "spot": header = True - elif asset_type == "futures/um": + elif asset_type_url_segment == "futures/um": header = None else: raise ValueError @@ -85,8 +85,8 @@ class MockResponse: def make_response_from_url(start_date, end_date): def make_response(url): pattern = ( - r"https://data.binance.vision/data/(?Pspot|futures/um)/daily/klines/" - r"(?P.*?)/(?P.*?)/(?P=symbol)-(?P=timeframe)-" + r"https://data.binance.vision/data/(?Pspot|futures/um)" + r"/daily/klines/(?P.*?)/(?P.*?)/(?P=symbol)-(?P=timeframe)-" r"(?P\d{4}-\d{2}-\d{2}).zip" ) m = re.match(pattern, url) @@ -97,7 +97,7 @@ def make_response_from_url(start_date, end_date): if date < start_date or date > end_date: return MockResponse(content="", status=404) - zip_file = make_daily_zip(m["asset_type"], m["symbol"], m["timeframe"], date) + zip_file = make_daily_zip(m["asset_type_url_segment"], m["symbol"], m["timeframe"], date) return MockResponse(content=zip_file, status=200) return make_response diff --git a/tests/exchange_online/test_binance_compare_ohlcv.py b/tests/exchange_online/test_binance_compare_ohlcv.py index af94b1bd1..2b23824f7 100644 --- a/tests/exchange_online/test_binance_compare_ohlcv.py +++ b/tests/exchange_online/test_binance_compare_ohlcv.py @@ -31,14 +31,14 @@ from freqtrade.util.datetime_helpers import dt_from_ts class Check: - def __init__(self, asset_type, timeframe): - self.asset_type = asset_type + def __init__(self, asset_type_url_segment, timeframe): + self.asset_type_url_segment = asset_type_url_segment self.timeframe = timeframe self.klines_endpoint = "https://api.binance.com/api/v3/klines" self.exchange_endpoint = "https://api.binance.com/api/v3/exchangeInfo" self.mismatch = set() - if asset_type == "futures/um": + if asset_type_url_segment == "futures/um": self.klines_endpoint = "https://fapi.binance.com/fapi/v1/klines" self.exchange_endpoint = "https://fapi.binance.com/fapi/v1/exchangeInfo" @@ -52,7 +52,9 @@ class Check: first_kline_ts = first_kline[0] date = dt_from_ts(first_kline_ts).date() - archive_url = zip_url(self.asset_type, symbol=symbol, timeframe=self.timeframe, date=date) + archive_url = zip_url( + self.asset_type_url_segment, symbol=symbol, timeframe=self.timeframe, date=date + ) async with self.session.get( archive_url, params=dict(symbol=symbol, interval=self.timeframe, startTime=0) ) as resp: