How-to: роботы и API брокерской торговой системы

Ринки 11.11.2013    12:37 image

В одном из прошлых топиков мы начали обсуждать общее устройство биржевого рынка России, а сегодня чуть подробнее взглянем на одно из его звеньев – брокерские системы. Брокерский бизнес технологичен по своей сути: клиенты выставляют заявки с использованием торговых терминалов, часто разработанных именно брокерами, а для обработки заявок и их отправки на биржу необходима автоматизированная система сбора заявок и выставления их на биржу. Такие системы, снабженные средствами авторизации и лимитирования, позволяющие смаршрутизировать заявку на рынок и дать клиенту информацию о ее статусе и о текущем состоянии его портфеля, обычно зовутся торговыми системами брокера. 

Большинство заявок на современных биржах генерируются не людьми, а специально созданными торговыми роботами, которые действуют по заданному алгоритму. Для этих программ ключевым фактором является общая скорость работы, которая зависит и от оперативности самого робота, и от каналов связи, и от мощности железа, на котором он работает. Само собой, для подключения робота к торговой системе у нее должно быть API. Об этом мы сегодня и поговорим.

Зачем это нужно?


Работа робота напрямую с серверами брокера (минуя клиентские интерфейсы) позволяет ему оперативно получать данные о торгах (Market Data) и состоянии счета, быстрее обрабатывать эти данные и, на их основе, генерировать приказы на покупку или продажу, а затем отслеживать их исполнение. При такой схеме скорость торговли зависит только от скорости самого робота и каналов связи.

image

Технические характеристики API


Интерфейс для подключения к нашей брокерской системе создан с использованием компонентной объектной модели (COM).Это означает, что к торговым серверам можно подключить роботов, разработанных на платформах, поддерживающих эту технологию, от C++ и Delphi до Visual Basic for Application из MS Excel. 

Недавно состоялся релиз новой версии API (SmartCOM 3.0), которая работает с запущенной в этом году торговой системе под названием MatriX (для ее создания мы использовали технологии IBM Data Power– об этом будет отдельный топик).

Из ключевых особенностей открытого интерфейса можно отметить следующие:

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

Виды роботов


image

Разработчики, занимающиеся разработкой роботов под системы разных брокеров, формируют довольно активное коммьюнити, в которое входят как отдельные энтузиасты и трейдеры, создающие роботов для своих нужд, так и компании, профессионально занимающиеся построением автоматизированных торговых систем на заказ.

В результате получается довольно много разнообразных программ, как платных, так и распространяемых свободно. Вот пара примеров:

  • StockSharp —бесплатная платформа для торговых роботов и автоматизации полного цикла алготрейдинга.
  • QScalp — торговый привод для анализа и скоростного выполнения операций на рынке при краткосрочной и высокочастотной биржевой торговле.

Купить торгового робота или скачать бесплатную программу, конечно, неплохая идея. Но сделать все самому – куда как более интересная и интригующая задача, не так ли? 

Делаем робота


Попробуем сделать собственного простейшего робота, который будет подключаться к торговой системе, запрашивать информацию по счету и котировки, а также выставлять на биржу приказы: 

using System;
usingSystem.Runtime.InteropServices;
using SmartCOM3Lib;

namespaceSmartTest
{
classSmartCOMTest
    {
StServermSmartCOMInstance;

        /* Инициализация */
publicSmartCOMTest()
{
try
            {
                /* создаем объект класса StServerClass */
mSmartCOMInstance = newStServerClass();

                /* устанавливаем уровень логгирования */
mSmartCOMInstance.ConfigureClient("logLevel=5;");
                /* регистрируем обработчики событий */
mSmartCOMInstance.Connected += new _IStClient_ConnectedEventHandler(mSmartCOMInstance_Connected);
mSmartCOMInstance.Disconnected += new _IStClient_DisconnectedEventHandler(mSmartCOMInstance_Disconnected);
mSmartCOMInstance.SetPortfolio += new _IStClient_SetPortfolioEventHandler(mSmartCOMInstance_SetPortfolio);
mSmartCOMInstance.SetMyOrder += new _IStClient_SetMyOrderEventHandler(mSmartCOMInstance_SetMyOrder);
mSmartCOMInstance.UpdateBidAsk += new _IStClient_UpdateBidAskEventHandler(mSmartCOMInstance_UpdateBidAsk);
}
catch (COMExceptionex)
            {
                /* Обработка возможных COM исключений */
            }
catch (Exceptionex)
            {
                /* Обработка остальных исключений */
}
        }

        /* Запускаемся */publicvoid Run()
        {
try
            {
/* Для начала нужно установить связь с сервером *//* в случае успешного установления соединения сработает событие Connected */
mSmartCOMInstance.connect("mx.ittrade.ru", 8443, "BPXXXX", "xxxxxx");

/* далее ожидаем до тех пор, пока пользователь не нажмет Esc, что 
                 приведет к завершению программы */while (Console.ReadKey().Key != ConsoleKey.Escape);

                /* отключаемся от сервера */
mSmartCOMInstance.disconnect();
            }
catch (COMException ex)
{
                /* Обработка возможных COM исключений */
            }
catch (Exceptionex)
{
                /* Обработкаостальныхисключений */
            }
        }

voidmSmartCOMInstance_SetPortfolio(string portfolio, double cash, double leverage, double comission, double saldo)
        {
            /* Обновление параметров портфеля */
        }

voidmSmartCOMInstance_Disconnected(string reason)
{
            /* не удалось установить соединение с сервером или существующее соединение было разорвано 
             * вследствиесетевой или других ошибок */
        }

voidmSmartCOMInstance_Connected()
        {
            /* соединение успешно установлено, можно подписываться на получение данных *//* подписываемся на портфель и обновление стакана по инструменту SBER */
mSmartCOMInstance.ListenPortfolio("BPXXXX-MS-01");
mSmartCOMInstance.ListenBidAsks("SBER");
        }

voidmSmartCOMInstance_UpdateBidAsk(string symbol, int row, intnrows, double bid, double bidsize, double ask, double asksize)
{
            /* обновление данных по стаканам, на которые мы подписаны *//* например, наш робот принимает решение о покупке или продаже,
             * исходя из каких то событий происходящих в биржевом стакане, 
             * тогда код будет примерно такой: */if (/* какие-то условия в стакане */)
                /* ставим приказ на покупку 1 лота сбербанка по рыночной цене */
mSmartCOMInstance.PlaceOrder("BPXXXX-MS-01", "SBER", StOrder_Action.StOrder_Action_Buy, 
StOrder_Type.StOrder_Type_Market, StOrder_Validity.StOrder_Validity_Day, 0, 1, 0, 0);
        }

        void mSmartCOMInstance_SetMyOrder(int row, intnrows, string portfolio, string symbol, StOrder_State state, StOrder_Action action, StOrder_Type type, StOrder_Validity validity, double price, double amount, double stop, double filled, DateTimedatetime, string id, string no, int cookie)
{
            /* Информация о судьбе наших торговых операций */
}
    }

class Program
    {
        /* точка входа */staticvoid Main(string[] args)
        {
SmartCOMTestsmartCOMTest = new SmartCOMTest();
smartCOMTest.Run();
}
    }
}

Более полный список доступных функций API можно посмотреть здесь.

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

Работа


Человеческим глазом разобрать, что там к чему, довольно сложно, поэтому обычно для контроля работы робота используют дополнительно обычный торговый терминал. 

image

На сегодня все. В следующий раз мы поговорим о том, что происходит «внутри» брокерской системы: как она принимает и обрабатывает заявки, как они выставляются на биржу, а также какое оборудование и ПО используются для этой работы. 

P.S. Если у вас возникли какие-либо вопросы по созданию и использованию торговых роботов, то задавайте их в комментариях или напишите письмо на smartcom@itinvest.ru.Кроме того, все интересующие темы, связанные с APISmartCOMможно обсудить с разработчиком системы на Brainstorge. Теги:   API C++ Delphi до Visual Basic for Application MS Excel Переглядів:   1423

Читайте також:

22.11

Україна та Азербайджан підписали меморандум про екологічну співпрацю на СОР29

22.11

S.T.A.L.K.E.R. 2 викликав 35% зростання інтернет-трафіку в Україні

22.11

Ціни промислових виробників України у жовтні зросли на 0,8%