import ccxt # Импорт библиотеки CCXT для API криптовалютных бирж
import time # Импорт модуля time для функции sleep
import logging # Импорт модуля logging для структурированного логирования
import json # Импорт модуля json для сохранения данных в файл
# Настройка конфигурации логирования: basicConfig устанавливает корневой логгер на уровень DEBUG,
# форматирует логи с временной меткой, уровнем и сообщением, и выводит в консоль.
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__) # Создание экземпляра логгера для этого модуля
# Инициализация объекта биржи Binance с использованием CCXT.
# Это создает соединение с API Binance. Примечание: Для реального использования предоставьте API-ключи, если нужно.
binance = ccxt.binance()
# Определение торговой пары (например, 'BTC-USDT') и таймфрейма.
# Замените 'BTC-USDT' на желаемую пару.
pair = 'BTC-USDT' # Пример торговой пары; настройте по необходимости
timeframe = '1h' # Таймфрейм для данных OHLCV (1-часовые свечи)
klines = [] # Список для хранения всех полученных данных OHLCV (свечей)
# Получение текущей временной метки в миллисекундах.
# Это используется для определения конечной точки получения исторических данных.
current_time = binance.milliseconds()
logger.debug(f"Текущее время: {current_time}") # Зафиксировать текущую временную метку
# Начать получение с конкретной временной метки (например, год назад).
# Настройте это значение на желаемую точку старта. Здесь установлено на 1 августа 2017.
since = binance.parse8601('2017-08-01T00:00:00Z') # Начальная временная метка в миллисекундах
logger.debug(f"Начало с: {since}") # Зафиксировать начальную временную метку
# Цикл для получения данных OHLCV частями до достижения текущего времени.
# Это обрабатывает ограничения скорости API, получая батчами по 1000 свечей.
while since < current_time:
logger.debug(f"Получение OHLCV для {pair} с {since}") # Зафиксировать попытку получения
# Получение данных OHLCV: символ отформатирован как 'BTC/USDT', с временной метки,
# лимит 1000 свечей, и указанный таймфрейм.
orders = binance.fetch_ohlcv(
symbol=pair.replace('-', '/'), # Заменить '-' на '/' для формата символа CCXT
since=since, # Начать с этой временной метки
limit=1000, # Максимальное количество свечей на запрос
timeframe=timeframe # Таймфрейм свечи (например, '1h')
)
time.sleep(0.1) # Заснуть на 0.1 секунды, чтобы избежать превышения лимитов API
# Проверить, были ли возвращены данные.
if len(orders) > 0:
# Обновить 'since' на временную метку после последней полученной свечи.
# Это обеспечивает, что следующий запрос начинается сразу после предыдущего батча.
since = orders[-1][0] + 1 # orders[-1][0] - временная метка последней свечи
klines.extend(orders) # Добавить полученный батч к основному списку
logger.debug(f"Получено {len(orders)} свечей. Всего на данный момент: {len(klines)}") # Зафиксировать прогресс
else:
# Если больше данных не возвращено, выйти из цикла.
logger.debug("Нет больше свечей для получения. Выход из цикла.")
break
# После получения всех данных, сохранить свечи в JSON файл.
# Это сериализует список списков (данные OHLCV) в файл для сохранения.
file_name = f"{pair.replace('/', '_')}_{timeframe}_klines.json" # Генерировать имя файла, например, BTC_USDT_1h_klines.json
with open(file_name, 'w') as f:
json.dump(klines, f) # Сохранить список свечей в JSON файл
logger.info(f"Сохранено {len(klines)} свечей в {file_name}") # Зафиксировать операцию сохранения