QPILE. Компилятор NKQPL. Макросы.

5 апреля, 2012

Применением компилятора 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.  

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

QPILE.Разработка роботов. Компилятор NKQPL (ч.2)

3 апреля, 2012

После сборки компилятором NKQPL проекта робота на QPILE, получаем два файла.

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

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

Фрагмент программы портфеля:

PORTFOLIO_EX test13_NK;
DESCRIPTION test3 автор: Николай Камынин kamnik@mail.ru 30.03.2012;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMID;
PROGRAM;
FUNC T1()
x=GET_DATETIME()
YEAR=GET_VALUE(x,»YEAR»)
MONTH=GET_VALUE(x,»MONTH»)
DAY=GET_VALUE(x,»DAY»)
DSTRING=GET_VALUE(x,»DATETIME»)
DD=YEAR
if MONTH-10<0
DD=DD&»0″
END IF
DD=DD&MONTH
if DAY-10<0
DD=DD&»0″
END IF
DD=DD&DAY
HH=GET_VALUE(x,»HOUR»)
MM=GET_VALUE(x,»MIN»)
SS=GET_VALUE(x,»SEC»)
result=60*(60*HH+MM)+SS
END FUNC
FUNC HMS(_3)
result=100*(100*SUBSTR(_3,0,2)+SUBSTR(_3,3,2))+SUBSTR(_3,6,2)
END FUNC
FUNC YMD(D)
result=SUBSTR(D,6,4)&SUBSTR(D,3,2)&SUBSTR(D,0,2)
END FUNC
FUNC Set_Ini()
ERR=0
LSEC=0
MP=CREATE_MAP()
L1=GET_FILE_LEN(fin)
FOR J7 FROM 1 TO L1
str=READ_LINE(fin,J7,ERR)

… всего 932 строки

Содержание информационного файла:

……..список QPILE.функций…….
1  NEW_GLOBAL
2  GET_INFO_PARAM
3  SUBSTR
4  DELETE_ALL_ITEMS
5  GET_DATETIME
6  GET_FILE_LEN
7  READ_LINE
8  WRITELN
9  GET_ITEM
10  GET_VALUE
11  FIND
12  APPLY_SCALE
13  set_value
14  INSERT_COLLECTION_ITEM
15  REMOVE_COLLECTION_ITEM
16  GET_NUMBER_OF
17  ADD_ITEM
18  SET_ROW_COLOR_EX
19  MODIFY_ITEM
20  SEND_TRANSACTION
21  len
22  CLEAR_FILE
23  TRIM
24  GET_CANDLE_EX
25  GET_COLLECTION_ITEM
26  GET_PARAM_EX
27  GET_CLIENT_MARGINAL_BUY_SELL_INFO
28  GET_SECURITY_INFO
29  GET_COLLECTION_COUNT
30  abs
31  CREATE_MAP
……..список внешних функций…..
1  T1
2  HMS
3  YMD
4  Set_Ini
5  RPF
6  FILT_DEPO ……. Local=( MP,J,_99,_999)
7  FILT_MONEY
8  RP
9  CALCP
10  GET_NEW_CANDLE_REAL
11  RobCom2
12  SETOWN
13  RE_STOP_ORDER
14  KILL_STOP_ORDER
15  SET_STOP_ORDER
16  Beg_tranz
17  TRANZ2
18  TimeCurrentSec
19  KILL_ORDER
20  Find_S
21  INTERVAL
22  NORM_3
23  POS_NOW
24  SET_SEC
25  FIND_SEC_OWN
26  KILL_ALL_STOP_ORDER
……………..список глобальных  переменных……….
1  INIT
2  DN
3  FT
4  LM
5  FCH
6  FCL
7  AVAILABLE
8  CBPLUSED
9  VARMARGIN
10  CBPLPLANNED
11  ML
12  DL
13  TRADEDATE
14  Micex
15  SesB
16  S_ID
17  LSEC
18  tranz
19  JTB
20  jSOB
21  JSONF
22  JONF
23  jOB
24  DH
25  fin
26  LRT_OLD
27  SR
28  SO_A
29  O_A
30  POS
31  ERR
32  QUAN
33  _ID
……………..список основных локальных переменных……….
1  TT
2  LPINGDUR
3  x
4  _HH
5  _MM
6  _SS
7  SERVERTIME
8  STIMES
9  LRT
10  fName
11  T_ID
12  MP
13  ACCOUNT
14  SECCODE
15  NUMBER
16  FUT
17  CLASSCODE
18  DP
19  TP
20  Q
21  PP
22  VALUE
23  CP
24  _B
25  _Q
26  MAP
27  _PRICE
28  _12
29  _3
30  _5
31  _51
32  QSTOP
33  FLAG
34  _53
35  L3
36  res
37  ww2
38  ww1
39  result
40  DDD
41  _8
42  _55
43  f_color
44  sst
45  len_
46  str
47  n
48  DC
49  TC
50  BS
51  price
52  PQ
53  StopLoss
54  TakeProfit
55  QR
56  TS
57  nfile
58  x1
59  y
60  _3H
61  _3M
62  _4
63  _7
64  _1
65  O
66  C
67  H
68  L
69  V
70  T
71  GO
72  VAL
73  PROFIT
74  MBS
75  Q_N
76  C_B
77  C_S
78  P_V
79  MP5
80  Name
81  M4
82  SCALE
83  LOT_SIZE
84  OFFER
85  BID
86  _81
87  TOTAL_NET
88  _82
89  _999
90  _x1
91  _x2
92  J2
93  L1
94  QTRADE
95  outst
96  POSITION_PRICE
97  DF
98  fileName
99  NP
100  _V
101  j
102  List
103  L2
104  j1
105  str2
106  YEAR
107  MONTH
108  DAY
109  DSTRING
110  DD
111  HH
112  MM
113  SS