Найти в Дзене
продолжение
1 год назад
продолжение
Добавляем переменные 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...
1 год назад
продолжение
Так как 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...
1 год назад
Используем этот пример для написания торгового робота. Функции для доступа к источнику данных 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, то нужно ее создать. В ней создать файл, скопировать текст.
1 год назад
Несколько лет назад я увлекся торговлей на фондовой бирже. Занимаясь программированием, решил воспользоваться возможностями программы 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
1 год назад