Знакомимся со схемой торговых роботов в QUIK
Структура языка QPILE. Работаем с таблицами. Первый простенький алгоритм.
Очень подробно все это описано в документации QUIK. Повторяться уверен не стоит, но кратко изложить основные моменты будет не лишним.
Итак, как мы уже говорили, программы на QPILE, создатели QUIK называют их «пользовательскими портфелями», а мы для кратости будем величать их торговыми роботами, или просто роботами, на основе данных, экспортируемых из основных таблиц QUIK, расчетных данных, реализует какие-то алгоритмы, торговые стратегии и условно производят два действия: визуализирует во вновь создаваемой таблице рассчитанные показатели, и непосредственно открывает, закрывает и модифицирует позиции по тому или иному инструменту.
Для наглядности разберем простой пример, который создает новую таблицу всех сделок, и подсвечивает цветом строки по следующему условию: если последующая сделка прошла по цене выше предыдущей – в зеленый, если ниже то в красный.
И сразу же будем построчно определять действия (после символа апостроф — ' в коде можно писать комментарии на русском языке, для обозначения действий. Очень рекомендую, ибо при создании объемного кода, порой сам начинаешь путаться, где что получаем). Копируйте текст кода в Notepad++ (или скачайте файл FIRST_ROVOT_VER_1_1.qpl из раздела скачать) и будем разбираться:
Код на QPILE доступен только зарегистрированным пользователям.
Теперь займемся настройкой: создайте в QUIK таблицу всех сделок по какому-то определенному инструменту. Поля можете выбрать любые. Создали? Теперь нажимайте CTRL-F10 и подгружайте робота в QUIK. Затем CTRL-F11, тут у нас свойства, нам надо сейчас поменять период расчета портфеля с 10 сек, до 1 сек. Это значит, наш робот будет исполняться раз в секунду. И затем CTRL-F12, добавляем все поля робота в таблицу и любуемся результатом! Подробнее о загрузке и настройке читайте в статье «Как загружать и настраивать торгового робота»
Поздравляю! Вы создали первого вашего робота, пусть простенького, но он работает!
Продолжение следует!
UPD: Есть более правильный вариант просмотра таблицы всех сделок, который не тормозит систему, т.к. описанный в этой статье.

Если уж рассказывать про роботов, то, полагаю, надо побольше внимания уделить самой идее реализации скрипта в квике — что означает «расчет портфеля раз в 10 сек», а также к какому набору данных можно получить доступ в рамках одного запуска кода. В документации к купайлу эти вещи прописаны очень туманно.
Спасибо за комментарий, а главное за пожелание! Я обязательно буду рассказывать обо всех туманных моментах, с которыми можно столкнуться, при написании программ на QPILE.
Про набор данных Вы абсолютно правы, хотя статья «Получаем данные из QUIK» уже опубликована, в будущем я уделю отдельное время этому важному моменту. О периоде расчета портфеля я написал в статье «Как загружать и настраивать торгового робота».
П.С. Я заранее приношу извинения за отсроченную модерируемую публикацию комментариев, но одобренный комментатор один раз, далее пишет без модерации.
Привет, а можно поподробнее вот про эту строчку?
FOR I FROM 50000 TO 100000 ' ЗАДАЕМ ЦИКЛ ОТ 50 ТЫСЯЧНОЙ ЗАПИСИ ДО 100 ТЫСЯЧНОЙ В ТАБЛИЦЕ ВСЕХ СДЕЛОК. ЕСЛИ ОБРАБАТЫВАТЬ ВСЮ ТАБЛИЦУ МОЖЕТ УЙТИ МНОГО ВРЕМЕНИ.
Что за магические числа?
Где хранится таблица всех сделок — в оперативной памяти или на диске?
Вообще много ли идет обращений к диску, когда система работает.
Я вот думаю можно ли робота на нетбуке запустить, или нужно что-то помощнее...
Ну насчет мощностей ничего сказать не могу — ни разу не сталкивался с нехваткой мощности
Что касается чисел — в таблице всех сделок отображаются именно ВСЕ сделки по ВСЕМ рынкам, а это сотни тысяч строк в сутки. Для быстроты именно в этом роботе я использовал диапазон строк от 50 до 100 тысячной, их можно поменять, или сделать так:
...
NEW_GLOBAL («N»,0)
FOR I FROM N TO GET_NUMBER_OF («ALL_TRADES»)
...
END FOR
N=GET_NUMBER_OF («ALL_TRADES»)+1
...
в таком случае будет просматриваться вся таблица всех сделок, и в текущем режиме будут одномоментно появляться в нашей таблице сделки по нашему инструменту, от начала до окончания сессии. Единственное, что с такими изменениями при запуске не сначала сессии будет долгая фильтрация всей таблицы, может даже несколько минут.
Yury Reply:
июня 5, 2009 at 1:52
Получается, что вашу таблицу вы создаете с 50000 строки?
ADD_ITEM (I,OUTPUT) ' ...И ВЫКЛАДЫВАЕМ ИХ В ТАБЛИЦУ
Евгений Reply:
июня 5, 2009 at 11:50
Не, не создаем с 50000 строки, а считываем значения из таблицы «всех сделок» начиная с 50000 строки. Эта цифра взята с потолка.
Yury Reply:
июня 5, 2009 at 17:20
Но ведь ADD_ITEM (I,OUTPUT) добавляет в текущую таблицу строку с индексом I, который начинается с 50000.
Евгений Reply:
июня 5, 2009 at 19:40
Точно! Мельком глянул в прошлый раз. Действительно в коде ошибка, там делее есть строка А=А+1, видимо именно эту переменную я планировал под номер строки, но потом не поставил в ADD_ITEM (A,OUTPUT). Пробуйте, то что Вы сумели найти столь малый акцент, свидетельствует о зорком взгляде и хорошее знание алгоритмики!
У Вас случайно нет файла для подсветки синтаксиса для Notepad++?
Очень извиняюсь, но вместо
072.
073.ADD_ITEM (I,OUTPUT) ' ...И ВЫКЛАДЫВАЕМ ИХ В ТАБЛИЦУ
074.
075.A=A+1 ' СЧЕТЧИК НОМЕРА СТРОКИ В НАШЕЙ ТАБЛИЦЕ
кроме уже замеченной погрешности (замена I на A )
нужно и строчки переставить местами ИМХО, иначе номер строки, которая затем подкрашивается — на единицу больше, чем тот, который мы только что заполнили.
Д.б.так:
072.
073.A=A+1 ' СЧЕТЧИК НОМЕРА СТРОКИ В НАШЕЙ ТАБЛИЦЕ
074.ADD_ITEM (A,OUTPUT) ' ...И ВЫКЛАДЫВАЕМ ИХ В ТАБЛИЦУ
075.
я только начинаю знакомиться с qpile
подскажите что не так в моей программе, хочу чтоб она создавала табличку и там отображалось изменения по инструменту mrkk
PORFOLIO MRSK;
DESCRIPTION MRSK CHANGE;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRMID;
PROGRAM
DELTA=0
DELTA=GET_PARAM («EQNE»,"MRKK","LASTCHANGE")
MAP CREATE_MAP (MRSK)
MAP SET_VALUE (MRSK,"изм",DELTA)
END_PROGRAM
PARAMETER MRSK;
PARAMETER_TITLE ИЗМ;
PARAMETER_DESCRIPTION %ИЗМ;
PARAMETER_TYPE NUMERIC (3;2);
END
Евгений Reply:
ноября 10, 2009 at 20:19
Привет начинающим!
Ошибок много, сравнивайте:
PORTFOLIO_EX DELTA;
DESCRIPTION DELTA;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
DELTA=GET_VALUE (GET_PARAM_EX («EQNE»,"MRKK","LASTCHANGE"),"PARAM_VALUE")+0
OUTPUT=CREATE_MAP ()
OUTPUT=SET_VALUE (OUTPUT,"DELTA",DELTA)
DELETE_ALL_ITEMS ()
ADD_ITEM (1,OUTPUT)
END_PROGRAM
PARAMETER DELTA;
PARAMETER_TITLE ИЗМ;
PARAMETER_DESCRIPTION %ИЗМ;
PARAMETER_TYPE NUMERIC (10,2);
END
END_PORTFOLIO_EX
pocemon Reply:
ноября 10, 2009 at 21:55
Спасибо Евгений за ответ, но у меня все равно выдает ошибку в строке
DELTA=GET_VALUE (GET_PARAM_EX («EQNE»,"MRKK","LASTCHANGE"),"PARAM_VALUE")+0, возможно для GET_PARAM_EX («EQNE»,"MRKK","LASTCHANGE") нужно создать свою переменую?
Еще интересно зачем вы удаляете все таблицы, после получения pyfxtybz DELTA?
Евгений Reply:
ноября 10, 2009 at 21:58
1. Версию квика обновите, у меня ошибки нет.
2. Если вы об этом: DELETE_ALL_ITEMS () — то это я очищаю таблицу перед выводом. Привычка.
Обновил квик, но ошибка не исчезла?
Еще Евгений вопрос- функции QPILE по работе с таблицами конкретными работают только при открытых таблицах или квик с сервера квика даные по команде качает?
Евгений Reply:
ноября 10, 2009 at 22:24
А! Кавычки правильные поставьте: DELTA=GET_VALUE (GET_PARAM_EX («EQNE»,"MRKK","LASTCHANGE"),"PARAM_VALUE")+0
движок блога любит символы менять, кавычки должны быть как у параметров MRKK и LASTCHANGE везде. Сейчас у параметра EQNE неправильные кавычки.
Данные из таблиц берет на сервере. Если есть функции работы с графиками. то график должен быть открыт.
pocemon Reply:
ноября 10, 2009 at 22:39
УРААААААА!!!!
Мой первый робот работает)) спасибо Евгений большое за помощь. Теперь я на вашем форуме постояный гость и вопросов всяких в том числе и глупых буду задавать много)
У меня есть идеи стратегии, поэтому я начал изучать язык квика. Хотя для меня он как дремучий лес, пока только понимаю что делает та или иная функция а вот как их сочетать я пока совсем непонимаю.
Надеюсь вас сайт мне поможет) Спасибо.
Евгений Reply:
ноября 10, 2009 at 22:40
Поздравляю!
Купайл не очень сложный, разберетесь быстро. Все наиболее часто встречающиеся блоки есть на этом сайте.
Удачи!
pocemon Reply:
ноября 10, 2009 at 22:48
Квик кстати я не зря обновил, появилась удобная функция — режим отладки)
Немного доработал DELTA, теперь котировки еще и подкрашиваються в красный если падение и зеленый если рост.
PORTFOLIO_EX DELTA;
DESCRIPTION DELTA;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;
PROGRAM
DELTA=GET_VALUE (GET_PARAM_EX («SPBFUT»,"RIZ9","LASTCHANGE"),"PARAM_VALUE")+0
OUTPUT=CREATE_MAP ()
OUTPUT=SET_VALUE (OUTPUT,"DELTA",DELTA)
DELETE_ALL_ITEMS ()
ADD_ITEM (1,OUTPUT)
IF OUTPUT+0>0
SET_ROW_COLOR_EX (1,"RGB (255,0,0)", «RGB (255,0,0)», «DEFAULT_COLOR», «DEFAULT_COLOR»)
ELSE
SET_ROW_COLOR_EX (1,"RGB (0,255,0)", «RGB (0,255,0)», «DEFAULT_COLOR», «DEFAULT_COLOR»)
END IF
END_PROGRAM
PARAMETER DELTA;
PARAMETER_TITLE ИЗМ;
PARAMETER_DESCRIPTION %ИЗМ;
PARAMETER_TYPE NUMERIC (10,2);
END
END_PORTFOLIO_EX
Здраствуйте, Евгений, я новичек совсем, поэтому к вам вопрос:
Исправил ошибку с ADD_ITEM (I,OUTPUT). Хотел сделать чтобы, отражался в списке Сбербанк и для этого подправил «INSTRUMENT» на «INSTRUMENT=»SBER3"" и класс инструмента на «EQBR» (А1-Акции).
Брокер у меня АТОН — фьютчерсы пока что не предусмотрены, поэтому хотел затестить код на фондовом рынке.
youare Reply:
ноября 19, 2009 at 16:39
Забыл сказать самое главное
В появившемся окне ничего не отображается. Почему не подскажете?
Евгений Reply:
ноября 19, 2009 at 19:15
Привет.
Все когда то начинают
А вопрос то какой?
Проверяйте кавычки.
INSTRUMENT="SBER3"? там ковычки стоят правильные.
вопрос вторым сообщением спросил. Повторю:
В появившемся окне ничего не отображается. Почему не подскажете?
Евгений Reply:
ноября 19, 2009 at 20:01
Сбербанк называется SBER03
Ошибка в коде бумаги.
Спасибо, теперь все работает.
Очень хороший ресурс, а самое главное человек, который его создал!
А почему формат даты и времени идет в полученной таблице без разделителей, сплошным текстом?
Евгений Reply:
ноября 25, 2009 at 15:48
чтобы время было шестизначным числом.
Здравствуйте Евгений. Поздравляю Вас с наступившим новым годом.
Хочу разобраться в QPILE, написал пробную таблицу для подсветки проходящих
объёмов из таблицы всех сделок, разными цветами для наглядности.
Таблица вроде той что выложена у вас в этом разделе.
При запуске таблицы во время сессии она работает, но частично.
Приходящие строчки отображаются, но не подсвечиваются.
Помогите разобраться в чем дело, какие только варианты не пробовал ничего не выходит. Кстати в таблице формула для времени с разделителем
(на вопрос выше)
Таблица для Газпрома.
PORTFOLIO_EX Расскраска объёмов;
DESCRIPTION РАСКРАСКА;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST FIRMID;
PROGRAM
FUNC FORMAT_QUIK_TIME (T)
IF LEN (T) ==5
RESULT = «0» &SUBSTR (""& T, 0, 1) & «:» & SUBSTR ("" & T,1,2) & «:» & SUBSTR ("" & T, 3, 2,)
ELSE
RESULT = SUBSTR (""& T,0,2) & «:» & SUBSTR ("" & T, 2, 2) & «:» & SUBSTR ("« & T, 4, 2)
END IF
END FUNC
NEW_GLOBAL („N“,1)
A=0
MAP=CREATE_MAP ()
FOR A FROM N TO GET_NUMBER_OF („ALL_TRADES“)
IF (GET_VALUE (GET_ITEM („ALL_TRADES“, A), „SECCODE“)=»GAZP") AND (GET_VALUE (GET_ITEM («ALL_TRADES», A), «CLASSCODE»)="EQNE")
MAP=GET_ITEM («ALL_TRADES», A)
QUANTITY=GET_VALUE (GET_ITEM («ALL_TRADES», A), «QUANTITY»)+0
MAP=SET_VALUE (MAP,"QUANTITY",QUANTITY)
MAP=SET_VALUE (MAP, «TIME», FORMAT_QUIK_TIME (GET_VALUE (MAP, «TIME»)))
A=A+1
ADD_ITEM (A,MAP)
IF QUANTITY=100 AND QUANTITY=500 AND QUANTITY=1000 AND QUANTITY=5000 AND QUANTITY=10000 AND QUANTITY=20000 AND QUANTITY=50000
SET_ROW_COLOR_EX (A,"RGB (255,1,1)", «RGB (255,1,1)», «RGB (255,255,255)», «DEFAULT_COLOR»)
END IF
END IF
N=GET_NUMBER_OF («ALL_TRADES»)+1
END FOR
END_PROGRAM
PARAMETER TIME;
PARAMETER_TITLE время;
PARAMETER_DESCRIPTION время;
PARAMETER_TYPE STRING (32);
END
PARAMETER PRICE;
PARAMETER_TITLE цена;
PARAMETER_DESCRIPTION ЦЕНА;
PARAMETER_TYPE NUMERIC (10,2);
END
PARAMETER QUANTITY;
PARAMETER_TITLE Количество;
PARAMETER_DESCRIPTION Количество;
PARAMETER_TYPE NUMERIC (10,2);
END
END_PORTFOLIO_EX
wandergraft Reply:
января 15, 2010 at 19:55
Почему то формула после пересылки исказилась кавычки и параметры расцветки
строк.
Евгений Reply:
января 15, 2010 at 20:20
Привет.
Обратите внимание на этот блок:
IF QUANTITY=100 AND QUANTITY=500 AND QUANTITY=1000 AND QUANTITY=5000 AND QUANTITY=10000 AND QUANTITY=20000 AND QUANTITY=50000
SET_ROW_COLOR_EX (A,"RGB (255,1,1)", «RGB (255,1,1)», «RGB (255,255,255)», «DEFAULT_COLOR»)
END IF
В условии у вас запрограммировано ОДНОВРЕМЕННОЕ равенство переменной QUANTITY и 100 и 500 и т.д. что невозможно в принципе.
Дальше не смотрел пока.
Здравствуйте Евгений, извините что повторяюсь.Формула после пересылки
изменилась,кавычки и параметры расцветки, видимо из-за интерпретации
знаков на сервере.Попробую выслать один блок расцветки, хотя то что он
работает это точно, если меняю в нем A на N (номер строки) Строчки подсвечиваются как надо, но таблица в перевёрнутом виде и расцветка
прекращается после обработки имеющихся в таблице всех сделок строк.
Вниз идут черно-белые строки. Функция подсветки строк стандартная.
IF QUANTITY=100 AND QUANTITY=500 AND QUANTITY=1000 AND QUANTITY=5000 AND QUANTITY=10000 AND QUANTITY=20000 AND QUANTITY=50000
SET_ROW_COLOR_EX (A,"RGB (255,1,1)", «RGB (255,1,1)», «RGB (255,255,255)», «DEFAULT_COLOR»)
END IF
Евгений Reply:
января 16, 2010 at 20:24
У вас условие невыполнимое!
IF QUANTITY=100 AND QUANTITY=500 AND QUANTITY=1000 AND QUANTITY=5000 AND QUANTITY=10000 AND QUANTITY=20000 AND QUANTITY=50000
Это рне будет работать, т.к. в один и тот же момент времени одна и та же переменная по вашему ДОЛЖНА быть равна разным числам!!!
Начните с условия.
Формула расцветки строк опять изменилась после пересылки, у меня по другому, попробую набрать в ручную.
IF QUANTITY<100
SET_ROW_COLOR_EX (A, "RGB (200,220,0)", "RGB (200,220,0)", "RGB (255,255,255)","DEFAULT_COLOR")
END IF
и так далее для каждого количества лотов.
вот вроде получилось, формулы надо набирать вручную.
Формула меняется при пересылке через сайт. Через личку Евгений мне разъяснил что было не правильно.
Цитирую.
***********************************************************
А — это переменная цикла, которая равна номеру строки в таблице все
сделки, а если в этой строке нет газпрома? Тогда у вас слетает нумерация
строк в вашей таблице. Правильно завести еще одну глобальную
переменную-счетчик,
NEW_GLOBAL («STRCOUNT»,0)
IF (GET_VALUE (GET_ITEM («ALL_TRADES», A), «SECCODE»)="GAZP") AND
(GET_VALUE (GET_ITEM («ALL_TRADES», A), «CLASSCODE»)="EQNE")
STRCOUNT=STRCOUNT+1
MAP=CREATE_MAP ()
которая будет увеличиваться на 1 если найден именно газпром. И
относительно этой переменной красить строки.
**********************************************************
После исправления таблица работает!!!
Евгений спасибо!
Евгений Здравствуйте, возникла проблема не по изучению QPILE здесь пока все ясно, написано понятно, комментарии исчерпывающие. а с редактором Notepad++ засада,копирую код ,вставляю в файл, открываю" сохранить как" прописоваю в ручную например" robt_v.qpl", сохраняюсь,подгружаю в квик,все нормально код в окне «формула расчета» читается,загрузил пустая таблица,загружаю с о страницы скачать, все грузится,работает,редактируется ,сохраняется, красота.в редакторе нет неподсветки строк, я уже и в синтекс прописал qpl.и перезагружал редактор ,без полезно, обясните как с Notepad++ работать пжалуста,
С уважением .
Евгений Reply:
февраля 4, 2010 at 19:12
Привет.
Попробуйте либо переустановить редактор, либо меню синтаксис — QPL
Евгений разобрался сам , "дело было не в бобине за рулем сидел...,это про меня,редактор работает нормально и понятно,фьюч на ртс обзывается у всех по разному RIH0 или RTS-3.10 вот их инадо было просто поменять местами,элементарно нет инструмента нет отражения в портфеле,а мучился весь день,над редактором так наверно не кто не издевался, так как я.
С Уважением
Евгений Reply:
февраля 4, 2010 at 19:16
Бывает. Я до сих пор понять не могу, для чего эта неразбериха с кодами инструментов, у одного брокера короткий — у другого длинный...
ладно разобрались,у меня недавно баг был стакан открыт,идет экспорт, все таблицы открыты, настроенны, в логе запись ненайден тикер базового актива.но это не на QPILE,бот через SDK как то не удобно решил помучить квик,ваш сайт просматриваю регулярно ,точнее каждый день по несколько раз,вот созрел до купал,в «Black Hole» мысль реалезованно здраво,если все довести до ума ,это заявка на высокое место «ЛЧИ2010»,
Сильно не пинайте за вопрос, но что такое PAPIER=0 никак в толк не возьму???
Евгений Reply:
февраля 21, 2010 at 10:00
ТОчно. Атавизм. Щас поправлю.
coole Reply:
февраля 22, 2010 at 9:11
Мерси
Евгений
вы спасли мои выходные, а то бы я все гадал да гадал