Главная > QUIK, Торговый робот > Как торговому роботу получить данные из окна котировок QUIK

Как торговому роботу получить данные из окна котировок QUIK

3 июня 2009

stakanОкно котировок второго уровня, в простонародье: стакан, ранее было недоступно для QPILE, но с одной из последних версий QUIK, сбылась мечта многих трейдеров, и теперь можно оперировать цифрами. Я грешным делом раньше думал что в этом окне, скрыта огромная тайна трейдинга, поэтому «квиковцы» до нее не допускали, но получив доступ я не знал (по началу :) ) что с ним делать. Итак, дорогу осилит идущий. Вид стакана:

Окно котировок QUIK

Окно котировок QUIK

В основном я использую в работе поля: цены покупки/продажи, количество на каждой котировке, и общее количество заявок от бида/аска. Расссмотрим код  QPILE:

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

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

Евгений QUIK, Торговый робот , , , ,

  1. Yury
    6 Июнь 2009 в 23:01 | #1

    Почему для бида и офера разные строки? Разве офер хранится по адресу 0?

    TEMP_MAP1 = GET_COLLECTION_ITEM (TEMP_MAP, BIDCOUNT-1) ' КОТИРОВКА БИДА НАХОДИТСЯ В СТРОКЕ С НОМЕРОМ BIDCOUNT-1

    TEMP_MAP1 = GET_COLLECTION_ITEM (TEMP_MAP, 0)

    Евгений Reply:

    Да, оффер в строке с номером «ноль».

  2. Юрий
    8 Июнь 2009 в 22:33 | #2

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

    Евгений Reply:

    Это и есть полностью код. Его надо использовать в разрезе своей стратегии.

  3. qsn
    8 Октябрь 2009 в 09:39 | #3

    Добрый день

    BIDCOUNT — это общее количество заявок от бида или число строк в стакане?

    Может быть поделитесь структурой стакана поподробнее.

    Да, оффер в строке с номером «ноль».Непонятно.

    Евгений Reply:

    BIDCOUNT — это общее количество заявок от бида или число строк в стакане? — Да.

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

  4. Miki
    19 Октябрь 2009 в 01:06 | #4

    Приветствую!

    Как можно получить «Сумму лучшей покупки/продажи» напротив каждой цены в стакане? Я так понимаю напрямую из стакана пока нельзя.

    Как выводить данные окна котировок для отображения в окне портфеля?

    Заранее спасибо.

  5. Евгений
    19 Октябрь 2009 в 17:40 | #5

    Привет.

    Сумму лучшей покупки можно получить простым суммированием количества от лучшего предложения/спроса до нужной строки котировки. Я так делал.

    По второму вопросу — посмотрите в публикациях «модифицированный стакан», там данные стакана анализируются и выводят в пользовательскую таблицу.

  6. Miki
    21 Октябрь 2009 в 16:01 | #6

    @Евгений

    Понемногу осваиваю. Есть несколько вопросов.

    1. Сделал цикл для подсчета суммы лучшей покупки и продажи. Перехожу от строки к строке и суммирую. Нужно ли в цикл включать присвоение коллекции всех данных стакана по инструменту или вынести это перед циклом, как правильнее?

    2. На каждом шаге цикла переменной присваивается новое значение суммы. Я хотел бы где-то эти данные собирать и потом к ним обращаться. Как это правильно делать? Может укажите место в примере где это реализовано?

    Евгений Reply:

    Привет.

    1. нет, коллекцию получаем один раз, раньше цикла, отдельно для бида и отдельно для оффера. Потом просто чередуем строки и суммируем.

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

    Miki Reply:

    Привет.

    1. Я оставил вне цикла присвоение коллекции всех данных стакана по инструменту, а потом в цикле поочередно беру биды и офера и пишу их в

    TEMP_MAP. Судя по всему правильно создать еще одну коллекцию например TEMP_MAP1 и получить коллекции бидов и оферов перед циклом с помощью

    TEMP_MAP = GET_VALUE (STAKAN, «BID»)

    TEMP_MAP1 = GET_VALUE (STAKAN, «OFFER»)

    Так получается?

    2. Коллекция типа MAP? Я такую использовал для вывода данных в портфель, в итоге получился стакан как у Вас на картинке. Только вот при каждом расчете добавляется новая порция строк, а правильнее было бы затирать старые значения новыми, как это сделать? Вроде как в начале каждого расчета обнуляю счетчик строк, но это не помогает, счетчик показывает 1, а записывает (при цикле от 1 до 3) в строку 4.

    Евгений Reply:

    STAKAN = CREATE_MAP ()

    TEMP_MAP = CREATE_MAP ()

    TEMP_MAP1 = CREATE_MAP ()

    STAKAN=GET_QUOTES_II_LEVEL_DATA («SPBFUT»,"RIM9")

    BIDCOUNT = GET_VALUE (STAKAN, «BID_COUNT»)+0

    OFFERCOUNT =GET_VALUE (STAKAN, «OFFER_COUNT»)+0

    ' BIDFORTS

    TEMP_MAP = GET_VALUE (STAKAN, «BID»)

    TEMP_MAP1 = GET_COLLECTION_ITEM (TEMP_MAP, BIDCOUNT-1)

    BIDFORTS=GET_VALUE (TEMP_MAP1, «PRICE»)+0

    BESTSUMM=0

    FOR I FROM (BIDCOUNT-1)*-1 TO 0

    A=I*-1

    TEMP_MAP1 = GET_COLLECTION_ITEM (TEMP_MAP, A)

    QBIDFORTS=GET_VALUE (TEMP_MAP1, «QUANTITY»)+0

    BESTSUMM=BESTSUMM+QBIDFORTS

    END FOR

    что-то вроде этого должно быть. В итоге BESTSUMM это общая сумма объемов, а QBIDFORTS это сумма построчно.

    2. Коллекция типа COLLECTION

  7. Rem
    25 Март 2010 в 14:26 | #7

    Добрый день, Евгений!

    Совсем запутался я :(

    Подскажите, если, к примеру, спрос по лучшей цене можно определить просто:

    BIDDEPTH=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"BIDDEPTH"),"PARAM_VALUE")+0,

    то можно ли также просто определить спрос по цене на один шаг меньше (т.е. на предыдущей строчке)?

    Если нет, то как это сделать конкретно?

    Спасибо.

    Rem Reply:

    Снимаю свой вопрос :)

    Оказалось всё действительно просто:

    изменить в цикле предел с 0 на -8:

    FOR I FROM (BIDCOUNT-1)*-1 TO -8

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