zveno013 (Автор тем)

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

Страницы: 1
Дискретные линии индикатора, Как заставить линию индикатора прерываться (исчезать периодами)
 
Цель:
Создаю индикатор демоторга по другим индикаторам, для чего требуется отрисовать на графике истории цены линии от точки покупки до точки продажи.

Проблема:
Линии индикатора непрерывны. Я заполняю линию индикатора значением nil и в точках покупки и продажи устанавливаю ей значение цены. В итоге линия при первом значении появляется, идёт зигзагом по установленным точкам и пропадает на последней установленной мной цене. Не смог заставить линию периодически пропадать.

Что имеется:
Индикатор сделал и работает, но на ужасном костыле. Линию отрисовываю точками так как при значении nil точка пропадает, но отсюда проблема в линии от покупки до продажи. Сначала всю линию индикатора я заполняю значениями nil, а обратным циклом и функцией SetValue() перетираю интерполированными значениями между ценой покупки и продажи (вызывается на свече демопродажи цикл с обратным перебором  всех свечей до свечи покупки). Получается красиво, но ужасно тормозит (скрин ниже). Код цикла выполняемого внутри функции OnCalculate(i) интерполяции прикладываю.
Код
for j = sdelka, i do -- sdelka - содержит индекс свечи покупки
    local d = (j - sdelka) / (i - sdelka)
    local c = a * (1 - d) + b * d
    SetValue(j, 1, c)
end

Глобальные переменные индикатора, не работает код индикатора на lua при попытке обратится к переменной объявленной в функции Init()
 
Не работает код индикатора на lua при попытке обратиться к переменной объявленной в функции Init()
Но всё бы ничего, если в одном коде индикатора он работает, а в другом не работает.

Вот код индикатора в котором обращение к  переменной VuEma Не работает как ожидается:
(переменная VuEma в message() выводит 4 раза сообщения вместо мною ожидаемой 1 один раз.:
VuEma = 1
VuEma = -nan(ind)
VuEma = -nan(ind)
VuEma = -nan(ind)
Как я понимаю индикатор пересчитывается зачем то 4 раза, и лишь первый раз он работает как мне нужно, но в итоге отрисовывается только первые две линии на экране.
Код
Settings = {}
Settings = {
    Name = "KEZ_Casper",
    period = 28,
    period2 = 28,
    line = {{
        Name = "Casper",
        Color = RGB(255, 0, 0),
        Type = TYPE_LINE,
        Width = 1
    }, {
        Name = "A",
        Color = RGB(0, 100, 100),
        Type = TYPE_LINE,
        Width = 1
    }, {
        Name = "B",
        Color = RGB(100, 100, 0),
        Type = TYPE_LINE,
        Width = 1
    }}
}

function Init()
    VuEma = 1
    Vu = 0
    Pu = 0
    Pd = 0
    F = 0
    return #Settings.line
end

function OnCalculate(index)
   if index == 1 then 
      message("VuEma = " .. VuEma)
   end

    if O(index) < C(index) then
        -- положительная свеча
        Pu = H(index) - L(index)
        Pd = H(index) - C(index) + O(index) - L(index)
    else
        -- отрицательная свеча
        Pu = H(index) - O(index) + C(index) - L(index) 
        Pd = H(index) - L(index) 
    end
    Vd = (Pd * V(index)) / (Pu + Pd) 
    Vu = V(index) - Vd 
    F = 2 / (Settings.period + 1)
  
    VuEma = Vu * F + VuEma * (1 - F)

    return Vu, -Vd, VuEma
end
Страницы: 1
Наверх