Tinkoff / invest-python

Tinkoff Invest Python gRPC client
https://tinkoff.github.io/invest-python/
Apache License 2.0
313 stars 90 forks source link

Отмена частично исполненной лимитной заявки #161

Closed artemtyupov closed 1 year ago

artemtyupov commented 1 year ago

Что случилось?

У меня вопрос, почему лимитная заявка, которая частично исполнена(например из 100 лотов взялось 50), не может быть закрыта?

Из API приходит такая ошибка: 639195280bb74a3a4faf12155315610b CancelOrder INVALID_ARGUMENT 30059 (<StatusCode.INVALID_ARGUMENT: (3, 'invalid argument')>, '30059', Metadata(tracking_id='639195280bb74a3a4faf12155315610b', ratelimit_limit='100, 100;w=60', ratelimit_remaining=99, ratelimit_reset=32, message='cancel order error: The order has been partially or fully executed.'))

Судя по описанию ошибки, сказано, что нельзя закрыть лимитную заявку, так как она частично или полностью исполнена. При этом в документации Tinkof API про это не сказано ни слова, да и в самом териминале можно отменять частично исполненные заявки. Просьба разъяснить этот момент, так как он является очень важным, для торговых роботов по лимитным заявкам.

Общая идея такая, что заявка должна сниматься по истечению таймера в 10 секунд, не важно частично она исполнена или нет. Если исполнена полностью, понятное дело, что она не будет сниматься.

Воспроизведение

1. Создание AsyncClient
2. Выставление лимитной заявки через await client.orders.post_order()
3. Запуск таймера на 10с
4. Получение состояния ордера каждые 0.5с с помощью await client.orders.get_order_state()
5. Если какая-то часть заявки исполнилась, то выставляется заявка в обратную сторону на то кол-во лотов, что исполнилось.
6. По прошедствию 10 секунд, если запрашиваемое количество лотов != исполненное количество лотов, то выполняется await client.orders.cancel_order()
7. В случае если заявка была частично исполнена, то приходит ошибка.

Tinkoff Invest Version

0.2.0-beta43

Python Version

3.10

OS

Windows

Логи

No response

AlexanderVolkovTCS commented 1 year ago

Добрый день, была такая проблема, уже решена.