Что это
brokapi - единый интерфейс к торговым API. Один и тот же код бота работает с любым брокером. Начинаем с API брокеров российского рынка: БКС, Т-Банк, Финам и АЛОР, есть также технический коннектор к API Bybit (страница). Дальше другие брокеры и биржевые протоколы под тот же интерфейс.
Для ИИ-агентов: llms.txt / llms-full.txt. Для тех, что пишут на Python: python/llms.txt
Стадия: открытая альфа. Интерфейс до беты может меняться. Перед первой заявкой на настоящем счете: Перед боевым счетом.
Выберите путь
В книге одна общая часть (как устроено, брокеры, ошибки, события) и у каждого продукта свой раздел. Общее написано один раз и верно для любого пути. Работают Rust, Python и Gateway (все в альфе).
-
Rust
альфаЯдро: рыночные данные, заявки, стоп-заявки, сверка, портфель, любой метод брокера через
raw(). Работает сейчас. Быстрый старт и инструкции. -
Python
альфаТонкая обертка над ядром: события через
async for, деньги какDecimal, те же правила и ошибки, что у ядра. Работает сейчас. Быстрый старт и инструкции.pip install brokapi. -
Gateway
альфаПрограмма
brokapi: служба держит связь со счетами за все ваши боты, боты на любом языке подключаются к ней по gRPC, один счетчик лимитов на всех. Команды той же программы запускают службу, показывают гейтвеи (brokapi ps,brokapi top) и читают счет (brokapi quote, вывод--jsonдля скриптов и ИИ-агентов). Бесплатно, ставится у себя: готовый файл для Linux, macOS и Windows илиcargo install. Работает сейчас.
Что общее у всех путей
- Переводчик. Бот говорит на одном языке (заявка, стакан, событие) со всеми брокерами. Разница протоколов (REST, WebSocket, gRPC) спрятана внутри. Сменить брокера - поменять коннектор, код бота почти не меняется.
- Предохранитель. Главная задача библиотеки - чтобы бот никогда не поставил заявку дважды и не торговал вслепую. Поэтому команда без ответа не повторяется, а торговля закрывается, когда данные о своих заявках могли потеряться.
- Без памяти. Между запусками библиотека ничего не хранит. Журнал заявок ведет бот, библиотека дает номер
cidв каждом событии заявки и сверку со счетом.
Книга устроена так: сначала общая часть (как устроено, брокеры), затем разделы продуктов со своим быстрым стартом и инструкциями, в конце справочник. Код на общих страницах дан вкладками Rust и Python там, где он есть.
Что умеет
| Возможность | Что внутри |
|---|---|
| Рыночные данные | стакан (снимок и поток), сделки рынка, котировки, свечи, справочник инструментов, лот и шаг цены, статус торгов, расписание |
| Заявки | постановка, отмена, изменение (где оно есть у брокера), статус по номеру бота, список активных, поток статусов |
| Свои сделки | история и поток исполнений |
| Портфель | снимок и поток: деньги и позиции |
| Стоп-заявки | стоп-лосс, тейк-профит, стоп-лимит одним набором методов |
| Сверка после рестарта | бот приносит список своих заявок, библиотека сравнивает его с брокером |
| Лимиты запросов | общий счетчик на область, где брокер считает лимит |
| Любой другой метод брокера | через raw(), с теми же токеном, адресом и счетчиком лимитов |
Из чего состоит
У каждого брокера два коннектора: MD (рыночные данные, один на брокера) и UD (заявки, свои сделки, портфель, один на счет). Как они связаны с ботом, с лимитами и между собой, показывает Карта.
Общие трейты (OrderBookSource, OrderExecutor, StopOrderExecutor и другие) закрывают то, что умеют все
брокеры. Бот, написанный на них, работает с любым брокером. Все остальное, что есть у брокера (купоны, отчеты,
избранное, новые методы), доступно через метод raw() каждого коннектора: raw. Сколько методов брокера
закрыто общим интерфейсом, а сколько только raw(): Покрытие API.
Три правила, на которых все держится
cidпридумывает бот и записывает у себя до отправки. Это единственная нить, по которой можно спросить брокера о заявке без ответа. Если номер выдает библиотека, он теряется вместе с ответом, и после падения бот не знает, что за заявка могла встать. Подробно: Круг команд.- Команда без ответа не повторяется.
Unknownвыясняется у брокера, новая попытка идет с новымcid. Заявка без ответа могла встать, и повтор дал бы две заявки на счете. Что делать вместо повтора: Если что-то пошло не так. - Торговля только после сверки. После старта, после перегрузки, при сомнении. Пока бот не знает, какие заявки уже стоят у брокера, новая команда может задвоить заявку или спорить с той, которую бот не видит. Подробно: Круг жизни.
Чего библиотека не делает
- Не придумывает номер заявки.
cidсоздает бот, по нему он узнает свою заявку после рестарта. - Не повторяет команды. Заявка, на которую не пришел ответ, не отправляется второй раз. Ни при каких условиях.
- Не хранит состояние на диске. Журнал своих заявок ведет бот.
- Не собирает общий портфель по счетам и не выбирает счет для заявки. Это слой над коннекторами.
- Не трогает чужие заявки. Заявки, поставленные руками или другим роботом, она только показывает.
- Не снимает заявки при остановке. Заявка на бирже переживает процесс бота.
С чего начать
- Хочу запустить: сначала Установка, потом Быстрый старт на Rust или на Python.
- Пишу бота (сам или с ИИ-агентом): сначала Контракт для агентов, затем инструкция по задаче: торговый бот (Rust, Python), несколько брокеров и счетов (Rust, Python), исследовательский движок, история свечей на Python.
- Несколько ботов на одном счете или бот не на Rust и Python: Gateway, затем быстрый старт.
- Хочу понять устройство: Карта, затем три круга: события, команды, жизнь коннектора.
- Что делать при старте, рестарте и остановке бота: Запуск, рестарт и остановка.
- Пришла ошибка или странное состояние: Ошибки и что с ними делать.
- Особенности конкретного брокера: Брокеры.
- Хочу поставить заявку на настоящем счете: сначала Перед боевым счетом.
- Нужен метод, тип или ошибка до последнего поля: Справочник API Rust (rustdoc, лежит рядом с книгой в
api/) или Python. - Что появилось нового: Изменения.
Листать можно клавишами Влево и Вправо.