Вы находитесь на странице: 1из 7

Рабочее место пользователя

информационно-торговой системы QUIK

Краткая инструкция
по языку QPILE
© СМВБ-информационные технологии, август 2008

Содержание
1. Введение 1
2. Первые шаги. Как начать писать программу 1
3. Описание языка QPILE 3
4. Загрузка программы 4
5. Советы по программированию 6
6. Часто задаваемые вопросы 6

1. Введение

* QPILE – это язык программирования, встроенный в систему QUIK, который позволяет


расширить стандартный функционал программы.

Наиболее часто QPILE используется для:


• расчёта и вывода собственных параметров в программируемую таблицу;
• отправки транзакций в торговую систему и формирования механических торговых систем
(МТС);
• доступа к значениям графиков и индикаторов, построенных в QUIK;
• автоматического сохранения значений таблиц и графиков в файл.
Код программы интерпретируется клиентским местом QUIK при загрузке файла с программой.
Загрузка выполняется с помощью пункта меню Таблицы/Портфели. Программы на языке QPILE
зачастую называют «Портфелями», поскольку раннее QPILE в основном использовался для расчёта
стоимости портфелей ценных бумаг.

2. Первые шаги. Как начать писать программу

Программу на языке QPILE можно написать в любом текстовом редакторе. Наиболее удобными
в этом плане являются программы: FAR (с плагином Colorer) и Notepad++ (с установленным
синтаксисом QPILE). Файлы с кодом программы должны иметь стандартное расширение *.QPL.
Условно любую программу на QPILE можно поделить на три обязательных раздела: заголовок
программы, тело программы и описание столбцов таблицы. В коде программы эти разделы должны
идти друг за другом и именно в такой последовательности.
Для начала необходимо задать значения параметров в заголовке программы:
1. PORTFOLIO_EX – название программируемой таблицы;
2. DESCRIPTION – текстовое описание таблицы (краткое пояснение о том, что делает данный
код);

Краткая инструкция по языку QPILE // Стр. 1


3. CLIENTS_LIST – список кодов клиентов, для которых вычисляются значения в таблице
(чаще всего равен ALL_CLIENTS);
4. FIRMS_LIST – список идентификаторов фирм, для которых вычисляются значения в
таблице (по умолчанию можно указать значение ALL_FIRMS). Каждый из этих параметров
должен описываться отдельной строкой и заканчиваться символом «;». Пример описания
заголовка:

Тело программы находится между операторами «PROGRAM» и «END_PROGRAM». Это основной


раздел, в котором описывается весь алгоритм работы программы. Каждый оператор в программе
должен описываться отдельной строкой. Разделителем операторов служит символ перевода
строки. Описание комментария в программе начинается с символа «’»:

Любая программа на языке QPILE должна содержать как минимум один параметр (столбец
таблицы). Данные параметры могут быть как строкового, так и числового типа. Следует учесть, что
вывод данных в программируемую таблицу не является обязательным. Каждый параметр в коде
программы описывается следующими строками:
• PARAMETER - название параметра, которое должно соответствовать названию ключа в MAP-
массиве;
• PARAMETER_TITLE - название параметра, отображаемое в созданной таблице;
• PARAMETER_DESCRIPTION - расширенное описание параметра;
• PARAMETER_TYPE - тип данных, выводимых в данный параметр.
Описание параметра всегда завершается оператором END. Пример описания двух столбцов
различных типов:

Далее, после описания всех параметров таблицы следует последний оператор END_PORTFOLIO_EX.
На сайте www.quik.ru в разделе «Файловый архив» выложены примеры программ на языке QPILE
(данный архив также включен в состав Руководства пользователя системы QUIK). Представленные
программы являются примерами кода на языке QPILE и могут использоваться в качестве основы
для пользовательских программ.

Краткая инструкция по языку QPILE // Стр. 2


3. Описание языка QPILE

Полное описание всех функций, используемых в языке QPILE, приведено в Разделе 8. Руководства
пользователя системы QUIK. Ниже рассмотрены наиболее часто используемые функции и
операторы.
Для вывода информации в программируемую таблицу используется функция ADD_ITEM.
Необходимо предварительно сформировать MAP-массив, в котором будут содержаться выводимые
значения. Ключи в MAP-массиве должны соответствовать названиям параметров (столбцов)
таблицы, описанных в поле PARAMETER. Рассмотрим простой пример использования данной
функции.
В приведенном ниже примере описаны два столбца: SecCode и LastPrice. Тело программы
начинается со строки DELETE_ALL_ITEMS. С помощью данной функции из программируемой
таблицы будут удаляться старые строки. Далее создается MAP-массив с идентификатором «mp».
Переменной «last_price» присваивается значение параметра «Цена последней сделки» из Таблицы
текущих параметров. Значения в массив «mp» записываются с помощью функции SET_VALUE.
В итоге в массиве будут храниться значения с ключами: SecCode и LastPrice («Код бумаги» и «Цена
последней сделки» соответственно). Функция ADD_ITEM добавляет в программируемую таблицу
строку со значениями ассоциативного массива «mp». В итоге, в таблице будет отображаться одна
строка, которая будет обновляться при каждом расчёте портфеля.

Для доступа к значениям графиков и индикаторов можно воспользоваться функцией


GET_CANDLE_EX. Для начала необходимо в свойствах графика задать строковый идентификатор,
который потом будет использоваться при вызове функции.
Приведенный ниже пример выводит в файл «report.txt» значения цен открытия и закрытия свечей
для графика «Price» с минутным интервалом. Для создания цикла по свечкам время первой и
последней свечи переводится в минуты (переменные StartTimeInMin и EndTimeInMin). Далее для
использования в функции GET_CANDLE_EX происходит приведение времени к формату «HHMMSS».
В переменную «slice» записывается MAP-массив, из которого с помощью функции GET_VALUE
в переменную «lines» записывается коллекция линий. В данной коллекции содержится только одна

Краткая инструкция по языку QPILE // Стр. 3


линия, поскольку это обычный график цены. Из коллекции значения извлекаются с помощью
функции GET_COLLECTION_ITEM. Для записи в файл используется функция WRITELN. Если
в определенный момент времени значение цены открытия свечи будет равно нулю, в файл
запишется строка «Свеча отсутствует».

4. Загрузка программы

Загрузка портфелей осуществляется с помощью пунктов меню Таблицы/Портфели, либо


с помощью горячих клавиш «Ctrl»+«F10»…«F12». Для начала необходимо выполнить загрузку кода
программы (пункт меню Таблицы/Портфели/Задать портфель). Если QUIK обнаружит ошибки
в структуре файла с программой, загрузка прервётся и в окне сообщений будет указано, в какой
строке предположительно находится ошибка.

Краткая инструкция по языку QPILE // Стр. 4


В появившемся окне «Работа с портфелями» необходимо нажать на кнопку «Загрузить локально».
И после того, как появится сообщение, что «Портфель … для фирмы … успешно задан», данное
окно можно закрыть. Если есть необходимость изменить период расчёта портфеля (по умолчанию
равен 10 секундам), либо отключить расчёт какого-либо загруженного портфеля, то нужно
воспользоваться пунктом меню Таблицы/Портфели/Доступные портфели.
Последним этапом загрузки программы является формирование пользовательской
(программируемой) таблицы. Для этого необходимо выбрать пункт меню Таблицы/Портфели/
Просмотр портфеля.

В окне «Доступные портфели» будут отображены все загруженные на данный момент портфели.
Нажатием кнопки «Добавить» или «Добавить все» из списка «Доступные параметры» нужно
сформировать заголовки столбцов пользовательской таблицы и затем нажать кнопку «Да».
В результате загрузки портфеля сформируется пользовательская таблица (OWN) с выбранными
параметрами. Если в теле программы будет найдена ошибка, то расчёт портфеля прервётся.
В появившемся окне сообщений будут указаны имя файла и номер в строки, в которой была
найдена ошибка.

Краткая инструкция по языку QPILE // Стр. 5


5. Советы по программированию

1. По умолчанию, все строковые константы переводятся в верхний регистр. Для отмены


автоматического перевода, необходимо между заголовком и телом программы добавить
ключ: USE_CASE_SENSITIVE_CONSTANTS. Этот ключ позволит использовать строковые
константы, содержащие символы нижнего регистра (коды клиентов, коды инструментов).
2. В случае необходимости для одного загруженного портфеля можно сформировать
несколько пользовательских таблиц и разместить их на разных закладках в QUIK.
3. Если в программе используется операция сравнения вещественных, либо строковых
переменных, необходимо убедиться, что сравниваются значения одного типа. Очень часто
ошибки возникают при получении вещественных значений с помощью функции Get_Value.
В этом случае необходимо приводить значение к вещественному типу с помощью какой-либо
арифметической операции. Например:

4. Для переноса длинных строк можно использовать комбинацию символов «<пробел>_».


5. Для загрузки программ на языке QPILE удобнее пользоваться зарезервированными
горячими клавишами:
• «Ctrl» + «F10» – Задать портфель;
• «Ctrl» + «F11» – Доступные портфели;
• «Ctrl» + «F12» – Просмотр портфеля.

6. Часто задаваемые вопросы

• Не могу получить значение параметра, потому что вызываемая функция


Get_Param_Ex(«EQBR»,«EESR»,«PREVPRICE») возвращает нулевое значение.
Функция Get_Param_Ex возвращает структуру данных типа MAP, для получения значений
из MAP-массива следует воспользоваться функцией Get_Value. Также следует проверить
значение получаемого параметра в «Таблице текущих параметров».

• Как мне объединить две строковые переменные в одну?


Для «склеивания» строковых переменных нужно использовать операцию конкатенации «&».

• Не могу получить данные с помощью Get_Param_Ex по следующим фьючерсам: SiH7, RoZ7,


RcZ7.
Проблема в том, что весь код QPILE автоматически переводится в верхний регистр. Для
отмены перевода символов в верхний регистр, необходимо между заголовком и телом
программы добавить ключ:
USE_CASE_SENSITIVE_CONSTANTS;

• Почему не получается снять все заявки с помощью функции SEND_TRANSACTION?


Язык QPILE не поддерживает следующие типы транзакций:
• «KILL_ALL_ORDERS» – снять все заявки из торговой системы;
• «KILL_ALL_STOP_ORDERS» – снять все стоп-заявки;
• «KILL_ALL_NEG_DEALS» – снять все заявки на внебиржевые сделки и заявки на сделки
РЕПО.

Краткая инструкция по языку QPILE // Стр. 6


• У меня одновременно работают несколько портфелей, можно ли из кода одного файла QPILE
обратиться к данным таблицы, сформированной кодом другого портфеля?
Такой возможности нет. Из кода QPILE можно обращаться только к таблице OWN,
сформированной данным кодом.

• У меня стоит период расчёта портфеля 5 секунд, что будет, если сам портфель будет
рассчитываться более пяти секунд?
Период расчёта (в данном случае — 5 секунд) определяет интервал между расчётами
портфеля. Отсчёт этого времени начинается после окончания расчёта портфеля.

• Если задать параметр «interval» в функции GET CANDLE как дневной (недельный, месячный),
то какое значение должен принять параметр «Time»?
Параметр «Time» нужно задавать равным нулю.

• Подскажите, как с помощью функции Get_Candle_Ex получить значение индикатора,


состоящего из нескольких линий?
Функция Get_Candle_Ex возвращает коллекцию линий, из которых состоит индикатор.
Нумерация линий начинается с нуля, а их название можно получить с помощью параметра
«Name».

• Каким образом можно отлаживать программы на QPILE? Можно ли просмотреть значения


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

Краткая инструкция по языку QPILE // Стр. 7

Вам также может понравиться