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
Страницы: 1
Читают тему (гостей: 1)
Наверх