Главная > Скальпинг, Торговый робот > Торговый робот — «Модифицированный стакан»

Торговый робот — «Модифицированный стакан»

9 октября 2009

StakanКак говорится — возвращаясь к напечатанному. Мы уже рассматривали трепанацию стакана в одной из прошлых статей. Теперь заглянем еще глубже. поводом послужили два фактора: один из посетителей попросил поподробнее рассказать о структуре стакана, и я после семинаров о скальпинге начал пристально присматриваться к стакану, особенно к движениям которые в нем происходят. И мне его вид показался больно уж неинформативным, спред числом не видно, визуально определить пустоты внутри офферов или бидов вообще не реально. Поэтому я решил написать торговый робот, который получив данные из стакана преподнесет мне их в более удобном виде. Но вначале давайте все же вернемся к структуре стакана:

Структура стакана

Структура стакана

Это небольшая часть стакана фьючерса на индекс РТС. Цифры на красном поле это очередь заявок трейдеров желающих продать по указанной цене указанный справа объем. Также это называется ОФФЕРА. Лучшее предложение в данной слечае это один лот по цене 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.

Код доступен только зарегистрированным пользователям:

* цене нетю

Вот пример как можно

Евгений Скальпинг, Торговый робот , , ,

  1. Ar@tur
    13 Октябрь 2009 в 15:33 | #1

    Здравствуйте Евгений! А можно ли настроить «Модифицированный стакан» на торговлю другим инструментом кроме индекса???

    Евгений Reply:

    Можно. Для этого надо поменять код инструмента и везде «SPBFUT» поменять на код класса нужного инструмента, также в кавычках, это текстовые переменные.

  2. Ar@tur
    16 Октябрь 2009 в 12:17 | #2

    Евгений добрый день! Подскажи пожайлуста, если я торгую несколькими инструментами например фьюч индекса и фьюч газпрома, что можно поменять в настройках чтобы загрузить 2 стакана?

    Евгений Reply:

    Для этого нужно переписать всего робота... Займусь жтим в ближайшее время. Следите за обновлениями!

    Евгений Reply:

    И еще, принимаются предложения по модификации этого робота, чтоб сделать его максимально удобным.

    Camill Reply:

    Я пробовал рисовать стакан гистограммой на графике, получается гораздо более информативно, но квик вылетает через несколько минут.

    Евгений Reply:

    ТОже думал так сделать, у амиброкера или нетинвестора такое есть. Пока руки не дошли, но чувствую там код строк на 300 потянет))

    Camill Reply:

    :)

    120, большая часть из которых — стандартное преобразование дат и оформление метки.

    Camill Reply:

    А из более простого — я конкретно в этот скрипт добавил настройку размера стакана (у меня 25*25) и сделал колонку с количеством числовой, чтобы выравнивание шло по правому краю — так нагляднее, хоть спред и неподписан. И фон строки спреда посветлее сделал.

    Евгений Reply:

    Да, фон строки спреда можно было вообще не заполнять — пусть будет белым, ведь он все равно будет выделен зеленой и красной по бокам. Если хотите — могу выложить ваш код с указанием авторства модификации. Свяжитесь через форму контакта.

  3. C1aymore
    20 Октябрь 2009 в 19:16 | #3

    Смоделируем ситуацию. Выставлены 2 заявки, одна исполнена и цена укатилась в ее сторону. Как поведет себя робот?

    Евгений Reply:

    Привет. Робот «Модифицированный стакан» вообще не работает с заявками. Может вы что-то другое имели в виду?

  4. sepa
    23 Октябрь 2009 в 17:35 | #4

    Евгений Reply:

    октября 16, 2009 at 20:36

    И еще, принимаются предложения по модификации этого робота, чтоб сделать его максимально удобным.

    На самом деле может получиться очень полезная примочка к КВИКу — глубина стакана в КВИКе явно маловата.

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

    Евгений Reply:

    Чтоб эта примочка была действительно полезной — ее надо писать на другом языке, там где период расчета как можно меньше. чем 1 секунда в QPILE. Также, как вы правильно подметили, с настраиваемыми параметрами. Сейчас начал изучать язык автоматизации AutoIt, на котором написал утилиту автозапуска, вот на нем скорее всего и буду со временем создавать модифицированный стакан. но даже в сегодняшнем виде «Модифицированный стакан» открывает новые перспективы :-)

    sepa Reply:

    Добрый день!

    А что это за язык AutoIT ? Почему Вы взялись именно за него?

    Надеюсь, не интерпретатор? С КВИКом он стыкуется напрямую? Или придется получать данные из КВИКа, обрабатывать программой, а потом опять засылать информацию в КВИК?

    sepa Reply:

    ОК! Нашел в Гугле информацию, если кому интересно — вот она:

    ==== цитата====>

    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:

    АвтоИТ, как вы правильно заметили, это язык сценариев, т.е. этот язык как раз можно применять для заполнения форм. в нашем случае формы ввода логина и пароля.

    Теоретически этот язык можно применить для автоматизации торговли, только нужно разобраться каким образом получать данные из квика(ODBC, API), импорт транзакций через API уже есть, и тогда можно построить систему которая будет в тысячи раз быстрее чем QPILE.

  5. sepa
    16 Ноябрь 2009 в 18:20 | #5

    Добрый день!

    Странно, я попробовал модуль (портфель) Camilla для акций FEES (ФСКЕС),

    получилась табличка, в которой, действительно по 25 строк и расцветка соответствующая... но все строки нулевые, за исключением пресловутых 10 строк, которые видны в стакане КВИКа. И еще — при каждой купле-продаже указатель (ползунок) убегает на первую позицию — не хочет стоять на границе купли-продажи.

    Евгений Reply:

    Проверил код Camill'a на стакане с фьючом РТС — работает. В вашем случае проверьте код инструмента, доступность Квика к его данным (Связь-списки). Ползунок так и будет убегать — уменьшите переменную RADIUS до 10 например, чтоб весь стакан влезал в экран.

    sepa Reply:

    Так в том-то и дело — все правильно работает. Но стакан, который виден в Квике (брокер АТОН) — по 10 строк продажа-покупка.

    И программа тоже показывает именно эти строки. Показывает правильно. А остальные строки нулевые.

    Т.е. получается, что можно увидеть только то, что позволяет брокер...

    А хочется больше :-)

    Вот как обойти эту заморочку?

    И возможно ли это?

    Что касается фьючей — видимо, там стакан изначально в Квике неограниченный.

    Я некоторые программы, которые здесь выложены переделываю с фьючерсов на акции — потом пробую на демонстрационном доступе в КВИКе — там нет фьючерсов.

    Евгений Reply:

    Меняйте брокера. У меня в БКС по 20 строк на фьючах. Обойти — средствами купайл никак, т.к. он получает данные из таблиц.

  6. sepa
    19 Ноябрь 2009 в 15:54 | #6

    Спасибо за разъяснение, понял!

    :-)

  7. panzernik
    20 Январь 2010 в 19:05 | #7

    Добрый день!

    Оч. хочется сохранить значениЯ спреда за день или рисовать график спреда где-нибудь(excel,quik). Можете это сделать?

    Евгений Reply:

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

  8. panzernik
    20 Январь 2010 в 20:58 | #8

    Ух ты! Работает:)

  9. Александр
    23 Январь 2010 в 20:18 | #9

    Стакан работает великолепно и действительно очень полезная задумка, спасибо!

    Есть вопрос немножно не по теме — на скриншотах я заметил «маковский» стиль окошек. Скажите, вы запустили QUIK под макинтошем или это просто оформление виндовс?

    Евгений Reply:

    Оформление :)

  10. Александр
    23 Январь 2010 в 20:42 | #10

    И еще такой момент:

    SPREAD=ABS (OFFER-BID)

    Думаю лучше изменить на

    SPREAD=BID-OFFER

    т.к. BID всегда больше OFFER, и получается всегда вызываем лишнюю функцию «ABS»

    Евгений Reply:

    Да, можно и так.

  11. Александр
    23 Январь 2010 в 21:13 | #11

    А вообще очень жаль, что в квике 1 секунда минимальный интервал пересчета. Для скальпирования стакан не подходит. Цена убегает

    Евгений Reply:

    Согласен, но другого варианта нет.

  12. ivac
    19 Март 2010 в 15:20 | #12

    Добрый день, Евгений. Не могу понять почему Модифицированныйф стакан показывает нули. Инструмент стоит правильно(RIM0), код тоже RTS-6.10. Жаль что в QPILE нет компиляции как в MQL. Другие роботы, кстати, работают нормально.

    Евгений Reply:

    Попробуйте вместо RIM0 написать RTS-6.10

    Евгений Reply:

    А также проверьте есть ли этот инструмент в «Меню — Списки»

  13. Vaht
    16 Апрель 2010 в 15:20 | #13

    Добрый день, Евгений. Подскажите, что нужно изменить в настройках, чтобы строка спреда окрашивалась в более светлый фон. А то черные цифры на тёмносинем фоне плохо видно.

    Евгений Reply:

    В 78 строке есть характеристика этого цвета — RGB (108,99,195)

    Подберите нужное сочетание цветов — например в «Паинте» и пропишите в этой строке.

  14. Positive
    18 Май 2010 в 15:46 | #14

    Евгений, добрый день! Подскажите, пожалуйста, как в стакане выделить «жирным» шрифтом свою заявку.

    Евгений Reply:

    Правой кнопкой по стакану — редактировать — поставить галочку «выделять свои заявки». Это функция Квика.

  15. Positive
    21 Май 2010 в 10:08 | #15

    Добрый день, Евгений! Эту функцию Квика я знаю. Я имел в виду модифицированный стакан, там такой функции не нашел.

    Евгений Reply:

    В этом роботе такой функции не предусмотрено, но теоритически это можно сделать, только выделять не шрифтом, а например выделять особым цветом строку с ценой, по которой у нас есть заявка активная.

Необходимо войти на сайт, чтобы написать комментарий.