Как известно, торговый терминал 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 раза увеличит время исполнения данных фрагментов изменения времени.