CandleExist не работает - можно привести рабочий и простой пример?

Страницы: 1
RSS
CandleExist не работает - можно привести рабочий и простой пример?
 
Начнем с того, что Candle не может Exist. Оно может только Exists.
Поэтому первая и очевидная ошибка для пишущего программиста, о которой выясняется только наступив на грабли.

Это к уровню знания английского и камень в огород разработчиков.

Второе и самое главное.
Можно привести простой(!!!) - это ключевое слово - простой и очевидный пример.
Кто нибудь, пожалуйста.

Хочу написать что-то вроде


Код
function OnCalculate(idx)  -- вход

if CandleExist(idx) == true then  -- имеется в виду если свечка существует на графике, то есть ее какой-нибудь O(idx) ~= nil
    бла-бла-бла расчеты с переменными
end -- мне даже else тут не нужен, вместо него или nil или молчаливый игнор свечки

end

Всё. То есть просто отсеивать ошибку не существования свечки на графике с  галкой "Показывать пустые интервалы".
Пользователя бывают дятлы.

Без интервалов, конечно, все прекрасно работает.

Симптом: Квик упорно игнорирует условие CandleExist(idx) и залезает во внутрь бла-бла и как итог появляется ошибка с красным крестом attempt to perform arithmetic on a nil value, чего быть не должно.
Смысл только в подавлении этой ошибки наименьшим фильтром и геморроем для программиста.
Вопрос только в этом.
В документации какой-то ад.
Хочу простой игнор свечки по простому условию.


Не работающий пример из примера документации:

Код
Settings={}
Settings.Name = "SimpleMA"
Settings.mode = "C"
Settings.period = 5
Settings.str_field = "STRING field"
 
 
function dValue(i,param)
    local v = param or "C"
    if v == "O" then
        return O(i)
    elseif v == "H" then
        return H(i)
    elseif v == "L" then
        return L(i)
    elseif v == "C" then
        return C(i)
    elseif v == "V" then
        return V(i)
    elseif v == "M" then
        return (H(i) + L(i))/2
    elseif v == "T" then
        return (H(i) + L(i)+C(i))/3
    elseif v == "W" then
        return (H(i) + L(i)+2*C(i))/4
    else
    return C(i)
    end
end

function Init()
    return 1
end

function OnCalculate(idx)
if CandleExist(idx) then   -- добавляю тут это и намеренно делаю пустые интервалы в квике

    local per = Settings.period
    local mode = Settings.mode
    local lValue = iValue
    if idx >= per then
        local ma_value=0
        for j = (idx-per)+1, idx do    -- и он все равно лезет в эту ветку
            ma_value = ma_value+dValue(j, mode)
        end
        return ma_value/per
    else
        return nil
    end

end
end



Опыт программирования именно на Lua - меньше недели.
C/C++ и C# знаю хорошо.

Спасибо.
 
Цитата
A.T. написал:
Начнем с того, что Candle не может Exist. Оно может только Exists.
Поэтому первая и очевидная ошибка для пишущего программиста, о которой выясняется только наступив на грабли.

Это к уровню знания английского и камень в огород разработчиков.

Второе и самое главное.
Можно привести простой(!!!) - это ключевое слово - простой и очевидный пример.
Кто нибудь, пожалуйста.

Хочу написать что-то вроде


Код
   function   OnCalculate (idx)   -- вход 

 if  CandleExist(idx)  =  =   true   then    -- имеется в виду если свечка существует на графике, то есть ее какой-нибудь O(idx) ~= nil 
    бла - бла - бла расчеты с переменными
 end   -- мне даже else тут не нужен, вместо него или nil или молчаливый игнор свечки 

 end   

Всё. То есть просто отсеивать ошибку не существования свечки на графике с  галкой "Показывать пустые интервалы".
Пользователя бывают дятлы.

Без интервалов, конечно, все прекрасно работает.

Симптом: Квик упорно игнорирует условие CandleExist(idx) и залезает во внутрь бла-бла и как итог появляется ошибка с красным крестом attempt to perform arithmetic on a nil value, чего быть не должно.
Смысл только в подавлении этой ошибки наименьшим фильтром и геморроем для программиста.
Вопрос только в этом.
В документации какой-то ад.
Хочу простой игнор свечки по простому условию.


Не работающий пример из примера документации:

Код
  Settings = {}
Settings.Name  =   "SimpleMA" 
Settings.mode  =   "C" 
Settings.period  =   5 
Settings.str_field  =   "STRING field" 
 
 
 function   dValue (i,param)
     local  v  =  param  or   "C" 
     if  v  =  =   "O"   then 
         return  O(i)
     elseif  v  =  =   "H"   then 
         return  H(i)
     elseif  v  =  =   "L"   then 
         return  L(i)
     elseif  v  =  =   "C"   then 
         return  C(i)
     elseif  v  =  =   "V"   then 
         return  V(i)
     elseif  v  =  =   "M"   then 
         return  (H(i)  +  L(i))/ 2 
     elseif  v  =  =   "T"   then 
         return  (H(i)  +  L(i) + C(i))/ 3 
     elseif  v  =  =   "W"   then 
         return  (H(i)  +  L(i) +  2  * C(i))/ 4 
     else 
     return  C(i)
     end 
 end 

 function   Init ()
     return   1 
 end 

 function   OnCalculate (idx)
 if  CandleExist(idx)  then     -- добавляю тут это и намеренно делаю пустые интервалы в квике 

     local  per  =  Settings.period
     local  mode  =  Settings.mode
     local  lValue  =  iValue
     if  idx  >  =  per  then 
         local  ma_value =  0 
         for  j  =  (idx - per) +  1 , idx  do      -- и он все равно лезет в эту ветку 
            ma_value  =  ma_value + dValue(j, mode)
         end 
         return  ma_value/per
     else 
         return   nil 
     end 

 end 
 end   



Опыт программирования именно на Lua - меньше недели.
C/C++ и C# знаю хорошо.

Спасибо.
Напишите , что Вы хотите делать русскими словами,   напишу, как это сделать в индикаторе на луа.
 
Хочу написать свой первый простой индикатор на Lua.
Расчет истореский волатильности (HV).
Текущую свечку делить на предыдущую свечку. Дальше буду дописывать более крутые формулы.

И методом тыка обнаружил эту брешь, что при возникновении пустых свечек на графике (если график так настроен), нужна чисто для лаконичности и не более, функция CandleExist, чтобы просто игнорировать пустые свечки.

Но выяснилось, что есть рабочий вариант. В примере к функции CandleExist в документации он дан.
И там технически этот расчет индикатора выглядит  уже совсем иначе. Через сбор данных в локальный массив и вот это всё. И только в том варианте CandleExist работает.
А более "тупом" варианте как выше, почему-то нет.

Вопрос в принципе исчерпан, разобрался, у меня работает.

Но какая-то прострация от всего происходящего осталась.
Тут функция работает, там нет.
Функция одна и та же.
Страницы: 1
Читают тему
Наверх