пятница, 21 января 2011 г.

Локальное и серверное время Quik: на что следует обратить внимание при разработке роботов на QuikOrdersDOM SDK

Сегодня речь пойдет о времени. Не о том, что его постоянно не хватает :), а о том, как правильно работать с временем при разработке своих автоматических торговых систем с помощью QuikOrdersDOM SDK (qSDK).

Для чего может понадобиться время? Например, в случае, если вы выставляете задержку между заявками (можно, конечно, в циклах, но в миллисекундах как-то красивее, на мой взгляд). Или для "отсрочки" запуска задачи. Или для остановки задачи на время клирингов.

В любом случае, правильно работать с временем сервера Quik. Но перед началом торговли все-таки смотрите, чтобы часы на вашем компьютере были синхронизированы и подведены.

В QuikOrdersDOM SDK есть 2 функции работы со временем:

fATLibGetServerDate : TATLibGetServerDT; – функция получения текущей даты
fATLibGetServerTime : TATLibGetServerDT; – функция получения текущего времени


Пишем небольшую процедурку для определения текущего времени из Quik:

function GetServerDT(aInitRec : TLibInitialRecord; var aNow : TDateTime) : Cardinal;
var
dDT, tDT :TDateTime;
begin
Result := 1;
if aInitRec.fATLibIsOnline <> 1 then exit;
if (aInitRec.fATLibGetServerDate(dDT) = 0) and (aInitRec.fATLibGetServerTime(tDT) = 0) then
begin
aNow := dDT + tDT;
Result := 0;
end;
end;

После этого, не забывая проверять возвращаемое значение, время вычисляем так:

// время последней сделки
if GetServerDT(R, aNow) = 0 then
aHedgerTask.LastOrderTick := aNow
else
aHedgerTask.LastOrderTick := Now;

Если время не может быть определено, то в листинге выше у меня берется локальное время. Это следует делать, только если время не критично (например, вы удачно отправили заявку и хотите запомнить время отправки). Если от времени зависит что-нибудь серьезное, то правильнее прервать процедуру, вызвав exit, и вернуться к выполнению своего алгоритма на следующем цикле.

Комментариев нет:

Отправить комментарий