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

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

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

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

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

Чем гейтвей отличается от прямого подключения

Объяснение для тех, кто уже пишет ботов на библиотеке и переносит бота на гейтвей. Правила те же: cid придумывает бот, команда без ответа не повторяется, торговля после сверки (три правила). Клиент RemoteClient умеет те же трейты ядра (OrderExecutor, OrderBookSource, PortfolioSource и остальные), поэтому код бота почти не меняется. Меняется дорога: между ботом и брокером появился еще один процесс. Из-за этого есть отличия, и каждое объяснено.

Схема показывает, откуда берутся отличия. Ответ на команду может потеряться на каждом из двух участков дороги. В библиотеке дорога одна, участок Б.

flowchart TB
  bot["бот"] -->|"участок А"| gw["гейтвей"]
  gw -->|"участок Б"| br[("брокер")]

Потерялся ответ на участке Б: гейтвей не знает, дошла ли команда до брокера, и бот получает Unknown. Потерялся на участке А: не знает уже бот, а гейтвей мог команду выполнить. Поэтому Unknown приходит и в этом случае, а клиент не повторяет команду ни на одном из участков.

ЧтоВ библиотекеЧерез гейтвейПочему
Ответ на команду потерянUnknown, если потерян ответ брокераUnknown и тогда, когда потерян ответ гейтвея: оборвалась связь с ним или вышел срок. Клиент не повторяет командуГейтвей мог ее выполнить. Повтор дал бы вторую заявку. Что делать: Если что-то пошло не так
Бот перестал ждатьРешает код ботаКоманда на гейтвее выполняется до конца, даже если вызов бросилиИначе отмена вызова оставила бы неизвестное состояние: заявка ушла к брокеру или нет
Журнал заявокВедет ботГейтвей ведет еще и свой журнал cid на дискеЧтобы после его перезапуска сверить заявки с брокером до приема команд. Свой журнал бот все равно ведет: сверка бота идет по его списку
СобытияКанал mpsc, Resync и OverflowПоток Events с номерами, кадры Gap и LaggedМежду гейтвеем и ботом событие может потеряться, а нумерация и кольцо позволяют это заметить и догнать. Подробно: События
ПодпискиПодписка принадлежит ботуПодписку открывает бот, но события подписки получают все боты, которые читают поток, а владельцев у подписки может быть несколькоПодписка стоит квоты у брокера, поэтому одинаковые подписки склеиваются. Фильтр own_orders_only оставляет в потоке только события ваших заявок
ЛимитыСчетчик в процессе ботаОдин счетчик на гейтвей, общий для его ботов, очереди между ботами нетЛимит брокера один на счет, а не на бота
Сверка ботаreconcile(ledger) сверяет ваш список с брокеромТо же, но заявки других ботов этого гейтвея возвращаются как foreign. Флаг include_journal в запросе добавляет к вашему списку журнал гейтвея (клиент Rust его не выставляет, из других языков он доступен)Гейтвей видит заявки всех своих ботов, бот - только свои
СтартБот сам открывает соединениеГейтвей мог еще не закончить сверку: вызовы получают UNAVAILABLE с причиной GATEWAY_STARTING, команда точно не выполняласьПока журнал не сверен, принимать заявки нельзя. Ждать готовности: вызов Health
Остановкаshutdown не снимает заявки на биржеОстановка гейтвея заявки тоже не трогает. Снять их: brokapi stop <гейтвей> --cancel-orders или brokapi cancel-allЗаявка на бирже переживает процесс, и это правильно: она может быть частью стратегии
Первый снимок портфеля БКСПодписка на портфель присылает снимокПодписка на портфель БКС присылает только изменения: гейтвей сверяется на старте, и первый снимок до подписки уже прошел. Начальное состояние бот читает вызовом PortfolioТак ведет себя коннектор БКС при открытии сокета портфеля
ДоступТокен брокера в процессе ботаТокен брокера только у гейтвея. Боту нужен ключ access.key и имяБоты не видят токена брокера. Ключ дает доступ только к гейтвею и только с этой машины

Если бот на Python

Клиент для Python - тот же Client, что при прямом подключении, и все отличия выше к нему относятся. Три добавки к ним, с причинами:

  • Торговля до сверки закрыта и на стороне бота. Гейтвей сам этого не требует, но Client держит правило библиотеки: NotReconciled до первой reconcile и Degraded после потери событий до следующей. Иначе бот, перенесенный на гейтвей, молча торговал бы там, где у брокера получил бы отказ.
  • Потеря событий - событие Gap, а не отдельный кадр потока: бот читает один async for, как раньше. Подробности: Подключить бота.
  • Нет client.limiter. Счетчик один на гейтвей, он общий для всех ботов и не в вашем процессе.

Что не меняется

  • Номер заявки бот придумывает сам и записывает до отправки.
  • Ошибки те же: Rejected, RateLimited, Unsupported, NotReconciled, Degraded, Unknown. Гейтвей добавляет две причины отказа, при которых команда точно не выполнялась: GATEWAY_STARTING и BAD_REQUEST. Все: Ошибки и что с ними делать и таблица в «Подключить бота».
  • Деньги и цены - десятичные числа, на проводе строками.
  • Любой метод брокера доступен через Raw: имя метода и аргументы в JSON.

Чего гейтвей пока не делает

  • Очередь между ботами по кругу. Лимитер отказывает сразу, очереди ожидания в нем нет: гейтвей не держит чужую команду и не меняет поведение «команда не ждет». Один бот может занять квоту целиком, остальные получат RateLimited.
  • Доступ с других машин и шифрование. Только этот компьютер.

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

brokapi by RunInfra