Получение данных
Торговая система АЛОР Брокер предоставляет возможность получения биржевых данных через API. Для этого можно использовать HTTP API, WebSocket API и GraphQL API.
Универсального способа взаимодействия не существует. У каждого из доступных способов есть свои плюсы, минусы и особенности, которые необходимо учитывать. При выборе подходящего способа взаимодействия опирайтесь на стоящие перед вами задачи, не забывая при этом о принципах добросовестного использования, чтобы совершаемые действия не нанесли вред системе. Кроме того, использование одного способа взаимодействия для решения одной задачи никак не влияет на возможность использовать другой способ для другой задачи.
Типы данных
Через API от торговой системы можно получить следующие биржевые данные:
- Список созданных заявок и детальная информация о них
- Список совершённых сделок и детальная информация о них
- Список доступных финансовых инструментов и информация о них: котировки, биржевые стаканы, исторические данные и т.д.
- Информация о пользователе и портфеле: общая информация, позиции, риски и т.д.
Если получить интересующие данные не удалось — не нашли подходящего запроса или полученный результат выглядит неинформативным — свяжитесь с нами в Telegram.
Категории данных
Все данные, предоставляемые торговой системой через API, можно разделить на две категории:
- Публичные данные — информация, которую можно свободно получить из любых сторонних источников, а доступ широкого круга лиц к ним не повлияет на поведение рынка или состояние системы. К такой информации, например, относятся списки доступных инструментов и валютных пар.
- Защищённые данные — информация, свободная публикация которых для неограниченного круга лиц может спровоцировать как изменения в поведении рынка, так и разглашение персональных данных держателей портфелей. Для доступа к данным этой категории в обязательном порядке требуется авторизация для подтверждения прав доступа к вызываемым ресурсам. К такой информации, например, относятся данные о всех сделках за сегодня и список открытых позиций в портфеле.
Доступ к данным
Несмотря на то, что публичные данные не являются тайной и могут быть свободно получены через другие источники, доступ к ним через АЛОР Брокер API может быть частично ограничен. Сделано это для снижения нагрузки на систему и предоставления приоритета запросам от клиентов Брокера.
В зависимости от выбранного способа взаимодействия ограничения могут иметь разный характер:
- В HTTP API и GraphQL API публичные ресурсы не требуют обязательной авторизации запросов, но ответ будет содержать данные, бывшие актуальными 15 минут назад. Так, например, в ответ на отправленный в 15:00 запрос на получение текущего UTC времени в формате Unix будут возвращены данные, соответствующие времени 14:45.
- В WebSocket API публичных ресурсов не существует — все запросы к любому из предоставляемых ресурсов должны быть авторизованы. Это касается даже тех запросов, информацию в ответ на которые можно получить другими способами без авторизации.
Чтобы избавиться от этих ограничений, авторизуйтесь как действующий трейдер или воспользуйтесь тестовым доступом.
Примеры запросов
Общие требования
Чтобы система вернула в ответ актуальные данные, отправляемые запросы должны соответствовать определённым требованиям. В зависимости от выбранного интерфейса взаимодействия, запросы должны:
- Быть авторизованными (HTTP API, WebSocket API, GraphQL API)
- Быть идентифицируемыми (WebSocket API)
- Отправляться к единому URL интерфейса (WebSocket API, GraphQL API)
Для соблюдения этих требований используются дополнительные параметры заголовка и/или тела запроса.
- HTTP API
- WebSocket API
- GraphQL API
Авторизация
Авторизация нужна для подтверждения у отправителя наличия прав на использование запрошенного ресурса. Для авторизации запросов используется JWT токен, выполняющий роль Access токена. Полное описание доступных способов авторизации доступно в разделе Авторизация.
В HTTP API для передачи токена используется параметр заголовка Authorization
. Заголовок должен передаваться с каждым выполняемым запросом.
Передаётся этот токен как Bearer-токен, в связи с чем заголовок должен содержать префикс Bearer
перед передаваемым значением. Выглядит корректно заполненный заголовок Authorization
так:
Authorization: Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9.eyJzdWIiOiJMb2dpblNhbXBsZSIsImVudCI6ImNsaWVudCIsImVpbiI6IjAxMjM0IiwiY2xpZW50aWQiOiIwMTIzNDU2IiwiYXpwIjoiMDEyMzQ1Njc4OWFiY2RlZjAxMjMiLCJhZ3JlZW1lbnRzIjoiQWdyZWVtZW50U2FtcGxlMSBBZ3JlZW1lbnRTYW1wbGUyIEFncmVlbWVudFNhbXBsZTMiLCJwb3J0Zm9saW9zIjoiUG9ydGZvbGlvU2FtcGxlMSBQb3J0Zm9saW9TYW1wbGUyIFBvcnRmb2xpb1NhbXBsZTMiLCJzY29wZSI6Ik9yZGVyc1JlYWQgT3JkZXJzQ3JlYXRlIFRyYWRlcyBQZXJzb25hbCBTdGF0cyIsImV4cCI6Mjg3MTc2MzE5OSwiaWF0IjowLCJpc3MiOiJBbG9yLklkZW50aXR5IiwiYXVkIjoiQ2xpZW50IFdBUlAgV2FycEFUQ29ubmVjdG9yIHN1YnNjcmlwdGlvbnNBcGkgQ29tbWFuZEFwaSBJbnN0cnVtZW50QXBpIFRyYWRpbmdWaWV3UGxhdGZvcm0ifQ.QOQVMIAoZ6SnF5urnIzJ0EvtQd9P5Sx355069kXoID207wHOTW0wkKNMcrIKXmENEQQ_0yDjqH_kjeqWLBJuqA
Соединение
Все запросы на получение данных через WebSocket API, независимо от типа данных, выполняются через интерфейс /ws
. Перед отправкой запроса установите WebSocket-соединение с этим интерфейсом.
Полный URL интерфейса:
Авторизация
Авторизация нужна для подтверждения у отправителя наличия прав на использование запрошенного ресурса. Для авторизации запросов используется JWT токен, выполняющий роль Access токена. Полное описание доступных способов авторизации доступно в разделе Авторизация.
В WebSocket API для передачи токена используется параметр token
, который должен передаваться с каждым выполняемым запросом.
Ус тановите соединение с нужным контуром системы и отправьте запрос к интересующему ресурсу с действительным Access токеном в качестве значения параметра token
:
{
"token": "eyJhbGciOiJ..."
}
Есл и запрос сформирован корректно, в ответ вернётся сообщение с кодом 200, подтверждающее успешную обработку запроса:
{
"message": "Handled successfully",
"httpCode": 200,
"requestGuid": "d3c886f1-ea1e-4634-aff4-119c902ad926"
}
После чего в то же WebSocket-соединение начнут поступать сообщения с кодом 100, содержащие запрошенную информацию.
Идентификация
Идентификация запроса нужна для определения принадлежности возвращаемых сообщений той или иной подписке. Идентификатор задаётся со стороны пользователя и передаётся в виде значения параметра guid
в теле сообщения, в связи с чем рекомендуем предусмотреть механизм его генерации в используемом ПО.
В качестве идентификатора запроса можно использовать любую символьную комбинацию, включая специальные символы !@№;%:?*()-_=+/|"'
. На идентификатор действуют два ограничения:
Значение идентификатора должно быть уникальным для торговой системы. Если значение ранее уже использовалось для другой подписки, вместо совмещения нескольких подписок старая будет заменена новой.
Спец.символы, нарушающие целостность JSON объекта, должны быть экранированы
Таким образом, в качестве идентификатора запроса система готова принять как Dxxxxx-Order-Market-No-812643-@-MOEX
, так и d3c886f1-ea1e-4634-aff4-119c902ad926
при условии, что эти значения не передавались в рамках этого WebSocket-соединения ранее.
Корректно заполненный параметр guid
не требует дополнительных префиксов и выглядит следующим образом:
{
"guid": "d3c886f1-ea1e-4634-aff4-119c902ad926"
}
Соединение
Все запросы на получение данных через GraphQL API выполняются через интерфейс hyperion
. Там же можно найти схему API, согласно которой строятся и обрабатываются запросы.
Авторизация
Авторизация нужна для подтверждения у отправителя наличия прав на использование запрошенного ресурса. Для авторизации запросов используется JWT токен, выполняющий роль Access токена. Полное описание доступных способов авторизации доступно в разделе Авторизация.
В GraphQL API для передачи токена используется параметр заголовка Authorization
. Заголовок должен передаваться с каждым выполняемым запросом.
Передаётся этот токен как Bearer-токен, в связи с чем заголовок должен содержать префикс Bearer
перед передаваемым значением. Выглядит корректно заполненный заголовок Authorization
так:
Authorization: Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9.eyJzdWIiOiJMb2dpblNhbXBsZSIsImVudCI6ImNsaWVudCIsImVpbiI6IjAxMjM0IiwiY2xpZW50aWQiOiIwMTIzNDU2IiwiYXpwIjoiMDEyMzQ1Njc4OWFiY2RlZjAxMjMiLCJhZ3JlZW1lbnRzIjoiQWdyZWVtZW50U2FtcGxlMSBBZ3JlZW1lbnRTYW1wbGUyIEFncmVlbWVudFNhbXBsZTMiLCJwb3J0Zm9saW9zIjoiUG9ydGZvbGlvU2FtcGxlMSBQb3J0Zm9saW9TYW1wbGUyIFBvcnRmb2xpb1NhbXBsZTMiLCJzY29wZSI6Ik9yZGVyc1JlYWQgT3JkZXJzQ3JlYXRlIFRyYWRlcyBQZXJzb25hbCBTdGF0cyIsImV4cCI6Mjg3MTc2MzE5OSwiaWF0IjowLCJpc3MiOiJBbG9yLklkZW50aXR5IiwiYXVkIjoiQ2xpZW50IFdBUlAgV2FycEFUQ29ubmVjdG9yIHN1YnNjcmlwdGlvbnNBcGkgQ29tbWFuZEFwaSBJbnN0cnVtZW50QXBpIFRyYWRpbmdWaWV3UGxhdGZvcm0ifQ.QOQVMIAoZ6SnF5urnIzJ0EvtQd9P5Sx355069kXoID207wHOTW0wkKNMcrIKXmENEQQ_0yDjqH_kjeqWLBJuqA
Отправка запросов
Для демонстрации синтаксиса запроса на получение данных используем запрос на получение биржевого стакана, доступный как в HTTP API, так и в WebSocket API.
В настоящий момент схема GraphQL API находится в разработке, в связи с чем получение некоторых данных может быть недоступно. К их числу относятся данные о биржевом стакане, в связи с чем для демонстрации этого способа используется пример с получением базовой информации об инструменте.
- HTTP API
- WebSocket API
- GraphQL API
Интерактивное описание запроса доступно на странице Биржевой стакан
Для выполнения запроса требуется авторизация.
Для получения биржевого стакана по инструменту через HTTP API используется GET-запрос к конечной точке /md/v2/orderbooks/{exchange}/{symbol}
, где:
Path-параметры
Possible values: [MOEX
, SPBX
]
Биржа
Тикер (Код финансового инструмента)
Для уточнения запроса можно добавить опциональные Query-параметры:
Query-параметры
Possible values: >= 1
and <= 20
Default value: 20
Глубина стакана. Стандартное и максимальное значение - 20 (20х20)
Possible values: [Simple
, Slim
, Heavy
]
Формат возвращаемого сервером JSON
После заполнения параметров нужными значениями полный URL запроса выглядит так:
https://api.alor.ru/md/v2/orderbooks/MOEX/SBER?depth=5&format=Simple
https://apidev.alor.ru/md/v2/orderbooks/MOEX/SBER?depth=5&format=Simple
В случае успешного выполнения запроса API вернёт ответ с кодом 200 и сообщением, содержащим запрошенную информацию:
{
"snapshot": true,
"bids": [
{
"price": 281.98,
"volume": 36
}
],
"asks": [
{
"price": 281.99,
"volume": 11
}
],
"timestamp": 1713387004,
"ms_timestamp": 1713387004878,
"depth": 20,
"existing": true
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Полное описание запроса доступно на странице Биржевой стакан
Для выполнения запроса требуется авторизация.
Для получения биржевого стакана по инструменту через WebSocket API отправьте в авторизованное соединение сообщение со значением "opcode": "OrderBookGetAndSubscribe"
, содержащее все атрибуты подписки:
{
// Код операции для создания подписки на биржевой стакан:
"opcode": "OrderBookGetAndSubscribe",
// Идентификатор запроса:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// Access токен:
"token": "eyJhbGciOiJ...",
// Атрибуты подписки:
"code": "SBER",
"depth": 10,
"exchange": "MOEX",
"format": "Simple",
"frequency": 0
}
В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, подтверждающее создание подписки:
{
"message": "Handled successfully",
"httpCode": 200,
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813"
}
После чего в соединение начнут поступать сообщения с кодом 100, содержащие запрошенную информацию:
{
"data": {
"snapshot": true,
"bids": [
{
"price": 257.7,
"volume": 157
}
],
"asks": [
{
"price": 257.71,
"volume": 288
}
],
"timestamp": 1702631123,
"ms_timestamp": 1702631123780,
"existing": true
},
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813"
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Схема со всеми поддерживаемыми параметрами доступна в веб-интерфейсе https://api.alor.ru/hyperion.
Для этого запроса авторизация не обязательна, но допустима.
Преимущество GraphQL API перед другими интерфейсами заключается в том, что через него можно запрашивать только те данные, которые требуются, отбрасывая при этом все лишние параметры.
Для получения данных через GraphQL API установите соединение с интерфейсом и, опираясь на схему, составьте тело запроса.
В зависимости от выбранного инструмента удобство формирования запроса может различаться: когда Postman, получив доступ к схеме, позволяет формировать запросы выбором параметров из списка, различные «песочницы» и большинство библиотек ожидают от пользователя умения читать схемы и формировать запросы вручную. Для первого знакомства со схемой рекомендуем воспользоваться Postman.
Тело запроса состоит из трёх частей: типа запроса, полей и аргументов к ним. В настоящий момент АЛОР Брокер API поддерживает только тип query
, поэтому укажите его в начале запроса.
query {
}
Полями называются параметры ресурса, к которому направлен запрос. С их помощью прокладывается путь к значениям из базы данных системы, которые необходимо вернуть в ответе. В качестве начала пути к значениям из базы данных укажите поле instrument
из схемы.
query {
instrument {
}
}
Это поле обладает обязательными аргументами, которые необходимо заполнить для успешной обработки запроса. Аргументы полей указываются в круглых скобках рядом с самим полем. Для этого запроса требуется заполнение следующих аргументов:
Аргументы
MOEX
- Московская биржаSPBX
- СПБ Биржа
Тикер (Код фи нансового инструмента)
Possible values: [MOEX
, SPBX
]
Биржа:
Код режима торгов
query {
instrument(symbol: "SBER", exchange: "MOEX", board: "TQBR") {
}
}
Получившееся сообщение пока не содержит полей, для которых будут возвращены параметры из базы данных. Согласно схеме, в поле instrument
вложено поле basicInformation
, а уже в него — поля, для которых будут возвращены значения из БД:
Вложенные поля
MOEX
- Московская биржаSPBX
- СПБ Биржа
Тикер (Код финансового инструмента)
Possible values: [MOEX
, SPBX
]
Биржа:
Краткое описание инструмента
Краткое наименование инструмента
Тип финансового инструмента
Добавьте вложенные поля в запрос, сохраняя структуру.
query {
instrument(symbol: "SBER", exchange: "MOEX", board: "TQBR") {
basicInformation {
symbol
exchange
description
shortName
type
}
}
}
Если сообщение сформировано верно и в базе данных есть значения для указанных полей, они будут возвращены в ответе от API.
{
"data": {
"instrument": {
"basicInformation": {
"symbol": "SBER",
"exchange": "MOEX",
"description": "Сбербанк России ПАО ао",
"shortName": "Сбербанк",
"type": "CS"
}
}
}
}
Один запрос может содержать несколько полей с одним именем одновременно. Чтобы упростить парсинг получаемых ответов, полям можно присвоить псевдонимы, которыми они будут подписаны в теле ответа. Например, добавьте всем полям, для которых возвращаются значения, префикс basic
:
query {
instrument(symbol: "SBER", exchange: "MOEX", board: "TQBR") {
basicInformation {
basicSymbol: symbol
basicExchange: exchange
basicDescription: description
basicShortName: shortName
basicType: type
}
}
}
В этом случае значения будут возвращаться под псевдонимами вместо оригинальных имён полей из схемы:
{
"data": {
"instrument": {
"basicInformation": {
"basicSymbol": "SBER",
"basicExchange": "MOEX",
"basicDescription": "Сбербанк России ПАО ао",
"basicShortName": "Сбербанк",
"basicType": "CS"
}
}
}
}
При необходимости запрос может быть значительно изменён: убраны лишние поля, добавлены новые с сохранением всей иерархии, введены переменные и фрагменты. Всё зависит от задачи и возможностей, которые предоставляет текущая реализация GraphQL API
.
Более полная информация о GraphQL-запросах доступна в разделе GraphQL API.
Что дальше?
- Ознакомьтесь с возможностями рыночных, лимитных и айсберг-заявок
- Изучите возможности объединения заявок в группы для упрощения торгов
- Детальнее ознакомьтесь с возможностями и требованиями HTTP API, WebSocket API и GraphQL API для лучшего понимания выполняемых действий
- Если возникли вопросы по использованию API, воспользуйтесь списком часто задаваемых вопросов для получения ответа
Для быстрого погружения в процессы использования API можете воспользоваться руководствами по быстрому старту для тестового и боевого контуров системы.