Торговый робот — «Модифицированный стакан»
Как говорится — возвращаясь к напечатанному. Мы уже рассматривали трепанацию стакана в одной из прошлых статей. Теперь заглянем еще глубже. поводом послужили два фактора: один из посетителей попросил поподробнее рассказать о структуре стакана, и я после семинаров о скальпинге начал пристально присматриваться к стакану, особенно к движениям которые в нем происходят. И мне его вид показался больно уж неинформативным, спред числом не видно, визуально определить пустоты внутри офферов или бидов вообще не реально. Поэтому я решил написать торговый робот, который получив данные из стакана преподнесет мне их в более удобном виде. Но вначале давайте все же вернемся к структуре стакана:
Это небольшая часть стакана фьючерса на индекс РТС. Цифры на красном поле это очередь заявок трейдеров желающих продать по указанной цене указанный справа объем. Также это называется ОФФЕРА. Лучшее предложение в данной слечае это один лот по цене 139725, оно показано синей стрелкой. Цифры на зеленом поле — очередь на покупку. Лучший спрос (красная стрелка) это два лота по цене 139715. Т.е. если мы хотим купить (как бы «по рынку» хотя на ФОРТС так нельзя, но допустим это возможно) то мы купим по цене 139725 один лот, и если в нашей «рыночной» заявке на покупку было больше чем один лот, мы будет дальше собирать ОФФЕРА пока не купим весь объем. То же самое для продажи.
Теперь посмотрим как выглядит стакан изнутри. А изнутри это по сути простая таблица, но с определенной нумерацией строк. Как мы получаем данные из стакана? А вот:
STAKAN = CREATE_MAP() ' СОЗДАЕМ КОЛЛЕКЦИЮ ТИПА "МАП"
TEMP_MAP = CREATE_MAP() ' СОЗДАЕМ КОЛЛЕКЦИЮ ТИПА "МАП"
TEMP_MAP1 = CREATE_MAP() ' СОЗДАЕМ КОЛЛЕКЦИЮ ТИПА "МАП"
STAKAN=GET_QUOTES_II_LEVEL_DATA("SPBFUT","RIZ9") ' ПРИСВАИВАЕМ КОЛЛЕКЦИИ STAKAN ВЕСЬ НАБОР ДАННЫХ СТАКАНА RIZ9
BIDCOUNT = GET_VALUE(STAKAN, "BID_COUNT")+0 ' ПОЛУЧАЕМ КОЛИЧЕСТВО СТРОК БИДОФ
OFFERCOUNT =GET_VALUE(STAKAN, "OFFER_COUNT")+0 ' ПОЛУЧАЕМ КОЛИЧЕСТВО СТРОК ОФФЕРОВ
' BID
TEMP_MAP = GET_VALUE(STAKAN, "BID") ' ,ЕРЕМ ОТДЕЛЬНО БИДЫ
TEMP_MAP1 = GET_COLLECTION_ITEM(TEMP_MAP, BIDCOUNT-1) ' БЕРЕМ СТРОКУ С НОМЕРОМ BIDCOUNT-1
BID=GET_VALUE(TEMP_MAP1, "PRICE")+0 ' ПОЛУЧАЕМ ИЗ НЕЕ ПОЛЕ "ЦЕНА"
QBID=GET_VALUE(TEMP_MAP1, "QUANTITY")+0 ' ПОЛУЧАЕМ ИЗ НЕЕ ПОЛЕ "КОЛИЧЕСТВО"
' OFFER
TEMP_MAP = GET_VALUE(STAKAN, "OFFER")
TEMP_MAP1 = GET_COLLECTION_ITEM(TEMP_MAP, 0) ' БЕРЕМ СТРОКУ С НОМЕРОМ НОЛЬ
OFFER=GET_VALUE(TEMP_MAP1, "PRICE")+0
QOFFER=GET_VALUE(TEMP_MAP1, "QUANTITY")+0
SPREAD=ABS(OFFER-BID)
А теперь смотрим нумерацию строк ОФФЕРОВ:
10 — номера строки
9
...
3
2
1
0 — в строке с номером «ноль» находится лучшее предложение
БИДОВ:
10
9 в строке с номером «количество строк минус один» находится лучший спрос
8
...
1
0
Вот такую структуру стакана в Квике видим мы с помощью QPILE.
А теперь перейдем к моему видению стакана:
Слева — родной стакан, справа мой. Что в нем мы видим:
- рассчитанный спред, в данном случае он равен десяти и эта строка подсвечивается синим, для лучшей визуализации;
- за основу карты цен взяты лучший спрос и предложение, и в разные стороны от них построен массив цен с учетом шага по данному инструменту, этим мы достигаем статичный вид цен
- мы видим биды и оффера со всеми пустотами. т.е. мгновенно мы можем определить насыщенность предложений и спроса, относительно неподвижной карты цен. Подсвеченные красным строки — это значит на этой цене в стакане есть котировка с определенным объемом, неподсвеченная строка — котировки по такой цене нет.
Вот пример как можно использовать спред (это реализовано в торговом роботе «Freedom») задается число — целевой спред, как только разница между лучшими оффером и бидом больше или равна этому числу — в систему выставляются две заявки: одна больше на шаг цены чем лучший бид, вторая меньше на шаг цены чем лучший оффер. Исполняются обе — мгновенная приыбыль, исполняется одна — вторая активна до тех пор, пока не появится более лучшая цена, тогда заявка снимается и перевыставляется опять на шаг лучше чем новая цена.
Минус у этого стакана только один — минимальный период расчета 1 секунда, но это не значит что он тормозит,например в 13:45:56 этот стакан отобразит полную картину стакана именно на эту секунду, а в 13:45:57 отобразит такую же картину уже на эту секунду, а то что бымо между не увидит. С другой стороны он несет большую информативность, и думаю будет полезен скальпинг-трейдерам. Код несколько сумбурный, но если кто в нем разберется — станет профи в препарировании стакана
. Автор модификации кода «Стакан» — Camill.
Код доступен только зарегистрированным пользователям:
Вот пример как можно


Здравствуйте Евгений! А можно ли настроить «Модифицированный стакан» на торговлю другим инструментом кроме индекса???
Евгений Reply:
октября 13, 2009 at 19:45
Можно. Для этого надо поменять код инструмента и везде «SPBFUT» поменять на код класса нужного инструмента, также в кавычках, это текстовые переменные.
Евгений добрый день! Подскажи пожайлуста, если я торгую несколькими инструментами например фьюч индекса и фьюч газпрома, что можно поменять в настройках чтобы загрузить 2 стакана?
Евгений Reply:
октября 16, 2009 at 20:35
Для этого нужно переписать всего робота... Займусь жтим в ближайшее время. Следите за обновлениями!
Евгений Reply:
октября 16, 2009 at 20:36
И еще, принимаются предложения по модификации этого робота, чтоб сделать его максимально удобным.
Camill Reply:
октября 23, 2009 at 0:45
Я пробовал рисовать стакан гистограммой на графике, получается гораздо более информативно, но квик вылетает через несколько минут.
Евгений Reply:
октября 23, 2009 at 9:51
ТОже думал так сделать, у амиброкера или нетинвестора такое есть. Пока руки не дошли, но чувствую там код строк на 300 потянет))
Camill Reply:
октября 23, 2009 at 10:59
120, большая часть из которых — стандартное преобразование дат и оформление метки.
Camill Reply:
октября 23, 2009 at 1:12
А из более простого — я конкретно в этот скрипт добавил настройку размера стакана (у меня 25*25) и сделал колонку с количеством числовой, чтобы выравнивание шло по правому краю — так нагляднее, хоть спред и неподписан. И фон строки спреда посветлее сделал.
Евгений Reply:
октября 23, 2009 at 9:53
Да, фон строки спреда можно было вообще не заполнять — пусть будет белым, ведь он все равно будет выделен зеленой и красной по бокам. Если хотите — могу выложить ваш код с указанием авторства модификации. Свяжитесь через форму контакта.
Смоделируем ситуацию. Выставлены 2 заявки, одна исполнена и цена укатилась в ее сторону. Как поведет себя робот?
Евгений Reply:
октября 22, 2009 at 9:19
Привет. Робот «Модифицированный стакан» вообще не работает с заявками. Может вы что-то другое имели в виду?
Евгений Reply:
октября 16, 2009 at 20:36
И еще, принимаются предложения по модификации этого робота, чтоб сделать его максимально удобным.
На самом деле может получиться очень полезная примочка к КВИКу — глубина стакана в КВИКе явно маловата.
Поэтому если написать функцию так, чтобы на экране отображалось одновременно несколько инструментов (их перечень — параметры функции) и глубина стакана — тоже параметр,то такая вполне самодостаточная функция могла бы получиться.
Евгений Reply:
октября 23, 2009 at 18:38
Чтоб эта примочка была действительно полезной — ее надо писать на другом языке, там где период расчета как можно меньше. чем 1 секунда в QPILE. Также, как вы правильно подметили, с настраиваемыми параметрами. Сейчас начал изучать язык автоматизации AutoIt, на котором написал утилиту автозапуска, вот на нем скорее всего и буду со временем создавать модифицированный стакан. но даже в сегодняшнем виде «Модифицированный стакан» открывает новые перспективы
sepa Reply:
ноября 3, 2009 at 16:21
Добрый день!
А что это за язык AutoIT ? Почему Вы взялись именно за него?
Надеюсь, не интерпретатор? С КВИКом он стыкуется напрямую? Или придется получать данные из КВИКа, обрабатывать программой, а потом опять засылать информацию в КВИК?
sepa Reply:
ноября 3, 2009 at 16:55
ОК! Нашел в Гугле информацию, если кому интересно — вот она:
==== цитата====>
AutoIt v3 — это язык для написания сценариев, напоминающий BASIC. Основным его назначением является автоматизация работ с Windows GUI (графическим интерфейсом пользователя MS Windows). Для выполнения этой сложной задачи предоставляется комбинация испытанных методов, включающих в себя — симуляцию нажатий комбинаций клавиш клавиатуры, перемещения указателя мыши и управления окнами и его визуальными элементами. Как показывает практика, эти «приводные ремни» весьма эффективны для получения работающих решений в ситуациях, когда другие стандартные средства (например, VBScript и SendKeys) оказываются бессильны.
По замыслу AutoIt предполагался быть средством «тиражирования конфигураций» ПК. Но с момента создания третьей версии его возможности могут быть использованы для реализации «кухни» автоматизации — написания сценариев решения различных задач, в том числе и для администрирования системы.
AutoIt умеет:
Симулировать нажатия комбинаций клавиатуры (поддерживается основная масса раскладок клавиатуры)
Симулировать перемещения указателя мыши и нажатия на ее кнопки
Перемещать, менять размер и управлять параметрами отображения окон
Непосредственно взаимодействовать с «управляющими элементами» (controls) окна (получать/менять надпись, перемещать, отключать, и т.п. действия)
Работать с буфером обмена для пересылки его текстового содержания
Читать, менять и создавать ключи и значения реестра
Новая версия AutoIt3 распознает общепринятые конструкции и имеет стандартный синтаксис, напоминающий синтаксис VBScript и BASIC, и поддерживает обработку сложных выражений, выполнение собственных функций, проводить циклические и условные вычисления. Помимо этого AutoIt3 приспособлен для всего того, что уже давно используют ветераны-сценаристы.
Как и раньше AutoIt имеет небольшой размер интерпретатора (~100KB), который является самостоятельным и не ссылается на другие, кроме системных .dll библиотек. Он намеренно не делает самостоятельных или скрытых записей в реестре, кроме обязательных и составляющих процесс полной установки. Сценарии могут быть скомпилированы в независимые выполняемые файлы с помощью поставляемого компилятора сценариев — Aut2Exe.
Вместе с интерпретатором модернизируются ActiveX и DLL версия AutoIt, которые называются AutoItX3. Эта библиотека представляет собой объединенный композит (COM и стандартная DLL библиотека в одном модуле). AutoItX3 позволяет добавлять уникальные возможности AutoIt в написанные Вами приложения на других языках программирования!
<===== конец цитаты ====
Все-таки, интерпретатор, и работает, как я понимаю, в данном случае, через тот же КВИК. ИМХО, если все так просто, то быстрее, чем 1 сек не может получиться (ведь 1 сек. ставится в КВИКе).
Впрочем, м.б. я ошибаюсь. Sorry.
Евгений Reply:
ноября 3, 2009 at 19:29
АвтоИТ, как вы правильно заметили, это язык сценариев, т.е. этот язык как раз можно применять для заполнения форм. в нашем случае формы ввода логина и пароля.
Теоретически этот язык можно применить для автоматизации торговли, только нужно разобраться каким образом получать данные из квика(ODBC, API), импорт транзакций через API уже есть, и тогда можно построить систему которая будет в тысячи раз быстрее чем QPILE.
Добрый день!
Странно, я попробовал модуль (портфель) Camilla для акций FEES (ФСКЕС),
получилась табличка, в которой, действительно по 25 строк и расцветка соответствующая... но все строки нулевые, за исключением пресловутых 10 строк, которые видны в стакане КВИКа. И еще — при каждой купле-продаже указатель (ползунок) убегает на первую позицию — не хочет стоять на границе купли-продажи.
Евгений Reply:
ноября 16, 2009 at 18:29
Проверил код Camill'a на стакане с фьючом РТС — работает. В вашем случае проверьте код инструмента, доступность Квика к его данным (Связь-списки). Ползунок так и будет убегать — уменьшите переменную RADIUS до 10 например, чтоб весь стакан влезал в экран.
sepa Reply:
ноября 17, 2009 at 19:00
Так в том-то и дело — все правильно работает. Но стакан, который виден в Квике (брокер АТОН) — по 10 строк продажа-покупка.
И программа тоже показывает именно эти строки. Показывает правильно. А остальные строки нулевые.
Т.е. получается, что можно увидеть только то, что позволяет брокер...
А хочется больше
Вот как обойти эту заморочку?
И возможно ли это?
Что касается фьючей — видимо, там стакан изначально в Квике неограниченный.
Я некоторые программы, которые здесь выложены переделываю с фьючерсов на акции — потом пробую на демонстрационном доступе в КВИКе — там нет фьючерсов.
Евгений Reply:
ноября 18, 2009 at 20:14
Меняйте брокера. У меня в БКС по 20 строк на фьючах. Обойти — средствами купайл никак, т.к. он получает данные из таблиц.
Спасибо за разъяснение, понял!
Добрый день!
Оч. хочется сохранить значениЯ спреда за день или рисовать график спреда где-нибудь(excel,quik). Можете это сделать?
Евгений Reply:
января 20, 2010 at 20:00
Вы можете это сделать сами, для этого достаточно в этого робота прописать одну строку — сохранение значения текущего спреда в текстовый файл, а потом открыть его Экселем. Почитайте статью про лог файлы.
Ух ты! Работает:)
Стакан работает великолепно и действительно очень полезная задумка, спасибо!
Есть вопрос немножно не по теме — на скриншотах я заметил «маковский» стиль окошек. Скажите, вы запустили QUIK под макинтошем или это просто оформление виндовс?
Евгений Reply:
января 26, 2010 at 11:42
Оформление
И еще такой момент:
SPREAD=ABS (OFFER-BID)
Думаю лучше изменить на
SPREAD=BID-OFFER
т.к. BID всегда больше OFFER, и получается всегда вызываем лишнюю функцию «ABS»
Евгений Reply:
января 26, 2010 at 11:43
Да, можно и так.
А вообще очень жаль, что в квике 1 секунда минимальный интервал пересчета. Для скальпирования стакан не подходит. Цена убегает
Евгений Reply:
января 26, 2010 at 11:43
Согласен, но другого варианта нет.
Добрый день, Евгений. Не могу понять почему Модифицированныйф стакан показывает нули. Инструмент стоит правильно(RIM0), код тоже RTS-6.10. Жаль что в QPILE нет компиляции как в MQL. Другие роботы, кстати, работают нормально.
Евгений Reply:
марта 19, 2010 at 21:09
Попробуйте вместо RIM0 написать RTS-6.10
Евгений Reply:
марта 19, 2010 at 21:10
А также проверьте есть ли этот инструмент в «Меню — Списки»
Добрый день, Евгений. Подскажите, что нужно изменить в настройках, чтобы строка спреда окрашивалась в более светлый фон. А то черные цифры на тёмносинем фоне плохо видно.
Евгений Reply:
апреля 18, 2010 at 17:34
В 78 строке есть характеристика этого цвета — RGB (108,99,195)
Подберите нужное сочетание цветов — например в «Паинте» и пропишите в этой строке.
Евгений, добрый день! Подскажите, пожалуйста, как в стакане выделить «жирным» шрифтом свою заявку.
Евгений Reply:
мая 19, 2010 at 19:27
Правой кнопкой по стакану — редактировать — поставить галочку «выделять свои заявки». Это функция Квика.
Добрый день, Евгений! Эту функцию Квика я знаю. Я имел в виду модифицированный стакан, там такой функции не нашел.
Евгений Reply:
мая 21, 2010 at 19:32
В этом роботе такой функции не предусмотрено, но теоритически это можно сделать, только выделять не шрифтом, а например выделять особым цветом строку с ценой, по которой у нас есть заявка активная.