Телеграм бот для уведомлений об ордерах Binance – Telegram Group

Телеграм бот для уведомлений об ордерах Binance

Недавно я решил попробовать себя в торговле криптой на известной криптобирже Binance.

Сам процесс довольно увлекательный, но “залипать” в торговом терминале целый день не удавалось т.к. есть основная работа (C# разработчик), которой нужно уделять время (ваш капитан очевидность).

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

Поскольку основная моя специализация — это .NET, то и бота буду писать на языке C# используя последнюю на текущий день версию .NET 6.

Создаем бота

В интернетах уже и так много инструкций как создать своего телеграм бота, поэтому вместе с этой статьей их станет на одну больше.

Для создания бота используется другой телеграм бот — @BotFather.

  1. В меню выбираем newbot или пишем команду “/newbot”.
  2. Дальше бот просит ввести название нашего бота. Своего я рашил назвать drjvt (просто нарандомил название, постучав по клавиатуре).
  3. В следующем пункте необходимо задать никнейм бота, с помощью которого, его будут находить другие пользователи. Необходимо чтобы этот никнейм заканчивался на “bot”. В моем случае это будет drjvtbot.
  4. После этих простых действий, BotFather пришлет нам ключик для этого самого бота, который нужно куда-нибудь сохранить и никому не показывать.
Вот так выглядел весь диалог с BotFather

Получаем ключ на Binance

У API криптобиржи очень хорошая и подробная документация. Получить очень широкая функциональность

Логинимся в систему и в меню центра пользователя, нажимаем на Управление API (API Management)

Выбираем пункт 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 и для отмены ордера, выглядеть она будет примерно вот так:

Пример отмены ордера Take profit в формате 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

Simple Telegram Bot using API’s. A Simple Telegram Bot which can respond… – Telegram Group

Making our First Telegram Bot [Part -2] – 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

How to Create a Telegram Chatbot in 2022 – Telegram Group

Telegram Bot 跟我想的不一樣. 第一天進公司時,Slack就被邀進同事們訂便當的群組,在上面會宣布今天訂那一家便… – Telegram Group