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
Строя автоматизированную торговлю на базе Квик, нет-нет да и столкнёшься с ситуацией, когда отправленная заявка исполняется совсем не так быстро как хотелось бы. Удивляться тут нечему, производительность квиковских серверов брокера не резиновая, на всплесках нагрузки могут изрядно подтупливать. Что с этим делать?
Запилить торговую систему через прямое подключение к бирже задача совсем другого уровня сложности по сравнению с демократичным Квиком со встроенным языком 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Результат: