Как известно, торговый терминал QUIK имеет встроенный интерпретатор  программ , написанных на языке программирования QPILE

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

Кроме того, если Вас устраивает время реакции робота на событие на рынке в пределах 0.5-5 секунд, то QPILE – может обеспечить такое  решение.

Создание программ на языке QPILE имеет ряд особенностей. Учет этих особенностей позволяет не только быстро создавать и отлаживать программы, но и ускорить их дальнейшее исполнение интерпретатором.

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

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

Например, четыре пустых строки или строки комментарии, занимают столько же времени на исполнение,  как оператор цикла FOR.

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

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

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

Это означает, что если некоторой переменной ”U” Вы присвоите значение в некоторой функции func_1, то это  значение будет доступно и в других функциях, а также в основной программе.

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

Для этого заранее определите названия переменных и их функциональное назначение.

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

Макросы применяются для обеспечения наглядности и компактности исходного текста программы.

Функции применяются для сокращения размеров исполняемого кода.

Применение функций всегда замедляет исполнение программы.

Однако, в языке QPILE приходится применять функции фактически для уменьшения размера текста программы, что в конечном счете приводит к дополнительным затратам времени на  ее исполнение.

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

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

Для этого, сначала определим следующие переменные, которые будем использовать в своих программах:

HHMMSS – время в формате HHMMSS

HHMM – время с точность до минуты

_H – часы

_M- минуты

_S-секунды

YYYYMMDD – дата в формате YYYYMMDD

Y_ –год

M_ — месяц

D_ — дата

 

Время и дата в форматах  HHMMSS и YYYYMMDD  необходимы для обращения к свечам, получаются при чтении таблиц сделок и заявок, передаются в транзакциях.

Однако, получение торговой и текущей даты и времени, возможны в формате DD.MM.YYYY. и в формате HH:MM:SS

Поэтому, для начала, получим текущее время и дату и разделим  их на составляющие.

X= GET_VALUE(GET_DATETIME (),”DATETIME”)

D_=substr(X,0,2)

M_= substr(X,3,2)

Y_= substr(X,5,4)

_H= substr(X,11,2)

_M= substr(X,15,2)

_S= substr(X,18,2)

Дата и время в форматах, необходимых для работы с графиками запишутся в виде:

YYYYMMDD=100*(100*_Y_+M_)+D_

HHMMSS=100*(100*_H+_M)+_S

 

Теперь рассмотрим алгоритм управления временем.

Так как графики истории сделок со свечами имеют интервал , кратный минуте, то рекомендую ввести переменную в формате HHMM

Рассмотрим алгоритм  изменения времени для выбора свечей и индикаторов с графиков

            Уменьшить время на T минут

_M=_M-T

If _M<0

_M=_M+60

H=H-1

END IF

            Увеличить время на T минут

_M=_M+T

If _M>60

_M=_M-60

_H=H+1

END IF

Время в формате HHMM=100*_H+_M

Для обеспечения наглядности программы без потери быстродействия, я оформляю алгоритмы изменения времени в виде макросов  #DEC_T и #INC_T.

            С потерей быстродействия, можно оформить их в виде функций без параметров:

 FUNC DEC_T()

_M=_M-T

If _M<0

_M=_M+60

H=H-1

END IF

END FUNC

И

FUNC INC_T()

_M=_M-T

If _M<0

_M=_M+60

H=H-1

END IF

END FUNC

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

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

 

В качестве информации предлагаю следующие результаты экспериментов оценки быстродействия работы с историей сделок на QPILE
1) Вывод истории сделок с графиков.
Программа определяет интервал графика и выводит всю историю в реальном времени, которой еще нет в файлах.
а)  Истории нет. Вывод 3000 свечей (максимальная длина истории с сервера КВИК) с графика составляет 12 секунд.
б) Отсутствует один день — 500 свечей — 2 секунды.
в) прием новой свечи <20 мс.
2) Вывод таблицы всех сделок по всем инструментам (1000 )
Всего сделок было в пятницу 892 тысячи
Время вывода в файлы на диск с сортировкой по инструментам 970 секунд.
Время вывода лишь сделок по индексу РТС ( всего сделок 283 тысячи) составляет 460 секунд.

~~~~~~~~~~~~~~~~~~~~~~~
Для сравнения эффективности привожу данные по выводу в файловую базу данных таблицы всех сделок с использованием DDE и сортировки инструментов (язык С++)
Эксперимент проводился ранее, объем ТВС 1.2 млн сделок инструментов 1000. время вывода с сортировкой по инструментам 8 секунд.
Выводы:
1) На QPILE вполне успешно можно работать с графиками сделок даже без предварительного сохранения в файле при числе необходимых сделок до 100 (примерно получим с графика за 1 секунду)
2) При работе с ТВС, скорость обработки информации на QPILE примерно в 100 раз меньше, чем во внешнем приложении с передачей ТВС по DDE.

~~~~~~~~~~~~~~~~~~~~~~~~~~~

Применением компилятора NKQPL позволяет существенно облегчить разработку программ на языке QPILE.

В компиляторе можно использовать собственные макросы.

Чем удобны макросы?

Макрос – это замена некоторой последовательности команд в программе одной строкой.

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

Функции применяются для сокращения размера программы.

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

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

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

Поясню данный вопрос на простом примере:

В программе на QPILE после тела программы надо описать программируемую таблицу.

Каждый столбец таблицы определяется следующей последовательностью строк

PARAMETER xxx;

 PARAMETER_TITLE Name_xxx

 PARAMETER_DESCRIPTION  Des_xxx;

 PARAMETER_TYPE  type_xxxNUMERIC(6,0);  

 END

Где xxx – имя переменной столбца, содержит значения, которые будут отображаться

Name_xxx – название столбца

Des_xxx   — описание столбца – текст пояснения

type_xxx-  формат   STRING строка или число NUMERIC(6,0);

Таким образом, на каждый столбец необходимо написать 5 строк подобного текста.

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

В программе, вместо записи указанных выше пяти строк для каждого столбца запишем следующую строку:

# column(xxx,Name_xxx,Des_xxx,NUMERIC(6,0))

Таким образом, вместо пяти указанных строк ,  в программе будет одна строка для каждого столбца.

Сам макрос запишем в файл column.qpl в виде:

‘макрос описания столбца программируемой таблицы

PARAMETER %1;

 PARAMETER_TITLE %2;

 PARAMETER_DESCRIPTION  %3;

 PARAMETER_TYPE  %4;  

 END

 

Если у нас  таблица состоит из 20-ти столбцов, то можно записать описание столбцов, в новом макросе, назвав, его  QWN и вместо  20 строк описания столбцов, которые в программе на QPILE составляют 100 строк оператора PARAMETR, записать одну строку

#OWN, а 20 строк макросов описания столбцов поместить в файл макроса OWN.qpl

В процессе сборки программы, компилятор автоматически заменит  одну строку макроса OWN на 20 строк макросов column, а те в свою очередь заменить на 100 строк операторов PARAMETR. Без вашего участия и каких-либо проблем.

Таким образом, макросы позволяют нам в процессе написания программы присваивать названия отдельным последовательностям кода программы и в тексте программы записывать эти понятные нам названия, вместо не очень понятных наборов команд, что обеспечивает читаемость Разрабатываемой программы.

С помощью макросов Вы можете написать программу в виде слов алгоритма, которая в дальнейшем автоматически компилятор автоматически превратит в текст программы на языке QPILE.  

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