Как создать торгового бота для крипторынка с использованием TradingView (PineScript)
Прежде всего, давайте определимся с основным термином этой статьи. Что такое торговый бот? Торговый бот — это использование компьютерной программы или системы для торговли на рынке в соответствии с заранее определенным и указанным набором правил. Другими словами, трейдер строит определенный алгоритм для своей торговой стратегии, который будет автоматически выполняться на рынке при выполнении всех условий. Это также причина, почему мы также будем использовать термин алгоритмическая торговля.
Такой стиль торговли идеально сочетается с рынками криптовалюты, что дает ряд преимуществ для алгоритмических трейдеров. Прежде всего — волатильность, рынки криптовалюты обычно имеют гораздо более высокую волатильность, чем традиционные рынки, создавая большие колебания цен и возможностей для трейдеров. Во-вторых, круглосуточная торговая сессия, так как рынки криптовалют открыты для бизнеса 24/7. В-третьих, общая рыночная капитализация, которая меньше по сравнению с традиционными рынками. На традиционных рынках преобладают крупные многомиллиардные фонды, в то время как рынки криптовалют гораздо моложе, что означает, что он относительно менее насыщен крупными фондами и, как следствие, не требует большого капитала, чтобы начать зарабатывать на криптовалюте.
С другой стороны, большая волатильность на молодом рынке, который никогда не спит, создает идеальную среду для спекуляций, таких как стратегии откачки и сброса. И это обязательно нужно учитывать, если вы решили торговать на рынках криптовалют.
Торговый бот может торговать в соответствии с техническими индикаторами, импульсом и основами. Или вы можете создать гораздо более продвинутый торговый алгоритм, который поможет вам более эффективно выполнять ордера, от маршрутизации ордеров через различные биржи (арбитражная торговля) до нарезки большого ордера на более мелкие части (автоматические Айсберг ордера).
3 наиболее популярных крипто-торговых стратегий: Создание рынка (Market Making), Арбитраж, Стратегии следования за трендом.
Это стратегия, в которой происходит непрерывная покупка и продажа, для того чтобы отразить разницу между ценой покупки и продажи. Чтобы сделать это, трейдер должен разместить лимитные ордера по обе стороны от книги заявок (order book), чтобы получить прибыль от спреда (spread). Тем не менее, эта стратегия будет иметь свои ограничения в условиях низкой ликвидности или во время предыдущей экстремальной конкуренции.
Арбитраж – это покупка и продажа актива с целью получения прибыли от разницы в цене актива между рынками. Следовательно, эта стратегия использует преимущество разницы в цене одного и того же актива на разных биржах. Трейдер покупает цифровые активы с одного рынка, а затем продает их на другом, получая прибыль в процессе.
Целью этой стратегии является выявление тренда актива и выполнение сделок на основе базового тренда. Стратегия следования за трендом пытается получить прибыль путем анализа импульса актива в заданном направлении. Трейдеры, которые выполняют эту стратегию, войдут в длинную позицию, когда криптовалюта торгуется вверх (long position), и продают позицию (short position), когда тренд разворачивается.
В зависимости от уровня сложности вашего торгового алгоритма вам нужно будет использовать разные инструменты. В свою очередь, инструменты будут сильно зависеть от уровня ваших технических навыков, которыми вы в данный момент обладаете. Для простоты вы можете разделить упражнение по созданию ботов на 3 основных уровня сложности: начинающий, промежуточный, продвинутый. В будущих обзорах мы подробно рассмотрим каждый уровень и предложим инструменты, которые можно использовать для создания торгового алгоритма, и способы его применения на рынке.
А пока давайте приведем пример торгового бота, который может быть построен с использованием TradingView (TV). Прежде всего, важно создать сценарий стратегии, потому что сценарий стратегии может быть протестирован, и TV предоставит подробные результаты вашей стратегии.
Код ниже, представляет простую стратегию EMA (exponential moving average), в которой вход и выход происходят при пересечении быстрой и медленной экспоненциальной скользящей средней (EMA). Это можно вставить в Pine Editor TV.
Эту стратегию можно изменить, добавив дополнительные входные переменные, такие как объем или некоторые стохастические индикаторы, или вы можете установить цели тейк-профита и стоп-лосса.
После того, как стратегия была создана и протестирована, вы можете создавать оповещения, чтобы не пропустить ваши торговые настройки. Однако для этого вам придется изменить свой сценарий на study (обозначение типа кода в TV), поскольку невозможно применить функцию оповещения к стратегии.
Теперь вы можете создавать оповещения (alerts) для вашего торгового актива и выбирать условия оповещения и действия.
Если оповещение сработало, и вы получили его, когда вы не рядом с компьютером, и у вас нет возможности выполнить свою стратегию. Существует решение для автоматизации ваших предупреждений TradingView через стороннего поставщика услуг, такого как Wunderbit Trading. Вы можете создать бота для входа и выхода из своей стратегии на основе предупреждений TradingView.
Создание ботов для торговли криптовалютами и акциями на Postgres
Сразу скажу, в этой статье не будут описаны алгоритмы торговли, хотя они есть и приносят прибыль. Моя цель показать вам удобный инструмент для создания ботов и поделится результатом пятилетней работы. Если кому-то не интересны боты, то здесь есть одно техническое решение, которое как вишенка на торте может многих заинтересовать, аналог dbms_pipe в ORACLE, реализованный на чистом pgsql, ну а также много других моих технических решений. Это не основная моя работа, скорее хобби. Сначала был просто интерес написать алгоритм, который гарантировал если не плюс, то хотя бы сохранение средств на падающем рынке, про растущий рынок говорить не интересно там и так все хорошо. По образованию я не экономист, а советский айтишник, и в качестве своих невидимых соперников рассматривал волков с Уолт стрит. Для меня это был вызов сродни изобретению вечного двигателя, но с возможностью реализации. В разработке алгоритма торговли мне сильно помогла книга Эдвина Лефевра «Воспоминания биржевого спекулянта». Итак, приступим.
Требование к боту
Бот должен зарабатывать денег больше чем банковские вклады, то есть больше чем 5% в валюте. Сразу скажу это достигнуто, бот работает уже 3 года и доход даже на падающем рынке не опускался ниже 35%. В хороший год достигал 100%. Алгоритмы здесь рассматривать не буду. Так же понимаю, что возможны и убытки и математически доказать, что всегда будет прибыль невозможно, и я всегда готов что будут убытки.
. Легкость разработки алгоритмов и прогон этих алгоритмов на исторических данных. Я постараюсь вас убедить в этой статье, что лучше pgsql вы не найдете. Главное инструмент должен позволять вам сосредотачиваться именно на алгоритме, а не программировании.
Надежность бота, он должен работать 24 на 7. Это реализовано, падает бинанс но не бот.
Производительность, сейчас я торгую 350 парами криптовалют в паре к USDT и никаких проблем с производительностью, нет. Раз в минуту я опрашиваю биржу по этим парам и в течении 30 секунд все данные по всем парам обработаны. Запас прочности еще есть.
Легкость администрирования. Вся реализация написана на pgsql, достаточно делать импорт экспорт. Проблем с администрированием нет.
Почему Postgres
Удобный пакет pgsql-http который позволяет общаться с внешним миром из сохраненных процедур.
Быстрая и удобная работа с json.
Большой набор математический функций.
Удобный пакет dblink позволяющий запускать много процессов postgres.
Sql прекрасный язык для обработки данных и синхронизации работы с данными, это важно когда вдруг два или три бота решат в один момент купить или продать свой актив.
Удобный IDE в виде pgadmin, с любого рабочего места можно ничего не устанавливая через браузер, работать с кодом.
Я знаю и люблю postgres как в прочем и oracle, но oracle за любовь денег хочет.
Как пример выше сказанного привожу запрос который показывает объём в стакане бинанса на покупку с отклонением в 3% вниз и в верх.
А теперь попробуйте все то же самое написать на другом языке. Конечно получится, но думаю будет не так изящно.
Общая архитектура системы.
Система состоит из следующих модулей
Основная программа, написана на pgsql.
Боты, запускаемые с определенным интервалов времени, боты делятся на служебные и боты для торговли. Боты для торговли разделяются на боты, торгующие в LONG и боты, торгующие в SHORT. Служебные боты — это бот для работы с телеграмм и бот, который может определять общую стратегию торговли для всех пар, в данный момент я его не использую, поскольку не смог ответить на вопрос, на до ли связывать между собой результаты торгов разными парами. Сейчас они у меня торгуются не зависимо. Это как пример игры в казино вы играете за разными столами, и если в сумме вы выиграйте, прекращать играть за всеми столами или продолжать играть на всех столах дальше. Эмулятор показал мне что лучше торговать не зависимо от результата торговли в других парах, но я не уверен, что это правильно. Боты реализованы на pgsql.
Бот выполняющий асинхронные команды, которые получает из pipe, реализация на pgsql.
Программа для посылки сигнала останов, основной программе, реализация на pgsql.
Командные файлы операционной системы для запуска и останова основной программы, написаны на bash.
Есть список ботов, которые надо запускать через определенные интервалы времени. Бот — это сохраненная процедура на pgsql. Боты запускаются выполнятся параллельно, каждый в своем процессе postgres. Боты делятся на два класса торговые и служебные. Торговые боты одинаковые, но можно реализовать и разные, каждый торгует своей парой криптовалют. Служебных ботов несколько, бот для работы с телеграмм, бот для выполнения асинхронных операций (эмуляция автономных транзакций), такие как логирование или вывод сообщений в телеграмм и прочие вспомогательные боты. Главная программа запускает боты в цикле, с определенным интервалом времени. Можно было это сделать более правильно так что бы каждый бот возвращал время, когда его надо запустить, но это я отложил на будущее.
В таблице bots содержится список ботов, которые будут запускаться. Key – это уникальный ключ бота, для торговых ботов он означает имя торговой пары, name имя бота, имя сохраненной процедуры, params – это переменные бота с которыми он работает, is_run флаг который показывает бот надо запускать или нет, и последние поле — это комментарий. Вот как верхняя выглядит часть данной таблицы. В таблице содержатся как служебные боты, так и боты для торговли. Боты для торговли делятся на торгующие в Long и Short. Для торговли в Short я использую монеты DOWN которые предоставляет binance, но в будущем предполагаю работать с маржинальной торговлей, поскольку возможностей больше. Вот как выглядит таблица в базе.

Теперь часть кода, которая запускает эти боты, дальше будет приведен полный код главной процедуры.
Как вы можете видеть я использую асинхронный запуск через dblink_send_query, в качестве параметра боту передаётся его key. Данный цикл выполняется раз в 5 секунд. Теперь посмотрим на стартовую часть, когда бота.
Вначале бот получает свои параметры из таблицы bots и затем смотрит, когда его последний раз вызывали и если прошло меньше 55 секунд, то прекращает работать, бот для телеграмма запускается каждые 5 секунд и проверяет не прислали команда от хозяина или не надо ли что сообщить хозяину. В конце работы бота, бот сохраняет параметры в таблице bots что бы использовать их при новом вызове.
Сохранение параметров в таблице сделано по двум причинам, первое в postgresql нет пакетов где можно держать удобно сессионные переменные и второе в случае перезагрузки бота сессионные переменные нас не спасут. Прошу прощения если не сумел донести основную идею, но думаю если вы сумеете прочесть до конца, то все прояснится.
Пакет pgsql-http
Это основное расширение, который я использую для общения с внешним миром. Я сделал небольшую обертку для обработки ошибок сети. Хочу поблагодарить автора данного расширения. Обертка для выполнения https запросов, в случае ошибки пробуем повторить запрос .
Подключаем телеграмм
Выше я немного рассказал о удобном пакете pgsql-http. На нем держится все взаимодействие с внешним миром. Для управления ботом я выбрал мессенджер телеграмм. Поскольку он обладает самым удобным API. Я не буду описывать шаги создания бота в телеграмме, в документации к нему все написано, просто покажу процедуры для взаимодействия с сервером телеграмма.
Процедура для отсылки сообщения выглядит так
Бот для работы с телеграмм.
Бот запускается раз в 5 секунд и проверяет новые сообщения от телеграмм, а так же отправляет сообщения от торговых ботов.
DBMS_PIPE средствами pgsql
В ORACLE есть удобная вещь, это автономные транзакции. Для логирования в таблицу они просто необходимы, иначе в случае ошибки произойдет rollback, и вы ничего не увидите. Вначале я использовал dblink, запускал отдельный процесс, для эмуляции автономной транзакции, но это было не очень красиво, хотелось что-то более изящного. В результате был написан dbms_pipe для postgres.
Создаем fifo mkfifo crypto_bot_pipe.
Создаем процедуру для чтения из pipe .
Используем команду copy для чтения из pipe в таблицу и затем проходим по этой таблице и выполняем sql запросы и так до тех пор, пока не получим команду stop. Обязательно поставте внутри процедуры commit иначе ничего не уведите в других сессиях. Сейчас покажу как это использовать.
Создаем процедуру для записи в pipe.
Как видим все очень просто, но это позволяет создать некий аналог автономных транзакций, что мне очень помогло. Это решение до сих пор мне очень нравится.
Выполнение системных команд из pgsql
В процессе разработки бота, мне захотелось запускать и останавливать pgadmin с помощью бота телеграмм, для этого надо было выполнять системные команды из pgsql. Сделано это было следующим образом
Логирование действий бота
Система логирование подразумевает фиксацию ошибок бота и его действий, например, по покупки или продажи криптовалюты. Логирование обязательно должно быть асинхронным. Например, в случае продажи криптовалюты мы хотим вывести сообщение в телеграмм, а сервер телеграмма не доступен в этот момент. Если делать это синхронно, то мы должны зависнуть в данной точке и ждать доступности телеграмма, что для нас не приемлемо. Мы записываем сообщение в таблицу используя эмуляцию механизма автономных транзакций, описанную выше и затем срабатывает триггер на таблице логирование и происходит отсылка сообщений в телеграмм. Таким образом мы нигде не зависаем и гарантировано получим уведомление, а также в случае ролбэка в боте, в таблице логера останется запись. Главное не отсылать сообщение об ошибки самого телеграмма в телеграмм.
В функции tlg_send_log сообщения необходимые для отправки в телеграмм помещаются в таблицу tlg_messages, при очередном запуске телеграмм бота они будут отосланы в телеграмм.
А вот функция логирования.
Еще раз вкратце как работает логирование, код у вас перед глазами.
Вызывается функция log_commit, эта функция через pipe посылает команду в другой сессии выполнить функцию log, которая просто вставит сообщение в таблицу log, но это в другой сессии и сразу закомитится. Так что если основная сессия даст сбой log у нас останется. На таблице log у нас сработает тригер который проверит надо ли отсылать данное сообщение в телеграмм и если надо то положит сообщение в таблицу tlg_messages, и когда запустится, мой телеграмм бот он отошлет это сообщение мне. Свои дети и свои идеи самое лучшее, мне кажется это хорошее решение. Вот кусок кода из телеграм бота который отсылает сообщения
Если произойдет сбой в отправке, то сообщения не будут удалены из таблицы tls_messages и будут повторно отправлены позже.
Драйвер для доступа к бирже Binance.
Я начинал торговать на wex, затем на kraken и сейчас перебрался на binance. Писал драйверы для всех этих бирж, а так же для тинькоф когда хотел торговать акциями. Здесь пример драйвера для доступа к binance. Так же при чтении данных с binance, биржа не любит когда ее часто опрашивают, учитывая что я торгую 350 пар, то есть делаю 350 запросов в минуту, то надо учитывать просьбы биржи, когда просят замедлить опросы. Для этого написал отдельную маленькую процедуру для опроса биржи. Готов предоставить имеющиеся драйверы для кракена, тинькова, или разработать для других бирж если кого-то заинтересует.
В случае ошибки пытаюсь повторить запрос если нет, то возвращаю ошибку и бот попробует все повторить заново чуть позже.
Бот для торговли
Код бота для торговли я не привожу. Отмечу только главные вещи, на которые следует обратить внимание если вы будете его реализовывать. Решение о покупке мой бот принимает раз в минуту, опрашивая биржу, затем если бот купил крипту я опрашиваю биржу каждые 5 секунд для принятия решения о продаже, одновременно у меня бывает куплено от 0 до 8 различных крипто валют. Опрос каждые 5 секунд это эмуляция стоп ордера, конечно если биржа упадет и у меня на руках будет криптовалюта, то придется продать ее с убытком, но пока такого не было, и стратегия предусматривает продажу до момента обвала. Хотя такой риск есть, и я его понимаю. Стоп ордера не ставлю, поскольку стратегия не предусматривает продажи по определенной цене, а продажа и покупка происходит при совпадении ряда факторов. Опрашивать биржу чаще раза в минуту если у вас на руках нет купленной криптовалюты не стоит, биржа вас быстро забанит особенно если вы торгуете большим количеством коинов, а принимать решение на основе частых опросов точно не стоит. Никогда не стоит вкладывать все деньги в один коин, и обязательно бот должен фиксировать убытки и не надеется, что все будет хорошо. Число сделок, которые мне не приносят убыток в среднем 72%, но это не значит, что все, что без убытка это прибыль, примерно половина сделок из этих 72% закрывается без прибыли. Самое интересное что при прогоне на акциях этот алгоритм так же показал процент сделок без убытка в 75%, что в пределах погрешности. Меня это обнадежило. Так же я сделал управление ботом, которое позволяет мне продать купленные коины в любой момент, главное у меня нет кнопок их купить, потому что бот при покупке коинов всегда знает в какой момент он будет фиксировать убыток, ну а прибыль при желании я могу и сам зафиксировать, это иногда полезно на падающем рынке. На растущем рынке лучше все доверить технике, у которой нет ни жадности, ни нервов, ни надежды.
Запуск основной программы
Основная программа запускается и останавливается через командный файл. В centos 7 была известная проблема утечки памяти в библиотеки curl в случае https соединения, данную библиотеку использует пакет pgsql-http. Поэтому приходилось перезапускать бота раз в сутки. Сейчас в centos 8 проблемы нет и бот может работать без перезагрузки, но я оставил данное решение, поскольку в этом случае можно отключить автоматический vacuum в постгрессе и делать его в ручную, что может повысить производительность, но это мысли о будущем. Так же при старте компьютера проверяется был ли бот запущен и если был, то он запускается снова. Было два раза, когда сервер у провайдера перезапускался и это меня выручало. Тут все просто. Запуск и останов осуществляются следующими командами.
Запуск выполняется командой
Файл cryptorestart.sh положил в rc.local
Основная программа
Комментариев к основной программе у меня нет, она приведена целиком. Маленький комментарий, боту запрещено перегружаться если у нас куплена крипта. Если будут вопросы готов ответить.
Настройки Postgres
Пришлось немного повозится с конфигурированием базы, поскольку одновременно запускается около 400 процессов постгреса и обрабатывается от 5000 до 50000 операций купли продажи на бирже, в зависимости от поведения рынка. Еще все это надо обсчитать и принять решение. Меня приятно удивило что со всем этим постгрес легко справляется на недорогом облачном хостинге за 14 евро. Параметры компьютера 4 ядра, 8Гб памяти и 160Гб диск. Использую 13 версию постгрес. Здесь привожу только те параметры, которые менял.
Вот как выглядит мой дашбоард с 350 процессами постгресс.

Эмуляция работы боты
Я сохраняю все данные собранные в процессе работа бота в таблице, эти данные агрегированы и сохранены все произведенные вычисления, чтобы не повторять вычисления снова. Всегда можно запустить эмулятор, который проходит по этим данным и показывает теоретическое поведение бота. В большинстве случаев оно совпадает с реальным, особенно для маленьких сумм. При больших суммах бот всегда смотрит корзину и покупает так что бы не продавить корзину больше заданной величины, у меня это 0.015%. Это важно для альтов с маленькой капитализацией. В результате получается расхождение с эмулятором так как состояние корзины в каждый момент времени не сохранить. Так же сейчас я стал перед покупкой смотреть корзину и решение зависит так же от ее состояния, увеличило количество удачный сделок на 5%-10%, это так же не может быть обработано эмулятором.
Эмулятор — это, наверное, самая важная часть бота, я начинал работу именно с него. Сначала я скачал все исторические данные с биржи kraken и изобретал алгоритмы торговли. То, что бот написан целиком на pqsql позволяет сосредоточится именно на алгоритмах, а не на программировании, учитывая, что все необходимые математические функции прекрасно реализованы в postgresql и так же замечательно реализовано работа с json, ну и sql отличная вещь. Когда у меня получились рабочие алгоритмы я перешел к реальной торговле. Еще раз убеждаюсь, что выбор правильного инструмента — это очень важно.
Обеспечение отказоустойчивости
Я арендую виртуальную машину у hetzner.de, и меня все устраивает, единственное я советую для торговли на binance размещать компьютер в дата центре в Германии, а не в Финляндии. Почему-то сетевых ошибок при доступе к binance из Финляндии гораздо больше чем из Германии. Однажды возникла мысль, если денег будет под управлением будет много как обеспечить надежность в случае обрыва соединения с биржей. Сразу скажу я еще не реализовал данную схему, поскольку на яхту пока не заработал. Однако продумал как это сделать. Объясню только схему. Есть два компьютера установленные в разных дата центрах, желательно на разных континентах. На них работает наша торговая система, одна в рабочем режиме, другая в резерве. Когда рабочая система падает, резервная система переходит в рабочий режим. В электронике есть такой забавный прием watchdog — аппаратно реализованная схема контроля над зависанием системы. Представляет собой таймер, который периодически сбрасывается контролируемой системой. Если сброса не произошло в течение некоторого интервала времени, происходит принудительная перезагрузка системы. В качестве таймера будем использовать ордер, на бирже который заведомо не может выполнится. Например, купить биток за рубль. Мы будем ставить этот ордер раз в 5 минут и убирать и если наша основная система зависнет и, не уберет ордер в течении определенного времени, то управление будет передано резервной системе, и она станет основной. Суть идеи использовать ордер биржи для обеспечения отказоустойчивости.
Выводы
Всегда есть риск потерять деньги, например, биржа закроется или криптовалюту запретят. Для игры на понижения я использую монеты DOWN которые есть на binance. Правильнее оформлять шорт ордера, тогда вариантов монет намного больше, но пока я до этого не дошел. Я собирался перейти на торговлю акциями, прогонял тесты на исторических данных по акциям и результат так же был положительным, от 25% до 50% процентов в год, но хорошего апи для торговли не было, а сейчас и подавно вариантов торговать в России нет. Главное отличие алгоритма торговли акциями от алгоритма торговли криптой это временной интервал на основе которого вы принимаете решение, он больше в случае торговли акциями поскольку они менее волотильны, а также торговля криптой идет круглосуточно, а при торговли акциями надо ориентироваться на американские торги. Сама идея алгоритма что для крипты что для акций одинакова. Главное, чтобы бот фиксировал убытки и не зависал в надежде что все будет хорошо. Еще дам совет, в алгоритме должно быть как можно меньше коэффициентов, а если они есть то типа таких 0.5, 0.25, 1./3. Никогда не подгоняйте коэффициенты к историческим данным. Лучшая проверка алгоритма если у вас совершенно новая идея и вы ее прогнали на исторических данных желательно за большой срок и на разных парах криптовалют или акций и у вас сразу получился на выходе плюс. У меня в телеграмме есть канал куда бот пишет свои действия, можете заглянуть в него, не призываю копировать его решения, но если интересно можете поглядеть https://t.me/criptozhenya. И еще совет не торгуйте руками, я на этом погорел, на LUNE, хотел много и сразу. Код в git я не выкладывал, но, если кого заинтересует могу вычистить торговых ботов и сделать экспорт приложения.
Главный вывод: можно делать торговых ботов, которые торгуют в плюс, их делать лучше самому и не верить тем, кто предлагает платные сигналы. Мой телеграмм для связи если возникли вопросы https://t.me/antokols .
В качестве ответов на вопросы я написал вторую часть, надеюсь она будет крайней по этой теме
Биржевой бот на Python — часть 1
Пишем простого бота для поиска арбитражных ситуаций
В одно время активно пилил букмекерских ботов и недавно заинтересовался очень похожей областью — криптовалютными биржами. В качестве первого проекта, который позволил бы мне разобраться с необъятным миром ордеров, спредов, шортов стал арбитражный бот, работающий внутри одной биржи — Poloniex.
Задача является простой и по сути как такого профита получить с такого бота нельзя, так как время жизни одной арбитражной ситуации в рамках конторы очень мала (около секунды). Но опять же, этого достаточно для входа в предметную область.
Терминология
Попробую описать необходимые для нас термины.
Криптовалютная биржа
Криптовалютная биржа — это элемент инфраструктуры валютного рынка, деятельность которой состоит в предоставлении услуг по организации и проведению торгов, в ходе которых участники заключают сделки с криптовалютой.
Ордер
Для заключение сделки продажи или покупки необходимо открыть биржевую заявку — ордер.
Ордер может быть описан следующими параметрами: пара, стоймость, объем, тип операции. Например:
Из данной таблицы видно, что вы можете купить 0.5 ETH за 1 BTC.
Пара читается справа налево при совершении операции. Например:
- [BTC_ETH, Продажа] — продаю ETH за BTC,
- [BCH_ETH, Покупка] — покупаю ETH за BCH.
Биржевой стакан
Если вы откроете страницу торгов на бирже Poloniex, то увидите ордера на продажу — SELL ORDERS и ордера на покупку — BUY ORDERS, которые выставляют трейдеры. Данные таблицы называются биржевым стаканом и отображают информацию о том сколько и за какую цену хотят купить / продать валюту.
Наша задача найти арбитражную ситуацию, используя информацию из биржевого стакана.
Арбитражная ситуация
Арбитражная ситуация — это ситуация, при которой за счет разницы в оценке актива (в данном случае валюты) трейдер может получить прибыль.
Например на бирже Poloniex есть три пары валют: BTC, BCH, ETH. И представим, что в биржевом стакане были созданы следующие ордера:
Данная таблица демонстрирует арбитражную ситуацию внутри биржы. Если вы выполните ордера, выставленные трейдерами (совершите с ними сделку) :
- 1 BTC => 10 ETH
- 10 ETH => 8 BCH
- 8 BCH => 1.6 BTC
то останетесь в прибыли на 0.6 BTC, так как изначально имели 1 BTC.
На Poloniex доступна документация API. В рамках нашей задачи нас интересует раздел Public API Methods, метод returnOrderBook .
Order Book — является описанным выше биржевым стаканом, который возвращается в JSON формате, а не на web-интерфейс.
Попробуйте перейти по ссылке Poloniex API. В результате вы должны получить ответ для BTC_ETH, похожий на этот:
- asks — ордера на продажу;
- bids — ордера на покупку;
Меня параметр currencyPair , можно получать список ордеров для различных валют.
Замечание: существует пара BTC_ETH, но обратной ETH_BTC нет. Поэтому если вы хотите выполнить покупку ETH_BTC, вам необходимо сделать продажу в BTC_ETH.
Задача
В итоге нам необходимо решить следующие задачи:
- Выполнить парсинг API криптовалютной биржи Poloniex, а именно метода returnOrderBook и реализация алгоритма поиска арбитражных ситуации;
- Реализовать архитектуру, при которой один поток парсит API и создает отдельные потоки, которые ищут арбитражные ситуации для разных валют;
- Решить проблему с отсутствием обратной пары. Например: существует пара BTC_ETH, но обратной ETH_BTC нет;
- Выводить результат поиска в консоль или в Telegram Bot.
В следующей части мы рассмотрим реализацию данного бота на языке программирования Python.
Создаём Telegram-бот для трекинга вашего криптопортфеля
Мне был необходим для личного удобства бот в Телеграм, который умеет выполнять следующие действия:
- Показать текущий размер активов в USD(T).
- Показать изменения по портфелю в USD(T) за неделю и за все время.
Мне критически важно не использовать никакое приложение вида «все биржи в одном месте» в качестве proxy — да, я не хочу никому предоставлять свои ключи.
Если нужен — давайте напишем.
Что нам потребуется?
В качестве примера в данной статье я буду использовать криптовалютную биржу Binance. Стоит отметить, что никаких ограничений на использование с другими биржами нет — весь каркас тот же самый. Разве что взаимодействие по API будет немного другим (зависит от биржи).
- Нам потребуется функционал Telegram (куда же без него).
- Нам потребуется Dropbox вместо базы данных (о, да).
- Нам потребуется инструмент, где будет крутиться наш бот. Лично я использую Heroku, но можно использовать и AWS.
Создаем бота в Телеграм
Данный этап был описан сотни раз в огромном числе статей, найти которые не составляет проблем. Поэтому здесь будет кратко.
Нам нужно найти в телеграмме контакт @BotFather и выполнить последовательность команд
База из топора
Для начала мы подготовим Dropbox.
Перейдем по ссылке и получим свой API token для Dropbox, нажав на кнопку Create App. Я создам доступ на отдельную папку в Dropbox.

На текущей странице нам необходимо будет сгенерировать OAuth 2.0 для Dropbox:

После создания пройдем на вкладку Permissions и установим права на files.content.write
Теперь по ссылке у нас появилась папка APPS. Зайдем в нее, далее зайдем в поддерикторию с названием нашего бота. Туда нам необходимо поместить файл totalData.txt, содержащий только пустой список.
Взаимодействие с Binance
Нам необходимо создать наш API ключ на бирже Binance.
Данная активность происходит по этой ссылке.
Результатом данного действия для нас будет API Key и Secret Key. В нашем случае будет достаточно прав только на чтение.

В качестве следующего шага мы напишем код, который будем использовать в дальнейшем.
Для начала попробуем запустить данный код локально. Если все сделано правильно — код будет исполняться каждые 60 секунд и спустя некоторое время файл totalData.txt должен выглядеть как-то так:
Еще немного кода. Как считать diff
Далее я приведу пример кода, с помощью которого мы будем получать сами изменения портфеля, а так же этот же код должен запускаться ботом.Как я уже писал выше — я использую Heroku. К тому же до недавнего времени данный сервис был бесплатным, но времена меняются и уже можно задуматься — стоит ли использовать Heroku или присягнуть AWS. Если вы, как и решите выбрать Heroku — я могу посоветовать данную статью.
Сам бот будет иметь одну ключевую команду — stats.
API ключей от Binance здесь уже не потребуется. Только token полученный при регистрации бота в Telegram и Dropbox token (вы же помните, Dropbox заменяет нам базу данных?). Для подсчета информации по неделе мы просто генерим список по балансам за неделю. При необходимости код несложно изменить и считать diff за любой временной срез.
Вместо заключения
В результате применения команды stats вы должны получить в ответ, например, такое сообщение:

Стоит отметить, что данного бота можно развивать и дальше до еще более прикладных применений.
Например, можно реализовать команду buy или sell. Можно подключить дополнительные аккаунты или сразу несколько бирж и мониторить все свои портфели в одном месте. Удобно? Удобно!
Для подключения дополнительных аккаунтов достаточно добавить еще один вызов в этом месте (и конечно же дополнительные api ключи — там они уже и так в list’е).
Однако данные упражнения мы оставим дорогим читателям для самостоятельной работы. Всё же потребности у всех разные
В целом, все исходники уже представлены в статье, но на всякий случай — также они на GitHub.