rss

Профиль компании

Финансовые компании

Блог компании OsEngine | ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95

Пост о том, как включить асинхронную отправку заявок на биржу. Это возможно далеко не во всех коннекторах, поэтому по умолчанию данная функция у коннекторов отключена.

*серия постов «Коннекторы к OsEngine» — для программистов. Если Вы пользуетесь OsEngine как пользователь, можете дальше не читать.

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

1. Очереди заявок в коннекторе.

Проблема выставления ордеров большими (по 20, 50 или 200 штук внутри секунды) пачками довольно новая в OsEngine. Появилась в момент создания роботов с режимом маркет-мейкинга. Стандартный алгоритм предполагает, что в какие-то моменты робот будет выбрасывать довольно большое кол-во заявок на выставление ордеров, а также их снятия. В этот момент, если высылать ордера синхронно, возникает довольно большая очередь на отправку этих заявок.

Для того, чтобы просматривать величину очереди, можно открыть окно «показателей нагрузки на систему»: https://smart-lab.ru/company/os_engine/blog/1176696.php

Нам нужен график MOQ (Max Orders in Queue):

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

В данном случае, мы видим, как кол-во ордеров в очереди уменьшается постепенно. Т.е. можно наблюдать, как она разгружается, секунда за секундой. Это – синхронная отправка ордеров.

Если робот захочет одномоментно выставить или снять 30 заявок через такой коннектор, могут возникать ошибки:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

В данном случае:

  1. Включена маркет-мейкерская сетка с очень коротким шагом. При этом в настройках указано, что надо держать в рынке 25 ордеров.
  2. Робот честно пытается выставлять ордера на биржу.
  3. Очередь копится. В данном случае идёт попытка делать HFT в Японии из Краснодара. Средняя скорость отклика на одну заявку — около 1 секунды. В очереди при этом около 30 заявок. Заявки в очереди как на открытие ордеров, так и на отзыв.
  4. OsEngine видит, что происходит беда, начинает запись в лог о том, что начались задержки в коннекторе и проблемы с отзывом ордеров.

При этом, когда коннектор со скрина был модернизирован до многопоточного режима, очередь стала разгружаться сильно быстрее, и ошибки ушли:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

Что мы видим на графике MOQ? 25 ордеров ушли на биржу за одну секунду. Всё в порядке.

Например, коннектор к Т-Инвест способен за 1 – 2 секунды выставлять несколько сотен заявок:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95

Однако, по умолчанию не все коннекторы в OsEngine поддерживают асинхронную отправку заявок на биржу, и надо их дорабатывать.

 

2. Как включить асинхронную отправку заявок.

В разрешениях каждого коннектора есть соответствующие настройки:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

  1. Если True, то отсылка ордеров в коннектор будет осуществляться асинхронно. По умолчанию False.
  2. Задержка между ордерами. На случай, если АПИ регулирует максимальное кол-во запросов, нужно устанавливать расстояние между ордерами в миллисекундах. Чтобы биржа не забанила нас по ip адресу из-за спама.

 

3. Где рождается многопоточность в AServer?

Во время создания коннектора в памяти, в случае, если мы включили эту функцию для коннектора, создаётся класс AServerAsyncOrderSender:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

Далее, в потоке, отправляющем заявки на исполнение, происходит передача ордера этому классу:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

Реализация класса:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

  1. Проверяем задержку, если она есть.
  2. Вызываем исполнение заявки в новом потоке.

 

4. Какие методы ServerRealization должны иметь возможность работать в многопоточном режиме?

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95

  1. Отправка ордера.
  2. Смена цены ордера.
  3. Отзыв ордера.

 

5. Блокировка спама через RateGate и LOCK.

В большинстве коннекторов есть ограничения на кол-во запросов за определённое время.

Например, для T-Invest API их можно посмотреть здесь: https://developer.tbank.ru/invest/intro/intro/limits

Выглядит это так:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95

Создаём соответствующие классы блокировки спама. В том числе, для каждого RateGate делаем по строке-блокировщику многопоточного доступа.

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95

Далее ставим на входе в соответствующие методы:

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95 

Оператор LOCK гарантирует, что внутрь кавычек будет заходить по одному потоку за раз. Даже, когда в этот метод их одновременно зайдёт 100. Эта конструкция гарантирует, что будут соблюдены ограничения на запросы внутри минуты.

Удачных алгоритмов!

Комментарии открыты для друзей!

ServerRealization #8. Как включить и реализовать многопоточную отправку заявок на биржу. Коннекторы к OsEngine #95
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


теги блога OS_Engine_team

....все тэги



UPDONW
Новый дизайн