Если вы следовали Части 1 этой серии, теперь у вас должна быть учетная запись биржи, ключ API и тестовая программа, которая может общаться от вашего имени с вашей учетной записью биржи. На данный момент заманчиво просто начать программировать торговую логику, но давайте сначала получим некоторые данные.

Режимы работы

Чтобы быть уверенным, что ваш бот работает правильно и, что более важно, приносит прибыль, очень важно иметь возможность воспроизвести исторические данные и протестировать своего бота. Легкость, с которой вы можете воспроизводить и тестировать, приведет к вашему окончательному успеху.

У моих ботов есть три основных режима:

  1. Воспроизведение = загрузка исторических данных, совершение синтетических сделок, расчет прибыли/убытка
  2. Тест = извлечение данных в реальном времени, совершение синтетических сделок
  3. Live = получение данных в реальном времени, совершение сделок в реальном времени

Получение исторических данных

У меня есть отдельная программа, которая извлекает исторические данные и сохраняет их в файлах для меня. Я не хочу вызывать API своей биржи каждый раз, когда хочу воспроизвести или протестировать; извлечение данных происходит медленно, и я не хочу достигать предела API.

У каждого API будет свой способ получения исторических данных. Если вы используете модуль Binance Python, вы можете получить исторические клины с помощью этой команды:

history = client.get_historical_klines('ETHBTC', '1h', '2020–12–01 00:00')

Это позволит получить часовые свечи и другие данные для ETHBTC с начала декабря 2020 года. К сожалению, данные без маркировки выглядят так:

[[1606780800000, ‘0.03131000’, ‘0.03142900’, ‘0.03124000’, ‘0.03127500’, ‘4938.22100000’, 1606781699999, ‘154.72123206’, 3167, ‘2318.47800000’, ‘72.64917475’, ‘0’], ..]

Для удобства имена столбцов следующие:

OpenTime,Open,High,Low,Close,Volume,CloseTime,QuoteAssetVolume,NumberOfTrades,TakerBuyBaseAssetVolume,TakerBuyQuoteAssetVolume,Ignored

Я сохраняю строки данных в файле CSV на основе тикера и таймфрейма, но перед этим я конвертирую время открытия/закрытия следующим образом, чтобы сделать их понятными для человека:

datetime.fromtimestamp(line[0] / 1000) # Epoch to datetime object

Работа с ценами и объемом

Важно отметить, что цены и объемы для большинства API представляют собой строки, а не числа с плавающей запятой. Это предотвращает неточность точности с плавающей запятой, то есть «0,03124000» становится «0,031240000000002». Если вы попытаетесь использовать операции равенства с числами с плавающей запятой, вы рискуете получить неточные результаты. например./

float("0.03124000") == float("0.03124000") # may be False

Вы можете прочитать больше о точности с плавающей запятой и рекомендуемом решении Python.

Что мы рассмотрели

Если вы последовали этому примеру, теперь у вас есть метод получения исторических данных, который вы можете использовать в своем боте, чтобы попробовать синтетическую торговлю и рассчитать прибыльность.

Далее

Далее мы рассмотрим создание вашего бота для использования исторических и текущих данных.