Когда мы выставляем заявку с помощью функции 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.