Найти тему
Простое МА

продолжение

Добавляем переменные 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