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

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

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

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

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

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



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

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

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

Идем в настройки "Project - Options" (горячие клавиши Shift+Ctrl+F11) и там на вкладке "Directories/Conditionals" выбираем в поле "Output directory" директорию, в которую будет компилироваться наша библиотека.
Настройки Output directory в Delphi
Далее в меню "Run - Parameters..." в поле "Host Application" выбираем QuikOrdersDOM.exe. Сейчас после нажатия на кнопку F9 (Run) будет запускаться QuikOrdersDOM.
Настройки Run Parameters в Delphi

Нажимаем и проверяем, как все сработало. Должно все без проблем откомпилироваться и должен запуститься QuikOrdersDOM. Если у вас не запущен Quik, можно запустить его, нажав Q на форме привода.
Запуск модуля в QuikOrdersDOM
Библиотеку пока не запускаем, нужно еще внести кое-какие изменения. Но перед этим рассмотрим основные блоки uAtLibMain.

Основные блоки модуля QuikOrdersDOM


В uAtLibMain содержится перечень функций, составляющих основную структуру (так сказать, костяк) любого модуля.

AT_LIB_INIT


function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;

Функция AT_LIB_INIT выполняется при "инициализации" модуля. Здесь самое главное — переменная T типа TLibInitialRecord. Именно через нее потом будем получать доступ ко всем функциям SDK.

Также в AT_LIB_INIT можно определять и создавать переменные и т.д.. В общем, подготовить все для работы.

AT_LIB_CYCLE


function AT_LIB_CYCLE: Cardinal ; stdcall;

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

В этой функции получаются и анализируются параметры, реализуется стратегия вашей торговли и т.д..

AT_LIB_DONE


function AT_LIB_DONE: Cardinal ; stdcall;

Функция выполняется по завершению работы модуля. В ней освобождается память, выделенная в AT_LIB_INIT, могут сохраняться какие-нибудь результаты работы, настройки и т.д.

AT_LIB_ABOUT


function AT_LIB_ABOUT: Cardinal; stdcall;

То, что происходит при нажатии на кнопку "О модуле". Здесь можно просто поместить мессадж о том, что делает ваш модуль. А можно и ничего не помещать, если он предназначен только для личного пользования.

AT_LIB_SETUP


function AT_LIB_SETUP: Cardinal ; stdcall;

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

Создаем пустую заготовку формы модуля для вычисления раундтрипа


Итак, основные блоки программы разобрали. Перейдем к модулю для вычисления раундтрипа. Из заготовки удалите юнит uEMATrading, почистите функции AT_LIB_INIT, AT_LIB_CYCLE, AT_LIB_DONE.

Далее по порядку:
1. Создаем новую форму (назовем ее frmRT), сохраняем юнит под названием uRT.
2. В uRT добавляем в uses библиотеку uATLibrary. А в глобальные переменные R типа TLibInitialRecord. У нас получится:

var
frmRT : TfrmRT;
R : TLibInitialRecord; // из этой переменной будем вызывать
// функции QuikOrderDOM SDK и получать данные

3. Переходим к uAtLibMain. В uses добавляем юнит с нашей формой uRT. И объявляем глобальную переменную fRT типа TfrmRT.
4. Прописываем следующий код в функциях:

function AT_LIB_INIT (T : TLibInitialRecord): Cardinal; stdcall;
begin
R:=T;
fRT := TfrmRT.Create(nil);
fRT.Show;
end;

function AT_LIB_DONE: Cardinal ; stdcall;
begin
fRT.Free;
end;

На этом первый этап можно считать оконченным. Проверяем, что у нас получилось. Запускаем модуль, выбираем RoundTrip.dll в качестве библиотеки автотрейдинга — и у нас сразу открывается немодальная форма (пока пустая).
Автоматический запуск модуля в QuikOrdersDOM
Остальное — в следующих частях инструкции. Надеюсь, мои труды останутся ненапрасными и помогут вам на пути к созданию своего собственного торгового робота. :)

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

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