function main -- пример работы функции. Приостановка на клиринг local ServerTime = getInfoParam("SERVERTIME") local tTime = {"14:00:00","14:05:00"} -- время начала/окончания неторгового периода local result = diffTime(tTime[1], tTime[2]) if ServerTime>=tTime[1] and ServerTime<=tTime[2] then message("Приостановка работы скрипта на ".. tostring(result).." сек.") sleep(result*1000) -- время приостановки в секундах. Время в Quik в миллисек., поэтому * 1000 end end function diffTime(time1, time2) -- возвращает разницу в секундах между time2-time1; либо 0, если time1 > time2 -- time1 = "14:00:00" -- time2 = "14:05:00" -- result = diffTime(time1, time2) -- = 300 секунд local dt1 = {} local dt2 = {} local dTime1 = 0 local dTime2 = 0 local result = 0 dt1.hour,dt1.min,dt1.sec = string.match(time1,"(%d*):(%d*):(%d*)") for key,value in pairs(dt1) do dt1[key] = tonumber(value) end dt2.hour,dt2.min,dt2.sec = string.match(time2,"(%d*):(%d*):(%d*)") for key,value in pairs(dt2) do dt2[key] = tonumber(value) end --часы*3600 + минуты*60 + секунды. dTime1 = dt1.hour*3600 + dt1.min*60 + dt1.sec dTime2 = dt2.hour*3600 + dt2.min*60 + dt2.sec result = dTime2 - dTime1 if result <= 0 then return 0 else return result end end
— Функция возвращает имя запускаемого скрипта
— может пригодиться для логирования результата (лог_<имя_запускаемого_скрипта>)
scName="" function OnInit(script_path) scName=tostring(get_file_name(script_path)) -- получение полного пути к исполняемому скрипту end function main() message("имя файла = "..scName) end function get_file_name (file) local file_name = file:match("[^\\]*.lua$") -- поиск в строке полного пути к файлу названия скрипта.lua return file_name:sub(0, #file_name - 4) -- обрезка '.lua' в конце строки end
Строя автоматизированную торговлю на базе Квик, нет-нет да и столкнёшься с ситуацией, когда отправленная заявка исполняется совсем не так быстро как хотелось бы. Удивляться тут нечему, производительность квиковских серверов брокера не резиновая, на всплесках нагрузки могут изрядно подтупливать. Что с этим делать?
Запилить торговую систему через прямое подключение к бирже задача совсем другого уровня сложности по сравнению с демократичным Квиком со встроенным языком Lua. Что же, будем выкручиваться с имеющимся инструментарием.
Для получения информации о выставлении или перестановке заявки можно использовать колбэки OnTransReply (со значением поля status = 3) или OnOrder. Сильно ли они отличаются между собой по скорости? Для ответа на этот вопрос я прикрутил логгирование задержек срабатывания этих колбэков от момента вызова функции отправки заявки на сервер до срабатывания соответствующего колбэка. Логгирование выполнялось на дельтахеджере и опционном котировщике. Данные собирались в течение месяца не первом сервере в Открывашке, сам Квик работал на VDS-хостинге.
Settings={ Name="Buy_osc_v01", period=50, delta=0, lim=100.0, line= { { Name = "cur1", Type =TYPE_LINE, Width = 1, Color = RGB(0, 0, 255) }, { Name = "cur2", Type =TYPE_LINE, Width = 1, Color = RGB(0, 0, 0) }, { Name = "cur3", Type =TYPE_LINE, Width = 1, Color = RGB(0,0, 0) }, { Name = "cur4", Type =TYPE_LINE, Width = 1, Color = RGB(0,0, 0) } } } --[[ описание свойств: period - период, за каротрый делается расчет delta - смещение назад назначение: горизонтальная ширина канала использовался: метод наименьших квадратов (аппроксимация линией) --]] function Init() return 2 end function OnCalculate(index) sz = Size() n = Settings.period d = Settings.delta lim = Settings.lim y = nil if index-n-d > 0 then a1 = 0 a2 = 0 a3 = 0 a4 = 0 for i=index-n+1-d, index-d do a1 = a1+i*C(i) a2 = a2+i a3 = a3+C(i) a4 = a4+i*i end if((n*a4 - a2*a2) ~= 0) then a = (n*a1 - a2*a3)/(n*a4 - a2*a2) b = (a3 - a*a2)/n c1 = 0 c2 = 0 n1 = 0 n2 = 0 for j=index-n+1-d, index-d do y = a*j + b if C(j) < y then c1 = c1 + (y -C(j)) n1 = n1 + 1 end if C(j) > y then c2 = c2 + (C(j) - y) n2 = n2 + 1 end end if n1 ~= 0 then c1 = c1/n1 end if n2 ~= 0 then c2 = c2/n2 end if a==0 then y = 0 else y = (c1+c2)/a if y > lim then y = lim else if y < -lim then y = -lim end end end end end return y,0 end
for i = 0.1, 0.3, 0.1 do message(tostring(i)) endРезультат:
Цикл:
for i = 0.1, 0.5, 0.1 do message(tostring(i)) endРезультат: