Бывают случаи, когда стандартные средства прослушивания статусов ордеров перестают работать… Случается это очень редко, но при этом последствия таких проблем значимы.
На данный случай в OsEngine существует отдельный механизм запроса ордеров. Запрашиваются они либо после переподключения коннектора, либо если API просто не присылает никакого ответа на выставленный ордер.
Называется этот механизм AServerOrderHub, ну или по-русски — хранилище ордеров под коннектором.
1. Нужные нам классы в проекте.
2. AServerOrdersHub. Регионы.
- Constructor, Settings – настройки и конструктор.
- Set orders – регион для приёма ордеров извне внутрь класса.
- Main Thread – регион, в котором работает поток, обслуживающий класс.
- Query orders after reconnect – регион для логики вызова события запроса ордера после переподключения коннектора.
- Orders Hub – менеджмент ордеров. Сохранение и загрузка из файловой системы.
- Query order status – регион для логики вызова событий запросов статусов ордеров.
- Log – логирование.
3. AServerOrdersHub. Поток, обслуживающий класс.
0. В бесконечном цикле, раз в секунду бежим в три основных метода. Все они ниже будут описаны.
1. Если у коннектора есть разрешение на запрос статусов после реконнекта, идём проверять, нужно ли.
2. Если у коннектора есть разрешение на проверку потерянных статусов ордеров, идём сохранять активные ордера и разбирать очереди.
3. Если у коннектора есть разрешение на проверку потерянных статусов ордеров, идём проверять статусы активных ордеров.
4. AServerOrdersHub. Запрос ордеров после переподключения коннектора.
Через 15 секунд после включения коннектора вызывается событие GetAllActivOrdersOnReconnectEvent. Один раз после переподключения.
5. AServerOrdersHub. Хранение ордеров.
- Массив с активными ордерами, за которыми мы следим.
- Менеджмент ордеров. Их приём и распределение по массивам. Проверка статусов.
- Сохранение и Загрузка массива ордеров в файловую систему.
6. AServerOrdersHub. Запрос статусов потерянных ордеров.
- Метод, вызываемый из основного потока класса.
- Методы разные для Market и Limit ордеров. Т.к. по ним надо запрашивать статусы в разных ситуациях.
- События для запроса статуса ордера и отправки на верх события о том, что ордер потерялся окончательно.
При каких случаях вызывается статус Limit ордера:
- Если в течении 5ти секунд не пришло никакого оповещения о статусе ордера, который отправил в API Os Engine.
- Если никакого оповещения не приходит, вызываем: через 5ть сек. Через 5ть сек. Через 10 сек. Через 15 сек. Через 20 сек. После этого высылаем ERROR в экстренный лог. О том, что ордер полностью потерян.
- Раз в пять минут запрашиваем статус лимитки. Просто по времени.
При каких случаях вызывается статус Market ордера:
- Если в течении 5ти секунд не пришло никакого оповещения о статусе ордера.
- Если никакого оповещения не приходит. Вызываем: через 5ть сек. Через 5ть сек. Через 10 сек. Через 15 сек. Через 20 сек. После этого высылаем ERROR в экстренный лог. О том, что ордер полностью потерян.
7. AServerOrdersHub. Активация в разрешениях коннектора.
На примере класса разрешения для ALOR:
- CanQueryOrdersAfterReconnect – если True, хранилище ордеров будет запрашивать у реализации сервера через 15 секунд активные ордера.
- CanQueryOrderStatus – если True, хранилище ордеров будет запрашивать статусы потерянных ордеров.
8. Создание хранилища в AServer.
- Создание объекта AServerOrdersHub происходит в seter свойства ServerRealization.
- Собственно, создание объекта хранилища ордеров и подписка на событие этого объекта.
9. Отдельный регион хранилища в AServer.
- Обработка события: запрос всех активных ордеров после переподключения.
- Обработка события: ордер потерялся окончательно. Произошло пять попыток запросить ордер. По нему нет ответа. Пора идти в журнал и править позиции руками.
- Обработка события: по ордеру нет ответа. Нужно запросить статус у ордера.
10. IServerRealization. Конечный метод запроса активных ордеров после реконнекта.
- Обязательный к перегрузке метод, в котором нужно делать запрос всех активных ордеров с биржи.
- Обязательный к перегрузке метод, в котором нужно узнать статус ордера.
11. ALOR. Пример. Конечный метод запроса активных ордеров после реконнекта.
- Если ордер не активный – не пропускаем. Надо высылать наверх только ордера со статусами Active / Patrial / Pending.
- Высылаем наверх. Стандартно.
12. ALOR. Пример. Конечный метод запроса статуса потерянного ордера.
- Сначала мы находим ордер, который у нас запрашивало хранилище.
- Если вдруг ордер со статусом Done или Patrial, то нужно загрузить ещё по этому ордеру MyTrades. Обязательно! Иначе автотест Order_10 не пройдёт!
Удачных алгоритмов
Пост из серии «Коннекторы к OsEngine».
Серия о том, как стать настоящим программистом и изменить свою профессию.
Оглавление и смыслы здесь: https://smart-lab.ru/company/os_engine/blog/959953.php
OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support
Регистрируйся в АЛОР и получай бонусы:
https://www.alorbroker.ru/open
Сайт АЛОР БРОКЕР:
https://www.alorbroker.ru
Раздел «Для клиентов»:
https://www.alorbroker.ru/openinfo/for-clients
Программа лояльности от АЛОР БРОКЕР и OsEngine:
https://smart-lab.ru/company/os_engine/blog/972745.php