Написал препроцессор для обработки исходников QPILE,

который выполняет функции сборки портфеля

на основе основной программы и библиотек функций.
Кроме того, он оптимизирует код программы,

включая в него из библиотек лишь используемые функции,

убирает комментарии и выявляет обращение к функциям,

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

и пожелания по развитию данного продукта.

С целью изучения спроса на данный продукт,

принимаются предварительные заявки.

По просьбе читателей привожу текст программы , реализующей фильтр АМА Кауфмана на языке программирования  QPILE для торгового терминала QUIK

Несколько замечаний к программе.

Программа рисует график в реальном времени.

Перерисовка исторических данных не предусмотрена.

Программа вычисляет значение и отображает его на график с идентификатором равным коду инструмента, в данном примере это  SBER03 — обычная акция сбербанка.

PORTFOLIO_EX NK_AMA;
DESCRIPTION автор:  НИКОЛАЙ КАМЫНИН  16.04.2011
фильтр АМА Кауфмана;
CLIENTS_LIST ALL_CLIENTS;
FIRMS_LIST ALL_FIRMID;
PROGRAM
SECCODE=»SBER03″
New_Global(«INIT»,0)
IF INIT=0
New_Global(«FH»,24)
New_Global(«P»,10)
New_Global(«AMA»,0)
New_Global(«NOISE»,0)
New_Global(«CP»,0)
New_Global(«D_OLD»,-1)
New_Global(«T_OLD»,-1)
New_Global(«Fastest»,0.6667)
New_Global(«Slowest»,0.0645)
ERR=DELETE_ALL_LABELS(SECCODE)
CLASSCODE=GET_VALUE (GET_SECURITY_INFO («»,SECCODE), «CLASS_CODE»)
INIT=1
END IF
‘~~~~~~~~~~~~~~~~~
FUNC C(k)
Lcol=GET_COLLECTION_COUNT (CP)
IF k>Lcol
k=Lcol
END IF
result=GET_COLLECTION_ITEM(CP,k)
END FUNC
‘~~~~~~~~~~~
D= GET_INFO_PARAM («TRADEDATE»)
DATE=SUBSTR (D,6,4) & SUBSTR (D,3,2) & SUBSTR (D,0,2)
TIME=GET_PARAM (CLASSCODE,SECCODE,»TIME»)
IF DATE-D_OLD!=0 OR TIME-T_OLD!=0
x=GET_PARAM (CLASSCODE,SECCODE,»last»)
CP=INSERT_COLLECTION_ITEM(CP,0,x)

‘~~~~~~вычисление нового значения фильтра~~~~~~~~

SIGNAL = ABS(C(0)-C(P))
NOISE=NOISE+ABS(C(0)-C(1))-ABS(C(P+1)-C(P))
ER=0
If Noise > 0
ER = SIGNAL/NOISE
END IF
Smooth = ER*(Fastest- Slowest) + Slowest
AMA = AMA + Smooth *
Smooth * (C(0)-AMA)

»~~~~~~~~~конец вычислений нового значения ~~~~~~~~~

st=SET_VALUE(«»,»AMA»,AMA)
ADD_ITEM (0, st)
‘~~~~~~~~~~~~
M_AMA=SET_VALUE(SET_VALUE(«»,»DATE»,DATE),»TIME»,TIME)
M_AMA=SET_VALUE(AMA,»YVALUE»,AMA)

M_AMA=SET_VALUE(SET_VALUE(SET_VALUE(M_AMA,»B»,255),»G»,255),»R»,0)
M_AMA=SET_VALUE(SET_VALUE(M_AMA,»TEXT»,»-«),»FONT_HEIGHT»,FH)

id=ADD_LABEL (SECCODE,M_AMA)
D_OLD=DATE
T_OLD=TIME
END IF
END_PROGRAM
PARAMETER AMA;
PARAMETER_TITLE AMA;
PARAMETER_DESCRIPTION AMA;
PARAMETER_TYPE STRING(10);
END

Inputs: Period(10);

Vars: Signal(0), Noise(0), Diff(0), ER(0), Smooth(1), Fastest(.6667), Slowest(.0645), AMA(0);

Diff = AbsValue(Close — Close[1]);

IF CurrentBar <= Period Then AMA = Close;

IF CurrentBar > Period Then Begin

Signal = AbsValue(Close — Close[Period]);

Noise = Summation(Diff, Period);

If Noise > 0 then ER = Signal / Noise;

Smooth = Power(ER ∗ (Fastest — Slowest) + Slowest, 2);

AMA = AMA[1] + Smooth ∗ (Close — AMA[1]);

End;

Plot1( AMA, «AMA»);