Блог им. Sundancer0369
Робот на домашнем компьютере — это когда ты в отпуске думаешь не о море, а о том, не прилетело ли Windows обновление.
У меня так и было. Машина под столом, QUIK запущен, робот рядом. И всё отлично ровно до того дня, когда провайдер моргнул, пока я стоял в очереди в аэропорту.
Расскажу, как мы работаем сейчас: робот живёт на сервере, терминал остаётся у клиента, и один сервер тянет сразу много терминалов. А главное — скажу сразу, иначе дальше никто читать не будет: деньги и счёт остаются у клиента, и это не обещание, а свойство схемы.
Как это выглядитРобот делает две вещи: смотрит на рынок и ставит заявки. Обычно и то и другое идёт через терминал. Мы эти потоки развели.
Котировки берём мимо QUIK — прямо с ISS МосБиржи, это открытый интерфейс самой биржи. Терминал в этом не участвует вообще.
Заявки идут через терминал клиента. На сервере — служба-шлюз, в QUIK у клиента — скрипт на QLua, встроенном языке терминала. Служба говорит скрипту «поставь заявку», скрипт передаёт терминалу, терминал — брокеру. Назад тем же путём: принята, исполнена, снята.
Всё. Больше у клиента ничего не стоит. Ни программ, ни служб, ни «установите наш клиент» — только текстовый скрипт внутри QUIK, который он открывает блокнотом и читает.
Почему котировки мимо терминалаЛогичный вопрос: терминал же и так всё получает, зачем огород.
Затем, что на горячем рынке лента через терминал начинает запаздывать. Ровно тогда, когда она нужна. Биржа отдаёт то же самое без посредника.
Второе — арифметика. Десять клиентов, собираем данные через их терминалы: одни и те же котировки приедут десять раз, и каждый терминал будет этим занят. С биржи они приходят один раз на всех.
Третье, бытовое: данные одинаковы для всех. Не надо разбираться, почему у одного клиента стакан другой, а у второго таблица настроена не так.
«А вы мне счёт не почистите?»Это первый вопрос, который задают. Правильный вопрос, кстати.
Робот не подключается к брокеру. Вообще. Он разговаривает с терминалом, который клиент уже запустил и уже авторизовал под собой. Ни паролей, ни ключей API, ни доступа в личный кабинет у нас нет и быть не может.
И вторая половина ответа, важнее первой: по этому каналу ходят только торговые команды. Вывод денег — операция личного кабинета, а не терминала. Даже если отдать мне весь канал целиком с бантиком, снять с него нечего.
Выключается всё одной кнопкой в QUIK — клиент останавливает скрипт, и робот остаётся наедине со своими расчётами.
Один сервер, много терминаловВот ради чего всё затевалось.
Мозги в одном месте: стратегии, расчёт объёма, лимиты, журнал, мониторинг. Исполнение у каждого своё — его счёт, его брокер, его комиссия.
Что это меняет на практике:
— Поправил стратегию — поправил у всех. Не надо обзванивать десять человек с просьбой обновиться.
— Клиенту не надо ничего настраивать. Закинул скрипт в терминал — работает.
— Видно всё сразу: позиции и заявки по всем счетам в одной панели, логи в одном месте. Когда что-то идёт не так, не приходится собирать картину по телефону.
— Стратегии и объёмы у всех разные, но это просто разные настройки на сервере, а не десять разных программ.
Где эта схема трещитТеперь без рекламы.
Терминал всё равно должен быть включён. Это главный минус, и я говорю о нём до начала работы, а не после. QUIK стоит у клиента, выключили машину — робот бессилен. Лечится дешёвой виртуалкой, где терминал живёт круглосуточно, но это отдельные деньги каждый месяц.
Связь рвётся. Всегда. Поэтому шлюз должен понимать, что терминал молчит, и не делать вид, будто заявка ушла. Молчание — не успех. Это самая дорогая ошибка в таких системах, и стоит она ровно столько, сколько успеет пройти рынок.
Lua падает тихо. Одна ошибка в скрипте — и он мёртв, а терминал работает как ни в чём не бывало. Снаружи всё прекрасно: QUIK запущен, связь есть. Поэтому нужен отдельный признак «скрипт жив», а не «терминал запущен».
После обрыва нельзя верить себе. Сколько заявок стоит и какая позиция — знает терминал, а не сервер. Первое действие после восстановления связи: спросить терминал, что там на самом деле. Пренебрёг этим однажды — закрытие по устаревшей картине не закрыло позицию, а открыло обратную. Второй раз я такого не хочу.
Версии разъезжаются. Клиенты обновляют QUIK когда вздумается. Протокол должен работать и со свежим терминалом, и с полугодовалым.
КороткоКотировки — с биржи, команды — через терминал клиента, мозги — на сервере, деньги — на счёте клиента и больше нигде. Ставить клиенту нечего, кроме скрипта в QUIK.
Сложность не в идее. Сложность в том, чтобы система честно говорила «я не знаю», когда связь отвалилась, вместо того чтобы бодро рапортовать.
А у вас робот где живёт — под столом или на сервере? И если на сервере, то как решили вопрос с включённым терминалом: своя виртуалка, VPS у брокера, что-то ещё? Собрать бы в одном месте, кто как выкрутился.
Как эта система выглядит целиком — панель, стратегии, журналы:

