Подскажите, как правильно получить значения цены закрытия для 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
Пользователь
Сообщений: Регистрация: 27.01.2017
30.06.2020 09:24:54
Определения функции 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
Пользователь
Сообщений: Регистрация: 30.06.2020
30.06.2020 11:45:06
Большое спасибо. К сожалению, только сегодня впервые увидел 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
Пользователь
Сообщений: Регистрация: 27.01.2017
30.06.2020 12:05:56
Код явно не весь. Где функция GetValueEX? Таблица it является upvalue замыкания. А где же она заполняется, кроме первеого индекса? В этом, скорее всего, и есть ошибка, т.к. выполняются арифметические действия с nil.
Lua, на самом деле, простой язык. Если знаком любой другой язык, то он изучается очень быстро.
Пользователь
Сообщений: Регистрация: 30.06.2020
30.06.2020 12:45:08
Да выдает именно ошибку с nil. Из языков я знаю только php, а Lua на него совсем не похож. PineScript я понял сразу, а с Lua пока сложно.
Функцию GetValueEX тоже взял из примера скользящей средней. Вроде бы добавил заполнение таблица it, но это не помогло.
Код
if I~=it.p then it={p=I, l=it.l+1} end
Пользователь
Сообщений: Регистрация: 27.01.2017
30.06.2020 15:23:42
В данном случае, что-то с логикой. Функция math.fmod - это остаток от деления двух чисел. Раз деление идет на P+1,то результат лежит в диапазоне от 0 до P. Это значение передается как индекс таблицы it. Что далее не ясно, всего когда нет.
Явно что-то с логикой. Вы бы себе алгоритм на любом языке написали, хоть на блок схеме, чтобы понять где проблема.
Пользователь
Сообщений: Регистрация: 30.06.2020
30.06.2020 17:50:09
алгоритм несложной скользящей средней
Код
(P1 * 3) + (P2 * 2) + (P3 * 1) / (3 + 2 + 1)
где Pn цена закрытия предыдущей n-свечи
вот реализация на PHP, на Lua я честно говоря даже не понимаю как получить цену закрытия предыдущих свечей с помощью чикла
Будет почти также, если использовать итератор уменьшения управляющей переменной и считать от текущего индекса = index.
Код
local sum, p = 0, 0
for i = period-1, 0, -1 do
sum = sum + (C(index - i) or 0)*i
p = p + 1
end
local avg = sum/p
В вашем коде нет умножения на весовой коэффициент. Если только Вы не хотите простую скользящую, а не взвешенную.
Советую не гадать, а взять руководство по языку для Квика, чтобы понять какие методы в языке были добавлены для терминала.
А по самому LUA есть столько материалов, можно брать любой.
Пользователь
Сообщений: Регистрация: 30.06.2020
01.07.2020 09:01:15
Спасибо за вашу помощь. В итоге я смог придти к тому, что на графике появляется просто прямая горизонтальная линия. Видимо происходит расчет одного первого значения и все. Не понятно, какую функцию выполняет таблица 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
Пользователь
Сообщений: Регистрация: 27.01.2017
01.07.2020 09:26:56
Выводить значения надо для каждого бара. Также, обычно, не выводят значения, пока число баров не стало больше чем период расчета (т.к. выборка недостаточна).
Вы можете просто инициализировать переменную в замыкании, отвечающую за результат расчета, и выводить ее всегда. Иначе у Вас могут образовываться дырки в расчете (это и приведет к такой прямой линии), когда бара нет и CandleExist(I,ds) вернет ложь.
В тех ссылках, что я скидывал подробно описана как строить индикатор. Вы сейчас зацепились за какой-то отрывок кода, не понимаю зачем он. Лучше, все же, взять руководство, его же не зря написали.
Пользователь
Сообщений: Регистрация: 30.01.2015
01.07.2020 12:30:19
Цитата
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
пример индикатора для произвольных параметров. по его подобию можете сделать любой свой.