Skip to content

Идеология

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

Структура проекта

  • .github/ - настройки CI/CD
  • .grafana/ - дашборды для Grafana
  • cmd - исполняемые файлы
    • trade-bot - непосредственно торговый бот
    • trade-util - консольная утилита-помощник
  • docs/ - документация
  • internal - внутрянка проекта
    • config - глобальная конфигурация
    • loggy - логгер проекта
    • metrics - доступные Prometheus-метрики
    • proto - автосгенерированные protobuf-контракты
    • sdk - обёртка над proto
    • trade - вся логика торговли
      • breaker - реализация "circuit breaker"
      • common - общие компоненты
      • strategy - доступные торговые стратегии
      • util - преобразования, форматирования, etc

Архитектура

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

  1. Основанная на воркерах (workers). Торговый бот запускает несколько горутин, каждая из которых отслеживает только один переданный по FIGI инструмент, выставляет заявки на покупку и продаётся в соответствии с торговыми индикаторами.

  2. Основанная на стримах (streams). Торговый бот слушается один поток для всех переданных в конфиге FIGI и запускает отдельную горутину на каждое необходимое для обработки событие.

Особенности работы

В основе обработки ошибок лежит паттерн Circuit Breaker: если worker/stream начинает получать слишком много ошибок при работе с конкретным инструментом, то он считается "нездоровым" и завершает свою работу.

Торгового бота можно запускать в нескольких инстансах со своим собственным конфигом. Каждый инстанс уникально идентифицирует себя полем "bot_id" в логах и метриках, случайно сгенерированным на старте.

Торговые стратегии, реализуемые ботом, используют достаточно короткие свечи, которые, к сожалению, Tinkoff Invest API не предоставляет на длинных интервалах. В связи с этим в проекте пока не реализован backtest.