ЭФиР. Партнерский сервис.

Инструкция для подключения к онлайновым потокам Эфира

Содержание

1. Введение. 4

1.1. Цель. 4

1.2. Область применения документа. 4

2. Общее описание. 4

2.1. Общие положения. 4

2.2. Общий принцип использования и ограничения. 4

3. Загрузка исторических данных. 4


 

1.  Введение

1.1.  Цель

В документе описывается порядок подключения к биржевым фидам Эфира, предоставляемым сервисом RTS (Real time service).

1.2.  Область применения документа

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

2.  Общее описание

2.1.  Общие положения

Обеспечивается доступ к онлайновым и историческим данным Эфира по учётной записи Эфира. Доступ к фидам и отдельным инструментам управляется подпиской.

2.2.  Общий принцип использования и ограничения

Клиентские библиотеки позволяют подключаться к онлайновому потоку данных по любому из фидов Эфира. Фид может соответствовать как торговой площадке (Форекс), так и группе инструментов площадки (МБ акции). Поток биржевых данных фида состоит из нескольких частей:

-  сделки;

-  котировки (снапшоты);

-  очереди заявок.

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

-  полная;

НЕ нашли? Не то? Что вы ищете?

-  частичная.

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

Клиентская библиотека позволяет подписываться только на один тип данных потока (сделки, снапшоты или очереди заявок). Таким образом, например, для получения всех трёх потоков по одному фиду, требуется создать три подписки.

Кроме библиотеки подключения к онлайновым данным имеется сервис исторических данных. Он позволяет получать:

-  текущее состояние (снапшоты, очереди заявок, сессионные поля);

-  пропущенную историю (сделки, тики);

-  справочники (справочник инструментов).

3.  Фиды и права доступа

Субъекты рынка описаны в сборке Interfax. Efir. MarketModel. Фиды, предоставляемые Эфиром, перечислены в enum MarketFeedGroup. Как уже говорилось, некоторые торговые площадки представлены одним фидом, а некоторые – несколькими. По MarketFeedGroup для каждого фида можно узнать:

-  имена онлайновых потоков RTS;

-  привилегии, дающие право получения данных по фиду.

Для фидов, где используется ограниченная подписка, используется две привилегии. Например: [EfirPrivelege("DATAFLOW FOREX")] и [EfirPrivelege("DATAFLOW FOREX RESTRICTED", true)].

Справочник инструментов и сессионные поля всегда предоставляются по фиду в полном объёме, не зависимо от типа подписки: полная или ограниченная. Все остальные исторические и онлайновые данные предоставляются строго по подписке. В случае, если тип подписки ограниченный, то происходит фильтрация по id_iss инструментов. Так же, подписка может быть задержанной, если у роли пользователя, которая даёт привилегию на фид, флаг activity = 0. При каждом соединении с сервером RTS для подключения к какому-либо онлайновому потоку, во время идентификации происходит проверка истечения срока подписки. При истечении связь пользователя с ролью помечается как неактивная флагом activity=0.

4.  Сервис исторических данных

4.1.  Форма реализации

Реализован в виде WCF-сервиса. Для получения архивов используется wcf-стриминг. Данные возвращаются в виде DTO, интерфейс в форме RPC, для кодирования используется стандартный DataContractSerialzer. В потоках для кодирования используется Protobuf. Для защиты сервиса используется userNameAuthentication. Клиент должен указывать на Proxy plain text логин и пароль. Для защиты используется сертификат с message-level security.

Для доступа к сервису предоставляется разделяемая библиотека с DataContract и со всеми DTO. А именно:

1)  Interfax. Efir. MarketModel – описание фидов;

2)  Interfax. Efir. PartnerDataModel – все Service и Data контракты, необходимые для работы.

4.2.  API сервиса

Справочные данные предоставляются по фидам без ограничения по подписке через IGuideService. Для получения справочников и сессионных полей достаточно иметь действительную учётную запись в Эфире.

Исторические данные предоставляются через IHistoryRecoveryService, который позволяет получать большие объёмы через Wcf-стриминг.

4.3.  Подключение

Для упрощения работы предоставляется библиотека Ifx. Helpers, имеющая готовые ChannelFactory-клиенты с поддержкой сертификатов, отладочного режима без security, и преобразованием исключений в Faults. Так же, в ней имеется поддержка для работы с Wcf-streams, автоматическое декодирование потоков через protobuf и передача исключений на сторону клиента. Для подключения к сервису можно использовать PooledWcfClientManager, а для чтения потоков DTO: SerializedStreamReader<T>.

Пример подключения предоставляется в проекте PartnerDataClient. Из него же можно взять и описание клиентской конфигурации WCF.

Тестовые сервисы находятся:

net. tcp://avior:9001/EfirPartnerData/Guide

net. tcp:// avior:9001/EfirPartnerData/History

5.  Сервис онлайновых данных

5.1.  Форма реализации

Реализован в виде Windows-сервиса, предоставляющего данные через TCP-соединение. При установлении соединения открывается сессия и производится идентификация клиента. Клиент должен передать логин /пароль учётной записи в Эфире. Далее, клиент создаёт в рамках этой сессии отдельные окна (клиентские сессии) в рамках которых происходит подписка на онлайновые потоки. Каждой клиентской сессии присвоен порядковый номер (id), по которому они различается принадлежность пакетов, так как пакеты идут через одно TCP-соединение и перемешиваются. Для создания подписки на онлайновый поток клиент отправляет команду. Например, для пакетной подписки:

-  BULK7.1.Snapshot – снапшоты Moex-акции;

-  BULK7.1.Queue – стаканы Moex-акции;

-  BULK7.1.Trades – сделки по акциям Moex.

Передача данных происходит через текстовый протокол, позволяющий передавать словари и массивы. Трафик шифруется при помощи Xor. Напрямую работать с протоколом клиенту не требуется. Предоставляются библиотеки Efir. municationLite, которая скрывает протокол взаимодействия, работу с сессиями, установление соединения и присоединение в случае разрыва связи.

5.2.  API сервиса

Онлайновые данные передаются отфильтрованными по подписке. Подписаться можно только на фиды, на которые есть привилегии у данного Эфир-логина.

В качестве примера реализации клиента Efir. municationLite в тестовом клиенте предоставляется пример задачи: TestClient. Tasks. BulkSubscriptionTest. Там демонстрируется работа с ServerConnectionAdmin и ServerSession. Подключение и подписка производятся в таком порядке:

CreateSession à Connect à Query (command) –

Фазы происходят асинхронно. Поэтому получение результата текущей фазы и продолжение возможны только в callback-функциях, которые реализованы в виде эвентов. При этом передача параметров происходит через dictionary, доступный у сессии через Params.

При выполнении команды подписки _requestedSession. Query(command) клиент сначала заполняет секцию IServerSession. Params:

1)  #return_subscription – если “1”, то Session_OnDataBulk мы получим PARAM.#subscription_arr – уровень подписки по инструментам и список всех подписанных инструментов по фиду;

2)  #return_columns – если “1”, то мы получим обратно PARAM.#columns – список запрошенных колонок. Если мы заполняем параметр #columns, то указывать #return_columns не имеет смысла, так как данные будут возвращаться в точности в запрошенном порядке и количестве. При неуказанном #columns мы получим подписку на все поля, и тогда имеет смысл запрашивать #return_columns, чтобы получить перечень и порядок колонок, которые нам будут поступать в Session_Ondata;

3)  #return_static_fields = “1” – приведёт к возврату секции HIDE_ONLINE, в которой лежит перечень статических колонок. Например, в снапшотах это ShortNameRus. Такие колонки в онлайне передаются пустыми. Их нужно взять из справочника инструментов и сессионных полей;

4)  #id_iss_array – перечень iss_id для подписки. Если не указан, то происходит подписка на весь фид;

5)  #columns – перечень колонок для подписки. В Session_Ondata мы будем получать именно эти колонки в таком же порядке. Если среди них есть несуществующие, то будут приходить пустые значения. Если #return_columns = “1”, то назад мы получим отфильтрованный список колонок, где остались только существующие колонки. Однако в Session_Ondata всёравно будет приходить то, что было перечислено в #columns. Но вместо несуществующих колонок будут пустые значения.

После выполнения команды подписки первым возникает Session_OnDataBulk, затем Session_Ondata. Session_OnDataBulk служит, чтобы получить запрошенные данные, связанные с подпиской. А именно следующие элементы словаря IServerSession. Params:

1)  PARAM.#subscription_arr – список кортежей <id_iss, UserPriv> через запятую;

2)  PARAM.#columns – список колонок через запятую;

3)  PARAM.#result – текстовый код результата (Ok или сообщение об ошибке);

4)  PARAM.#version – номер версии запроса (используется EfirClient при изменении списка колонок);

5)  секция HIDE_ONLINE<array> - список статических полей через запятую.

Далее начинают поступать онлайновые данные через эвент Session_Ondata. Используются секции:

1)  DATA<array> - тут передаётся один или несколько элементов потока данных в виде массива;

2)  GDATA<array> - только для стаканов: тут передаётся id_iss (для остальных потоков он уже включён в список полей).

5.3.  Подключение

Для упрощения работы с сервером RTS мы предоставляем клиентскую библиотеку Efir. municationLite, пример её использования в приложении TestClient, в TestClient. Tasks. BulkSubscriptionTest.

Данный пример встроен в нагрузочный тест и позволяет подписаться на отдельный тип данных одного фида. Параметры подписки задаются в app. config в секции <bulkTestSection>. Далее, поступающие данные логируются в файлы в подкаталоге Logs (см NLog. config).

Для правильной работы требуется подключение к специально настроенному RTS. В его конфиге все потоки должны быть описаны как некэшируемые (т. е. сквозные).

Тестовый сервер находится:

micar: 7717

Также, при соединении потребуется указать логин Эфира, имеющий в подписке продукт SUBSCR_ON_PROD_DATAFLOW и привилегии на желаемые фиды. Имена привилегий можно посмотреть в Interfax. Efir. MarketModel. MarketFeedGroup.