Evgeny Grizli (Автор тем)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
создание индикаторов, Создание индикатора по предложенному образцу у Вас
 
вот такой пример:
--
-- Построение спреда по нескольким инструментам:
-- spread := k * price(security) + k1 * price(tag1) + k2 * price(tag2) + a.
-- Можно добавлять дополнительные инструменты, модифицируя код индикатора.
--

Settings = {
   Name = "SpreadIndicator",
   k = 1, -- коэффициент, с которым учитывается цена основного инструмента
   tag1 = "SberB", -- метка графика, откуда берётся цена дополнительного инструмента 1
   tag2 = "SberB60", -- метка графика, откуда берётся цена дополнительного инструмента 2
   k1 = -5, -- коэффициент, с которым учитывается цена дополнительного инструмента 1
   k2 = -5, -- коэффициент, с которым учитывается цена дополнительного инструмента 2
   a = 0, -- свободный член
   line = { { Name = "Spread", Color = RGB(0, 0, 255), Type = TYPE_LINE, Width = 1, } }
}

function Init()
   return 1
end

local function getTimeCode(dt)
   return (dt.year * 10000 + dt.month * 100 + dt.day) * 1000000 + (dt.hour * 10000 + dt.min * 100 + dt.sec)
end

--- Найти свечу, относящуюся к заданному времени или предшествующую ему, если для заданного времени нет свечи.
-- @param tag строковый идентификатор графика или индикатора
-- @param timeCode метка времени в формате yyyymmddhhmmss
-- @return искомая свеча или nil, если свеча не найдена.
local function getCandleByTimeCode(tag, timeCode)
   local numCandles = getNumCandles(tag)
   if numCandles < 2 then
       return nil
   end
   local lastCandle, n, _ = getCandlesByIndex(tag, 0, numCandles - 1, 1)
   if n ~= 1 then
       return nil
   end
   lastCandle = lastCandle[0]
   if getTimeCode(lastCandle.datetime) <= timeCode then
       return lastCandle
   end
   local b = numCandles - 1
   local a = b - 1
   local candle
   while true do
       local firstCandle, n, _ = getCandlesByIndex(tag, 0, a, 1)
       if n ~= 1 then
           return nil
       end
       firstCandle = firstCandle[0]
       local firstTimeCode = getTimeCode(firstCandle.datetime)
       if firstTimeCode == timeCode then
           return firstCandle
       elseif firstTimeCode < timeCode then
           candle = firstCandle
           break
       elseif a == 0 then
           return nil
       else
           a = math.max(0, 2 * a - b)
       end
   end
   while true do
       local c = math.floor((a + b) / 2)
       if c == a then
           return candle
       else
           local middleCandle, n, _ = getCandlesByIndex(tag, 0, c, 1)
           if n ~= 1 then
               return nil
           end
           middleCandle = middleCandle[0]
           local middleTimeCode = getTimeCode(middleCandle.datetime)
           if middleTimeCode == timeCode then
               return middleCandle
           elseif middleTimeCode < timeCode then
               a, candle = c, middleCandle
           else
               b = c
           end
       end
   end
end

--- Вычислить спред.
-- @param index номер свечи на графике
-- @return значение спреда или nil, если оно неопределено
local function getSpread(index)
   local timeCode = getTimeCode(T(index))
   local securityPrice = C(index)
   if securityPrice == nil then
       return nil
   end
   -- Получение свечей дополнительных инструментов
   local candle1 = getCandleByTimeCode(Settings.tag1, timeCode)
   local candle2 = getCandleByTimeCode(Settings.tag2, timeCode)
   if candle1 == nil or candle2 == nil then
       return nil
   end
   -- Получение цен дополнительных инструментов
   local price1 = candle1.close
   local price2 = candle2.close
   if price1 == nil or price2 == nil then
       return nil
   end
   -- Вычисление спреда
   local spread = Settings.k * securityPrice
           + Settings.k1 * price1
           + Settings.k2 * price2
           + Settings.a
   return spread
end

function OnCalculate(index)
   if index > 1 then
       local spread = getSpread(index - 1)
       if spread then
           SetValue(index - 1, 0, spread)
       end
   end
   return getSpread(index)
end
---------------------------------------------------------------
Вызывает ошибку по оператору "Color" это в 15 строчке. Пожалуйста про комментируйте. Почему ошибка?  
программа индикатора, вопрос по использованию getNumCandles
 
--[[
*******************************************************************
Пример демонстрирует возможности получения данных с графиков
и индикаторов. "Свечки" индексируются по номеру.
Для исполнения также требуется наличие скрипта tpf.lua.
*******************************************************************
]]

dofile("tpf.lua")

function main(  )
file = io.open("1.txt", "w+t")
-- должен быть создан график или индикатор с идентификатором zzz
local x = getNumCandles("Сбербанк") -- получаем количество свечек на графике
local y = getLinesCount("Сбербанк") -- получаем количество линий у графика
-- у некоторых индикаторов линий может быть
-- больше чем одна
message("total ".. x .. " candles in " ..y .. " lines", 3)
for i=0,y-1 do
file:write("line = ".. i .. "\n")
-- получаем 10 первых свечей с каждой линии
t, num, legend = getCandlesByIndex("Сбербанк", i, 0, 10)
file:write("num = " .. num ..", legend = ".. legend .. "\n")
for j=0,num-1 do
--сохраняем каждую свечку в файл
table_save( "candle["..j .. "]", file, t[j])
end
end

file:close()
end

Это текст известной у Вас программы индикатора в Ваших образцах
Пожалуйста прокомментируйте использование это программе применительно на графике "Сбербанка" (взят для примера). Насколько я понял по ответы программы 0 Lines  видимо с таким идентификатором "Сбербанк" не находит свечек.
Страницы: 1
Наверх