Settings=
{
Name = "Zigzag_MNK", -- название индикатора
delta=1.0, -- дельта зигзага
showperiod=5000,--колич баров за которые строится
line=
{
{
Name = "zigzagline2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0, 0)
}
}
}
function Init()
vMin = 0
vMax = 0
vMinindex = 0
vMaxindex = 0
voldMinindex = 0
voldMaxindex = 0
a1 = 0
a2 = 0
a3 = 0
a4 = 0
cind = 0
v = null
vFrom=0
vsl = 0
return 1
end
function calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
v = null
v2 = null
showperiod = Settings.showperiod
if index-1 > 1 and vFrom > 1 and index > Size()-showperiod then
--[[
for i=vFrom, index-1 do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
for i=index, index do
a01 = a1+i*C(i)
a02 = a2+i
a03 = a3+C(i)
a04 = a4+i*i
end
n = index - vFrom + 1
if((n*a04 - a02*a02) ~= 0) then
a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
b = (a03 - a*a02)/n
v = a*index + b
end
--]]
a1 = 0
a2 = 0
a3 = 0
a4 = 0
vto = index
if vMinindex < vMaxindex then
vto = vMaxindex
end
if vMinindex > vMaxindex then
vto = vMinindex
end
for i=vFrom, vto do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
n = vto - vFrom + 1
if((n*a4 - a2*a2) ~= 0) then
a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
b = (a3 - a*a2)/n
v = a*index + b
end
vmindel = 0
for i=vFrom, vto do
y = a*i + b
if vMinindex < vMaxindex and y - C(i) > vmindel then
vmindel = y - C(i)
end
if vMinindex > vMaxindex and C(i) - y > vmindel then
vmindel = C(i) - y
end
end
y = a*index + b
if vMinindex < vMaxindex then
v2 = y - vmindel
end
if vMinindex > vMaxindex then
v2 = y + vmindel
end
if vMinindex < vMaxindex and O(index) < v2 and vsl == 0 then
vsl = C(vMaxindex)
v2 = vsl
end
if vMinindex > vMaxindex and O(index) > v2 and vsl == 0 then
vsl = C(vMinindex)
v2 = vsl
end
if vsl ~= 0 then
v2 = vsl
end
if vMinindex < vMaxindex and O(index) > vsl and vsl ~= 0 then
vsl = 0 --v2 = y - vmindel
end
if vMinindex > vMaxindex and O(index) < vsl and vsl ~= 0 then
vsl = 0 --v2 = y + vmindel
end
--[[
--]]
cind = index
end
return v, v2
end
function OnCalculate(index)
v = null
v2 = null
if index < 3 then
vMin = C(index)
vMax = C(index)
vMinindex = index
vMaxindex = index
voldMinindex = index
voldMaxindex = index
else
--if index > 18000 then
if voldMaxindex >= voldMinindex then
if C(index) > (1 + Settings.delta/100)*vMin then
vMin = C(index)
vMax = C(index)
vMaxindex = index
voldMinindex = vMinindex
vFrom = vMinindex
vsl = 0
a1 = 0
a2 = 0
a3 = 0
a4 = 0
v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
--[[
for i=vFrom, index-1 do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
for i=index, index do
a01 = a1+i*C(i)
a02 = a2+i
a03 = a3+C(i)
a04 = a4+i*i
end
n = index - vFrom + 1
if((n*a04 - a02*a02) ~= 0) then
a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
b = (a03 - a*a02)/n
v = a*index + b
end
cind = index
--]]
else
if vMin > C(index) then
vMin = C(index)
vMinindex = index
vFrom = voldMaxindex
-- else
-- vFrom = vMinindex
end
v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
--[[
if cind ~= index then
for i=index-1, index-1 do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
end
for i=index, index do
a01 = a1+i*C(i)
a02 = a2+i
a03 = a3+C(i)
a04 = a4+i*i
end
n = index - vFrom + 1
if((n*a04 - a02*a02) ~= 0) then
a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
b = (a03 - a*a02)/n
v = a*index + b
end
cind = index
--]]
end
else
if voldMaxindex <= voldMinindex then
if C(index) < (1 - Settings.delta/100)*vMax then
vMax = C(index)
vMin = C(index)
vMinindex = index
voldMaxindex = vMaxindex
vFrom = vMaxindex
vsl = 0
a1 = 0
a2 = 0
a3 = 0
a4 = 0
v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
--[[
for i=vFrom, index-1 do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
for i=index, index do
a01 = a1+i*C(i)
a02 = a2+i
a03 = a3+C(i)
a04 = a4+i*i
end
n = index - vFrom + 1
if((n*a04 - a02*a02) ~= 0) then
a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
b = (a03 - a*a02)/n
v = a*index + b
end
cind = index
--]]
else
if vMax < C(index) then
vMax = C(index)
vMaxindex = index
vFrom = voldMinindex
-- else
-- vFrom = vMaxindex
end
v, v2 = calcmnk(index, vFrom, a1, a2, a3, a4, cind, vMinindex, vMaxindex)
--[[
if cind ~= index then
for i=index-1, index-1 do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
end
for i=index, index do
a01 = a1+i*C(i)
a02 = a2+i
a03 = a3+C(i)
a04 = a4+i*i
end
n = index - vFrom + 1
if((n*a04 - a02*a02) ~= 0) then
a = (n*a01 - a02*a03)/(n*a04 - a02*a02)
b = (a03 - a*a02)/n
v = a*index + b
end
cind = index
--]]
end
end
end
-- end
--[[
a1 = 0
a2 = 0
a3 = 0
a4 = 0
for i=vFrom, index do
a1 = a1+i*C(i)
a2 = a2+i
a3 = a3+C(i)
a4 = a4+i*i
end
n = index - vFrom + 1
if((n*a4 - a2*a2) ~= 0) then
a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
b = (a3 - a*a2)/n
v = a*index + b
end
--]]
--[[
for i = vFrom, index do
k = (C(index)- C(vFrom))/(index- vFrom);
v = i*k + C(index) - index*k
SetValue(i, 1, v)
end --]]
end
return v2
end