Экспорт всех исторических свечей Bitcoin с Binance

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}")  # Зафиксировать операцию сохранения