Глобальные переменные индикатора

Страницы: 1
RSS
Глобальные переменные индикатора, не работает код индикатора на 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
 
VuEma после конца первого прохода OnCalculate остаётся равным последнему значению. Из-за того, что проходов обычно три, следует всё изменяемое состояние индикатора инициализировать внутри условия по == 1.
 
попробуйте так ( переписал Ваш скрипт, но не проверял.)
Код
name="KEZ_Casper"
Settings={Name =name,period = 28,period2 = 28}


function OnCalculate(i)
   if i==1 then
     VuEma,Vu,Pu,Pd,F = 1,0,0,0,0
      message("VuEma = " .. VuEma)
   end
   local d=C(i)-O(i);
   Pu=H(i)-L(i); pd=Pu-d;
   if 0>d then  d=Pu; Pu=Pd;  Pd=d end     -- отрицательная свеча
    Vd=(Pd*V(i))/(Pu + Pd)
    Vu= V(i)-Vd
    F=2/(Settings.period + 1)
    VuEma = Vu * F + VuEma * (1 - F)
    return Vu, -Vd, VuEma
end

function Init()
   local t={}   Settings.line=t;
    t[#t+1]={ Name = "Casper", Color = RGB(255, 0, 0), Type = TYPE_LINE, Width = 1}
    t[#t+1]={ Name = "A",     Color = RGB(0, 100, 100), Type = TYPE_LINE, Width = 1}
    t[#t+1]={ Name = "B",  Color = RGB(100, 100, 0),  Type = TYPE_LINE,  Width = 1}
   return #t
end

 
 
funduk и nikolz, большое спасибо за оперативную помощь!

Предложение отслеживать повторную итерацию с тем же index свечи хорошее, если только не предложенный пример...  :unamused:

Пример предложенный nikolz работает без повторных итераций! Код заработал без изменений с выводом одного ожидаемого сообщения.
Чуть позже поэкспериментирую и отпишусь, с целью показать разбор своих ошибок.

Добавлю в вопросу глобальных переменных еще один:
Возможен ли доступ к глобальной переменной индикатора из скрипта lua и какими методами? (подразумевается обращение по индификатору)
 
Цитата
zveno013 написал:

Добавлю в вопросу глобальных переменных еще один:
Возможен ли доступ к глобальной переменной индикатора из скрипта lua  и какими методами? (подразумевается обращение по индификатору)
Предлагаю уточнить терминологию.
----------------
глобальные переменные есть в языке Луа, но не в индикаторе.
В индикаторе есть настраиваемые параметры, которые задаются в массиве settings
и которые можно изменять на графике через функцию окна редактирования.
------------------
Значения самого индикатора можно читать в других индикаторах с графика, если присвоить индикатору метку (см. док на библиотеку QLua)
================  
Поясните свой вопрос подробнее, можно с примером.
 
К сожалению я так и не избавился от многократного расчёта индикатора, да еще и с непредсказуемым содержанием переменных объявленных в функции Init()
А вот если раскомментировать присвоение переменным a и b, то переменные каждый проход равны.
На скриншоте многократный вывод message() из индикатора, обратите внимание на содержание переменной a.
Код
NAME = "KEZ_TEST"
Settings = {Name = NAME,period = 0.01}

function OnCalculate(i)
    if i ~= indexZ then -- проверка на повторную итерацию
        indexZ = i
        if i == 1 then
            --a, b = 23, 2
            message("a = " .. a .. "\nb = " .. b .. "\ni = " .. i)
        end
        if i == 100 then
            message("a = " .. a .. "\nb = " .. b .. "\ni = " .. i)
        end
        a = a + Settings.period
    end
    return math.sin(a), b
end

function Init()
    indexZ = 0
    a = 0
    b = 0
    local t = {}
    Settings.line = t;
    t[#t + 1] = {Name = "A",Color = RGB(0, 139, 139),Type = TYPE_LINE,Width = 1}
    t[#t + 1] = {Name = "B",Color = RGB(255, 127, 80),Type = TYPE_LINE,Width = 1}
    return #t
end


 
Цитата
zveno013 написал:
К сожалению я так и не избавился от многократного расчёта индикатора,
Это глюк КВИКА. Существует давно и избавиться от него сложно.
Можно сделать костыль, но он не удобный. Делал но потом отказался.
---------------------
Вы очевидно не правильно понимаете работу функции Init
Она вызывается один раз при загрузки скрипта.
------------------------
Надо делать как у меня написано.
т е все глобальные переменные надо устанавливать внутри onCalculate
в условии равенства индекса 1.
Страницы: 1
Читают тему
Наверх