Блог им. autotrade

--[[
вопросы к автору: https://smart-lab.ru/profile/autotrade/
Zigzag + 2 MA
параметры:
prc - процент зигзага
--]]
Settings={
Name="MMZ_v1",
prc=2,
frm=200,
line=
{
{
Name = "cur1",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0,0)
},
{
Name = "cur2",
Type =TYPE_LINE,
Width = 2,
Color = RGB(0,0,255)
},
{
Name = "cur3",
Type =TYPE_LINE,
Width = 2,
Color = RGB(255,0,0)
}
}
}
function Init()
return 3
end
function OnCalculate(index)
de = Settings.prc
vl = O(index)
if index == 1 then
y1 = vl
y2 = vl
y3 = vl
y4 = vl
x1 = 1
x2 = 1
x3 = 1
x4 = 1
ch = {}
ch[index] = 0
else
ch[index] = ch[index-1]
if O(index) > y1*(1+de/100) and y1 < y2 then
x4 = x3
y4 = y3
x3 = x2
y3 = y2
x2 = x1
y2 = y1
x1 = index
y1 = O(index)
ch[index] = ch[index-1] + 1
else
if O(index) > y1 and y1 >= y2
then
x1 = index
y1 = O(index)
end
end
if O(index) < y1*(1-de/100) and y1 > y2 then
x4 = x3
y4 = y3
x3 = x2
y3 = y2
x2 = x1
y2 = y1
x1 = index
y1 = O(index)
ch[index] = ch[index-1] + 1
else
if O(index) < y1 and y1 <= y2
then
x1 = index
y1 = O(index)
end
end
end
--[[
if x1 ~= index then
curfrom = x1
curto = index
else
curfrom = x2
curto = x1
end
if curto ~= curfrom and curfrom ~= nil and curto ~= nil then
if O(curto) ~= nil and O(curfrom) ~= nil then
k = (O(curto)- O(curfrom))/(curto- curfrom)
for i = curfrom, index do
curv = i*k + O(curto) - curto*k
SetValue(i, 1, curv)
end
end
end
--]]
if index == 1 then
sma = {}
sma[index] = O(index)
per1 = {}
per2 = {}
per1[index] = 8
per2[index] = 2
else
sma[index] = sma[index-1] + O(index)
per1[index] = per1[index-1]
per2[index] = per2[index-1]
if ch[index] ~= ch[index-1] then
for i = Settings.frm, 5, -2 do
--[[
cros0 = 0
for k = x2, x1 do
if k-2 > Settings.frm then
j = math.ceil(i/4)
sma1 = (sma[k] - sma[k-i])/i
sma2 = (sma[k] - sma[k-j])/j
sma1_0 = (sma[k-1] - sma[k-i-1])/i
sma2_0 = (sma[k-1] - sma[k-j-1])/j
if
sma1 > sma2 and sma1_0 <= sma2_0 and y2 > y3 or
sma1 < sma2 and sma1_0 >= sma2_0 and y2 < y3
then
cros0 = cros0 + 1
per1_0 = i
per2_0 = j
pr0 = O(k)
end
end
end -- for k
--]]
cros = 0
for k = x3, x2 do
if k-2 > Settings.frm then
j = math.ceil(i/4)
sma1 = (sma[k] - sma[k-i])/i
sma2 = (sma[k] - sma[k-j])/j
sma1_0 = (sma[k-1] - sma[k-i-1])/i
sma2_0 = (sma[k-1] - sma[k-j-1])/j
if
sma1 > sma2 and sma1_0 <= sma2_0 and y2 > y3 or
sma1 < sma2 and sma1_0 >= sma2_0 and y2 < y3
then
cros = cros + 1
per1_1 = i
per2_1 = j
pr1 = O(k)
end
end
end -- for k
cros2 = 0
for k = x4, x3 do
if k-2 > Settings.frm then
j = math.ceil(i/4)
sma1 = (sma[k] - sma[k-i])/i
sma2 = (sma[k] - sma[k-j])/j
sma1_0 = (sma[k-1] - sma[k-i-1])/i
sma2_0 = (sma[k-1] - sma[k-j-1])/j
if
sma1 > sma2 and sma1_0 <= sma2_0 and y3 > y4 or
sma1 < sma2 and sma1_0 >= sma2_0 and y3 < y4
then
cros2 = cros2 + 1
per1_2 = i
per2_2 = j
pr2 = O(k)
end
end
end -- for k
if cros == 1 and cros2 == 1 and ( y2 > y3 and pr1 < pr2 or y2 < y3 and pr1 > pr2 ) then
if per1_1 < per1_2 then
per1[index] = per1_1
per2[index] = per2_1
else
per1[index] = per1_2
per2[index] = per2_2
end
end
end -- for i
end
if index-2 > Settings.frm then
sma1 = (sma[index] - sma[index-per1[index]])/per1[index]
sma2 = (sma[index] - sma[index-per2[index]])/per2[index]
end
end
return nil, sma1, sma2
--return nil, per1[index], per2[index]
end