По просьбе читателей привожу текст программы , реализующей фильтр АМА Кауфмана на языке программирования 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