создание индикаторов

Страницы: 1
RSS
создание индикаторов, Создание индикатора по предложенному образцу у Вас
 
вот такой пример:
--
-- Построение спреда по нескольким инструментам:
-- 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 строчке. Пожалуйста про комментируйте. Почему ошибка?  
 
примерно так выглядит сообщение:

lua: spread_ind_1.lua:15: attempt to call global 'RGB' (a nil value)
stack traceback:
spread_ind_1.lua:15: in main chunk
[C]: in ?
 
указанный пример  присутствует в Вашем материале:
"Программный комплекс QUIK –
фронт-офисная система прямого доступа
Создание индикаторов
технического анализа
с помощью скриптов Lua
Инструкция
© ARQA Technologies, октябрь 2013"
 
Здравствуйте,
Как Вы запускаете скрипт?
Скорее всего причина в том что Вы его запускаете как обычный Lua скрипт через меню.
В то время как "индикаторы" не предназначены для такого запуска, их следует добавлять в спец папку LuaIndicators и после этого индикатор появится в списке индикаторов при добавлении на график.
Об этом сказано в документации, см глава "Индикаторы технического анализа" - "Общие сведения"
 
Точно! Появился такой индикатор! Спасибо!
есть один уточняющий вопрос: вот - "price(security)" или ещё вот так: "local securityPrice = C(index) " это основной инструмент? какой?
 
Evgeny Grizli,
Это тот инструмент, на график которого Вы добавили индикатор.
 
я немного его изменил начало вот такое:
--------------------------------------------------------------------
--
-- Построение спреда по нескольким инструментам:
-- spread := k * price(security) + k1 * price(tag1) + k2 * price(tag2) + a.
-- Можно добавлять дополнительные инструменты, модифицируя код индикатора.
--

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

function Init()
   return 1
end
---------------------------------------------------------
далее не стал писать суть вот в чём:
Как видите дополнительные графики это 60 мин "SberB60" и второй Дневной "SberBD", в отдельном окне первого графика 5 минутки ниже окно я размещаю этот индикатор. Значит основным считается График 5 минутки ? Правильно я понял?
 
Evgeny Grizli,

Еще раз. Основной инструмент индикатора это тот на график которого Вы добавляете индикатор. И не важно в какой области окна он располагается.
При добавлении индикатора Вы сами явно его указываете в окне "Добавление графика" пункт "Источник данных"
Страницы: 1
Читают тему
Наверх