пятница, 1 апреля 2011 г.

Ограничение на переставление заявок в Quik Junior

Хотя сегодня и пятница, но что-то какая-то напряжная пятница. День дурака принес с собой проблемы на хостинге всех сайтов, над которыми я работаю. Поэтому 2 часа потратила на переписку с техподдержкой (а вернее — на ожидание ответа от нее). В каком-то подвешенном состоянии находилась, ничего делать не могла.

Но сейчас, вроде, — тьфу-тьфу-тьфу — работа восстановилась (хотя кое-какие проблемы время от времени вылазят), можно облегченно вздохнуть и написать пост на этот блог :)

Хочу поделиться интересным наблюдением при работе с тестовым Quik Junior. Если тестировать на нем маркетмейкерского робота, который часто переставляет заявки в зависимости от изменения рыночной ситуации, то 10 переставлений проходят на "ура", а 11-ое отклоняется системой. В лог идет примерно такая запись:
01.04.2011 11:22:07 [470] [FORTS] В операции отказано: Превышен лимит операций от указанного клиента.

Причем повторяется это периодически, без каких-либо сбоев. То есть 10 удачних переставлений — 2 реджекта (я переставляю сразу пару заявок — бид и оффер) — 10 удачных переставлений и так далее.

Сначала у меня чуть мозги не закипели, когда пыталась найти причину этого где-нибудь в ошибке в своем коде. Даже заказала тестовый аккаунт в другом месте. И только в результате опытов поняла, что дело в ограничениях Quik Junior-а.

Может, мой опыт кому-нибудь поможет меньше ломать голову над этой проблемой, когда столкнется с ней.

___

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

пятница, 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.

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

среда, 2 февраля 2011 г.

Хорошая новость — QuikOrdersDOM+ со скидкой 10%!

Сообщаю хорошую и — надеюсь — полезную новость! Этот блог стал партнером ttools.ru. Что это значит? Это значит, что, воспользовавшись реферальной ссылкой, вы можете купить расширенную версию QuikOrdersDOM (с дополнительными полезными функциями) со скидкой 10%!

Подробнее обо всем написала на странице, посвященной этому радостному событию %D
___

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

вторник, 1 февраля 2011 г.

Что такое roundtrip (раундтрип)? Пишем приложение для определения значения раундтрипа

Roundtrip — так называется у трейдеров время, которое затрачивается на выставление заявки и получение информации о том, что заявка зарегистрирована в системе (ну или отклонена по каким-то причинам).

На примере вычисления раундтрипа я хочу показать по пунктам, как начинать работу с QuikOrdersDOM SDK. Все от А до Я: создание проекта, описание структуры, некоторые функции, которые понадобятся для реализации задачи.

Программу будем писать на Delphi.

Создание нового проекта Delphi для работы с QuikOrdersDOM



Проще всего создать новый проект на основе заготовки, которую нам предлагает автор qSDK.

В архиве с приводом, который можно скачать на сайте, есть папка src, а в ней — несколько поддиректорий с примерами проектов. Создаем себе рабочую папку (я назвала ее RoundTrip) и копируем туда файлы из каталога ATLibSample.

Открываем проект в Delphi и прересохраняем его под названием RoundTrip.