Так как OnCalculate(idx) срабатывает на каждое изменение цены, добавим условие, которое позволит рассчитывать МА для новой свечи только один раз.
Переменная Lastidx принимает значение текущего номера свечи.
if Lastidx < idx then
Lastidx = idx
-- блок --
end
Теперь программа выглядит так:
Settings={}
Settings.Name = "*RobotMA"
Settings.B_PeriodMA = "1"
function Init()
return 8
end
function MyInit()
APeriodMA = {}
APeriodMA[0] = 0
APeriodMA[1] = 0
PeriodMA = Settings.B_PeriodMA+0
LastIdx = 0
end
function OnCalculate(idx)
if idx == 1 then
MyInit()
end
if LastIdx < idx then
LastIdx = idx
APeriodMA[idx] = APeriodMA[idx-1]
if idx >= PeriodMA then
mSum = 0
if idx == PeriodMA then
for i = 0, PeriodMA-1, 1 do
mSum = mSum + O(idx - i)
end
APeriodMA[idx] = mSum/PeriodMA
end
if idx > PeriodMA then
APeriodMA[idx] = APeriodMA[idx-1] - O(idx-PeriodMA)/PeriodMA + O(idx)/PeriodMA
end
end
end
if idx >= PeriodMA then
return APeriodMA[idx]
end
end