продолжение
Простое МА
1
подписчик
Простое скользящее среднее. Lua. QUIK.…
продолжение
Добавляем переменные 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...
продолжение
Так как 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...
Используем этот пример для написания торгового робота. Функции для доступа к источнику данных O, H, L, C, V, T принимают в качестве параметра индекс свечи и возвращают соответствующее значение. Первое что сделаю, перепишу функцию для себя. Для расчета МА использую функцию O(idx). Переменная APeriodMA[idx] хранит расчетные значения МА для каждого бара. Settings={} Ssettings.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 end function OnCalculate(idx) if idx == 1 then MyInit() end 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 idx >= PeriodMA then return APeriodMA[idx] end end Если в папке QUIK нет папки LuaIndicators, то нужно ее создать. В ней создать файл, скопировать текст.
Несколько лет назад я увлекся торговлей на фондовой бирже. Занимаясь программированием, решил воспользоваться возможностями программы QUIK и написать робота, который бы выставлял заявки, используя индикатор технического анализа Simple Moving Average. В документации по QLUA описывается такой пример: Settings={} settings.name = "SimpleMA" Settings.mode = "C" Settings.period = 5 Settings.str_field = "STRING field" function dValue(i,param) local v = param or "C" if v == "O" then return O(i) elseif v == "H" then return H(i) elseif v == "L" then return L(i) elseif v == "C" then return C(i) elseif v == "V" then return V(i) elseif v == "M" then return (H(i) + L(i))/2 elseif v == "T" then return (H(i) + L(i)+C(i))/3 elseif v == "W" then return (H(i) + L(i)+2*C(i))/4 else return C(i) end end function Init() return 1 end function OnCalculate(idx) local per = Settings.period local mode = Settings.mode local lValue = iValue if idx >= per then local ma_value=0 for j = (idx-per)+1, idx do ma_value = ma_value+dValue(j, mode) end return ma_value/per else return nil end end