# Допущения по документации брокеров

Для ИИ-агентов, которые пишут код для боевого счета. БКС, Т-Банк, Финам и АЛОР на настоящих счетах не запускали, Bybit проверен вживую (последний раздел): ниже то, что взято из документации
брокера и может оказаться иначе. Сначала [before-live.md](../before-live.md). Допущение, на которое опирается ваш код, проверьте
на минимальной заявке и не выдавайте за подтвержденное.

## Все брокеры

| Допущение | Что делать |
|---|---|
| Что брокер сделает с повтором того же `cid`, неизвестно (`PlaceIdempotency::LabelOnly`) | `place` не повторять. `Unknown` выясняйте через `order_state`, новая попытка идет с новым `cid` |
| Области и значения лимитов взяты из документации | Один `BrokerLimiter` на область. Если `RateLimited` приходит раньше времени, уменьшите значения в `limits.toml` |
| Срок жизни токенов и потоков не назван | Обрыв виден событием `Reconnected` и закрытым шлюзом: после него `reconcile` |

## БКС

| Допущение | Что делать |
|---|---|
| `GET /orders` по неизвестному `cid` отвечает `NOT_FOUND` | Иначе сверка отнесет заявку к неопределенным: первую сверку сделайте на минимальной заявке |
| Количество в заявке в штуках, в уровнях стакана и ленты единица не названа | Не умножайте на лот, объем сверяйте с количеством своей заявки |
| Синхронные методы: сколько ждут, как выглядит отказ, повтор `clientOrderId` | `Unknown` не повторять |
| Какой из `clientOrderId` и `originalClientOrderId` несет `cid` в `orders/events/ws` | `cid` из событий сверяйте с журналом |
| Условные заявки: срок жизни, смысл `price`, потока статусов нет | Только срок «до отмены», стопы читайте через `active_stop_orders()` |
| Количество при `replace` частично исполненной заявки (весь объем или остаток) | Указывайте количество явно |
| Что приходит в `orders/events/ws` после переподключения | После `Reconnected` делайте `reconcile` |
| Как БКС считает секунду и сутки. Суточный лимит считает только ваш процесс | Один процесс на счет |

## Т-Банк

| Допущение | Что делать |
|---|---|
| Повтор `order_id`: прежний отчет, ошибка или вторая заявка | `PostOrder` не повторять, ждать `Unknown` и спрашивать `order_state` |
| Повтор `order_id` стоп-заявки: ключ идемпотентности или вторая заявка | `place_stop` не повторять |
| `create_date` стопа в `GetStopOrders` совпадает со временем отправки (допуск 10 секунд): по нему коннектор связывает стоп с потерянным ответом и `cid` | После `Unknown` стоп с `cid: None` на той же бумаге и в ту же сторону считайте возможно своим, второй не ставьте |
| Количество в потоке своих сделок в штуках (по `.proto`) | Объем сверяйте со своей заявкой |
| Цена в потоке чужих заявок: за бумагу или за лот | Не опирайтесь на цену чужих заявок |
| `ReplaceOrder`: цена при пустом поле, смена биржевого номера | Ориентируйтесь на `cid`, не на биржевой номер |
| Действительные лимиты (15 в секунду на `PostOrder`, 100 в минуту на сервис заявок) | Реальные значения читайте через `raw()`: `GetUserTariff`, `x-ratelimit-*` |

## Финам

| Допущение | Что делать |
|---|---|
| Комментарий заявки возвращается без изменений, от этого зависит `reconcile` | Первую сверку сделайте на минимальной заявке, `confirmed` не должен быть пустым |
| Повтор `client_order_id` | Не повторять |
| JWT в заголовке без `Bearer` | При отказе сервера включите `FinamApiConfig::bearer` |
| Стартовый срез в потоках, завершенные заявки в `GetOrders` | Состояние читайте запросом, срез не ждите |
| Область лимитов (секрет, пользователь или счет) | При раннем `RateLimited` уменьшите значения |

## АЛОР

| Допущение | Что делать |
|---|---|
| Единицы объема в стакане, ленте и свечах не названы (у котировок - лоты) | Берите количество как пришло |
| Повтор `X-REQID` возвращает копию ответа, срок памяти не назван | Коннектор команды не повторяет, и ваш код не должен |
| Регистр `condition`, `side`, `timeInForce`, срок стоп-заявки без времени окончания | Задавайте срок явно |
| Заявки в потоке после переподключения, заявки из приложения | После `Reconnected` делайте `reconcile` |
| История сделок свыше 1000 записей, реальные пределы (100 запросов в секунду, 5000 подписок) | Историю читайте окнами |

## Bybit

Bybit проверен вживую (подробности: [Bybit](../brokers/bybit.md#что-проверено-вживую)). Не проверено:

| Допущение | Что делать |
|---|---|
| Срабатывание стоп-заявки (стоп ставился и снимался, цена до него не доходила), поведение стопа на основном контуре | Первый настоящий стоп на минимальной позиции, дождитесь срабатывания |
| Переподключение приватного потока по истечении срока его жизни и потеря событий заявки за время обрыва | После `Reconnected` делайте `reconcile` |
| Лимиты: бан по адресу (HTTP 403), счет лимитов демо-счета и основного контура | Не превышайте 10 команд в секунду, при раннем `RateLimited` уменьшите значения в `limits.toml` |
| Режим позиции с хеджированием, смена плеча и режима маржи | Односторонний режим, плечо ставьте до первой заявки через `raw()` |
| Формулы `available` и `blocked` для нескольких монет в залоге и портфельной маржи | Для сумм, от которых зависит бот, читайте кошелек через `raw()` |
| Курсор страниц при более чем 50 заявках, история исполнений длиннее одного окна в 7 дней | Читайте историю короткими периодами |
| Сколько времени биржа помнит закрытый `orderLinkId` (`PlaceIdempotency::LabelOnly`) | Никогда не повторяйте `cid` |
| Минимальная стоимость заявки и предельное количество не проверяются локально | Считайте самую малую заявку сами, отказ придет `Rejected { code: "bybit_<код>" }` |
