Вопрос по индикатору.

Страницы: 1
RSS
Вопрос по индикатору.
 
Добрый день!
Пытаюсь разобраться с индикаторами. Появился вопрос. Есть индикатор, который вычисляет разность между двумя свечками другого индикатора. Добавляю его на тиковый график в quikjunior, он работает и показывает разность двух свечей-тиков. Перезапускаю quikjunior, оставив индикатор на графике, он перестает работать и вычислять разность, так как свеча s0 все время равна нулю. Подскажите ошибку и что делаю не так.

Settings = {
Name = "**Raznost_SiU1_MyRobot",
tag_graf="SMA_SiU1",
line = {
{
Name = "AMA",
Type = TYPE_LINE,
Color = RGB(221, 44, 44)
}
},
}

function Init()
return 1
end

function OnCalculate(Index)
local Candle_Count = getNumCandles(Settings.tag_graf)
local candel_prav=Candle_Count-Index
PrintDbgStr("Candle_Count"..type2str(Candle_Count))
PrintDbgStr("candel_prav"..type2str(candel_prav))

local s1=GetGraphValueByCandle(Settings.tag_graf, candel_prav+1, 0)
local s0=GetGraphValueByCandle(Settings.tag_graf, candel_prav, 0) or s1
PrintDbgStr("s0"..type2str(s0))
PrintDbgStr("s1"..type2str(s1))
s0=math_round(s0.close,7)
s1=math_round(s1.close,7)

PrintDbgStr("Index"..type2str(Index))
PrintDbgStr("s0"..type2str(s0))
PrintDbgStr("s1"..type2str(s1))


local razn=s0-s1
PrintDbgStr("razn"..type2str(razn))
return razn
end



--Функция преобразования переменной любого типа и таблицы в строку
function table2string(table)--запись таблицы в строку
local k,v,str=0,0,""
for k,v in pairs(table) do
if type(v)=="string" or type(v)=="number" then
str=str..k.."="..v..';'
elseif type(v)=="table"then
str=str..k.."={"..table2string(v).."};"
elseif type(v)=="function" or type(v)=='boolean' then
str=str..k..'='..tostring(v)..';'
end
end
return str
end

--Функия добавления типа переменной и значения при использовании PrintDbgStr()
function type2str(value)
local t,str=type(value),""
if t=="string" or t=="number" then
str=":|"..t.."|"..value
elseif t=="table"then
str=table2string(value)
str=":|"..t.."|"..str
elseif t=="function" or t=='boolean' then
str=":|"..t.."|"..tostring(value)
end
return str
end

------------------------------------------------------
--Функция возвращает свечу (таблицу) графика
------------------------------------------------------
function GetGraphValueByCandle(tag, candle_num, line)
--[[
tag - тэг графика\индикатора,
candle_num - номер запрашиваемой свечи(СПРАВА): 0 - текущая, 1 - предыдущая и тд,
line - номер линии графика\индикатора]]
  --PrintDbgStr("Пуск GetGraphValueByCandle,tag="..type2str(tag))
local CandleCount = getNumCandles(tag)--получает количество свечей по идентификатору tag
--PrintDbgStr("GetGraphValueByCandle,CandleCount="..type2str(CandleCount))
   local LinesCount = getLinesCount(tag)--получения количества линий в графике
   local c_num = candle_num
   if ( candle_num == nil or candle_num==0 ) then
       c_num = CandleCount-1
   end
   if (candle_num>0)then
       c_num = CandleCount-1-candle_num
   end
   if ( line == nil ) then
       line = 0
   end
   if (CandleCount == nil or LinesCount == nil) then
       message("qlib.GetGraphValueByCandle(): error occured, cannot aqquire candle or line data"..tag,3)
       return 0
   end
   if (tag == nil) then
       message("qlib.GetGraphValueByCandle(): error occured, tag is nil"..tag,3)
       return 0
   end
   t, num, legend = getCandlesByIndex(tag, line, c_num, 1)--получения информации о свечках по идентификатору, график должен быть открыт
--[[Формат вызова getCandlesByIndex():
TABLE t, NUMBER n, STRING l getCandlesByIndex (STRING tag, NUMBER line, NUMBER first_candle, NUMBER count)
Параметры:
• tag – строковый идентификатор графика или индикатора,
• line – номер линии графика или индикатора. Первая линия имеет номер 0,
• first_candle – индекс первой свечки. Первая (самая левая) свечка имеет индекс 0,
• count – количество запрашиваемых свечек.
Возвращаемые значения:
• t – таблица, содержащая запрашиваемые свечки,
• n – количество свечек в таблице t,
• l – легенда (подпись) графика.]]
   --PrintDbgStr("t"..type2str(t))
--PrintDbgStr("num"..type2str(num))
--PrintDbgStr("legend"..type2str(legend))
if ( num == 0 ) then
       message("qlib.GetGraphValueByCandle(): error occured, no candles aqquired"..tag,3)
       return 0
   end
--PrintDbgStr("return GetGraphValueByCandle,t[0]"..type2str(t[0]))
   return t[0]
end

function math_round( roundIn , roundDig ) -- первый аргумент - число которое надо округлить, второй аргумент - количество символов после запятой.
    local mul = math.pow( 10, roundDig )
    return ( math.floor( ( roundIn * mul ) + 0.5 )/mul )
end
 
Может быть потому, что у разных инструментов разное количество свечей?
 
Пардоньте, сейчас все работает. Тогда не очень понимаю, почему при перезагрузке до этого не работало.
Цитата
s_mike@rambler.ru написал:
Может быть потому, что у разных инструментов разное количество свечей?
Да, конечно разное, даже для одного инструмента. Но в индикаторе оно не статично.
 
Необходимо еще учитывать то, что при старте терминала индикаторы не могут инициализироваться одновременно. Текущий запустился первый, а два других, с которых данные считываются - еще нет. Или в другой последовательности.
 
Цитата
Nikolay написал:
Необходимо еще учитывать то, что при старте терминала индикаторы не могут инициализироваться одновременно. Текущий запустился первый, а два других, с которых данные считываются - еще нет. Или в другой последовательности.
думаю вы правы, спасибо
 
И ещё нужно учитывать, что на тиковых интервалах  все свечи имеют разное время. Непонятно, что вы хотите увидеть, вычитая значение Газпрома в один момент времени из значения Лукойла в другой момент.
 
Цитата
s_mike@rambler.ru написал:
И ещё нужно учитывать, что на тиковых интервалах  все свечи имеют разное время. Непонятно, что вы хотите увидеть, вычитая значение Газпрома в один момент времени из значения Лукойла в другой момент.
не, я графически строил дельту АМА для текущего и предыдущего значения одного графика. для наглядности)
Страницы: 1
Читают тему (гостей: 2)
Наверх