описание функции Squeeze

Страницы: 1
RSS
описание функции Squeeze
 
Пытаюсь разобраться в примере SMA, но не могу найти описания что делает функция Squeeze. Есть ли где ее описание?
Я понимаю, что это как то завязано на пропуск в расчете несуществующих свечей в ds. Что содержится в переменных Ip,Ipp,Ippp
Код
--[[Simple Moving Average (SMA)
SMA = sum(Pi) / n]]
function F_SMA()
   local sum = {}
   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
      if I~=it.p then it={p=I, l=it.l+1} end
      local Ip,Ipp,Ippp = Squeeze(it.l,P),Squeeze(it.l-1,P),Squeeze(it.l-P,P)
      sum[Ip] = (sum[Ipp] or 0) + GetValueEX(it.p,VT,ds)
      if it.l >= P then
         return (sum[Ip] - (sum[Ippp] or 0)) / P
      end
   end
return nil
end
end
 
нашел определение
Код
 function Squeeze(I,P)
        return math.fmod(I-1,P+1)
    end

но появился вопрос. зачем вычитание?

Код
sum[Ip] - (sum[Ippp] or 0)) / P

допустим у нас последовательность

5, 3, 4, , 9

период равен 2

на первом шаге

Ip = 0, Ipp = 1, Ippp = 2   т.к. fmod(1-1, 2+1) = 0; fmod((1-1)-1, 2+1) = 1; fmod((1-2)-1, 2+1)=2 соответственно

и sum[0] = 5 return nil

на втором шаге

Ip = 1, Ipp = 0, Ippp = 1   т.к. fmod(2-1, 2+1);fmod((2-1)-1, 2+1);fmod((2-2)-1, 2+1) соответственно

и sum[1] = 5 + 3

здесь уже деление на период, то есть среднее должно быть (5+3)/2 = 4
но судя по формуле вернется 0,т.к (8-8)/2

либо я где то ошибся в логике. подскажите
 
Aleksei,
Функция нужна только для того чтобы не запоминать все значения в таблицах, а только нужные.
Работает просто, есть порядковый индекс I свечки и есть период P за который нужны значения
Благодаря функции, вместо того чтобы в таблице sum хранить все значения за все свечки, мы храним для расчетов только значения за несколько последних свечек.
Это достигается путем побора индекса через функцию Squeeze
 
Цитата
Aleksei написал:
но судя по формуле вернется 0,т.к (8-8)/2

Вы категорически не правы, проверьте на простом примере:
Скрытый текст



на второй итерации sum[Ip]=8, где Ip=1
и sum[Ippp] = nil
По формуле получается
(8 - (nil or 0)) / 2 = (8-0)/2 = 8/2 = 4
Страницы: 1
Читают тему (гостей: 1)
Наверх