Top.Mail.Ru

Бесплатный сыр в биржевой мышеловке

В сети немало бесплатных материалов с кодами советников для автоматизации биржевой торговли. К большинству из них следует относиться со спасительным недоверием. В качестве примера для анализа возьму случайно найденный код с адреса url=http://forum-archive.quik.ru/forum/lua/97085/.

Это скрипт buysell.lua - розничный спредер для терминала QUIK. Логика: вставать в очередь на лучшем биде при расширении спреда; при исполнении переворачивать позицию и вставать на лучший офер, постоянно "подтягивая" заявки за рынком.


🔍 1. Технический разбор кода: скрытые ловушки и ошибки

⚠️ 1.1. Критическая нагрузка на терминал (OnQuote + message)

OnQuote вызывается при каждом изменении стакана. На ликвидных фьючерсах это тысячи срабатываний в секунду. Внутри функции многократно вызывается message(), который блокирует поток Lua и выводит окно в QUIK. Результат: терминал начнёт "подвисать", очередь колбэков вырастет, исполнение ордеров будет происходить с задержкой в сотни миллисекунд, что для спредера смертельно.

⚠️ 1.2. Ошибка в форматировании цены (MakeStringPrice)

m = string.sub(tostring(m), 1, PRICE_SCALE)

tostring(0.5) возвращает "0.5". Если PRICE_SCALE=2, string.sub("0.5", 1, 2) вернёт "0." или "0" в зависимости от реализации, что приведёт к отправке цены 100. или 1000.. Также math.floor(m * 10^PRICE_SCALE + 0.01) даёт артефакты округления.

⚠️ 1.3. Гонка идентификаторов транзакций (OnTransReply)

if (uniq_trans_id ~= repl.R) then return end

Если за цикл работы скрипта отправлено несколько транзакций (например, KillOrder + SendOrder), uniq_trans_id уже увеличен. Ответ от брокера придёт позже и будет проигнорирован, так как repl.R не совпадёт с текущим uniq_trans_id. Состояние CURRENT_STATE зависнет.

⚠️ 1.4. OnTrade реагирует на ВСЕ сделки счёта

QUIK вызывает OnTrade для любой сделки по указанному счёту и инструменту. Если вы торгуете другими роботами или вручную, либо придёт чужая сделка (при совместном счёте), состояние CURRENT_STATE сбросится некорректно.

⚠️ 1.5. Отсутствие проверки статусов транзакций

OnTransReply проверяет только status == 3 (снята/исполнена). Но если заявка отклонена брокером (status == 0), скрипт этого не обрабатывает и остаётся в состоянии OB/OS, ожидая исполнения, которого не будет.

⚠️ 1.6. Жёсткая привязка к инструменту и отсутствие проверки сессии

В комментариях указано "время сессии торговое", но код этого не проверяет. QUIK вернёт ошибку при отправке вне сессии, но скрипт не отреагирует. Также PRICE_STEP = 1 и MIN_P_SPREAD = 0.1 захардкожены. Для фьючерса Si шаг цены действительно 1, но 0.1% спреда при цене ~90 000 руб. = 90 пунктов. Такой спред бывает крайне редко. Скорее всего, автор имел в виду 0.1 пункта, но формула считает в процентах.


📌 Итог

1. Код: Рабочий каркас, но содержит классические ошибки QUIK-Lua (гонка состояний, блокирующие message, небезопасное форматирование, отсутствие проверок принадлежности сделок).

2. Стратегия: Теоретически верна, но практически нежизнеспособна для розничного трейдера через QUIK из-за латентности, позиции в очереди и комиссий. Без колокатора, прямого API и алгоритмов управления очередью такие спредеры уступают HFT-алгоритмам.

3. В текущем виде на live-рынках РФ (MOEX) стратегия малоперспективна. Она может показывать прибыль на демо-счёте с нулевой задержкой и без комиссий, но в реальности будет систематически терять деньги на проскальзывании, очередях и комиссиях.

0 / 2000
Ваш комментарий
Тебя ждёт миллион инвесторов
Регистрируйся бесплатно, чтобы учиться у лучших, следить за инсайтами и повторять успешные стратегии
Мы используем файлы cookie, чтобы улучшить ваш опыт на нашем сайте
Нажимая «Принять», вы соглашаетесь на использование файлов cookie в соответствии с Политикой конфиденциальности. Можно самостоятельно управлять cookie через настройки браузера: их можно удалить или настроить их использование в будущем.
Бесплатный сыр в биржевой мышеловке | Базар