Телеграм бот для уведомлений об ордерах Binance
Недавно я решил попробовать себя в торговле криптой на известной криптобирже Binance.
Сам процесс довольно увлекательный, но “залипать” в торговом терминале целый день не удавалось т.к. есть основная работа (C# разработчик), которой нужно уделять время (ваш капитан очевидность).
Немного погуглив, как можно получать уведомления об изменениях ордеров, ничего подходящего для меня найти не удалось. Ну и как большинству программистов, очень хотелось сделать с̶в̶о̶й̶ в̶е̶л̶о̶с̶и̶п̶е̶д свое решение. Поэтому я решил по-быстрому запилить своего телеграм бота, запустить у себя на компьютере и радоваться всем уведомлениям.
Поскольку основная моя специализация — это .NET, то и бота буду писать на языке C# используя последнюю на текущий день версию .NET 6.
Создаем бота
В интернетах уже и так много инструкций как создать своего телеграм бота, поэтому вместе с этой статьей их станет на одну больше.
Для создания бота используется другой телеграм бот — @BotFather.
- В меню выбираем newbot или пишем команду “/newbot”.
- Дальше бот просит ввести название нашего бота. Своего я рашил назвать drjvt (просто нарандомил название, постучав по клавиатуре).
- В следующем пункте необходимо задать никнейм бота, с помощью которого, его будут находить другие пользователи. Необходимо чтобы этот никнейм заканчивался на “bot”. В моем случае это будет drjvtbot.
- После этих простых действий, BotFather пришлет нам ключик для этого самого бота, который нужно куда-нибудь сохранить и никому не показывать.
Получаем ключ на Binance
У API криптобиржи очень хорошая и подробная документация. Получить очень широкая функциональность
Логинимся в систему и в меню центра пользователя, нажимаем на Управление API (API Management)
Задаем метку (Label) для ключа. В нашем случае это будет “drjvtbot”.
Проходим проверку безопасности и вводим нужные коды
Дальше будет показано окно с созданным API ключом и секретным ключом. Их надо будет сохранить и никому не показывать. А секретный ключ больше нельзя будет увидеть.
Для получения пользовательских событий достаточно будет разрешения на чтение (Enable reading)
На этом все доступы получены и остается только написать немного кода.
Пишем код
Перед началом разработки необходимо установить .NET 6 SDK (скачать установщики можно на https://dotnet.microsoft.com/en-us/download).
Важное уточнение: написанный код не претендует на архитектурную красоту, разделение на сборки и слои, выделение абстракций и т.п. Все будем писать в одной сборке, которую и будем запускать.
Для работы с Api для телеграм ботов уже есть готовая библиотека с хорошей документацией и опубликованным в nuget пакетом Telegram.Bot.
Получать все обновления для бота можно с помощью веб-хуков (webhooks) и через Long polling. Главное отличие в них — это способ получения обновлений.
Webhooks — это по сути push-схема, а long polling — это pull-схема. В нашем случае проще всего будет выбрать long polling и самим забирать обновления во время работы приложения.
Для этого нам понадобится еще одна библиотека Telegram.Bot.Extensions.Polling.
А для работы с Api Binance тоже заиспользуем готовую библиотеку
Binance.Net.
В проект добавляем вышеперечисленные зависимости
dotnet add package Telegram.Bot
dotnet add package Telegram.Bot.Extensions.Polling
dotnet add package Binance.Net
Все зависимости установлены и теперь остается написать немного кода.
Начнем с создания сервиса, который подпишется на поток событий на Binance. Стандартный наследник класса BackgroundService, в котором необходимо переопределить один вызов метода ExecuteAsync. В этом методе опишем обвязку, которая делает паузу в 5 секунд и дальше метод выполняется вновь. Все это можно посмотреть в исходниках, в файле BinanceListenService.cs.
Вся “магия” подписки на события находится в методе UpdateSubscriptions в этом же классе, а также есть несколько особенностей использования библиотеки. Рассмотрим их подробнее.
В нашем примере будем подписываться на изменения во фьючерсных ордерах.
Первым шагом необходимо вызвать метод StartUserStreamAsync у клиента Binance. В результате будет получен ключ, который необходимо использовать для подписки на пользовательские обновления SubscribeToUserDataUpdatesAsync.
В вызове этого метода указываем можно указать callback-и на разные события. Нас интересуют 2 из них OnOrderUpdate и OnListenKeyExpired.
Метод OnListenKeyExpired вызовется каждый раз, когда будет истекать срок действия ключа для потока событий и после того, как он истекает, необходимо переподписаться. Судя по доке, истекает он примерно каждые 30 минут. В нашем случае, используем флажок _subscribeRequired, который устанавливается в true при возникновении этого события.
Метод OnOrderUpdate будет вызван каждый раз, когда будет приходить изменения в ордерах. В нем как раз и будем производить оповещения, в нашем случае через телеграм.
В callback приходит один аргумент типа DataEvent<BinanceFuturesStreamOrderUpdate> и в нем достаточно много информации. Нас интересует события типа ORDER_TRADE_UPDATE и этот тип хранится в поле Data.Event.
Таким образом, у нас есть все данные для того, чтобы можно было отправить уведомление пользователю. Для меня достаточно было получать информацию о том какой ордер сработал, с какой стороны он сработал и какой профит был получен.
Можно получить исходную строчку, оправляемую сервером в формате JSON и для отмены ордера, выглядеть она будет примерно вот так:
Имея вот такие примеры событий в формате JSON на разные типы событий, можно очень легко написать unit тесты и тем самым быть уверенными, что последующие доработки ничего не сломают и их не надо будет перетестировать каждый раз (с) Ваш капитан очевидность.
Заключение
В результате, за несколько часов, получился вполне рабочий бот, который отправляет уведомления об изменениях в ордерах. Но это прям такая первая версия, которая больше похожа на прототип и написан исключительно для одного человека.
Дальше планирую дополнить бота возможностью добавления пользователей новых пользователей и опишу этот процесс.
Исходники проекта: https://github.com/A-Sosnovsky/alert_bot
Telegram Bot Client: https://github.com/TelegramBots/Telegram.Bot
Binance.Net: https://github.com/JKorf/Binance.Net
Документация telegram bot api: https://core.telegram.org/bots/api
Ten articles before and after
IntruderDet —An Intruder Detection Bot for my Appartment – Telegram Group
Send APK automatically to Telegram using Dart/Flutter – Telegram Group
How to build a Telegram bot to show Chainlink price feeds – Telegram Group
Cómo crear un Bot de Telegram?. Hola 👋 soy YOSS, en este post te… – Telegram Group
Simple Telegram Bot using API’s. A Simple Telegram Bot which can respond… – Telegram Group
The art of indexing +1PB data on Telegram – Telegram Group
How to Install and Run the Crypto-Telegram Bot – Telegram Group
How to create a Telegram bot with Python in under 10 min! – Telegram Group
Monitor Server with Telegram Bot and Python – Telegram Group
Google Sheets Formula & Telegram Message ✈️ – Telegram Group