Лучший онлайн-брокер для работы на бирже
215,40
рейтинг
11 ноября 2013 в 12:25

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

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;
using System.Runtime.InteropServices;
using SmartCOM3Lib;

namespace SmartTest
{
    class SmartCOMTest
    {
        StServer mSmartCOMInstance;

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

                /* устанавливаем уровень логирования */
                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 (COMException ex)
            {
                /* Обработка возможных COM-исключений */
            }
            catch (Exception ex)
            {
                /* Обработка остальных исключений */
            }
        }

        /* Запускаемся */
        public void 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 (Exception ex)
            {
                /* Обработка остальных исключений */
            }
        }

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

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

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

        void mSmartCOMInstance_UpdateBidAsk(string symbol, int row, int nrows, 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, int nrows, string portfolio, string symbol, StOrder_State state, StOrder_Action action, StOrder_Type type, StOrder_Validity validity, double price, double amount, double stop, double filled, DateTime datetime, string id, string no, int cookie)
        {
            /* Информация о судьбе наших торговых операций */
        }
    }

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


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

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

Работа


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

image

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

P.S. Если у вас возникли какие-либо вопросы по созданию и использованию торговых роботов, то задавайте их в комментариях или напишите письмо на smartcom@itinvest.ru.Кроме того, все интересующие темы, связанные с API SmartCOM можно обсудить с разработчиком системы на Brainstorge.
Автор: @itinvest
ITinvest
рейтинг 215,40
Лучший онлайн-брокер для работы на бирже

Комментарии (24)

  • +1
    Любопытная картинка в самом начале поста — это делается вручную или автоматически?? Прям вот интересно как программно можно сделать так, что слово 'allow' находится внутри пустого пространства в букве 'P' слова API ну и остальные подобные примеры.
    • 0
      Дизайнер детектед.

      По теме поста: планируется ли работа на бирже с биткойнами?
      • +1
        btc-e имеет и апи для роботов и Metatrader для этого дела )
        • 0
          Если говорить о Метатрейдере в плане API и прочего, то MQL4 (5й не трогал) полный отстой, как по мне :(
      • 0
        Мы не планируем пока что.
      • +1
        Если речь про ММВБ — то однозначно нет. Биржа крайне консервативная.
        Российские брокеры — тоже не рискнут лицензией.
        А вот дочки в офшорах — пожалуйста. Но не думаю что надежность кого-то устроит.
    • +1
      Wordle http://www.wordle.net/. В этой книжке есть описание алгоритма.
    • 0
      Еще сюда загляните d3.js
  • 0
    Есть доступ к nasdaq/nyse?
    • +2
      Конкретно к этим двум — нет, но есть, к примеру, Лондонская и еще несколько довольно интересных площадок (список).
      • 0
        А можно поподробнее с этого места — на какой платформе у вас реализован терминал к западным биржам?
        Вероятно это уже не SmartCom… Большинство российских брокеров, если не все — предлагают _западные_ площадки лишь в формате MetaTrader т.е. CFD+FOREX… кухни вобщем. При этом российские площадки у них представлены с нормальным биржевым доступом…

        В идеале, лично мне — хотелось бы иметь настоящий терминал т.е. 'со стаканом' к западным площадкам + возможность программирования (API). Вероятно для этого потребуется иметь несколько счетов — не проблема, но хорошо бы, чтобы все эти счета и площадки были доступны через _единое_ API — у вас это возможно?
        • 0
          Большинство российских брокеров имеют офшорных дочек для доступа к зарубежным площадкам.
        • +1
          Одновременный доступ к российским и западным площадкам осуществляется через торговую систему MatriX и терминал SmartX. Кроме этого, существующее API SmartCOM 3.0 также обеспечивает единый интерфейс на все площадки. На текущий момент из западных площадок доступна LSE IOB. В ближайшем будущем – CME и другие. И все этого в рамках одного договора на брокерское обслуживание. Скоро в нашем блоге мы анонсируем новый универсальный API. Следите за обновлениями :).
  • +2
    API к серверу брокера — отлично, а можете ли посоветовать какие-либо C# компоненты для чартинга — т.е. для визуализации финансовых графиков?

    Параллельная проверка через терминал не подходит, а в Stock# чартинг не очень гибок и не прозрачен на мой взгляд… мне хочется несколько инструментов на один график затащить в масштабе и чтобы события (клики разные) иметь возможность обрабатывать…
    • +1
      Хороших бесплатных компонент для физуализации финансовых графиков навскидку вспомнить не удается. Самая простая альтернатива — это MSChart (входит в .Net Framework 4). Он многофункционален, в т.ч может строить финансовые графики. Но он не предназначен для частого динамического их обновления (уж больно медленный), да и финансовых индикаторов и фигур там по умолчанию вроде бы нет (надо уточнить), т.е. если нужны индикаторы — придется долго и муторно разрабатывать их самостоятельно.
  • 0
    Нет ли у вас в планах Java based API? или скажем FIX-эндпоинт, чтобы отвязаться от платформы клиента?
    • +1
      Java based — пока в планах нет, а FIX — уже есть, скоро будет соответствующий анонс.
      • +1
        Отличная новость. Спасибо
        • 0
          Пожалуйста!
  • –2
    2013 год подходит к концу, а русские биржи все так же с COM работают. Да еще и продают это как передовые технологии…
    Это печально.
    • +1
      Кстати, вы неправы. COM интерфейсы у российских бирж давно закончились. Но это был важный и необходимый этап в их развитии. Сейчас подключение к биржам осуществляется по FIX-протоколам, а также через нативные протоколы и шлюзы: Plaza II (для срочного рынка, торговая система Spectra) и TEAP (для валютного и фондового рынков, торговая система ASTS).

      Что касается нас как брокера, то для начинающих роботоводов мы предлагаем COM. Кажется это наиболее разумный выбор из всех альтернатив. Для тех же кто чувствует себя состоявшимся алготрейдером и готов платить бОльшие деньги, мы предалагаем и FIX, и FAST (для получения Market Data) и логины Plaza II и подключение через TEAP. Подробности тут.
  • –1
    скомканная статья какая-то, код не отформатирован…
    • 0
      форматирование поправили
  • 0
    Подскажите, как правильно реализовать Stop Limit Order (для SHORT и LONG) при помощи вашего API со сроком действия 30 секунд?

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

Самое читаемое Разработка