Перейти к основному содержимому

Группы заявок

Для частичной автоматизации торгов и уменьшения рисков, связанных с колебаниями рынка, рекомендуется выставляемые заявки объединять в группы.

Группа заявок (также известные как брекет-ордеры) — набор из нескольких заявок, объединённых между собой определённым условием выполнения.

Создание заявок

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


Общая информация

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

Для биржи не существует групп заявок.

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

Количество групп не ограничено.

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

У группы нет ограничений по заявкам.

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

У заявок нет ограничений по количеству групп.

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

Пример

В группу заявок groupA входят заявки order1, order2 и order3, а в группу заявок groupBorder3, order4 и order5. Обе группы содержат в себе order3 и для обеих задано условие выполнения OnExecuteOrCancel.

Заявка order1 была исполнена, что вызвало отмену всех остальных заявок groupA, в том числе и order3. Так как order3 входила в том числе в groupB, её отмена вызвала также отмену order4 и order5.

Таким образом, на groupB было оказано влияние событием, произошедшим в groupA.

Не рекомендуется изменять заявки после добавления в группу.

Изменение заявок происходит через отмену старой заявки и создание новой. Эта новая заявка не будет иметь никаких связей с той группой, в которую входила старая заявка. При этом, если группе задано условие OnExecuteOrCancel, изменение одной заявки отменит все остальные заявки в группе. Если необходимо изменить одну заявку в достаточно большой группе, рекомендуем сперва изменить тип группы на IgnoreCancel и только потом менять входящую в неё заявку с последующим повторным добавлением в группу.


Условия выполнения

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

Условие

Описание

OnExecuteOrCancel

Остальные заявки группы отменяются при выполнении, изменении или снятии любой из них

IgnoreCancel

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

TriggerBracketOrders

Применяется для групп из одной лимитной и нескольких стоп-заявок. Стоп-заявки в группе имеют флаг Activate = false, помечающий их как неактивные. До момента активации такие заявки игнорируют состояние рыночной цены, даже если она достигла цены срабатывания. После выполнения лимитной заявки все стоп-заявки в группе становятся активными


Группы с неактивными заявками

Одним из требований при создании группы с условием выполнения TriggerBracketOrders является неактивный статус стоп-заявок.

При неактивном статусе стоп-заявки игнорируют любые состояния цены инструмента, даже если условия для срабатывания стоп-заявки были достигнуты. Наиболее частый сценарий использования таких заявок — создание тейк-профит и стоп-лосс заявок для инструмента, которого ещё нет в портфеле.

Чтобы создать неактивную стоп-заявку, укажите значение параметра "activate": false:

Пример тела запроса
{
"condition": "MoreOrEqual",
"triggerPrice": 330.40,
"stopEndUnixTime": 1719781199,
"activate": false, // Параметр, выставляющий стоп-заявку неактивной
"side": "sell",
"quantity": 100,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX",
"instrumentGroup": "TQBR"
},
"user": {
"portfolio": "D39004"
}
}

После чего добавьте её в группу с остальными заявками.


Примеры запросов

Общие требования

При создании группы заявок должны соблюдаться следующие требования:

  • Добавляемые в группу заявки не должны быть исполнены или отменены
  • Все связанные с группами заявок запросы должны быть авторизованы

Авторизация

Для авторизации запросов используется JWT токен, выполняющий роль Access токена. Полное описание доступных способов авторизации представлено в разделе Авторизация.

В HTTP API для передачи токена используется параметр заголовка Authorization. Заголовок должен передаваться с каждым выполняемым запросом.

Передаётся этот токен как Bearer-токен, в связи с чем заголовок должен содержать префикс Bearer перед передаваемым значением. Выглядит корректно заполненный заголовок Authorization так:

Authorization: Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9.eyJzdWIiOiJMb2dpblNhbXBsZSIsImVudCI6ImNsaWVudCIsImVpbiI6IjAxMjM0IiwiY2xpZW50aWQiOiIwMTIzNDU2IiwiYXpwIjoiMDEyMzQ1Njc4OWFiY2RlZjAxMjMiLCJhZ3JlZW1lbnRzIjoiQWdyZWVtZW50U2FtcGxlMSBBZ3JlZW1lbnRTYW1wbGUyIEFncmVlbWVudFNhbXBsZTMiLCJwb3J0Zm9saW9zIjoiUG9ydGZvbGlvU2FtcGxlMSBQb3J0Zm9saW9TYW1wbGUyIFBvcnRmb2xpb1NhbXBsZTMiLCJzY29wZSI6Ik9yZGVyc1JlYWQgT3JkZXJzQ3JlYXRlIFRyYWRlcyBQZXJzb25hbCBTdGF0cyIsImV4cCI6Mjg3MTc2MzE5OSwiaWF0IjowLCJpc3MiOiJBbG9yLklkZW50aXR5IiwiYXVkIjoiQ2xpZW50IFdBUlAgV2FycEFUQ29ubmVjdG9yIHN1YnNjcmlwdGlvbnNBcGkgQ29tbWFuZEFwaSBJbnN0cnVtZW50QXBpIFRyYWRpbmdWaWV3UGxhdGZvcm0ifQ.QOQVMIAoZ6SnF5urnIzJ0EvtQd9P5Sx355069kXoID207wHOTW0wkKNMcrIKXmENEQQ_0yDjqH_kjeqWLBJuqA


Примеры запросов

Только HTTP

Управление группами заявок возможно только через HTTP API. Способ выставления самих заявок при этом не играет роли.

Создание группы заявок

Интерактивный запрос

Интерактивное описание запроса доступно на странице Создание группы заявок

Создание заявок

Создание группы заявок не предполагает группового создания заявок. Все заявки, которые нужно объединить в группу, должны быть созданы заранее.

Для создания группы заявок используется POST-запрос к конечной точке /commandapi/api/orderGroups с сообщением, содержащим все характеристики группы.

Полный URL конечной точки выглядит так:

https://api.alor.ru/commandapi/api/orderGroups

https://apidev.alor.ru/commandapi/api/orderGroups

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

Пример тела запроса
{
"orders": [
{
"portfolio": "D39004",
"exchange": "MOEX",
"orderId": "15...860",
"type": "Limit"
},
{
"portfolio": "D39004",
"exchange": "MOEX",
"orderId": "15856",
"type": "Stop"
}
],
"executionPolicy": "OnExecuteOrCancel"
}
Ожидаемый результат

Создана группа заявок, состоящая из лимитной заявки 15...860 и рыночной стоп-заявки 15856. По условию OnExecuteOrCancel выполнение одной заявки приведёт к отмене другой.

В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе идентификатор (guid) группы:

Пример тела ответа
{
"message": "success",
"groupId": "eafb19d6-c578-4afe-aa95-d528c4531031"
}

Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.

Параметры запроса

Полный список всех параметров и возможных ответов доступен на странице описания запроса.

Получение информации о всех группах заявок

Интерактивный запрос

Интерактивное описание запроса доступно на странице Все группы заявок

Для получения информации обо всех ранее созданных группах заявок используется GET-запрос к конечной точке /commandapi/api/orderGroups без дополнительных параметров. Информация о портфелях, для которых требуется отобразить список, содержится в передаваемом с запросом Access токене.

Полный URL конечной точки выглядит так:

https://api.alor.ru/commandapi/api/orderGroups

https://apidev.alor.ru/commandapi/api/orderGroups

В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее массив из всех ранее созданных групп заявок. Для каждой группы будут возвращены её идентификатор, условие выполнения, текущее состояние, время создания и время выполнения, если заявка выполнена. Для определения принадлежности группы ответ также содержит логин клиента, от имени которого заявка была выставлена.

Пример тела ответа
[
{
"id": "eafb19d6-c578-4afe-aa95-d528c4531031",
"login": "P039004",
"orders": [
{
"orderId": "15...860"
},
{
"orderId": "15856"
}
],
"executionPolicy": "OnExecuteOrCancel",
"status": "Active",
"createdAt": "2024-04-19T08:25:56.7164619",
"closedAt": null
}
]
Фильтрация результатов

Сервер возвращает все доступные группы заявок единым массивом без фильтрации результатов. Механизмы сортировки и фильтрации должны быть предусмотрены в клиентском приложении.

Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.

Параметры запроса

Полный список всех параметров и возможных ответов доступен на странице описания запроса.

Получение информации об отдельной группе заявок

Интерактивный запрос

Интерактивное описание запроса доступно на странице Выбранная группа заявок

Для получения информации об определённой группе заявок используется GET-запрос к конечной точке /commandapi/api/orderGroups/{orderGroupId}, где {orderGroupId} — идентификатор (guid) просматриваемой группы.

Полный URL конечной точки выглядит так:

https://api.alor.ru/commandapi/api/orderGroups/eafb19d6-c578-4afe-aa95-d528c4531031

https://apidev.alor.ru/commandapi/api/orderGroups/eafb19d6-c578-4afe-aa95-d528c4531031

В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее информацию об указанной заявке. Для каждой группы будут возвращены её идентификатор, условие выполнения, текущее состояние, время создания и время выполнения, если заявка выполнена. Для определения принадлежности группы ответ также содержит логин клиента, от имени которого заявка была выставлена.

Пример тела ответа
{
"id": "eafb19d6-c578-4afe-aa95-d528c4531031",
"login": "P039004",
"orders": [
{
"orderId": "15...860"
},
{
"orderId": "15856"
}
],
"executionPolicy": "OnExecuteOrCancel",
"status": "Active",
"createdAt": "2024-04-19T08:25:56.7164619",
"closedAt": null
}

Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.

Параметры запроса

Полный список всех параметров и возможных ответов доступен на странице описания запроса.

Изменение группы заявок

Интерактивный запрос

Интерактивное описание запроса доступно на странице Редактирование группы заявок

Статус группы

Изменять можно только группы со статусом Active.

Для изменения существующей группы заявок используется PUT-запрос к конечной точке /commandapi/api/orderGroups/{orderGroupId}, где {orderGroupId} — идентификатор (guid) изменяемой группы.

Полный URL конечной точки выглядит так:

https://api.alor.ru/commandapi/api/orderGroups/eafb19d6-c578-4afe-aa95-d528c4531031

https://apidev.alor.ru/commandapi/api/orderGroups/eafb19d6-c578-4afe-aa95-d528c4531031

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

Пример тела запроса
{
// Прежние данные группы:
"orders": [
{
"portfolio": "D39004",
"exchange": "MOEX",
"orderId": "15...860",
"type": "Limit"
},
{
"portfolio": "D39004",
"exchange": "MOEX",
"orderId": "15856",
"type": "Stop"
},
// Новая заявка, добавляемая в группу:
{
"portfolio": "D39004",
"exchange": "MOEX",
"orderId": "15857",
"type": "Stop"
}
],
// Изменение ранее переданного параметра:
"executionPolicy": "IgnoreCancel"
}

В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе только текстовый статус выполнения запроса:

success

Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.

Параметры запроса

Полный список всех параметров и возможных ответов доступен на странице описания запроса.

Удаление группы заявок

Интерактивный запрос

Интерактивное описание запроса доступно на странице Удаление группы заявок

Статус группы

Удалять можно только группы со статусом Active.

Судьба заявок группы

Удаление группы влияет только на связь заявок между собой. Состояние заявок при удалении группы остаётся прежним.

Для удаления группы заявок используется DELETE-запрос к конечной точке /commandapi/api/orderGroups/{orderGroupId}, где {orderGroupId} — идентификатор (guid) удаляемой группы.

Полный URL конечной точки выглядит так:

https://api.alor.ru/commandapi/api/orderGroups/eafb19d6-c578-4afe-aa95-d528c4531031

https://apidev.alor.ru/commandapi/api/orderGroups/eafb19d6-c578-4afe-aa95-d528c4531031

В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе только текстовый статус выполнения запроса:

success

Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.

Параметры запроса

Полный список всех параметров и возможных ответов доступен на странице описания запроса.


Что дальше?

Для быстрого погружения в процессы использования API можете воспользоваться руководствами по быстрому старту для тестового и боевого контуров системы.