15
Июн

QUIK. LUA. Свой Индикатор

Posted by: Kamynin   in QLUA, QUIK

Известно, что в торговом терминале QUIK есть встроенные индикаторы и есть возможность написать собственный индикатор на языке программирования LUA.

Сравнительно просто написать индикатор на основе параметров свечи либо используя данные с графика другого индикатора.

Но часто у трейдеров возникает желание сделать свой индикатор, в котором используются данные из таблицы текущих значений.

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

В данной заметке выкладываю пример создания собственного индикатора в торговом терминале QUIK на основе любых параметров с возможностью сохранения истории индикатора для дальнейшего отображения либо использования в торговых роботах.

Обобщенный алгоритм построения такого индикатора следующий:

Скрипт индикатора условно разделяется на две части.

В первой его части function param() рассчитываем наш индикатор.

Во второй части function OnCalculate(i) обеспечиваем сохранение значений индикатора в файле и отображение на графике.

Пример такого индикатора, который рассчитывает отношение спроса и предложения.

name="nk_BID_OFFER"
Settings={}; Settings.Name =name; Settings.line ={};
-----------------
function param()
pr1=tonumber(getParamEx (clas,sec,"NUMBIDS").param_value); 
pr2=tonumber(getParamEx (clas,sec,"NUMOFFERS").param_value);
if pr2 and pr1 and pr2~=0 then x_par=0.001*math.floor(1000*pr1/pr2);end
end
-----------------
function OnCalculate(i)
local size=Size(); local Ti=T(i);
DT=100*(100*(Ti.year-2000)+Ti.month)+Ti.day;
TT=100*(100*Ti.hour+Ti.min)+Ti.sec;
if i==1 then
 local tinfo=getDataSourceInfo();
 cl,se,int=tinfo.class_code,tinfo.sec_code,tinfo.interval;
 path=getScriptPath().."/"..cl..se.."_"..int.."_"..name;  
   i_old=0;
else
 local fn=path..DT..".txt";
 if DT~=D_old then 
  if file then file:close(); end
  file=io.open(fn,"r+"); 
  if file then file:seek("cur"); s_ind=file:read(); end
end
 x_par=nil;
 if size>i then
  if s_ind then 
   local t={}; for s1 in string.gmatch(s_ind,"%S+") do 
       t[#t+1]=tonumber(s1); end
     if TT and #t>0 and TT>=t[1] then x_par=t[2]; 
          s_ind=file:read(); end
  end
else
  if file==nil then file=io.open(fn,"w"); file:close();
  file=io.open(fn,"r+"); end
 param();
if x_par and i_old~=i and x_par>0 then
 local s=tostring(TT).." ".. tostring(x_par).."\n";
 if file then file:seek("end"); end
 file:write(s);  file:flush(); end
end
end
D_old=DT;T_old=TT;x_old=x_par; i_old=i;
if x_par then
   if x_par>1 then return x_par else return nil,x_par end
end
end
----------------
function Init()
local t=Settings.line;
t[#t+1]={Name= "x1",Color=RGB(0,255,0),Type =4,Width = 2}
t[#t+1]={Name= "x2",Color=RGB(255,0,0),Type = 4,Width =2}
 return #t
end
---------------
function OnDestroy () if file then file:close(); end end

Данный скрипт создает файл в каталоге индикаторов и пишет в него время и значение индикатора.

Если значение индикатора больше 1, то его цвет на графике будет зеленый, иначе -красный.

Пример индикатора на графике (третье окно сверху).

This entry was posted on Понедельник, 15 июня, 2020 at 11:54 and is filed under QLUA, QUIK. You can follow any responses to this entry through the RSS 2.0 feed. Both comments and pings are currently closed.

Comments are closed at this time.