Известно, что в торговом терминале 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, то его цвет на графике будет зеленый, иначе -красный.
Пример индикатора на графике (третье окно сверху).