БИБЛИОТЕКА ФУНКЦИЙ для QUIK на QPILE

18 февраля, 2010

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

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

БИБЛИОТЕКА ФУНКЦИЙ 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

 

ПРОГРАММИРОВАНИЕ ТОРГОВЫХ РОБОТОВ для QUIK на QPILE

18 февраля, 2010

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

            В широко используемом торговом терминале 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 будут сохранять свои значения, полученные ими в прошедшем цикле.

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