Компилятор NKQPL разработан с целью облегчения создания роботов и советников на встроенном, в торговый терминал QUIK, интерпретаторе языка QPILE.
Возможности компилятора:
1) Организация библиотек функций
2) Организация библиотек макросов
3) Организация отдельных проектов
4) Сборка сложных проектов , включающих большое число функций и макросов
5) Обнаружение ошибок
Некоторые определения:
Макрос — фрагмент кода программы, который имеет свое имя и формальные переменные.
Макрос отличается от функции тем, что при компиляции программы фрагмент заменяющего кода вставляется на место макроса. Таким образом, макрос не увеличивает время исполнения программы, а лишь делает ее более читаемой на этапе разработки.
Как известно, программа на QPILE состоит из трех частей:
- «Заголовок» – наименование определение основных параметров,
- «Тело программы» – собственно код программы,
- «Описание столбцов таблицы» – определение названий столбцов и формата соответствующих им ячеек программируемой таблицы.
1. Заголовок программы на QPILE имеет вид:
PORTFOLIO_EX название;
DESCRIPTION описание программы;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMID;
PROGRAM — ‘ ключевое слово начала программы
В среде NKQPL, мы запишем два макроса именами title в файл title.qpl.
А в тексте программы запишем :
# title название , описание программы
Когда компилятор будет собирать нашу программу для запуска ее на исполнение, он подставит в начале программы небоходимые операторы QPILE с указанном в макросе текстом
2. Тело программы — это собственно программа робота.
Для включения своих функций в программу на QPILE предназначен оператор INCLUDE file1, file2,…,fileN;
который включается в текст программы между заголовком и телом программы.
Таким образом, изначально Вы сами должны постоянно следить за тем,
какие функции и в каких файлах у вас хранятся.
Какие из них требуются для данного проекта , а какие следует исключить, чтобы не грузить лишнего в терминал или не отдавать клиентам.
При использовании компилятора, вам вообще нет необходимости в операторе INCLUDE
Компилятор сам определит по тексту Вашей программы, какие функции Вы используете, какие из этих функций встроенные в интерпретатор, а какие являются внешними (вашими или сторонними) разработками и их необходимо подключить. Если он не найдет требуемых функций, то сообщит об этом.
Собирая программу для исполнения, NKQPL выберет из библиотеки требуемые функции и допишет их в загружаемый файл портфеля. При этом, компилятор убирает все комментарии и лишние пробелы.
Таким компилятор уменьшает объем загружаемой памяти.
Кроме того ( опция) , возможна экономия числа переменных, путем определения локальных в теле функции переменных.
Таким образом, с компилятором NKQPL, Вам больше не надо грузить себя заботой о выборе нужных функций.
Вы можете совершенствовать существующие функции и разрабатывать новые, записывая из в библиотеку .
Для указания компилятору места хранения библиотечных функций предназначен псевдо оператор:
# pathlib C:\NK_QPILE — путь к каталогу библиотеки LIB
4. Описание столбцов таблицы
Описание столбцов программируемой таблицы размещается после тела программы.
На описание каждого столбца таблицы требуется 5 строк кода. Ниже представлено описание таблицы одной из моих разработок. Таблица содержит 36 столбцов, что составляет 180 строк плюс две строки – завершение программы и завершение портфеля.
Таким образом, если таблица содержит 36 столбцов, то еще не начиная разработку тела программы, мы должны написать в программу , с учетом заголовка и вставки файлов функций 188 строк .
END_PROGRAM – оператор окончания тела программы
PARAMETER NAME;
PARAMETER_TITLE NAME;
PARAMETER_DESCRIPTION NAME;
PARAMETER_TYPE STRING(20);
END
PARAMETER SECCODE;
PARAMETER_TITLE SECCODE;
PARAMETER_DESCRIPTION SECCODE;
PARAMETER_TYPE STRING(20);
END
PARAMETER CLASSCODE;
PARAMETER_TITLE CLASSCODE;
PARAMETER_DESCRIPTION CLASSCODE;
PARAMETER_TYPE STRING(12);
END
PARAMETER D;
PARAMETER_TITLE D;
PARAMETER_DESCRIPTION D;
PARAMETER_TYPE STRING(8);
END
PARAMETER T;
PARAMETER_TITLE T;
PARAMETER_DESCRIPTION T;
PARAMETER_TYPE STRING(8);
END
PARAMETER BS;
PARAMETER_TITLE BS;
PARAMETER_DESCRIPTION BS;
PARAMETER_TYPE STRING(12);
END
PARAMETER QR;
PARAMETER_TITLE QR;
PARAMETER_DESCRIPTION QR;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER DC;
PARAMETER_TITLE DC;
PARAMETER_DESCRIPTION DC;
PARAMETER_TYPE STRING(8);
END
PARAMETER DP;
PARAMETER_TITLE DP;
PARAMETER_DESCRIPTION DP;
PARAMETER_TYPE STRING(8);
END
PARAMETER TP;
PARAMETER_TITLE TP;
PARAMETER_DESCRIPTION TP;
PARAMETER_TYPE STRING(6);
END
PARAMETER Q_N;
PARAMETER_TITLE Q_N;
PARAMETER_DESCRIPTION Q_N;
PARAMETER_TYPE NUMERIC(6,0);
END
PARAMETER C_B;
PARAMETER_TITLE C_B;
PARAMETER_DESCRIPTION C_B;
PARAMETER_TYPE NUMERIC(6,0);
END
PARAMETER C_S;
PARAMETER_TITLE C_S;
PARAMETER_DESCRIPTION C_S;
PARAMETER_TYPE NUMERIC(6,0);
END
PARAMETER P_V;
PARAMETER_TITLE P_V;
PARAMETER_DESCRIPTION P_V;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER TC;
PARAMETER_TITLE TC;
PARAMETER_DESCRIPTION TC;
PARAMETER_TYPE STRING(8);
END
PARAMETER TS;
PARAMETER_TITLE TS;
PARAMETER_DESCRIPTION TS;
PARAMETER_TYPE STRING(10);
END
PARAMETER TF;
PARAMETER_TITLE TF;
PARAMETER_DESCRIPTION TF;
PARAMETER_TYPE STRING(10);
END
PARAMETER PR;
PARAMETER_TITLE PR;
PARAMETER_DESCRIPTION PR;
PARAMETER_TYPE STRING(8);
END
PARAMETER NUM;
PARAMETER_TITLE NUM;
PARAMETER_DESCRIPTION NUM;
PARAMETER_TYPE STRING(16);
END
PARAMETER QTY;
PARAMETER_TITLE QTY;
PARAMETER_DESCRIPTION QTY;
PARAMETER_TYPE NUMERIC(8,0);
END
PARAMETER PPOZ;
PARAMETER_TITLE PPOZ;
PARAMETER_DESCRIPTION PPOZ;
PARAMETER_TYPE STRING(10);
END
PARAMETER PRICE;
PARAMETER_TITLE PRICE;
PARAMETER_DESCRIPTION PRICE;
PARAMETER_TYPE STRING(10);
END
PARAMETER PROFIT;
PARAMETER_TITLE PROFIT;
PARAMETER_DESCRIPTION PROFIT;
PARAMETER_TYPE STRING(10);
END
PARAMETER VAL;
PARAMETER_TITLE VAL;
PARAMETER_DESCRIPTION VAL;
PARAMETER_TYPE STRING(10);
END
PARAMETER COM;
PARAMETER_TITLE COM;
PARAMETER_DESCRIPTION COM;
PARAMETER_TYPE STRING(10);
END
PARAMETER OFFER;
PARAMETER_TITLE OFFER;
PARAMETER_DESCRIPTION OFFER;
PARAMETER_TYPE STRING(10);
END
PARAMETER BID;
PARAMETER_TITLE BID;
PARAMETER_DESCRIPTION BID;
PARAMETER_TYPE STRING(10);
END
PARAMETER STOPLoss;
PARAMETER_TITLE STOPLoss;
PARAMETER_DESCRIPTION STOPLoss;
PARAMETER_TYPE STRING(10);
END
PARAMETER TakeProfit;
PARAMETER_TITLE TakeProfit;
PARAMETER_DESCRIPTION TakeProfit;
PARAMETER_TYPE STRING(10);
END
PARAMETER OFFSET;
PARAMETER_TITLE OFFSET;
PARAMETER_DESCRIPTION OFFSET;
PARAMETER_TYPE STRING(4);
END
PARAMETER OFFSET_UNITS;
PARAMETER_TITLE OFFSET_UNITS;
PARAMETER_DESCRIPTION OFFSET_UNITS;
PARAMETER_TYPE STRING(20);
END
PARAMETER SPREAD;
PARAMETER_TITLE SPREAD;
PARAMETER_DESCRIPTION SPREAD;
PARAMETER_TYPE STRING(4);
END
PARAMETER SPREAD_UNITS;
PARAMETER_TITLE SPREAD_UNITS;
PARAMETER_DESCRIPTION SPREAD_UNITS;
PARAMETER_TYPE STRING(20);
END
PARAMETER MARKET_STOP_LIMIT;
PARAMETER_TITLE MARKET_STOP_LIMIT;
PARAMETER_DESCRIPTION MARKET_STOP_LIMIT;
PARAMETER_TYPE STRING(4);
END
PARAMETER MARKET_TAKE_PROFIT;
PARAMETER_TITLE MARKET_TAKE_PROFIT;
PARAMETER_DESCRIPTION MARKET_TAKE_PROFIT;
PARAMETER_TYPE STRING(4);
END
PARAMETER PQ;
PARAMETER_TITLE PQ;
PARAMETER_DESCRIPTION PQ;
PARAMETER_TYPE STRING(8);
END
PARAMETER R;
PARAMETER_TITLE R;
PARAMETER_DESCRIPTION R;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER S;
PARAMETER_TITLE S;
PARAMETER_DESCRIPTION S;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER O;
PARAMETER_TITLE O;
PARAMETER_DESCRIPTION O;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER H;
PARAMETER_TITLE H;
PARAMETER_DESCRIPTION H;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER L;
PARAMETER_TITLE L;
PARAMETER_DESCRIPTION L;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER C;
PARAMETER_TITLE C;
PARAMETER_DESCRIPTION C;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER V;
PARAMETER_TITLE V;
PARAMETER_DESCRIPTION V;
PARAMETER_TYPE NUMERIC(8,0);
END
PARAMETER BH;
PARAMETER_TITLE BH;
PARAMETER_DESCRIPTION BH;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER BM;
PARAMETER_TITLE BM;
PARAMETER_DESCRIPTION BM;
PARAMETER_TYPE NUMERIC(8,2);
END
PARAMETER BL;
PARAMETER_TITLE BL;
PARAMETER_DESCRIPTION BL;
PARAMETER_TYPE NUMERIC(8,2);
END
END_PORTFOLIO_EX
При использование NKQPL, мы помещаем описание таблицы в файл OWN.qpl, а в программе пишем одну строку
# OWN
Компилятор вставит описание таблицы при сборке окончательного варианта, а на начальном этапе разработки программы, вместо 187 строк, мы должны записать всего три строки
# pathLib C:\NK_QPILE
# TITLE название, описание
… тело программы
# OWN
Примечание: компилятор NKQPL распространяется на коммерческой основе.