Вопрос по скрипту индикатора Bollinger Bands

Страницы: 1
RSS
Вопрос по скрипту индикатора Bollinger Bands
 
Здравствуйте, написал для своего скрипта индикатор вычисления полос Боллинджера, опираясь на предыдущее написание написание индикатора AD которое я обсуждал с вами тут https://forum.quik.ru/messages/forum10/message37868/topic4504/#message37868
тогда у меня возникли вопросы - почему мои показания AD не совпадают с вашими показаниями AD из AD.lua на графиках, эти вопросы были решены, а именно вычисление AD (как и практически всех ваших индикаторов) идут у вас начиная с самой 1ой свечи которая получается с биржи и до последней, т.е. за весь диапазон, свой скрипт я поправил после чего мои показания AD стали идти точь в точь с вашими,  но при однако же значения вычисляемых полос Боллинджера опять стали несовпадать хоть в этот раз я сразу написал их вычисление с самого начала диапазона как и у вас, причем средняя линия у меня везде совпадает с вашей но несовпадают верхняя и нижняя полосы, т.е. отклонения полос, стал изучать ваш скрипт BB.lua в итоге вижу что у вас полосы боллинджера вычисляются по какой то совсем другой формуле а не по оригинальной, потому и не совпадение, а именно сама формула в целом у вас
стандартная -

1. Средняя линия ML (обычное скользящее среднее) рассчитывается по формуле:

ML = SUM (CLOSE, N) / N = SMA (CLOSE, N),

где:
— SUM (…, N) — сумма за N периодов;
— CLOSE — цена закрытия;
— N — количество периодов, используемых для расчета;
— SMA — простая скользящая средняя.

2. Верхняя линия TL (средняя линия ML, смещенная вверх на определенное число D стандартных отклонений StdDev) рассчитывается по формуле:

TL = ML + (D * StdDev),

3. Нижняя линия BL (средняя линия ML, смещенная вниз на число стандартных D отклонений StdDev) рассчитывается по формуле:

BL = ML — (D * StdDev).

StdDev - среднеквадратичное отклонение

Далее же - везде где только можно нагуглить чтолибо о полосах Боллинджера везде формула расчета среднеквадратичного отклонения

такова:
StdDev = SQRT (SUM ((CLOSE — SMA (CLOSE, N))^2, N)/N)

или же графически

Верхняя линия
Нижняя линия

Источников масса:
https://fortrader.org/indicators-forex/bollinger-bands-bb.html
http://tlap.com/o-lentah-bollindzhera/
https://privatfinance.com/indikator-polosyi-bollindzhera/
https://kbrobots.ru/roboty/11-torgovyx-robotov-dlya-quik/polosy-bollindzhera/
И еще много других, и все они содержат одинаковую формулу вычисления отклонения от средней линии

проанализировав же ваш скрипт BB.lua, а именно место вычисления отклонения от средней линии в функции SD ():
Код
function SD() --Standard Deviation ("SD")
    local SD_MA=MA()
    local sum = {}
    local sum2 = {}
    local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 20)
local M = (Fsettings.Metod or SMA)
local VT = (Fsettings.VType or CLOSE)
if (P>0) then
    if I == 1 then 
        sum = {}
        sum2 = {}
        it = {p=0, l=0}
    end
    local t_ma = SD_MA(I, {Period=P, Metod = M, VType=VT}, ds)
    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)
        sum2[Ip]=(sum2[Ipp] or 0) + GetValueEX(it.p, VT, ds)^2
        if it.l >= P and t_ma then
            return math.sqrt((sum2[Ip]-(sum2[Ippp] or 0) - 2*t_ma*(sum[Ip]-(sum[Ippp] or 0)) + P*(t_ma^2)) / P)
        end
    end
end
return nil
end
end
Из которого непосредственно само вычисление отклонения:
Код
sum[Ip]=(sum[Ipp] or 0) + GetValueEX(it.p, VT, ds)
sum2[Ip]=(sum2[Ipp] or 0) + GetValueEX(it.p, VT, ds)^2

И итоговая формула вычисления:

math.sqrt((sum2[Ip]-(sum2[Ippp] or 0) - 2*t_ma*(sum[Ip]-(sum[Ippp] or 0)) + P*(t_ma^2)) / P)

Я понял что ваша формула имеет иной вид, математически её можно записать примерно так:

StdDev = SQRT ( (SUM(CLOSE(N)^2)-SUM(CLOSE(N-P)^2)) - 2*MA(C,N-P)*(SUM(CLOSE(N))-SUM(CLOSE(N-P))) + P*MA(C,N-P)^2

Графически она будет выглядеть примерно так:
Ваша формула среднекв. отклонения

соответственно - формула другая, дает другие значения ( не совпадающие с оригинальной формулой) в итоге значения верхней и нижней полос отличаются


Хотелось бы услышать ваши обьяснения - что это за формула, откуда она взята, чем обьясняется её использование, для того чтобы лучше понимать её смысл и смысл использования полос Боллинджера вашего вида.

Кстати нехитрым путём я подправил ваш скрипт чтобы он рассчитывал отклонение по стандартной формуле:

Код
function SD() --Standard Deviation ("SD")
   local SD_MA=MA()
   local sum = {}
   local sum2 = {}
   local sum3 = {}
   local it = {p=0, l=0}
return function (I, Fsettings, ds)
local Fsettings=(Fsettings or {})
local P = (Fsettings.Period or 20)
local M = (Fsettings.Metod or SMA)
local VT = (Fsettings.VType or CLOSE)
if (P>0) then
   if I == 1 then 
      sum = {}
      it = {p=0, l=0}
   end
   local t_ma = SD_MA(I, {Period=P, Metod = M, VType=VT}, ds)
   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)-(t_ma or 0))^2
      if it.l >= P and t_ma then
         return = math.sqrt((sum[Ip]-(sum[Ippp] or 0))/P)
      end
   end
end
return nil
end
end

И этот индикатор стал давать значения (и рисовать на графике линии соответственно) в точности совпадаемые с рассчетными в скрипте по оригинальной формуле, только лишь что из за этого места
Код
sum[Ip]=(sum[Ipp] or 0)+(GetValueEX(it.p, VT, ds)-(t_ma or 0))^2
Значения полос неправильны в самом начале диапазона на нескольких самых первых свечах, это можно поправить но нет смысла поскольку те давние свечи и значения индикаторов по ним уже никому ненужны а далее же на всем остальном диапазоне расчет идет правильный

И что интересно - мои, т.е. оригинальные полосы Боллинджера, на всём графике во многом совпадают с полосами вычисляемыми вашим скриптом но только в местах  где свечи начинают убывать, т.е. снижаться, ваши полосы резко сужаются следуя за свечами, оригинальные же полосы сужаются плавно и неспеша, что исключает вероятность ложных пробоев, зато после окончательного сужения полосы совпадают и с началом нового расширения расширяются одинаково так же полностью совпадая дос следующего сужения и т.д.
В общем хотелось бы услышать обьяснение по поводу вашей формулы расчета
 
Добрый день.
Посмотрели по ссылкам, которые вы представили.
Например: https://kbrobots.ru/roboty/11-torgovyx-robotov-dlya-quik/polosy-bollindzhera/

Формула с сайта: TL = ML + D * StdDev- Верхняя линия, BL = ML - D * StdDev- нижняя линия. Метод расчета SMA.
Наша формула: BBLower = MA(P,N) – k * StDev(P,N) - нижняя, BBUpper = MA(P,N) + k * StDev(P,N). У нас также по умолчанию метод расчета SMA.


По другим ссылкам аналогичная ситуация.
 
Я и говорю что ваши формулы для расчета верхней и нижней полосы такие же как и везде в остальных источниках
То есть BBLower/BBUpper = MA(P,N) –+ k * StDev(P,N)
Но вот среднеквадратичное отклонение  StDev(P,N) у вас рассчитывается иным методом:
StdDev = SQRT ( (SUM(CLOSE(N)^2)-SUM(CLOSE(N-P)^2)) - 2*MA(C,N-P)*(SUM(CLOSE(N))-SUM(CLOSE(N-P))) + P*MA(C,N-P)^2
То есть кв.корень разницы сумм цен, разницы скользящей средней умноженной на 2 и плюс период умноженный на  скользящую средню в квадрате! О как!
В то время как везде где только можно нагуглить среднеквадратичное отклонение  StDev(P,N) рассчитывается намного проще:
StdDev = SQRT (SUM ((CLOSE — SMA (CLOSE, N))^2, N)/N)
то есть кв.корень из суммы разниц цен(обычно закрытия потому и CLOSE) и скользящей средней некоторого периода цен
 
Цитата
Анатолий написал:
Я и говорю что ваши формулы для расчета верхней и нижней полосы такие же как и везде в остальных источниках
То есть BBLower/BBUpper = MA(P,N) –+ k * StDev(P,N)
Но вот среднеквадратичное отклонение  StDev(P,N) у вас рассчитывается иным методом:
StdDev = SQRT ( (SUM(CLOSE(N)^2)-SUM(CLOSE(N-P)^2)) - 2*MA(C,N-P)*(SUM(CLOSE(N))-SUM(CLOSE(N-P))) + P*MA(C,N-P)^2
То есть кв.корень разницы сумм цен, разницы скользящей средней умноженной на 2 и плюс период умноженный на  скользящую средню в квадрате! О как!
В то время как везде где только можно нагуглить среднеквадратичное отклонение  StDev(P,N) рассчитывается намного проще:
StdDev = SQRT (SUM ((CLOSE — SMA (CLOSE, N))^2, N)/N)
то есть кв.корень из суммы разниц цен(обычно закрытия потому и CLOSE) и скользящей средней некоторого периода цен
Анатолий, формула среднеквадратичного отклонения в QUIK аналогичная:

StDev = SQRT(SUM((Pi – SMA(P,N))^2)/N)

Она также описана в справке QUIK. Раздел 4. Работа с графиками/Методы технического анализа/Standard Deviation («Стандартное отклонение»)
 
поясню откуда что берется.
Данная формула берется из следующей гипотезы.
Полагаем что цена отклоняется от оценки среднего значения случайным образом по гауссовскому закону плотности вероятности отклонения
тогда с вероятностью 0.95 имеем 1.96*ср.квадр
-----------------
Но это гипотеза не верна (доказано в прошлом веке)
так как закон распределения цены не нормальный
следовательно центр тяжести нельзя считать как среднее
следовательно закон двух сигма не работает
------------------
Резюме:
алгоритм этого индикатора такой:
Берете любой  фильтр например скользящее среднее
вычитает его из цены
сглаживаете фильтром модуль ошибки
и прикручиваете к первой линии еще две
никакой существенной разницы нет какие формулы вы применяете.
так как особого тайного смысла как и ценности в них тоже нет.
======================
Вообще-то  зачем городить расчет индикатора когда он есть в КВИКЕ
поставьте метку и читайте значения в своем скрипте
Зачем изобретать дырку от бублика.
 
Цитата
Николай Камынин написал:
поясню откуда что берется.Данная формула берется из следующей гипотезы.Полагаем что цена отклоняется от оценки среднего значения случайным образом по гауссовскому закону плотности вероятности отклонения тогда с вероятностью 0.95 имеем 1.96*ср.квадр-----------------Но это гипотеза не верна (доказано в прошлом веке)так как закон распределения цены не нормальныйследовательно центр тяжести нельзя считать как среднееследовательно закон двух сигма не работает
Можно ссылочку на какой нибудь ресурс почитать поподробней об этом?

Цитата
Николай Камынин написал:
Вообще-то  зачем городить расчет индикатора когда он есть в КВИКЕпоставьте метку и читайте значения в своем скрипте Зачем изобретать дырку от бублика.
Есть некоторые совершенно очевидные причины иногда "загородить" собственный расчет индикатора в скрипте, но впрочем я не буду распространятся на эту тему, кому это непонятно тому это и ненадо
 
Цитата
Анатолий написал:
В то время как везде где только можно нагуглить среднеквадратичное отклонение  StDev(P,N) рассчитывается намного проще:
по той простой причине, что коли находятся бестолочи использующие нестатистические выборки для статистических расчетов ... то какая нафик уже разница сколько раз сделать глупость по одному вопросу :)
 
Цитата
новичок написал:
по той простой причине, что коли находятся бестолочи использующие нестатистические выборки для статистических расчетов ...
К сожалению, большинство людей использующих это, не понимают что они делают и как это работает.
Главное же - верить.
Страницы: 1
Читают тему
Наверх