QPILE. Разработка роботов. SciTe + NKQPL

1 апреля, 2012

В качестве среды разработки предлагается использовать редактор текста SciTe со встроенными возможностями раскраски операторов языка QPILE и интерактивными подсказками.

Кроме того, в меню редактора встроен вызов компилятора NKQPL.

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

Вот так выглядит программа на QPILE в реадкторе SciTe:

 

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

1 апреля, 2012

      Компилятор NKQPL разработан с целью облегчения создания роботов и советников на встроенном, в торговый терминал QUIK, интерпретаторе языка QPILE.

  Возможности компилятора:

1) Организация библиотек функций
2) Организация библиотек макросов
3) Организация отдельных проектов
4) Сборка сложных проектов , включающих большое число функций и макросов
5) Обнаружение ошибок
Некоторые определения:
Макрос — фрагмент кода программы, который имеет свое имя и формальные переменные.

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

Как известно, программа на QPILE состоит из трех частей:

  1. «Заголовок» – наименование  определение основных параметров,
  2. «Тело программы» – собственно код программы,
  3. «Описание столбцов таблицы» – определение названий столбцов и формата соответствующих им ячеек программируемой таблицы.

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 распространяется на коммерческой основе.