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