пятница, 18 марта 2011 г.

Как найти индекс заявки по ее ID в qSDK

Поиск индекса выставленной в торговый терминал заявки по Id — зачем он вообще нужен?

Когда мы выставляем заявку с помощью функции fATLibSendCustomOrder, она соответственно возвращает нам Id выставленной заявки.

BidOrderId := R.fATLibSendCustomOrder(SecIdx,OD,BidPrice,Size,Account,aAdditional);


Дальше нам желательно отслеживать состояние заявки. Это делается с помощью функции R.fATLibGetOrderInfo. Только вот в качестве параметра туда надо передавать не Id, а индекс в списке QuikOrdersDOM.

R.fATLibGetOrderInfo(tmpOrderIndex,@tmpOrderInfo);


Найти его можно, перебирая все выставленные заявки. Так вот, чтобы чуть оптимизировать нахождение индекса, надо перебирать заявки с конца — так вы найдете его быстрее.

function FindOrderIndexById ( aInitRec  : TLibInitialRecord;
aId : Cardinal) : integer;
var
Res,
i : integer;
cnt : Cardinal;
tmpOrderInfo : TOrderInfo;
begin
Result := -1;
cnt := aInitRec.fATLibGetOrdersCount;
if (cnt = 0) or (cnt = $FFFFFFFF) then exit;
for i := cnt-1 downto 0 do
begin
Res := aInitRec.fATLibGetOrderInfo(i,@tmpOrderInfo);
if Res = 0 then
if tmpOrderInfo.Id = aId then
begin
Result := i;
exit;
end;
end;
end;


Еще один ньюанс, о котором бы хотелось написать (авось кому пригодится). Для торговых роботов, совершающих большое количество сделок (маркетмейкерских, скальперских), лучше хранить "активные" заявки в отдельном списке. Так вам проще и быстрее будет отслеживать их состояние. Причем хранить не Id, не индекс, а запись, в которой указаны и то, и другое (при необходимости — еще какие-нибудь параметры, например, время попытки снятия).

В ходе проверки состояния заявок будете удалять исполненные (tmpOrderInfo.State = OS_CREATED), переставлять отклоненные и т.д., в зависимости от вашего алгоритма.

Напомню, что у заявки могут быть 8 статусов:
OS_CREATED    : byte = 0; // создана
OS_SENT : byte = 1; // отправлена в терминал
OS_ACTIVE : byte = 2; // активна (подтверждено из терминала)
OS_EXECUTED : byte = 3; // исполнена
OS_CANCELED : byte = 4; // отменена
OS_CANCELING : byte = 5; // отправлена транзакция на отмену, но ещё не
// отменена
OS_INDEFINITE : byte = 6; // неопределенный, после загрузки заявок
OS_REJECTED : byte = 7; // отклонена системой

___

Чтобы быть в курсе обновлений блога, подпишитесь на RSS.

пятница, 4 марта 2011 г.

Новая версия TradeProcessor 1.0.0.1 — всем, кто любит SDK :)

На Ttools.ru была проанонсирована новая версия модуля TradeProcessor. Самое примечательное в ней — появление SDK. Сейчас можно использовать готовые функции вычисления дельты (инструмента или позиции), а так же работать с задачами в своих приложениях: создавать, запускать и т.д.

Использование функций интуитивно понятно и для тех, кто уже программировал на QuikOrdersDOM SDK, разобраться с ними не составит труда. В принципе, потом по их использованию тоже можно написать статью-мануал с примерами, если будет кому-нибудь интересно :) Сейчас просто не до этого: работы много, да и приоритеты в отношении материалов для этого бложика уже распределены (первым делом надо взять себя в руки и закончить начатую серию статей про программирование тестировщика раундтрипа).
___

Чтобы быть в курсе обновлений блога, подпишитесь на RSS.

Если материал оказался интересным — поделитесь ссылкой с друзьями :)