Tinkoff / invest-openapi

Документация для Тинькофф Инвестиции OpenApi
https://tinkoff.github.io/invest-openapi/
456 stars 52 forks source link

Ошибка отмены ордера #530

Closed sergeymavrin closed 3 years ago

sergeymavrin commented 3 years ago

Логика работы робота:

Теперь смотрим логи:

[ 2021-06-14 16:47:00 +0300 ] Try to buy CCXI - 12.63
[ 2021-06-14 16:47:01 +0300 ] Order placed CCXI - 12.63
[ 2021-06-14 16:47:07 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:08 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:08 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:08 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:09 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:09 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:10 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:11 +0300 ] Error cancel order - code: OrderNotAvailable, message: Поручение уже было снято или исполнено
[ 2021-06-14 16:47:11 +0300 ] Error cancel order - code: ORDER_ERROR, message: Cannot find order by id 260194745110
[ 2021-06-14 16:47:12 +0300 ] Bought CCXI - 12.63 * 47

Можно пояснить что здесь произошло?

Как я понял - openapi имеет какое-то кэширование. Т.е. что я вижу - при запросе ордеров - ордер в статусе new, но по факту он уже исполнился. 10 секунд была неактуальная информация по ордерам.

AlexanderVolkovTCS commented 3 years ago

Добрый день. В openapi кэша статусов заявок нет, но так как система не строго-консистентна в любой момент времени, то иногда на стороне брокера могут быть задержки в изменении статусов поручений. Аналогичные задержки могут быть касаться и списка операций / портфолио. Рекомендуем проверять на результат отмены на OrderNotAvailable.

sergeymavrin commented 3 years ago

@AlexanderVolkovTCS, я правильно Вас понял, что если в списке ордеров ордер в статусе New, а при попытке отменить ордер получаю code: OrderNotAvailable - считаю, что ордер исполнился успешно?

AlexanderVolkovTCS commented 3 years ago

Либо исполнился успешно, либо уже был отменен ранее либо был снят (например, из-за завершения торговой сессии). В любом случае это уже не NEW.

sergeymavrin commented 3 years ago

Как-то непонятно как определить - ордер исполнился или отменился из-за завершения торговой сессии(т.к. в instrument_info данные по началу и завершению торгов не работает правильно #498 ). Т.е. единственный вариант перезапрашивать портфель, что добавляет количество запросов, а там можно налететь на лимиты. Было бы неплохо иметь endpoint, передав в который orderId получить по нему информацию (даже если он исполнился).

Я понимаю, что вы не хотите дорабатывать текущий OpenApi, но кажется количество проблем и требуемых улучшений уже достигает критического объёма.

AlexanderVolkovTCS commented 3 years ago

непонятно как определить

надежнее всего определять факт исполнения ордера по портфелю (уменьшение баланса и добавление позиции),

добавляет количество запросов

лимиты запросов на портфель не влияют на лимиты по остальным группам методов,

Было бы неплохо иметь endpoint

Эндпоинт со статусом заявок запланирован, но не в существующем openAPI.

кажется количество проблем и требуемых улучшений

Отмечу, что лаги с ордерами или операциями возникают не в опенапи, а в сервисах брокера

sergeymavrin commented 3 years ago

лимиты запросов на портфель не влияют на лимиты по остальным группам методов,

да, но у меня активно используется запрос валют из портфеля, если добавить ещё запросы самого портфеля на 24 инструментах (сейчас робот играется 24 инструментами, планируется расширение до 50), то 120 запросов/мин. явно будет нехватать.

Эндпоинт со статусом заявок запланирован, но не в существующем openAPI.

Может вам помощь нужна ) А то очень много тут в задачках вы ссылаетесь на следующую версию openAPI, но когда это произойдёт - секрет

Отмечу, что лаги с ордерами или операциями возникают не в опенапи, а в сервисах брокера

Я не про лаги, а про проблемы, которые описаны в этом трекере и они не от сервисов брокера. Например из проблем - неправильное время срабатывания открытия/закрытия торгов, остановки торгов, когда планки. И очень много улучшений, описанных в задачах уже хотелось бы:

В любом случае спасибо )

Dazlonar commented 3 years ago

@sergeymavrin Лично я для такой задачи сначала получаю список ордеров и смотрю какой статус у ордера по данному айди, если ордера нет, то получаю список операций (operations) и там поле id соответствует айди вашего ордера, так можно узнать есть ли уже выполненные операции по вашему оредеру. Но стоит понимать что операции обновляются не моментально, т.е. если нет нужного ордера и операции тоже, то нужно продолжать ждать, либо пытаться отменить ордер, если ваш алгоритм этого хочет. И да при выставлении лимитного ордера вам в ответ возвращается ордер, у которого есть orderId по нему и следует все проверять, а не по figi.

sergeymavrin commented 3 years ago

@Dazlonar Да, действительно, неправильно написал - проверяю по orderId, а не по figi. Если нужного orderId в списке нет, то я автоматически считаю, что ордер исполнился (у него там особо и вариантов нет - или New, или PartiallyFill. Другие статусы никогда не видел, а если придёт - логирование есть - буду смотреть ). Тут же немного другая ситуация - ордер в статусе New, а при попытке его отмены - его уже нет.