Сложный индикатор с сохранением его данных для каждой свечи

Страницы: 1
RSS
Сложный индикатор с сохранением его данных для каждой свечи
 
Добрый день.

Хочу написать индикатор, для которого нужно сохранять данные предыдущих значений индикатора в контейнер.
Как при инициализации индикатора пройтись по всем предыдущим свечкам  и записать значения индикатора для каждой из них в контейнер?
Код
local cache_XO = {}

function cashed() -- записывает старые показания в кэш

end


-----------------------------------------------------------------------------------------------------
-- ниже функции для терминала

Settings = {
    Name = "m_XO",
   StepXO = 400, -- ценв шага
   NXO = 2, -- количество превыщшений для шага
    line = {    
    {
        Name = "Line",
        Color = RGB(15, 54, 247),
        Type = TYPE_LINE,
        Width = 2
    },
   {
        Name = "Line",
        Color = RGB(247, 63, 7),
        Type = TYPE_LINE,
        Width = 2
    }
  }
}

function Init()  
   cashed() -- записывает старые показания в кэш, для того что-бы можно было забирать старые значения
    return #Settings.line --число линий
end



function OnCalculate(index)
   local StepXO = Settings.StepXO
   local NXO = Settings.NXO
    
   local xoValue = O(index)
   local xoValue2 = nil
   if index == 0 then
      xoValue = O(index)
   else 
      xoValue = O(index)
   end
    cache_XO[index] = xoValue
   xoValue2 = xoValue + 10
   return xoValue, xoValue2
end
 
Кажется разобрался. OnCalculate проходит с номера 1 до конца? Если так то нужно просто по очереди записать данные в контейнер. Хотя нелепо начинать с 1.
 
VelikiyTrader,  Для Вашей задачи удобней писать индикатор через замыкание, где вычисления происходят в анонимной области, а не обходимые таблиц сохраняете между вызовами, почему лучше писать не буду на форуме много обсуждалось, да и разработчики предлагают этот вариант.

Вот пример расчета средней, удачи.
Код
calcMean()
    
    local Price = {} -- Инициализируем для хранения таблицу
    local Mean = {}
    
    return function (I, FSettings, ds)
        I = I or 1
        ds = ds or nil
        FSettings = FSettings or {}
        local v_t = FSettings.v_t or 'C'
        local P = FSettings.period or 9
        local max_cache_size = FSettings.max_cache_size or 5 -- Максимальный размер кэша для Mean[I]
      local x = FSettings.x or nil
        
        local p0 = x or (Value(I, v_t, ds) or 0)
        Price[I] = p0 -- сохраняем
        
        if I == 1 then 
            Price[I] = p0
            Mean[I] = p0
        end
        
        -- Освобождаем память от старых значений Price[I]
        if I > P then
            Price[I-P] = nil
        end
        
        local sum = 0
        local n = math.min(I, P) -- Ограничиваем количество значений для усреднения
        for i = n, 1, -1 do
            sum = sum + Price[I-i+1] -- Берем только последние P значений
        end
        
        local mean = sum / n or p0
        Mean[I] = mean
        
        -- Освобождаем память от старых значений Mean[I]
        if #Mean > max_cache_size then
            table.remove(Mean, 1)
        end
        
        return mean
    end
end
 
Цитата
VelikiyTrader написал:
Добрый день.

Хочу написать индикатор, для которого нужно сохранять данные предыдущих значений индикатора в контейнер.
Как при инициализации индикатора пройтись по всем предыдущим свечкам  и записать значения индикатора для каждой из них в контейнер?
может не писать индикатор куда-то, а читать индикатор с графика , когда надо.
либо записать формулу и вычислять, когда надо.
 
nikolz,  Можно и читать иногда даже удобней, только нужно помнить, что пользоваться нужно небольшим количеством открытых окон для небольшого количества тикеров. Так ка все это дело приводи к замедлению терминала, а при большой нагрузке и к зависаниям. Здесь нужно добавить что организация алгоритма через замыкание позволяет один и тот - же скрипт использовать как в индукторах, так и в потоке main() что избавляет от избыточного кода.  
 
Цитата
nikolz написал:
может не писать индикатор куда-то, а читать индикатор с графика , когда надо. либо записать формулу и вычислять, когда надо.
Для этого нужно указывать id линии на графике?
 
Цитата
VelikiyTrader написал:
Цитата
nikolz написал:
может не писать индикатор куда-то, а читать индикатор с графика , когда надо. либо записать формулу и вычислять, когда надо.
Для этого нужно указывать id линии на графике?
открываете редактировать и пишите Идентификатор
Страницы: 1
Читают тему
Наверх