Добавляем переменные SdelkaDn и SdelkaUp. Они будут следить какую заявку выставили, покупка или продажа. Также добавляем переменную SdelkaOidx, которая будет хранить O(idx) значение цены по которой открываем позицию. переменная AProfit будет хранить результат прибыли/убытка. Переменная Contract - число контрактов.
В итоге получаем:
Settings={}
Settings.Name = "*RobotMA"
Settings.B_PeriodMA = "1"
Settings.B_Contract = "1"
function Init()
return 8
end
function MyInit()
APeriodMA = {}
APeriodMA[0] = 0
APeriodMA[1] = 0
AProfit = {}
AProfit[0] = 0
AProfit[1] = 0
iProfit = 0
PeriodMA = Settings.B_PeriodMA+0
Contract = Settings.B_Contract+0
LastIdx = 0
SdelkaDn = 0
SdelkaUp = 0
SdelkaOidx = 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
if SdelkaDn == 1 or SdelkaUp == 1 then
if SdelkaDn == 1 then
if APeriodMA[idx] < O(idx) then
SdelkaDn = 0
iProfit = iProfit + 1
AProfit[iProfit] = AProfit[iProfit-1] + (SdelkaOidx - O(idx))*Contract
end
end
if SdelkaUp == 1 then
if APeriodMA[idx] > O(idx) then
SdelkaUp = 0
iProfit = iProfit + 1
AProfit[iProfit] = AProfit[iProfit-1] + (O(idx) - SdelkaOidx)*Contract
end
end
end
if SdelkaDn == 0 and SdelkaUp == 0 then
IFDN = APeriodMA[idx] > O(idx)
IFUP = APeriodMA[idx] < O(idx)
if IFDN and not IFUP then
SdelkaDn = 1
SdelkaOidx = O(idx)
elseif IFUP and not IFDN then
SdelkaUp = 1
SdelkaOidx = O(idx)
end
end
end
if idx >= PeriodMA and iProfit > 0 then
return AProfit[iProfit]
end
end