for для значений свечей

Страницы: 1
RSS
for для значений свечей
 
Подскажите, как правильно получить значения цены закрытия для 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, на самом деле, простой язык. Если знаком любой другой язык, то он изучается очень быстро.
 
Да выдает именно ошибку с nil. Из языков я знаю только php, а Lua на него совсем не похож. PineScript я понял сразу, а с Lua пока сложно.

Функцию GetValueEX тоже взял из примера скользящей средней. Вроде бы добавил заполнение таблица it, но это не помогло.
Код
 if I~=it.p then it={p=I, l=it.l+1} end
 
В данном случае, что-то с логикой. Функция math.fmod - это остаток от деления двух чисел. Раз деление идет на P+1,то результат лежит в диапазоне от 0 до P.
Это значение передается как индекс таблицы it. Что далее не ясно, всего когда нет.


Явно что-то с логикой. Вы бы себе алгоритм на любом языке написали, хоть на блок схеме, чтобы понять где проблема.
 
алгоритм несложной скользящей средней
Код
(P1 * 3) + (P2 * 2) + (P3 * 1) / (3 + 2 + 1)
где Pn цена закрытия предыдущей n-свечи

вот реализация на PHP, на Lua я честно говоря даже не понимаю как получить цену закрытия предыдущих свечей с помощью чикла
Код
for ($i = $period; $i >= 1; $i--){
   $sumP += $candles[$i]->close;
   $sumI += $i;
}
$x = $sumP/$sumI;
 
Это простой алгоритм взвешенной скользящей.

Будет почти также, если использовать итератор уменьшения управляющей переменной и считать от текущего индекса = 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

В вашем коде нет умножения на весовой коэффициент. Если только Вы не хотите простую скользящую, а не взвешенную.

Советую не гадать, а взять руководство по языку для Квика, чтобы понять какие методы в языке были добавлены для терминала.

https://arqatech.com/ru/support/files/
                                                                                                     [TABLE][TR][TD]Документация по языку LUA в QUIK и примерыzip,  18.5 МБ                                          [/TD][TD]
[/TD][TD]
[/TD][/TR][TR][TD] Примеры функций расчета индикаторов терминала QUIK на языке Luazip,  76 КБ[/TD][/TR][/TABLE]http://luaq.ru/
А по самому LUA есть столько материалов, можно брать любой.
 
Спасибо за вашу помощь. В итоге я смог придти к тому, что на графике появляется просто прямая горизонтальная линия. Видимо происходит расчет одного первого значения и все.
Не понятно, какую функцию выполняет таблица 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/
пример индикатора для произвольных параметров.
по его подобию можете сделать любой свой.
 
Цитата
Nikolay написал:

                                                                                                    [TABLE][TR][TD] Примеры функций расчета индикаторов терминала QUIK на языке Luazip,  76 КБ [/TD][/TR][/TABLE]
Спасибо все получилось. Эти примеры на много понятнее, чем примеры уже готовых индикаторов. Но в целом пока очень не привычный язык.
Страницы: 1
Читают тему (гостей: 1)
Наверх