Ширина канала показана синим отрезком, канал строится за отрезок показанный зеленым цветом
по перегибам можно понять что тренд заканчивается
Settings={
Name="Buy_osc_v01",
period=50,
delta=0,
lim=100.0,
line=
{
{
Name = "cur1",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0, 0, 255)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0, 0, 0)
},
{
Name = "cur3",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0,0, 0)
},
{
Name = "cur4",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0,0, 0)
}
}
}
--[[
описание свойств:
period - период, за каротрый делается расчет
delta - смещение назад
назначение:
горизонтальная ширина канала
использовался:
метод наименьших квадратов (аппроксимация линией)
--]]
function Init()
return 2
end
function OnCalculate(index)
sz = Size()
n = Settings.period
d = Settings.delta
lim = Settings.lim
y = nil
if index-n-d > 0 then
a1 = 0
a2 = 0
a3 = 0
a4 = 0
for i=index-n+1-d, index-d do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
if((n*a4 - a2*a2) ~= 0) then
a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
b = (a3 - a*a2)/n
c1 = 0
c2 = 0
n1 = 0
n2 = 0
for j=index-n+1-d, index-d do
y = a*j + b
if C(j) < y then
c1 = c1 + (y -C(j))
n1 = n1 + 1
end
if C(j) > y then
c2 = c2 + (C(j) - y)
n2 = n2 + 1
end
end
if n1 ~= 0 then
c1 = c1/n1
end
if n2 ~= 0 then
c2 = c2/n2
end
if a==0 then
y = 0
else
y = (c1+c2)/a
if y > lim then
y = lim
else
if y < -lim then
y = -lim
end
end
end
end
end
return y,0
end