Блог им. coredumped

Проблемы алготорговли облигациями в Quik

В этой статье расскажу о некоторых интересных проблемах, с которыми встретился в процессе написания торгового робота облигациями.
Для контекста — схема робота была приведена в этой статье.

Отправка тысяч заявок — это долго

В виду того, что на Мосбирже на рынке облигаций (и не только) заявки не переносятся через ночь, каждое утро надо выставлять в стакан на продажу то, что напокупал ранее.
Когда речь идёт о выставлении тысяч заявок через Quik, невольно сталкиваешься с тем, что это:
— долго;
— возможно дорого (чревато платежами за большой напор заявок).

В самом начале я отправлял заявки синхронной функцией TRANS2QUIK_SEND_SYNC_TRANSACTION. Этого было вполне достаточно на малых объёмах. Но на большем объёме стало туговато.

Синхронная отправка:
Проблемы алготорговли облигациями в Quik
Все заявки выставляются за 6.5 минут, более половины времени аукциона открытия. А можно быстрее?

Решение простое — переключаемся на асинхронную отправку функцией TRANS2QUIK_SEND_ASYNC_TRANSACTION. Но тут есть другие проблемы:
  — коллбэк асинхронной отправки не содержит пользовательский transaction_id;
  — следовательно, коллбэк я не жду, и между асинхронной отправкой заявки и появлением её в таблице заявок (в любом статусе) может пройти много времени, и тогда робот может отправить эту заявку более одного раза.
 Хорошо, в таком случае будем кешировать отправленные transaction_id в память на какое-то короткое время, чтобы не отправлять лишний раз.

Асинхронная отправка:
Проблемы алготорговли облигациями в Quik

45 секунд. Всё круто, да? Нет, т.к. в логах Quik видно: «Превышено максимальное количество транзакций 50 в интервале 1 сек».
Пу-пу-пуууу, а на некоторых тарифах такое превышение конвертируется в заработок брокера.
Ясно. Введём рейтлимит отправки.

Асинхронная отправка с рейтлимитом:
Проблемы алготорговли облигациями в Quik
2 минуты. Есть пространство для роста.

Наверное, можно предположить, что, имея прямое подключение до серверов биржи, можно было бы не выполнять все эти приседания. Но, учитывая свои объёмы и доходность, платить за такой доступ смысла не вижу.

ask, который я покупаю — мой же ордер на продажу

Допустим, алгоритм настроен так, что свободные средства тратятся на покупку инструмента с наибольшим потенциалом доходности на данный момент.
Для этого сканируются все стаканы и выбирается самый доходный ask. И бывает так, что самый доходный ask — это моя жа заявка:
Проблемы алготорговли облигациями в Quik

Помимо тщетных попыток купить самого себя, навскидку есть следующие варианты:
— Ждать. Т.е., беря приведённый выше пример, ждать удовлетворения всех моих завок до 98.38 (если эта цена к тому моменту тоже будет лучшей среди всех стаканов) либо ждать чей-то более доходный ask (в этом или другом стакане). Для простоты опустим случай, когда на лучшей цене находится моя заявка вместе с чьей-то ещё, и я не знаю, кто в голове очереди (на одной цене заявки выстроены в очередь, в хронологическом порядке их поступления на биржу).
— Пропускать этот инструмент и переходить к другому стакану в соответствии с доходностью ask-ов. Но тут есть другая проблема — тогда я упускаю лучшую в моменте доходность.
— Перемещать выше в стакане этот свой лучший ask. Но тут есть другая проблема — перемещение в стакане не является атомарным с т.з. всей моей системы (либо я ещё не придумал, как сделать это атомарным), т.е. в процессе может, например, оборваться связь и, как следствие, в БД и в стакане будут разные состояния (и синхронизировать их — значит сильно усложнять вещи, а где тонко, там и рвётся).

Есть ещё варианты, но для простоты опущу их. Пока я выбрал первый вариант — ждать.

Робот иногда начинает сливать

Эта проблема относится не к Quik, а сугубо к кривизне рук, но всё равно поведаю о ней, т.к. забавно.
Покупай дешевле, продавай дороже — что может пойти не так?
Проблемы алготорговли облигациями в Quik

На скриншоте видно, как робот покупает выше, продаёт ниже — это гайзенбаг, возникает раз в несколько месяцев, и его я пока ещё не исправил (а может и исправил, но не подозреваю об этом). Кстати, в поисках проблемного места мне не помогли даже железные друзья.

Уход в минус по деньгам

Источником истины по деньгам является Quik (его таблица depo_limits), и обновления по ней могут доезжать не сразу, что иногда приводит к перерасходу свободных средств и уходу в небольшой минус.
Наивное решение — получать состояние счёта в самом начале торгового дня, увеличивать/уменьшать при торговле на своей стороне и опираться на то, что получается в итоге. Но это решение не подходит, т.к. тут надо как-то учитывать поступления купонов, амортизаций, пополнения счёта и т.п., а это большая сложнота. Надо как можно проще.
На данный момент эта проблема пока не решена, а точнее — когда ушёл в минус (а это бывает редко и на чуть-чуть), подкидываю денег или продаю парочку лотов руками.

Медленная работа робота в целом

Это стало ощущаться ещё до проблем с долгой отправкой заявок на премаркете (описал выше).
Если в одном инстансе Quik открыть кучу инструментов (стаканы, таблицы), то всё в нём работает ооочень меееедленно, в т.ч. медленно работают потоки робота.
Решение простое — вынести робота на отдельный инстанс Quik, где открыть максимум окошко с запущенными скриптами.
Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
  • обсудить на форуме:
  • QUIK
409 | ★1
15 комментариев
Робот обод и болты получилось
avatar
Странный робот как по мне. Несколько тысяч заявок (зачем?) и ситуации когда робот хочет купить у самого себя. Понятно, что хозяин — барин, но я бы с логикой разбирался. И в комментах к предыдущей статье не понятно как поможет умная розетка перезагрузить ноутбук. У него ж батарейка есть, а это по сути встроенный бесперебойник.
avatar
Vkt, 
Несколько тысяч заявок (зачем?)
Несколько инструментов, по несколько сотен лотов в каждом (набраны по разным ценам). Специально до погашения не держу, продаю раньше по нужной мне цене. Если, допустим, взять среднюю цену выхода по инструменту и выставляться всеми лотами на этой одной цене одной лимиткой (чтоб не тысяча), то:
— Есть фронтраннеры, как бы смешно это не звучало для рынка облигаций.
— Это усложнение алгоритма и ведения позиции (в контексте моей системы).
Но опять же, любое решение — это компромисс. И я даже соглашусь с Вами, что робот странный в контексте и понимании другого человека.
робот хочет купить у самого себя
Один из вариантов набора позиции (его и описал в данной статье) — робот всегда старается купить самый доходный на данный момент инструмент. И может такое произойти, что в стакане этого инструмента самая доходная лимитка на продажу — моя же. Хоть это и не одно и то же, но другие трейдеры писали о кросс-сделках в своих алгоритмах на срочном рынке.
как поможет умная розетка перезагрузить ноутбук. У него ж батарейка есть, а это по сути встроенный бесперебойник.
Есть розетки с таймером. Выключаем розетку, заведя таймер на достаточное кол-во времени для выключения ноутбука.
Да, это крайнее решение.
avatar

Понятнее не стало, но опять же — дело хозяйское.

А для ноутбука лучше купить умный нажиматель кнопок, чем умную розетку. Ну если кнопка у ноута достаточно удобно для нажимателя расположена.

avatar
Vkt, 
Понятнее не стало
Как бы Вы вели позицию при условии обязательной продажи всех лотов до даты погашения/оферты? Не воспримите как пассивную агрессию. Мне действительно интересно.
А для ноутбука лучше купить умный нажиматель кнопо
Вы не поверите! О нажимателе кнопок хотел написать где-то в следующих статьях.
Между делом — нынешний нажиматель не захотел управляться через хаб удалённо. Но да, замечание ценное, спасибо!
avatar
coredumped, я бы возможно ответил на этот вопрос, но для этого нужно дать четкое и понятно определение термину «вести позицию» — у каждого могут быть свои представления об этом тремине
avatar
quik крайне сомнительное решение для алготрейда. Насколько знаю, до сих пор нет штатной функции переподключения при разрыве связи, это приходится делать сторонними костылями, имитирующими клик по кнопкам и ввод пароля. И не всегда при перебоях получится переподключиться, т.к. сессия на стороне quik может подвиснуть.

Если не секрет, почему не смотрели в сторону openapi/gRPC от брокеров?
avatar
john_doe, 
quik крайне сомнительное решение для алготрейда
Смотря про какой алготрейдинг мы говорим. Для HFT — на 100% согласен с Вами. Для моего «автоматизированного инвестирования» с горем пополам сгодится. Но да, в целом Quik сомнителен как для алготрейдинга, так и для всего остального.
Насколько знаю, до сих пор нет штатной функции переподключения при разрыве связи, это приходится делать сторонними костылями, имитирующими клик по кнопкам и ввод пароля. И не всегда при перебоях получится переподключиться, т.к. сессия на стороне quik может подвиснуть.
Переподключение есть, и оно работает. Но да, чтобы сделать автологин (после загрузки ОС, например), надо подставить костылик (простой, работает).
Если не секрет, почему не смотрели в сторону openapi/gRPC от брокеров?
У моего брокера нет API. Уходить от этого пока не хочу, но новые идеи, скорее всего, буду реализовывать у других брокеров (если подойдут по условиям).
avatar
coredumped, я имел ввиду ошибку «вы уже работаете в системе» которая бывает даже при ручном переподключении при обрыве по таймауту, из-за того, что quik-сервер брокера думает что клиент еще подключен. Этот таймаут может десятки минут длиться.

Несколько раз сталкивался с таким на сильных движениях рынка, такое ощущение, что специально так читерили. Брокер ВТБ, если что.

Еще как-то был глюк, когда quik врал со свечами, показывал заниженные значения для индексов. В идеале маркет дату надо брать с разных брокеров и сверять на отклонения.
avatar
john_doe, 
ошибку «вы уже работаете в системе»
Да, бывает такая ошибка. Но всегда после неё переподключается, пусть и по прошествии нескольких минут.
Несколько раз сталкивался с таким на сильных движениях рынка
Да, на сильных движениях проявляются разные проблемы, одна из которых у меня — задержка в поступлении данных (состояния счёта, сделок). Приходится сооружать костыли.
Еще как-то был глюк, когда quik врал со свечами
Да, тоже такое наблюдал. Тут помогает удаление директории archive. Вероятно, такое происходит из-за внутренних гонок или из-за кривоватого I/O в терминале.
avatar

Но если робот хочет купить у вас же, не будет ли лучшим (в плане торговли) решением тогда отменить заявку? И как я понимаю продать условно потом, или согласно вашей стратегии

А если цена «слишком высокая» в моменте, для того, чтобы вы покупали ещё, то тогда критерии «высокая доходность (за хорошую цену я так понимаю?)» неточны

avatar
Jeanor,
не будет ли лучшим (в плане торговли) решением тогда отменить заявку?
Отменить заявку — одно из решений, но не лучшее (на мой вкус). Наиболее подходящим вариантом я вижу перемещение заявки выше в стакане, но это надо научиться делать атомарно. Возможно, перемещение я и сделаю в будущем.

А если цена «слишком высокая» в моменте, для того, чтобы вы покупали ещё, то тогда критерии «высокая доходность (за хорошую цену я так понимаю?)» неточны
Условно, покупки инструмента будут не выше 98.5, а продажи — не выше 99.5 (цифры для понимания). Если я правильно понял комментарий.
Для разных инструментов доходность на этих ценах будет разная, но, если кратко, она всегда сравнивается с некоторым опорным значением — иногда целесообразно либо вообще не торговать (отнести деньги на вклад), либо влезть в фонды ликвидности.
avatar
coredumped, вам, возможно, подойдет оракл, который бы следил за заявками в стакане в моменте, (но это очень много запросов к API?.. если инструментов много, хотя не знаю), и он бы уже перемещал заявки (например, если кол-во заявок увеличивается относительно числа секунду(?) назад)
avatar
Jeanor, Да, примерно так это сейчас и работает (сканирование стаканов), и в перспективе будет перемещение.
avatar

Читайте на SMART-LAB:
Фото
Кто закрыл дивидендный гэп в 2026 году
Дивидендный сезон 2026 года проходил на фоне глубокого пессимизма, который начал рассеиваться лишь в последнюю неделю. Мы нашли акции, которые...
🖥 Позитив на пути к прибыли
Разработчик ПО представил отчет за полугодие   Позитив (POSI) ➡️ Инфо и показатели   Результаты • выручка: ₽9,5 млрд (+41%); •...
Рубль снижается на фоне смягчения ДКП
С начала торгов 27 июля юань на Мосбирже колеблется в районе 11,5 рубля. Доллар США укрепляется до 78 рублей, а евро торгуется выше 88,7...
Фото
Модельный портфель рублевых облигаций: итоги, состав, планы
В условиях повышенной волатильности долгового публичного российского рынка в этом году, модельный портфель рублевых облигаций в целом показывает...

теги блога coredumped

....все тэги



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