Пост о том, как включить асинхронную отправку заявок на биржу. Это возможно далеко не во всех коннекторах, поэтому по умолчанию данная функция у коннекторов отключена.
*серия постов «Коннекторы к OsEngine» — для программистов. Если Вы пользуетесь OsEngine как пользователь, можете дальше не читать.
Проблема выставления ордеров большими (по 20, 50 или 200 штук внутри секунды) пачками довольно новая в OsEngine. Появилась в момент создания роботов с режимом маркет-мейкинга. Стандартный алгоритм предполагает, что в какие-то моменты робот будет выбрасывать довольно большое кол-во заявок на выставление ордеров, а также их снятия. В этот момент, если высылать ордера синхронно, возникает довольно большая очередь на отправку этих заявок.
Для того, чтобы просматривать величину очереди, можно открыть окно «показателей нагрузки на систему»: https://smart-lab.ru/company/os_engine/blog/1176696.php
Нам нужен график MOQ (Max Orders in Queue):
В данном случае, мы видим, как кол-во ордеров в очереди уменьшается постепенно. Т.е. можно наблюдать, как она разгружается, секунда за секундой. Это – синхронная отправка ордеров.
Если робот захочет одномоментно выставить или снять 30 заявок через такой коннектор, могут возникать ошибки:
В данном случае:
При этом, когда коннектор со скрина был модернизирован до многопоточного режима, очередь стала разгружаться сильно быстрее, и ошибки ушли:
Что мы видим на графике MOQ? 25 ордеров ушли на биржу за одну секунду. Всё в порядке.
Например, коннектор к Т-Инвест способен за 1 – 2 секунды выставлять несколько сотен заявок:
Однако, по умолчанию не все коннекторы в OsEngine поддерживают асинхронную отправку заявок на биржу, и надо их дорабатывать.
В разрешениях каждого коннектора есть соответствующие настройки:
Во время создания коннектора в памяти, в случае, если мы включили эту функцию для коннектора, создаётся класс AServerAsyncOrderSender:
Далее, в потоке, отправляющем заявки на исполнение, происходит передача ордера этому классу:
Реализация класса:
В большинстве коннекторов есть ограничения на кол-во запросов за определённое время.
Например, для T-Invest API их можно посмотреть здесь: https://developer.tbank.ru/invest/intro/intro/limits
Выглядит это так:
Создаём соответствующие классы блокировки спама. В том числе, для каждого RateGate делаем по строке-блокировщику многопоточного доступа.
Далее ставим на входе в соответствующие методы:
Оператор LOCK гарантирует, что внутрь кавычек будет заходить по одному потоку за раз. Даже, когда в этот метод их одновременно зайдёт 100. Эта конструкция гарантирует, что будут соблюдены ограничения на запросы внутри минуты.
Удачных алгоритмов!
Комментарии открыты для друзей!

smart-lab.ru/company/os_engine/blog/1024149.php
OsEngine: https://github.com/AlexWan/OsEngine
Поддержка OsEngine: https://t.me/osengine_official_support
Канал Научный трейдинг: https://t.me/bad_quant