Это третья часть серии статей о настройке некоторых инструментов для начала работы с машинным обучением для криптотрейдинга. Если вы не следили до этого момента, первую запись можно найти по адресу https://medium.com/@kid.bytes/building-some-node-js-tools-to-setup-machine-learning. -trading-pt-1-fdbb40439384»

Продолжаем обменный импортер

Если вы следили за нами до этого момента, мы:

  • Создал базовый регистратор
  • Начат объект импортера обмена
  • Начат объект диспетчера данных

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

Перво-наперво. В прошлой статье я упомянул, что нам, вероятно, не следует напрямую читать dataManager из process.env. Он не следует принципу разделения интересов. Я начал писать несколько тестов на своей локальной копии, чтобы держать себя в руках и придать уверенности в своем коде, а также было проще передать их в качестве параметров. Итак, давайте внесем это изменение. Ниже представлены main.js, exchangeImporter.js и dataManager.js в том виде, в каком они есть на данный момент.

Main.js

exchangeImporter.js

dataManager.js

Теперь, когда мы все на одной странице, давайте сначала добавим строку в main.js после строки exchangeImporter.init(exchange, dataDir, dbExt), мы добавим exchangeImporter.getPair(args[1]). Эта функция еще не существует, поэтому давайте напишем ее. В наш exchangeImporter добавляем:

Комментарии в коде должны помочь объяснить, что здесь происходит, но давайте пройдемся по ним.

Сначала мы удостоверяемся, что пара указана, прежде чем пытаться получить данные. Затем мы устанавливаем переменную в идентификатор самой новой сделки в нашей БД. Вы снова заметите, что мы вызываем функцию, которую еще не написали, поэтому мы вскоре напишем ее в нашем dataManager.

Просто короткое замечание по поводу вышесказанного. Я замечаю, что многим новым разработчикам тяжело с такими вещами, когда они вызывают функцию, которая еще не написана. Не зацикливайтесь на том факте, что ее еще не существует, мы можем продолжить писать нашу функцию, и это поможет нам конкретизировать то, что нам нужно написать для ее поддержки. Иногда мы думаем, что нам нужна такая вещь, как getNewestTrade, пока не пройдем большую часть нашей функции и не поймем, что это не так. В этом случае мы бы сэкономили время, потому что нам не нужно было писать его в первую очередь. Это также помогает нам выяснить, что именно мы хотим получить от функции.

Затем мы настраиваем цикл do while и вызываем функцию fetchTrades, которую нам нужно будет написать дальше. Наше условие выхода будет, когда мы получим меньше запрошенного количества сделок, поэтому наша функция fetchTrade должна будет вернуть счет. Случай, когда мы получаем меньше, чем максимальное количество сделок, должен происходить только в том случае, если было меньше сделок, чем это, с момента передачи fromId, что должно означать, что это самые последние данные и больше не нужно импортировать.

Наконец, мы бросаем сообщение в наш Logger и обрабатываем случаи ошибок. Функция объявлена ​​как async только для того, чтобы мы могли await вызывать fetchTrades.

Хорошо, мы добираемся туда. Давайте сначала займемся функцией fetchTrades.

Так что это довольно прямолинейно. Первое, что мы делаем, это вызываем fetchTrades на нашем обмене cctx, который мы инициализировали в функции инициализации, и присваиваем его пакетной переменной. Затем мы сохраняем сделки с помощью нашей функции dataManager.storeTrades, которую мы написали в прошлый раз. Помните, что нам нужна эта функция, чтобы возвращать количество полученных сделок, чтобы getPair мог выйти из цикла while.

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

Хорошо, теперь давайте добавим то, что нам нужно в наш dataManager.

Вот наша функция getNewestTrade, которую мы вызвали в нашем exchangeImporter. Это довольно просто. Мы возвращаем обещание, поскольку вызов db занимает неизвестное количество времени, и нам нужно выполнить его, когда он завершится. К сожалению, библиотека sqlite3 не использует промисы и вместо этого использует обратные вызовы, поэтому мы не можем просто await ее использовать. Мы получаем экземпляр соединения с базой данных и просто запускаем запрос, чтобы получить наш самый большой tradeId из базы данных и разрешить его или 0 в случае, если данных еще нет.

Вот и все! Мы готовы импортировать торговые данные для любой пары из общедоступного API Binance. В настоящее время подходящей парой для тестирования является PAX/USDT. Это более новый рынок, поэтому вы сможете импортировать все данные за несколько минут, в то время как попытка что-то вроде BTC/USDT займет несколько часов.

Мы также ничего не написали, чтобы начать с определенной точки, поэтому он получит все данные для пары, что в некоторых случаях займет много времени. На момент написания этой статьи по паре BTC/USDT было около 70 миллионов сделок на binance, и максимальная скорость, которую мы будем импортировать, составляет 2 тыс./с. Что чуть меньше 10 часов, на практике у меня ушло 11,5 часов.

Если мы запустим npm start import PAX/USDT и наш уровень журнала будет установлен на отладку в нашем .env, мы начнем видеть некоторый вывод.

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

Я, вероятно, собираюсь создать репозиторий на github для этой серии с папками для каждой записи в блоге. Кодовая база будет расти, и ею будет легче поделиться со всеми вами. Я по-прежнему буду создавать списки для обмена, пока мы создаем эту штуку, но вы сможете найти конкурирующий проект на каждом этапе, а не я буду делиться каждым файлом в начале каждой записи в блоге.

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

Изменить: новая статья размещена на https://medium.com/@kid.bytes/building-some-node-js-tools-to-setup-machine-learning-trading-pt-4-9f1f58053a5f