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

Почему для бида и офера разные строки? Разве офер хранится по адресу 0?
TEMP_MAP1 = GET_COLLECTION_ITEM (TEMP_MAP, BIDCOUNT-1) ' КОТИРОВКА БИДА НАХОДИТСЯ В СТРОКЕ С НОМЕРОМ BIDCOUNT-1
TEMP_MAP1 = GET_COLLECTION_ITEM (TEMP_MAP, 0)
Евгений Reply:
июня 6, 2009 at 23:04
Да, оффер в строке с номером «ноль».
А нельзя ли полностью код написать как он должен выглядеть, а то не получается отобразить стакан.
Евгений Reply:
июня 9, 2009 at 11:49
Это и есть полностью код. Его надо использовать в разрезе своей стратегии.
Добрый день
BIDCOUNT — это общее количество заявок от бида или число строк в стакане?
Может быть поделитесь структурой стакана поподробнее.
Да, оффер в строке с номером «ноль».Непонятно.
Евгений Reply:
октября 8, 2009 at 17:26
BIDCOUNT — это общее количество заявок от бида или число строк в стакане? — Да.
Как раз сейчас пишу модифицированный стакан и о бязательно в этой же статье подробно опишу схему стакана. Вообще хочу начать новую серию статей с углубленным изучением сложных вещей, например коллекции, мапы, графики и т.п.
Приветствую!
Как можно получить «Сумму лучшей покупки/продажи» напротив каждой цены в стакане? Я так понимаю напрямую из стакана пока нельзя.
Как выводить данные окна котировок для отображения в окне портфеля?
Заранее спасибо.
Привет.
Сумму лучшей покупки можно получить простым суммированием количества от лучшего предложения/спроса до нужной строки котировки. Я так делал.
По второму вопросу — посмотрите в публикациях «модифицированный стакан», там данные стакана анализируются и выводят в пользовательскую таблицу.
@Евгений
Понемногу осваиваю. Есть несколько вопросов.
1. Сделал цикл для подсчета суммы лучшей покупки и продажи. Перехожу от строки к строке и суммирую. Нужно ли в цикл включать присвоение коллекции всех данных стакана по инструменту или вынести это перед циклом, как правильнее?
2. На каждом шаге цикла переменной присваивается новое значение суммы. Я хотел бы где-то эти данные собирать и потом к ним обращаться. Как это правильно делать? Может укажите место в примере где это реализовано?
Евгений Reply:
октября 22, 2009 at 9:26
Привет.
1. нет, коллекцию получаем один раз, раньше цикла, отдельно для бида и отдельно для оффера. Потом просто чередуем строки и суммируем.
2. Если вам нужны потом данные каждой конкретной строки, можно воспользоваться созданием собственной коллекции. и при получении суммы записывать эти данные в ячейку. Почитайте в руководстве.
Miki Reply:
октября 22, 2009 at 15:30
Привет.
1. Я оставил вне цикла присвоение коллекции всех данных стакана по инструменту, а потом в цикле поочередно беру биды и офера и пишу их в
TEMP_MAP. Судя по всему правильно создать еще одну коллекцию например TEMP_MAP1 и получить коллекции бидов и оферов перед циклом с помощью
TEMP_MAP = GET_VALUE (STAKAN, «BID»)
TEMP_MAP1 = GET_VALUE (STAKAN, «OFFER»)
Так получается?
2. Коллекция типа MAP? Я такую использовал для вывода данных в портфель, в итоге получился стакан как у Вас на картинке. Только вот при каждом расчете добавляется новая порция строк, а правильнее было бы затирать старые значения новыми, как это сделать? Вроде как в начале каждого расчета обнуляю счетчик строк, но это не помогает, счетчик показывает 1, а записывает (при цикле от 1 до 3) в строку 4.
Евгений Reply:
октября 22, 2009 at 19:07
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
Добрый день, Евгений!
Совсем запутался я
Подскажите, если, к примеру, спрос по лучшей цене можно определить просто:
BIDDEPTH=GET_VALUE (GET_PARAM_EX («SPBFUT»,INSTRUMENT,"BIDDEPTH"),"PARAM_VALUE")+0,
то можно ли также просто определить спрос по цене на один шаг меньше (т.е. на предыдущей строчке)?
Если нет, то как это сделать конкретно?
Спасибо.
Rem Reply:
марта 25, 2010 at 15:24
Снимаю свой вопрос
Оказалось всё действительно просто:
изменить в цикле предел с 0 на -8:
FOR I FROM (BIDCOUNT-1)*-1 TO -8