Автор: Николай Камынин

В алгоритмическом  языке  QPILE  программирования для QUIK  согласно руководству пользователя имеются два типа операторов ЦИКЛ:

FOR переменная IN список значений
                последовательность инструкций
END FOR

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

———————————————

FOR переменная FROM значение1 TO значение2
    последовательность инструкций
END FOR

выполняет последовательность инструкций для каждого значения переменной в диапазоне от «значение1» до «значение2» с шагом 1, в качестве которых могут выступать математические выражения. Если «значение2» < «значение1», цикл не обрабатывается.

Вложенность операторов цикла не ограничена.

————————————

Для организации цикла типа WHILE  я использую следующую конструкцию:

    FOR переменная FROM  1   TO    10  (граница цикла любая)

 В тело ЦИКЛА ставим следующий условный блок:

IF   условие цикла BREAK     ELSE  переменная=1  END IF

   последовательность инструкций
END FOR

Если надо, чтобы цикл исполнялся хотя бы раз,  то условный блок ставим  в конце цикла,

иначе условный блок помещаем сразу после оператора FOR.

   ПЕРЕМЕННАЯ   в теле цикла (последовательность инструкций)   для вычислений не используется.

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

 то оператор BREAK заменяем на RETURN

Цикл на убывание переменной делается следующим образом:

FOR переменная  FROM значение1  TO   значение2

   переменная2 = значение2  + значение1   — переменная

В теле цикла для вычислений используется переменная2, которая убывает от значение2 до значение1.

Tags: ,

Автор: Николай Камынин

Учитывая, указанные ранее  ограничения, рассмотрим примеры функций из библиотеки автора:

БИБЛИОТЕКА ФУНКЦИЙ NK

Функции преобразования даты и времени:

FUNC DateTimeSesLoc() ‘определение даты сессии локального времени и текущей даты

MAP=GET_TRADE_DATE () ‘дата торговой сессии

Y_M_D1() ‘распаковка даты торговой сессии

DateTrade=DATE(YEAR,MONTH,DAY) ‘дата торговой сессии в формате YYYYMMDD

MAP=GET_DATETIME ()  ‘текущая дата и время

Y_M_D()  ‘распаковка текущей даты

DateLast=DATE(YEAR,MONTH,DAY) ‘дата в формате YYYYMMDD

H_M_S()  ‘распаковка текущего времени

T=0+TIME(HOUR,MIN,SEC‘текущее время в формате hhmmss

LOCALTIME=GET_INFO_PARAMLOCALTIME«)    ‘локальное время компьютера hh:mm:ss

Time_ID=0+HMS(LOCALTIME‘время hh:mm:ss в hhmmss будем использовать как код транзакции

‘—————

END FUNC

‘——————————

FUNC Y_M_D1()  ‘распаковка даты

YEAR=GET_VALUE(MAP, «YEAR»)

MONTH=GET_VALUE(MAP, «MONTH»)

DAY=GET_VALUE(MAP, «DAY»)

DW=GET_VALUE(MAP, «DAYOFWEEK»)

END FUNC

‘——————————

FUNC Y_M_D()  ‘распаковка текущей даты

Y_M_D1()  ‘распаковка даты

DW=GET_VALUE(MAP, «DAYOFWEEK«)

DD_MM_YYYY=GET_VALUE(MAP, «DATETIME»)

DateLastString=SUBSTR (DD_MM_YYYY, 6,4) & SUBSTR (DD_MM_YYYY, 3,2) & SUBSTR (DD_MM_YYYY,0,2) 

END FUNC

‘——————-

FUNC H_M_S()  ‘распаковка текущего времени

HOUR=GET_VALUE(MAP, «HOUR»)

MIN=GET_VALUE(MAP, «MIN»)

SEC=GET_VALUE(MAP, «SEC»)

‘MLS=GET_VALUE(MAP, «MILLISEC»)

END FUNC

‘——————-

FUNC HMS(LTime‘распаковка времени из формата hh:mm:ss в формат hhmmss

result=SUBSTR (LTime,0,2) & SUBSTR (LTime, 3,2) & SUBSTR (LTime, 6,2)

END FUNC

‘——————-

FUNC Y_M_D_H_M(LDat‘распаковка текущего времени

Y_M_D(LDat)  ‘распаковка текущей даты

H_M_S(LDat)  ‘распаковка текущего времени

END FUNC

‘——————-

FUNC DATE(YEAR,MONTH,DAY )  ‘дата в формате YYYYMMDD

  result=(YEAR*100+MONTH)*100+DAY

END FUNC

‘——————-

FUNC TIME(HOUR,MIN,SEC )      ‘время в формате hhmmss

 result=(HOUR*100+MIN)*100+SEC 

END FUNC

‘——————-

FUNC DecrTIME(HHMMSS,STEP )  ‘перевод назад на STEP минут, вывод hhmmss

HM1=FLOOR (HHMMSS/100)

H1=FLOOR (HM1/100)

M1=HM1-H1*100

S1=HHMMSS-100*(H1*100+M1)

S1=H1*3600+M1*60+S1- STEP*60

IF S1>0

result=SEC_TO_HHMMSS(S1)

ELSE

result=0

END IF

END FUNC

‘——————-

FUNC IncTIME(HHMMSS,STEP )  ‘перевод вперед на STEP минут, вывод hhmmss

HM1=FLOOR (HHMMSS/100)

H1=FLOOR (HM1/100)

M1=HM1-H1*100

S1=HHMMSS-100*(H1*100+M1)

S1=H1*3600+M1*60+S1+STEP*60

result=SEC_TO_HHMMSS(S1)

END FUNC

‘——————

FUNC SEC_TO_HHMMSS(TimeToSec)        ‘перевод из секунд в формат HHMMSS

TEMP=TimeToSec

H2=FLOOR (TEMP/3600)

MS2=TEMP-H2*3600

M2=FLOOR (MS2/60)

S2=MS2-60*M2

 result=(H2*100+M2)*100+S2 

END FUNC

‘————

FUNC HHMMSS_TO_MIN(HHMMSS)        ‘перевод времени из HMMSS в минуты

H2=FLOOR (HHMMSS/3600)

MS2=HHMMSS-H2*3600

M2=FLOOR (MS2/60)

 result=H2*60+M2 

END FUNC

 

Tags: ,

Автор: Николай Камынин

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

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

        QPILE имеет особенности и ограничения.

    Однако,учитывая эти особенности можно программировать практически любые стратегии.

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

            Первой особенностью языка является наличие фактически лишь двух форматов данных –DOUBLE  и STRING, с плавающей точкой и строковых соответственно.

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

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

         Второй особенностью QPILE является отсутствие областей видимости  переменных.

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

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

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

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

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

Определения такой переменной выполняется оператором  NEW_GLOBAL(“Y”, 10) – определяет переменную Y с начальным значением 10. Оператор NEW_GLOBAL(“X”, CREATE_MAP ())  определяет ассоциативный массив с именем X.

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

            Для программирования механических торговых систем (МТС) или торговых роботов рекомендую разработать библиотеку программ.

Tags: , ,