Горячие клавиши

← и →: предыдущая и следующая глава

S или /: поиск по книге

?: показать эту подсказку

Esc: закрыть подсказку или поиск

brokapi для Python

Тонкая обертка над ядром brokapi на Rust. Стадия: открытая альфа, интерфейс до беты может меняться. Перед боевым счетом: Перед боевым счетом.

Обертка не придумывает своих правил. Это те же БКС, Т-Банк, Финам, АЛОР и Bybit, те же сверка, cid, лимиты и ошибки, что у ядра, только вызываются они из Python. События приходят через async for, деньги, цены и количества - decimal.Decimal, никогда float. Устройство, правила и особенности брокеров общие для всех путей и лежат в общих частях книги. Здесь то, что зависит от языка: как подключить пакет и как решить задачу кодом.

Что нужно

  • Python 3.10 или новее. Пакет один на все версии (abi3).
  • pip install brokapi. Готовые пакеты есть для Linux (x86_64 и aarch64), macOS (Intel и Apple silicon) и Windows, на остальных системах расширение соберется при установке (нужен Rust 1.88 или новее). Подробности и частые ошибки: Установка. Пакет дает библиотеку. Программа brokapi (Gateway) ставится отдельно: Установка.
python -m venv .venv && . .venv/bin/activate
pip install "git+https://github.com/runinfra/brokapi#subdirectory=crates/python"   # из клона: pip install ./crates/python
python -c "import brokapi; print(brokapi.__version__)"

Должен напечататься номер версии.

Инструкции по задачам

Что нужно сделатьСтраница
Пройти путь от нуля до первой заявки: имитация без токена, песочница Т-Банка, потом боевой счетБыстрый старт на Python
Перенести бота с tinkoff-investments (или с QUIK)Если вы пришли с tinkoff-investments
Написать торгового бота на событияхТорговый бот на событиях, Python
Держать несколько брокеров и счетов в одном процессеНесколько брокеров и счетов
Выгрузить длинную историю свечейИстория свечей
Поставить стоп-заявку, найти ее и снять. Проверить стоп после рестартаСтоп-заявки, Python
Остановить бота и знать, что останется на счетеАварийная остановка бота
Вызвать метод брокера, которого нет в общем интерфейсеЛюбой метод брокера, Python
Записать поток событий в файл и проиграть его из файлаЗапись событий и проигрыш, Python
Проверить свой код без сети и денегТесты против имитаций, Python
Подключить бота к гейтвею вместо брокераПодключить бота: Python
Понять, как Python связан с ядром, и чем отличается от RustКак это устроено
Найти класс, метод или поле до последней подробностиСправочник API: Python

Что умеет первая версия

ВозможностьКак в Python
Подключиться к БКС, Т-Банку, Финаму, АЛОРу, Bybitawait brokapi.connect("bcs"), настройки из переменных окружения или аргументами
Подключиться через гейтвейawait brokapi.connect_gateway("bcs-main", bot="my-bot"): тот же Client, остальной код бота не меняется
Стакан, сделки рынка, котировки, свечиorder_book, last_trades, candles, подписки subscribe_*, история по окнам candle_pages
Свои заявки и исполненияsubscribe_order_state, subscribe_executions, executions
Заявкиreconcile, place, cancel, replace (где брокер умеет), order_state, active_orders
Стоп-заявкиplace_stop, cancel_stop, active_stop_orders, subscribe_stop_orders (потока статусов нет ни у кого: Unsupported)
Любой метод API брокераawait client.raw("GetLastPrices", {...}): имя метода и словарь, ответ словарем, квота общая с клиентом
Запись и проигрыш событийbrokapi.record: EnvelopeWriter, EnvelopeReader, replay. Файл тот же, что у Rust
Справочник, лот, шаг цены, статус торгов, расписаниеinstrument, find, trading_params, trading_status, schedule
Портфельportfolio, positions, balances, подписка subscribe_portfolio
Событияasync for envelope in client.events, один поток на клиента, brokapi.merge для нескольких
Ошибкиисключения с теми же именами и текстом, что у Error в Rust: Unknown, Rejected, RateLimited, NotReconciled, Degraded и другие
Тестыbrokapi.testing.mock_bcs(), mock_tbank(), mock_finam(), mock_alor(): имитации брокеров, на них идет каждый пример книги

Python повторяет Rust по возможностям. Отличие одно: raw не отдает потоки (метод, который открывает поток, и WebSocket-каналы БКС), их читает общий интерфейс. Подробности: Любой метод брокера, Python.

Правила, которые остаются

Обертка сохраняет обязательные правила ядра (Контракт для агентов):

  • торговля открывается только после reconcile, до него place поднимает NotReconciled
  • cid придумывает бот (brokapi.new_cid()) и записывает в свой журнал до вызова place
  • Unknown никогда не повторяется: после него order_state(cid)
  • один счетчик лимитов на область брокера: limiter= у connect
  • деньги, цены и количества - Decimal, float в вызове отвергается с TypeError

Что бывает, если нарушить каждое правило, объяснено в общих частях: Круг команд, Круг жизни, Лимиты, Деньги, цены и количества.

Общее, что нужно прочитать

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

Листать можно клавишами Влево и Вправо.

brokapi by RunInfra