Бывают случаи, когда стандартные средства прослушивания статусов ордеров перестают работать… Случается это очень редко, но при этом последствия таких проблем значимы.
На данный случай в OsEngine существует отдельный механизм запроса ордеров. Запрашиваются они либо после переподключения коннектора, либо если API просто не присылает никакого ответа на выставленный ордер.
Называется этот механизм AServerOrderHub, ну или по-русски — хранилище ордеров под коннектором.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/169fa4.webp)
1. Нужные нам классы в проекте.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/531a58.webp)
2. AServerOrdersHub. Регионы.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/a7723a.webp)
- Constructor, Settings – настройки и конструктор.
- Set orders – регион для приёма ордеров извне внутрь класса.
- Main Thread – регион, в котором работает поток, обслуживающий класс.
- Query orders after reconnect – регион для логики вызова события запроса ордера после переподключения коннектора.
- Orders Hub – менеджмент ордеров. Сохранение и загрузка из файловой системы.
- Query order status – регион для логики вызова событий запросов статусов ордеров.
- Log – логирование.
3. AServerOrdersHub. Поток, обслуживающий класс.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/ace013.webp)
0. В бесконечном цикле, раз в секунду бежим в три основных метода. Все они ниже будут описаны.
1. Если у коннектора есть разрешение на запрос статусов после реконнекта, идём проверять, нужно ли.
2. Если у коннектора есть разрешение на проверку потерянных статусов ордеров, идём сохранять активные ордера и разбирать очереди.
3. Если у коннектора есть разрешение на проверку потерянных статусов ордеров, идём проверять статусы активных ордеров.
4. AServerOrdersHub. Запрос ордеров после переподключения коннектора.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/e15ad7.webp)
Через 15 секунд после включения коннектора вызывается событие GetAllActivOrdersOnReconnectEvent. Один раз после переподключения.
5. AServerOrdersHub. Хранение ордеров.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/eb17bc.webp)
- Массив с активными ордерами, за которыми мы следим.
- Менеджмент ордеров. Их приём и распределение по массивам. Проверка статусов.
- Сохранение и Загрузка массива ордеров в файловую систему.
6. AServerOrdersHub. Запрос статусов потерянных ордеров.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/9a3855.webp)
- Метод, вызываемый из основного потока класса.
- Методы разные для Market и Limit ордеров. Т.к. по ним надо запрашивать статусы в разных ситуациях.
- События для запроса статуса ордера и отправки на верх события о том, что ордер потерялся окончательно.
При каких случаях вызывается статус Limit ордера:
- Если в течении 5ти секунд не пришло никакого оповещения о статусе ордера, который отправил в API Os Engine.
- Если никакого оповещения не приходит, вызываем: через 5ть сек. Через 5ть сек. Через 10 сек. Через 15 сек. Через 20 сек. После этого высылаем ERROR в экстренный лог. О том, что ордер полностью потерян.
- Раз в пять минут запрашиваем статус лимитки. Просто по времени.
При каких случаях вызывается статус Market ордера:
- Если в течении 5ти секунд не пришло никакого оповещения о статусе ордера.
- Если никакого оповещения не приходит. Вызываем: через 5ть сек. Через 5ть сек. Через 10 сек. Через 15 сек. Через 20 сек. После этого высылаем ERROR в экстренный лог. О том, что ордер полностью потерян.
7. AServerOrdersHub. Активация в разрешениях коннектора.
На примере класса разрешения для ALOR:
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/f5ec18.webp)
- CanQueryOrdersAfterReconnect – если True, хранилище ордеров будет запрашивать у реализации сервера через 15 секунд активные ордера.
- CanQueryOrderStatus – если True, хранилище ордеров будет запрашивать статусы потерянных ордеров.
8. Создание хранилища в AServer.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/29ed69.webp)
- Создание объекта AServerOrdersHub происходит в seter свойства ServerRealization.
- Собственно, создание объекта хранилища ордеров и подписка на событие этого объекта.
9. Отдельный регион хранилища в AServer.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/c426ab.webp)
- Обработка события: запрос всех активных ордеров после переподключения.
- Обработка события: ордер потерялся окончательно. Произошло пять попыток запросить ордер. По нему нет ответа. Пора идти в журнал и править позиции руками.
- Обработка события: по ордеру нет ответа. Нужно запросить статус у ордера.
10. IServerRealization. Конечный метод запроса активных ордеров после реконнекта.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/1c0e83.webp)
- Обязательный к перегрузке метод, в котором нужно делать запрос всех активных ордеров с биржи.
- Обязательный к перегрузке метод, в котором нужно узнать статус ордера.
11. ALOR. Пример. Конечный метод запроса активных ордеров после реконнекта.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/11d824.webp)
- Если ордер не активный – не пропускаем. Надо высылать наверх только ордера со статусами Active / Patrial / Pending.
- Высылаем наверх. Стандартно.
12. ALOR. Пример. Конечный метод запроса статуса потерянного ордера.
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/6deba9.webp)
- Сначала мы находим ордер, который у нас запрашивало хранилище.
- Если вдруг ордер со статусом Done или Patrial, то нужно загрузить ещё по этому ордеру MyTrades. Обязательно! Иначе автотест Order_10 не пройдёт!
Удачных алгоритмов
Пост из серии «Коннекторы к OsEngine».
Серия о том, как стать настоящим программистом и изменить свою профессию.
Оглавление и смыслы здесь: https://smart-lab.ru/company/os_engine/blog/959953.php
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/21/16/44/2024/08/22/50c5ba.webp)
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
![AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83 AServer #10. Механизм запроса ордеров при перезагрузке и при частичной потере связи с биржей. Коннекторы к OsEngine #83](/uploads/2024/images/00/78/53/2024/04/12/cd9e57.webp)