Oi‑сигналы и автоторговля: как на python создать telegram‑бота для фьючерсов

OI‑сигналы и автоторговля: создаём Telegram‑бота для фьючерсов

---

Введение

Цель этого материала — пошагово разобрать реальный Python‑проект автоматического трейдинга, который уже работает в боевых условиях. Речь идёт не о теоретической стратегии и не о псевдокоде, а о полноценном боте, который:

- непрерывно отслеживает рынок Binance Futures,
- анализирует открытый интерес (Open Interest, OI) и формирует сигналы,
- пропускает каждый сигнал через набор защитных фильтров,
- параллельно обслуживает множество пользователей,
- управляется через Telegram‑интерфейс,
- и при необходимости открывает реальные позиции через API биржи BingX.

Далее будет подробно разобрана логика основного файла `main.py`: как устроены модули, как принимаются решения об открытии сделок и каким образом реализованы элементы риск‑менеджмента.

---

Архитектура проекта: два слоя ответственности

Проект сознательно разделён на два уровня:

1. Управляющий слой (main.py)
- получение и агрегация рыночных данных с Binance Futures;
- расчёт OI‑сигналов;
- применение фильтров (объём, ликвидность, OI и т.п.);
- работа с пользователями и их настройками;
- обработка команд и кнопок в Telegram;
- финальное решение: открывать сделку или пропустить сигнал.

2. Исполнительный слой (bingx_client.py)
- низкоуровневое взаимодействие с торговым API BingX;
- подпись запросов, авторизация;
- установка плеча и маржинального режима;
- открытие/закрытие ордеров;
- реализация трейлинг‑механик и других торговых операций.

Ключевой принцип — логика стратегии должна быть максимально отвязана от конкретной биржи. В управляющем коде мы работаем не с HTTP‑запросами, а с абстрактными вызовами вроде `place_market_order()`. Если завтра потребуется сменить биржу или добавить вторую, достаточно реализовать ещё одного клиента в стиле `bingx_client.py`, не переписывая всё ядро бота.

---

Хранение пользователей и их состояния

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

- Каждый пользователь представлен словарём (dict),
в котором лежат:
- торговые настройки (размер позиции, плечо, multiplier и т.п.),
- набор включённых/выключенных фильтров,
- персональный чёрный список инструментов,
- служебные метаданные (последние сигналы, время последней сделки и др.).

Такой подход даёт несколько важных преимуществ:

- не требуется разворачивать и обслуживать полноценную базу данных;
- состояние бота легко сериализуется в файл;
- перезапуск процесса не приводит к потере данных: JSON просто перечитывается;
- структура гибкая — можно безболезненно добавлять новые поля и настройки.

---

Вспомогательные функции и проценты

Отдельно вынесены утилиты для вычисления процентных изменений — они используются и для цены, и для открытого интереса.

Например, функция вида:

```python
def percent_change(old, new):
return (new - old) / old * 100
```

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

- единообразный подход к расчётам по всему проекту;
- снижение риска логических ошибок;
- гибкость: если требуется немного изменить методику подсчёта — делается это в одном месте.

---

Получение рыночных данных: Binance Futures

Данные рынка берутся исключительно с публичных эндпоинтов Binance Futures. На их основе построен набор функций, который:

- получает список фьючерсных символов, торгуемых к USDT;
- загружает исторические свечи по заданному таймфрейму;
- извлекает данные по открытому интересу (OI);
- возвращает компактные структуры, удобные для последующей аналитики.

Фильтрация по символам типа `*_USDT` позволяет:

- не тратить ресурсы на нерелевантные активы;
- упростить логику — все инструменты номинированы в одной базовой валюте;
- легче масштабировать стратегию, добавляя или удаляя конкретные рынки.

---

Основная аналитика: функция проверки инструмента

Сердце стратегии — функция `check_symbol`, которая выполняет основную аналитику по одному конкретному инструменту:

1. Загружает данные по цене и открытому интересу на выбранном таймфрейме (например, 5‑минутные свечи).
2. Берёт фиксированное количество точек истории — к примеру:
- 48 точек для анализа за последние 4 часа;
- 288 точек для анализа за 24 часа.
3. Рассчитывает:
- процентное изменение цены за интересующий период;
- процентное изменение OI;
- дополнительные коэффициенты, необходимые для фильтров.

Жёсткая фиксация числа точек (48, 288) делает расчёты полностью детерминированными: при одинаковых входных данных бот всегда принимает одинаковое решение, что важно и для отладки, и для повторяемости результатов.

---

OI‑сигнал: не только рост, но и связь с ценой

Сигнал строится не просто на росте открытого интереса. Важна взаимосвязь между изменением OI и изменением цены. Для этого применяется коэффициент вида:

```python
PRICE_OI_RATIO = 0.5
```

Смысл: рост OI должен быть значимым по отношению к движению цены. Стратегия нацелена именно на поиск накопления позиций, а не на погоню за уже начавшимся импульсом.

Если OI растёт сильно, а цена ведёт себя вяло или даже слегка откатывается, это может говорить о «тихом» наборе позиций крупным капиталом. Именно такие ситуации и интересуют стратегию — на них чаще формируется достойное продолжение движения.

---

Анти‑спам и защита от повторных входов

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

При формировании нового сигнала алгоритм:

1. Проверяет, когда по этому инструменту в последний раз открывалась сделка;
2. Сравнивает текущее время с заданным интервалом «тишины»;
3. Если интервал ещё не истёк, сигнал игнорируется.

Такой механизм:

- защищает от переоткрытия позиций в условиях шума,
- снижает нагрузку на депо,
- делает поведение бота более предсказуемым.

---

Фильтры объёма и ликвидности

В код встроен жёсткий фильтр, отсеивающий:

- неликвидные активы,
- монеты с подозрительно низким объёмом,
- инструменты с «грязными» или неполными данными.

Главная задача фильтра — работать только с рынками, где:

- есть достаточная ликвидность для исполнения рыночных ордеров,
- данные по OI и цене выглядят корректными,
- нет экстремальных проскальзываний на малых объёмах.

Отсекая подобные инструменты, мы:

- снижаем риски непредсказуемых скачков,
- уменьшаем вероятность «залипания» в позиции,
- повышаем стабильность всей стратегии.

Дополнительно используется фильтр объёма, который разрешает торговать лишь в моменты повышенной рыночной активности. На тестах включение этого фильтра:

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

Каждый пользователь может настроить персональный мультипликатор объёма (multiplier), усиливая или ослабляя этот фильтр под свой риск‑профиль.

---

Минимальный OI и другие пороги

Для OI задан минимальный порог: сигналы, появившиеся на фоне слишком маленького открытого интереса, просто игнорируются.

Логика проста:

- маленький открытый интерес — мало вовлечённого капитала;
- любой всплеск в таких условиях менее надёжен;
- на крупных значениях OI можно рассчитывать на более устойчивое движение.

Комбинация объёмного фильтра и проверок по OI даёт базовый каркас риск‑менеджмента на уровне самой стратегии.

---

Чёрный список инструментов

Каждый пользователь может не только работать с общими фильтрами, но и вести персональный blacklist:

- `/blacklist_add` — добавить символ в список запрещённых;
- `/blacklist_remove` — убрать инструмент из чёрного списка;
- `/blacklist_show` — посмотреть текущий список.

Это удобно, когда:

- пользователь не хочет иметь дело с конкретными монетами (например, из‑за их волатильности или личного опыта),
- нужны дополнительные ограничения сверх общесистемных фильтров.

Перед каждой потенциальной сделкой бот проверяет, не находится ли символ в чёрном списке — и при наличии блокировки просто пропускает сигнал.

---

Переход от сигнала к реальной сделке

Когда инструмент проходит все фильтры — OI, объём, ликвидность, отсутствие в blacklist и проверку на переоткрытие — наступает этап подготовки сделки.

Основные шаги:

1. Расчёт параметров позиции
- размер сделки определяется из пользовательских настроек;
- учитываются ограничения по риску (например, доля от депозита);
- срабатывает пользовательский multiplier объёма.

2. Риск‑менеджмент
- проверка максимально допустимого количества открытых позиций;
- контроль просадки (можно внедрить дневные/недельные лимиты);
- отказ от входа, если баланс ниже безопасного порога.

3. Открытие ордера
Через клиент BingX вызывается функция, аналогичная:

```python
bingx_client.place_market_order(
symbol=s,
amount=calculated_amount,
long=True, # стратегия работает в лонг
leverage=user_leverage,
...
)
```

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

---

Telegram‑интерфейс и inline‑кнопки

Управление ботом вынесено в Telegram, где реализовано меню настроек через inline‑кнопки.

Пользователь может:

- менять размер позиции;
- включать/выключать отдельные фильтры;
- управлять мультипликатором объёма;
- работать с чёрным списком;
- просматривать текущие настройки.

Важная особенность — единый обработчик всех кнопок. Вместо множества разрозненных функций для каждой команды используется централизованная логика:

- каждая кнопка шлёт компактный callback‑данные (например, `set_vol_mult:2`);
- общий обработчик парсит эти данные;
- в зависимости от ключа обновляет нужное поле в JSON состояния пользователя.

Преимущества такого подхода:

- легко расширять меню — добавление нового параметра требует минимум кода;
- структура остаётся чистой и предсказуемой;
- снижение вероятности ошибок при изменении логики интерфейса.

---

Универсальная обработка пользовательского ввода

Помимо кнопок, бот обрабатывает текстовые команды и произвольный ввод от пользователя. В основе лежит универсальный механизм:

- каждая команда переводит бота в определённое «ожидаемое состояние» (например, ожидается ввод числа для нового объёма позиции);
- ввод пользователя интерпретируется с учётом этого состояния;
- результат сохраняется в JSON и сразу влияет на поведение бота.

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

---

Основной цикл: всё в одной функции проверки символов

Функция `check_symbols` — главный рабочий цикл бота. Она:

1. получает актуальный список фьючерсных инструментов;
2. по каждому символу:
- загружает данные цены и OI;
- рассчитывает процентные изменения;
- формирует потенциальный сигнал;
- последовательно прогоняет его через все фильтры:
- ликвидность и объёмы;
- минимальный OI;
- коэффициент PRICE_OI_RATIO;
- чёрный список;
- анти‑спам и защита от переоткрытия;
3. при положительном исходе — формирует параметры сделки для каждого пользователя и, если автоторговля включена, отправляет команду на открытие позиции через `bingx_client`.

Именно в этом месте сходится вся логика проекта — от рыночных данных до конкретного ордера.

---

Дополнительно: что важно учесть при практическом использовании

Чтобы бот не превращался в «чёрный ящик», стоит учитывать несколько дополнительных аспектов:

1. Логирование
Важен подробный лог: какие сигналы приходили, какие фильтры сработали, какие сделки были открыты, а какие — отклонены. Это позволяет:
- разбирать спорные ситуации;
- оптимизировать фильтры;
- сравнивать разные конфигурации настроек.

2. Отладка на paper‑трейдинге
Запускать такую систему сразу на реальных деньгах — рискованно. Гораздо разумнее:
- сперва поработать в «сухом режиме» (только сигналы и логи);
- затем подключить демо‑счёт или минимальные объёмы;
- лишь после этого переходить к рабочим размерам.

3. Гибкая конфигурация по пользователям
Разным трейдерам нужен разный уровень агрессии:
- консервативные могут усиливать фильтр объёма и снижать multiplier;
- агрессивные — уменьшать ограничения, но понимать возможные последствия.

4. Мониторинг работоспособности
Стоит предусмотреть:
- уведомления о критических ошибках в Telegram;
- оповещения о перезапуске бота;
- контроль частоты сигналов, чтобы заметить резкие изменения в поведении.

5. Обновление и развитие стратегии
OI‑сигналы — лишь один из возможных источников входа. В будущем можно:
- комбинировать OI с данными по кластерам или ленте сделок;
- вводить отдельные правила для шорта;
- адаптировать параметры под разные рыночные фазы.

---

Заключение

Разобранный бот демонстрирует, как можно выстроить полноценную систему автоторговли вокруг простого, но мощного источника сигналов — открытого интереса.

Проект показывает на практике:

- как разделять торговую логику и работу с конкретной биржей;
- как гибко хранить состояние множества пользователей в JSON без БД;
- как применять многоуровневые фильтры (объём, ликвидность, OI, blacklist);
- как использовать Telegram в качестве удобного и понятного интерфейса;
- и как из «сухой» аналитики OI перейти к реальным сделкам, не жертвуя контролем над рисками.

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

1
1
Прокрутить вверх