getCandlesByIndex в индикаторе

Страницы: 1
RSS
getCandlesByIndex в индикаторе, Как используется функция getCandlesByIndex в индикаторе?
 
Пытаюсь написать простой индикатор на основе ADX. QUIK зависает  при вызове этого индикатора. сыплет ошибками "attempt to index field "?"
Код
Settings=
{
    Name = "***AAA"
}
function Init()
    
    return 1
end
function OnCalculate(index)
    plusdi,n,q = getCandlesByIndex ("SBAdx",1,0,getNumCandles("SBAdx"))  -- get +DI table
    minusdi,n,q = getCandlesByIndex ("SBAdx",2,0,getNumCandles("SBAdx")) -- get -DI table
    return handler()
end

function handler()
    if plusdi[index].close ~= nil and minusdi[index].close ~= nil then
        if plusdi[index].close > 30 then
            my_indicator = 1
        elseif minusdi[index].close > 30 then
            my_indicator = -1
        else my_indicator = 0
        end
    else my_indicator = 0
    end
    return my_indicator
end


 
Цитата
Дмитрий написал:
Пытаюсь написать простой индикатор на основе ADX. QUIK зависает  при вызове этого индикатора. сыплет ошибками "attempt to index field "?" (a nil value)
 
Добрый день.
У Вас в функции handler() используются переменная index, таблицы plusdiи minusdi, но я не вижу, чтобы вы эти данные передавали в функцию handler() (эти переменные не глобальные, соответственно они не будут видны в функции handler), сделайте вот так:
Код
function OnCalculate(index)
    plusdi,n,q = getCandlesByIndex ("SBAdx",1,0,getNumCandles("SBAdx"))  -- get +DI table
    minusdi,n,q = getCandlesByIndex ("SBAdx",2,0,getNumCandles("SBAdx")) -- get -DI table
    return handler(index, plusdi, minusdi)
end

function handler(index, plusdi, minusdi)
    if plusdi[index].close ~= nil and minusdi[index].close ~= nil then
        if plusdi[index].close > 30 then
            my_indicator = 1
        elseif minusdi[index].close > 30 then
            my_indicator = -1
        else my_indicator = 0
        end
    else my_indicator = 0
    end
    return my_indicator
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Хотя можно даже короче, т.к. только параметр index не является глобальным:
Код
function OnCalculate(index)
    plusdi,n,q = getCandlesByIndex ("SBAdx",1,0,getNumCandles("SBAdx"))  -- get +DI table
    minusdi,n,q = getCandlesByIndex ("SBAdx",2,0,getNumCandles("SBAdx")) -- get -DI table
    return handler(index)
end

function handler(index)
    if plusdi[index].close ~= nil and minusdi[index].close ~= nil then
        if plusdi[index].close > 30 then
            my_indicator = 1
        elseif minusdi[index].close > 30 then
            my_indicator = -1
        else my_indicator = 0
        end
    else my_indicator = 0
    end
    return my_indicator
end

И проверьте, возвращает ли функция getCandlesByIndex() данные, тут может быть проблема в том, что тэг 'SBAdx' не задан в свойствах индикатора ADX.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
 
Цитата
Дмитрий написал:
function   OnCalculate (index)
   plusdi,n,q  =   getCandlesByIndex  ( "SBAdx" , 1 , 0 , getNumCandles ( "SBAdx" ))   -- get +DI table
   minusdi,n,q  =   getCandlesByIndex  ( "SBAdx" , 2 , 0 , getNumCandles ( "SBAdx" ))  -- get -DI table
    return  handler()
end

function handler(index)
   if plusdi[index].close ~= nil and minusdi[index].close ~= nil then [/CODE]

1) Правильно ли, что  из plusdi[] и minusdi[] значения берутся по индексу index?
Ведь в OnCalculate индексы приходят начиная с 1, а в возвращаемых значениях массивов из getCandlesByIndex  индексы начитаются с 0...

Наверное правильно будет plusdi[index-1].close и minusdi[index-1].close ?

2) Про оптимизации.
Здесь получается, что мы в каждом OnCalculate получаем все свечи с другого графика через getCandlesByIndex(), после чего берём только какое-то одно значение...
думаю будет эффективнее написать так:

   plusdi  =   getCandlesByIndex  ( "SBAdx" , 1 , index-1 , 1)   -- get +DI table
   minusdi  =   getCandlesByIndex  ( "SBAdx" , 2 , index-1 , 1)  -- get -DI table
...
и, соответственно, данные брать как
plusdi[0].close и minusdi[0].close
Страницы: 1
Читают тему
Наверх