Новая версия индикатора на IMOEX 60 мин
свободный доступ к исходникам в
ТК
--[[
SMA list template v1
--]]
Settings=
{
Name = "SMA_list_magic_template_v3", -- indicator name
sign=0,
prf=0,
ln1=10, -- period
ln2=20, -- period
ln3=30, -- period
ln4=40, -- period
ln5=50, -- period
ln6=60, -- period
ln7=70, -- period
ln8=80, -- period
ln9=90, -- period
ln10=100, -- period
ln11=110, -- period
ln12=120, -- period
ln13=130, -- period
ln14=140, -- period
ln15=150, -- period
ln16=160, -- period
ln17=170, -- period
ln18=180, -- period
ln19=190, -- period
ln20=200, -- period
line=
{
{
Name = "SMA_TEMPL",
Type =TYPE_LINE,
Width = 1,
Color = RGB(0,0,0)
},
{
Name = "SMA_TEMPL",
Type =TYPE_LINE,
Width = 1,
Color = RGB(255,0,0)
},
{
Name = "cur3",
Type =TYPE_TRIANGLE_DOWN,
Width = 5,
Color = RGB(255, 0, 0)
},
{
Name = "cur4",
Type =TYPE_TRIANGLE_UP,
Width = 5,
Color = RGB(0, 0, 255)
}
}
}
function Init()
sma = {{},{}}
sum = {{},{}}
ln = {}
n = {}
sumln = 0
m = {}
prof = {}
return 4
end
function GetSMA(index, num)
if index == 1 then
if num == 1 then
ln[num] = Settings.ln1
end
if num == 2 then
ln[num] = Settings.ln2
end
if num == 3 then
ln[num] = Settings.ln3
end
if num == 4 then
ln[num] = Settings.ln4
end
if num == 5 then
ln[num] = Settings.ln5
end
if num == 6 then
ln[num] = Settings.ln6
end
if num == 7 then
ln[num] = Settings.ln7
end
if num == 8 then
ln[num] = Settings.ln8
end
if num == 9 then
ln[num] = Settings.ln9
end
if num == 10 then
ln[num] = Settings.ln10
end
if num == 11 then
ln[num] = Settings.ln11
end
if num == 12 then
ln[num] = Settings.ln12
end
if num == 13 then
ln[num] = Settings.ln13
end
if num == 14 then
ln[num] = Settings.ln14
end
if num == 15 then
ln[num] = Settings.ln15
end
if num == 16 then
ln[num] = Settings.ln16
end
if num == 17 then
ln[num] = Settings.ln17
end
if num == 18 then
ln[num] = Settings.ln18
end
if num == 19 then
ln[num] = Settings.ln19
end
if num == 20 then
ln[num] = Settings.ln20
end
sumln = sumln + ln[num]
sum[num] = {}
sum[num][index] = O(index)
n[num]=1
else
if index > ln[num] then
sum[num][index] = sum[num][index-1] + O(index)
sum[num][index] = sum[num][index] - O(index-ln[num])
else
sum[num][index] = sum[num][index-1] + O(index)
n[num] = n[num] + 1
end
end
if n[num] ~= 0 then
if num == 1 then
sma[index] = {}
end
sma[index][num] = sum[num][index]/n[num]
end
return sma[index][num]
end
function GetMagic(index, num)
res = 0
val = 0
cnt = 3+num
if index > ln[num] then
val = sma[index][num]
for i = 1, cnt do
dw = 0
up = 0
if index-cnt > 5 then
if O(index) < O(index-1) and O(index-1) < O(index-2) then
dw = O(index-1) - O(index)
end
if O(index) > O(index-1) and O(index-1) > O(index-2) then
up = O(index) - O(index-1)
end
end
val = val + (O(index) - O(index-ln[num]+i))/ln[num]
if O(index) >= val or up*i + O(index) > val --[[or val >= sma[index][num]--]] then
res = res + (ln[num]/sumln)*(i/cnt)
end
if O(index) < val or - dw*i + O(index) < val --[[or val < sma[index][num]--]] then
res = res - (ln[num]/sumln)*(i/cnt)
end
end
end
return res
end
function OnCalculate(index)
prof[index] = 0
GetSMA(index, 1)
GetSMA(index, 2)
GetSMA(index, 3)
GetSMA(index, 4)
GetSMA(index, 5)
GetSMA(index, 6)
GetSMA(index, 7)
GetSMA(index, 8)
GetSMA(index, 9)
GetSMA(index, 10)
GetSMA(index, 11)
GetSMA(index, 12)
GetSMA(index, 13)
GetSMA(index, 14)
GetSMA(index, 15)
GetSMA(index, 16)
GetSMA(index, 17)
GetSMA(index, 18)
GetSMA(index, 19)
GetSMA(index, 20)
m[index] = GetMagic(index, 1)
m[index] = m[index] + GetMagic(index, 2)
m[index] = m[index] + GetMagic(index, 3)
m[index] = m[index] + GetMagic(index, 4)
m[index] = m[index] + GetMagic(index, 5)
m[index] = m[index] + GetMagic(index, 6)
m[index] = m[index] + GetMagic(index, 7)
m[index] = m[index] + GetMagic(index, 8)
m[index] = m[index] + GetMagic(index, 9)
m[index] = m[index] + GetMagic(index, 10)
m[index] = m[index] + GetMagic(index, 11)
m[index] = m[index] + GetMagic(index, 12)
m[index] = m[index] + GetMagic(index, 13)
m[index] = m[index] + GetMagic(index, 14)
m[index] = m[index] + GetMagic(index, 15)
m[index] = m[index] + GetMagic(index, 16)
m[index] = m[index] + GetMagic(index, 17)
m[index] = m[index] + GetMagic(index, 18)
m[index] = m[index] + GetMagic(index, 19)
m[index] = m[index] + GetMagic(index, 20)
--[[
if index > 10 then
m[index] = (9*m[index]+8*m[index-1]+7*m[index-2]+6*m[index-3]+5*m[index-4]+4*m[index-5]+3*m[index-6]+2*m[index-7]+m[index-8])/45
end
--]]
if index > 3 then
m[index] = (3*m[index]+2*m[index-1]+m[index-2])/6
end
if index == Size() then
if Settings.sign == 1 then
for i = 2, Size() do
if m[i] ~= nil and m[i-1] ~= nil then
if 0 < m[i] and 0 >= m[i-1] then
SetValue(i, 4, O(i))
else
if 0 > m[i] and 0 <= m[i-1] then
SetValue(i, 3, O(i))
else
SetValue(i, 3, nil)
SetValue(i, 4, nil)
end
end
end
end
end;
end;
if Settings.prf==1 then
if prof[index-1] ~= nil and m[index-1] ~= nil and O(index-1) ~= nil then
if 0 <= m[index-1] then
prof[index] = prof[index-1] + O(index) - O(index-1)
end
if 0 > m[index-1] then
prof[index] = prof[index-1] + O(index-1) - O(index)
end
end
return prof[index], nil, nil, nil
else
if Settings.sign == 0 then
return 0, m[index], nil, nil
end
end
end