Подскажите, как правильно получить значения цены закрытия для N последних свечей и умножить на их порядковый номер по счету (P1 * 5) + (P2 * 4) + (P3 * 3)
И не совсем понимаю, что делает функция Squeeze и зачем она нужна?
if CandleExist(I,ds) then
if it.l >= P then local MD = 0 for i = it.l-P+1, it.l do MD = MD + (GetValueEX(it[Squeeze(i,P)], VT, ds)) * i end return MD end end
Определения функции Squeeze не представлено, поэтому сказать, что она делает невозможно. Чтобы получить порядковый номер надо либо организовать итерацию с таким численным праметром от 1 до P или привести саму переменную i к такому виду.
Так: for i = 1, P do MD = MD + (GetValueEX(it[Squeeze(it.l-P+i,P)], VT, ds)) * i end
Или так: for i = it.l-P+1, it.l do MD = MD + (GetValueEX(it[Squeeze(i,P)], VT, ds)) * (i - it.l+P) end
Большое спасибо. К сожалению, только сегодня впервые увидел LUA и пока не совсем понятна структура. Не могли бы вы посмотреть весь код так он выдает ошибку.
Код
function F()
local it = {p=0, l=0}
return function (I, P, VT, ds)
if I == 1 then
sum = {}
it = {p=0, l=0}
end
if CandleExist(I,ds) then
local MD = 0
for i = it.l-P+1, it.l do
MD = MD + (GetValueEX(it[Squeeze(i,P)], VT, ds)) * (i - it.l+P)
end
return MD
end
return nil
end
end
а Squeeze я взял из примеров
function Squeeze(I,P) return math.fmod(I-1,P+1) end
Код явно не весь. Где функция GetValueEX? Таблица it является upvalue замыкания. А где же она заполняется, кроме первеого индекса? В этом, скорее всего, и есть ошибка, т.к. выполняются арифметические действия с nil.
Lua, на самом деле, простой язык. Если знаком любой другой язык, то он изучается очень быстро.
В данном случае, что-то с логикой. Функция math.fmod - это остаток от деления двух чисел. Раз деление идет на P+1,то результат лежит в диапазоне от 0 до P. Это значение передается как индекс таблицы it. Что далее не ясно, всего когда нет.
Явно что-то с логикой. Вы бы себе алгоритм на любом языке написали, хоть на блок схеме, чтобы понять где проблема.
Спасибо за вашу помощь. В итоге я смог придти к тому, что на графике появляется просто прямая горизонтальная линия. Видимо происходит расчет одного первого значения и все. Не понятно, какую функцию выполняет таблица it и и как посчитать индикатор для каждой свечи.
Код
function F()
local it = {p=0, l=0}
return function (I, P, VT, ds)
if I == 1 then it = {p=0, l=0} end
if CandleExist(I,ds) then
if I~=it.p then it={p=I, l=it.l+1} end
local sum, sump = 0, 0
for i = P-1, 0, -1 do
sum = sum + (C(i) or 0)*i
sump = sump + i
end
return sum/sump
end
return nil
end
end
Выводить значения надо для каждого бара. Также, обычно, не выводят значения, пока число баров не стало больше чем период расчета (т.к. выборка недостаточна).
Вы можете просто инициализировать переменную в замыкании, отвечающую за результат расчета, и выводить ее всегда. Иначе у Вас могут образовываться дырки в расчете (это и приведет к такой прямой линии), когда бара нет и CandleExist(I,ds) вернет ложь.
В тех ссылках, что я скидывал подробно описана как строить индикатор. Вы сейчас зацепились за какой-то отрывок кода, не понимаю зачем он. Лучше, все же, взять руководство, его же не зря написали.
jonny1960 написал: Подскажите, как правильно получить значения цены закрытия для N последних свечей и умножить на их порядковый номер по счету (P1 * 5) + (P2 * 4) + (P3 * 3)
И не совсем понимаю, что делает функция Squeeze и зачем она нужна?
if CandleExist(I,ds) then
if it.l >= P then local MD = 0 for i = it.l-P+1, it.l do MD = MD + (GetValueEX(it[Squeeze(i,P)], VT, ds)) * i end return MD end end
http://www.kamynin.ru/ пример индикатора для произвольных параметров. по его подобию можете сделать любой свой.