Айсберг-заявки
Айсберг-заявка — распоряжение на совершение сделки на покупку/продажу заданного количества лотов финансового инструмента по желаемой цене с возможностью порционного выставления лотов в биржевой стакан.
Айсберг-заявки являются частным случаем лимитных заявок и обрабатываются по тем же принципам за исключением одной особенности: общий объём лотов в заявке можно разбить на части и выставлять в биржевой стакан порционно, таким образом скрывая истинный размер заявки от других участников торгов.
Общая информация
Помимо ряда свойств, наследуемых от лимитных заявок, айсберг-заявки обладают также собственными особенностями, которые необходимо учитывать в работе:
Общий биржевой стакан.
Айсберг-заявки отображаются в том же биржевом стакане, что и любые другие лимитные заявки. Для них не существует отдельного стакана, позволяющего каким-либо образом обособить новое предложение от прочих или по которому можно было бы гарантированно отследить количество и объёмы других айсберг-заявок.
Обеспечение блокируется для всей заявки, а не только для видимой части.
Несмотря на то, что в стакан единовременно выставляется только часть айсберг-заявки, гарантийное обеспечение должно покрывать её полный объём.
Стоимость лота — 300 рублей. Выставляя заявку на покупку с общим объёмом в 1000 лотов и видимой частью в 100 лотов, участник торгов должен предоставить обеспечение заявки в полном объёме, т.е. на сумму в 300000 (триста тысяч) рублей.
Видимая часть не обязана быть постоянной.
При выставлении айсберг-заявки используются два параметра: размер видимой части и амплитуда отклонения. Первый параметр определяет количество лотов, отображаемое в стакане единовременно вместо общего объёма заявки. Второй параметр позволяет задать максимальный размер случайной надбавки в процентном соотношении к заданному видимому количеству, чтобы новый видимый объём отличался от предыдущего поглощённого.
В торговой системе АЛОР Брокер амплитуда отклонения доступна только для заявок на срочном рынке.
Участник торгов выставляет заявку с общим объёмом в 1000 лотов, видимой частью в 100 лотов и амплитудой отклонения 15%. В стакан по такой заявке будут публиковаться предложения в объёме от 100 до 115 лотов, пока общий объём заявки не будет исчерпан.
У айсберг-заявок есть свои границы.
Биржи могут предъявлять дополнительные условия выставления айсберг-заявок, которые необходимо учитывать. Так, например, на Московской Бирже соотношение видимой части к общему объёму заявки должно быть не менее 1:100, а минимальная сумма видимой части в денежном выражении должна быть не менее 30000 рублей. Амплитуда отклонения при этом должна составлять не более 20% от размера видимой части.
Участник торгов выставляет заявку с общим объёмом в 1000 лотов. Цена одного лота составляет 300 рублей. Несмотря на то, что минимальное соотношение видимой части и общего объёма позволяет установить видимую часть в размере 10 лотов, объём видимой части должен быть не менее 100 лотов из-за нижней границы денежного выражения видимого объёма и стоимости одного лота.
Нужно быть готовым к скачку цены.
После исчерпания всего объёма или отмены заявки может произойти резкое изменение цены инструмента, так как её больше ничто не удерживает на одном уровне при той же динамике торгов.
Опытные участники торгов могут определить айсберг-заявку.
Основная задача айсберга — скрыть общий объём заявки от других участников торгов. Тем не менее, зная о правилах выставления заявок и наблюдая за стаканом, опытный участник торгов может обнаружить выставленную айсберг-заявку, предположить её общий объём и скорректировать свои действия в соответствии с этим знанием.
Наблюдая за биржевым стаканом, участник торгов наблюдает следующую ситуацию: на одном и том же ценовом уровне в 300 рублей за лот постоянно присутствует предложение объёмом от 100 до 120 лотов, которое выставляется повторно после исчерпания предыдущего. Отбросив возможность совпадения, опытный трейдер может предположить наличие в стакане айберг-заявки общим объёмом до 10000 лотов.
Выставляемая лимитная заявка должна быть обеспечена в соответствии с уровнем риска клиента и подходом к ведению торгов:
При немаржинальной торговле обеспечение заявки составляет полную стоимость заявки;
Для маржинальной торговли обеспечение зависит от уровня риска клиента.
Убедиться в достаточности средств можно с помощью запроса на оценку заявки. Ознакомиться с условиями обеспечения заявки в зависимости от уровня риска можно здесь.
Айсберг-заявку стоит рассматривать как возможность скрыть от других участников торгов свои намерения о крупной покупке или продаже. При этом стоит помнить, что опытные трейдеры могут выявить такие заявки по косвенным признакам и использовать это в свою пользу.
Если этот подход не соответствует используемой торговой стратегии, рекомендуем воспользоваться обычными лимитными или рыночными заявками.
Условия выполнения
Основным условием выполнения заявки является параметр timeInForce
, регулирующий обработку остатка заявки после исчерпания всех встречных предложений рынка. Возможные значения:
Условие | Описание |
---|---|
oneday | Заявка действительна в течение торгового дня. Если встречная заявка с подходящей ценой содержит недостаточный для полного выполнения заявки объём, неиспользованный остаток останется позицией в стакане до полного выполнения заявки, её отмены или завершения торгового дня, в рамках которого была выставлена заявка. |
goodtillcancelled | Аналогично |
immediateorcancel | Заявка выполняется на доступный на момент выставления объём, остаток снимается с торгов. |
fillorkill | Заявка может быть выполнена только полностью. Если доступный объём не позволяет выполнить заявку, она не будет выставлена вовсе. |
Примеры запросов
Общие требования
Заявку через API можно выставить на исполнение, изменить и снять с исполнения, если она не была выполнена ранее. При этом, независимо от выбранного действия и протокола взаимодействия, все запросы должны:
- Быть авторизованными
- Быть идентифицируемыми
- Содержать сообщение со всеми необходимыми характеристиками заявки
От протокола взаимодействия же зависит, как эти условия соблюсти.
- HTTP API
- WebSocket API
Авторизация
Авторизация нужна для подтверждения у отправителя наличия прав на использование запрошенного ресурса. Для авторизации запросов используется JWT токен, выполняющий роль Access токена. Полное описание доступных способов авторизации представлено в разделе Авторизация.
В HTTP API для передачи токена используется параметр заголовка Authorization
. Заголовок должен передаваться с каждым выполняемым запросом.
Передаётся этот токен как Bearer-токен, в связи с чем заголовок должен содержать префикс Bearer
перед передаваемым значением. Выглядит корректно заполненный заголовок Authorization
так:
Authorization: Bearer eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCIsImN0eSI6IkpXVCJ9.eyJzdWIiOiJMb2dpblNhbXBsZSIsImVudCI6ImNsaWVudCIsImVpbiI6IjAxMjM0IiwiY2xpZW50aWQiOiIwMTIzNDU2IiwiYXpwIjoiMDEyMzQ1Njc4OWFiY2RlZjAxMjMiLCJhZ3JlZW1lbnRzIjoiQWdyZWVtZW50U2FtcGxlMSBBZ3JlZW1lbnRTYW1wbGUyIEFncmVlbWVudFNhbXBsZTMiLCJwb3J0Zm9saW9zIjoiUG9ydGZvbGlvU2FtcGxlMSBQb3J0Zm9saW9TYW1wbGUyIFBvcnRmb2xpb1NhbXBsZTMiLCJzY29wZSI6Ik9yZGVyc1JlYWQgT3JkZXJzQ3JlYXRlIFRyYWRlcyBQZXJzb25hbCBTdGF0cyIsImV4cCI6Mjg3MTc2MzE5OSwiaWF0IjowLCJpc3MiOiJBbG9yLklkZW50aXR5IiwiYXVkIjoiQ2xpZW50IFdBUlAgV2FycEFUQ29ubmVjdG9yIHN1YnNjcmlwdGlvbnNBcGkgQ29tbWFuZEFwaSBJbnN0cnVtZW50QXBpIFRyYWRpbmdWaWV3UGxhdGZvcm0ifQ.QOQVMIAoZ6SnF5urnIzJ0EvtQd9P5Sx355069kXoID207wHOTW0wkKNMcrIKXmENEQQ_0yDjqH_kjeqWLBJuqA
Идентификация
Идентификация запроса нужна для разделения десятка однотипных запросов на уникальные. Идентификатор задаётся со стороны пользователя и передаётся в виде значения параметра заголовка X-REQID
, в связи с чем рекомендуем предусмотреть механизм его генерации в используемом ПО.
В качестве идентификатора запроса можно использовать любую символьную комбинацию, включая специальные символы !@№;%:?*()-_=+/|"'
. На идентификатор действуют два ограничения:
Значение идентификатора должно быть уникальным для торговой системы. Если значение ранее уже использовалось для другого запроса, вместо повторного выполнения будет возвращена копия ответа на первый запрос с этим идентификатором
Спец.символы, нарушающие целостность JSON объекта, должны быть экранированы
Таким образом, в качестве идентификатора запроса система готова принять как Dxxxxx-Order-Market-No-812643-@-MOEX
, так и d3c886f1-ea1e-4634-aff4-119c902ad926
при условии, что эти значения не передавались ни одним из пользователей API ранее.
Корректно заполненный заголовок X-REQID
не требует дополнительных префиксов и выглядит следующим образом:
X-REQID: d3c886f1-ea1e-4634-aff4-119c902ad926
Соединение
Все запросы на управление заявками через WebSocket API, независимо от типа заявки и запрашиваемой операции, выполняются через интерфейс /cws
. Перед отправкой запроса установите WebSocket-соединение с этим интерфейсом.
Полный URL интерфейса:
https://api.alor.ru/cws
https://apidev.alor.ru/cws
Авторизация
Авторизация нужна для подтверждения у отправителя наличия прав на использование запрошенного ресурса. Для авторизации запросов используется JWT токен, выполняющий роль Access токена. Полное описание доступных способов авторизации представлено в разделе Авторизация.
В WebSocket API для передачи токена используется отдельный запрос к интерфейсу /cws с кодом операции authorize
. Запрос достаточно выполнять раз в 15-20 минут для авторизации всех последующих запросов в рамках того же WebSocket-соединения.
Установите соединение с нужным контуром системы и отправьте сообщение с кодом операции authorize
и действительным Access токеном в качестве значения параметра token
:
{
"opcode": "authorize",
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"token": "eyJhbGciOiJ..."
}
Если запрос сформирован корректно, в ответ вернётся сообщение с кодом 200, подтверждающее авторизацию соединения:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "The connection has been initialized."
}
Параметр guid
отвечает за идентификацию сообщения и описан ниже.
Идентификация
Идентификация запроса нужна для разделения десятка однотипных запросов на уникальные. Идентификатор задаётся со стороны пользователя и передаётся в виде значения параметра guid
в теле сообщения, в связи с чем рекомендуем предусмотреть механизм его генерации в используемом ПО.
В качестве идентификатора запроса можно использовать любую символьную комбинацию, включая специальные символы !@№;%:?*()-_=+/|"'
. На идентификатор действуют два ограничения:
Значение идентификатора должно быть уникальным для торговой системы. Если значение ранее уже использовалось для другого запроса, вместо повторного выполнения будет возвращена копия ответа на первый запрос с этим идентификатором
Спец.символы, нарушающие целостность JSON объекта, должны быть экранированы
Таким образом, в качестве идентификатора запроса система готова принять как Dxxxxx-Order-Market-No-812643-@-MOEX
, так и d3c886f1-ea1e-4634-aff4-119c902ad926
при условии, что эти значения не передавались ни одним из пользователей API ранее.
Корректно заполненный параметр guid
не требует дополнительных префиксов и выглядит следующим образом:
{
"guid": "d3c886f1-ea1e-4634-aff4-119c902ad926"
}
Управление заявками
Способы выставления заявки взаимозаменяемы. Например, заявку, выставленную через HTTP API, можно изменить или снять через WebSocket API, и наоборот.
- HTTP API
- WebSocket API
Выставление заявки
Интерактивное описание запроса доступно на странице Создание лимитной заявки
Айсберг-заявка выставляется через HTTP API точно так же, как и обычная лимитная заявка: POST-запросом к конечной точке /commandapi/warptrans/TRADE/v2/client/orders/actions/limit
.
Полный URL конечной точки выглядит так:
https://api.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit
https://apidev.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit
При этом тело сообщения, аналогичное лимитной заявке, должно содержать два дополнительных параметра: icebergFixed
(видимая часть заявки) и icebergVariance
(амплитуда отклонения в процентах от видимой части).
{
"side": "buy",
"quantity": 1000,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX",
"instrumentGroup": "TQBR"
},
"comment": "Первая заявка",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday",
"icebergFixed": 100,
"icebergVariance": 10
}
Создана айсберг-заявку на покупку 1000 лотов инструмента SBER на Московской Бирже (MOEX) в режиме T+2 (TQBR) по цене 301.74 рублей за лот.
Видимая часть айсберга составляет 100 лотов с максимальным отклонением в 10% (до 110 лотов суммарно).
В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе биржевой номер заявки:
{
"message": "success",
"orderNumber": "189...559"
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Изменение заявки
Интерактивное описание запроса доступно на странице Изменение лимитной заявки
Для изменения ранее выставленной заявки через HTTP API используется PUT-запрос к конечной точке /commandapi/warptrans/TRADE/v2/client/orders/limit/{orderId}
, где {orderId}
— Path-параметр, в котором передаётся номер заявки.
Изменение происходит через отмену ранее выставленной заявки и публикацию новой. Изменение исполненной или отменённой заявки невозможно.
Полный URL конечной точки выглядит так:
https://api.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit/189...559
https://apidev.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/actions/limit/189...559
Где 189...559
— фактическое значение параметра {orderId}
.
При изменении существующей заявки используется такое же сообщение, как и при первичном выставлении заявки. Тело сообщения так же должно содержать всю информацию о новой заявке, которая будет выставлена взамен изменяемой.
{
"side": "buy",
"quantity": 1000,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX",
"instrumentGroup": "TQBR"
},
"comment": "Первая заявка",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday",
"icebergFixed": 150,
"icebergVariance": 20
}
Заявка с номером 189...559
отменена. Создана новая айсберг-заявка на покупку 1000 лотов инструмента SBER на Московской Бирже (MOEX) в режиме T+2 (TQBR) по цене 301.74 рублей за лот. При этом видимая часть заявки должна составлять 150 лотов с максимальным отклонением в 20% (до 180 лотов суммарно).
В случае успешного выполнения запроса прежняя заявка будет отменена и API вернёт сообщение с кодом ответа 200, содержащее в себе биржевой номер новой заявки:
{
"message": "success",
"orderNumber": "189...560"
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Снятие заявки
Интерактивное описание запроса доступно на странице Снятие заявки
Отменить можно только ожидающую исполнения заявку. Отмена исполненной заявки невозможна.
Для снятия ранее выставленной заявки через HTTP API используется DELETE-запрос к конечной точке /commandapi/warptrans/TRADE/v2/client/orders/{orderId}
, где {orderId}
— Path-параметр, в котором передаётся номер заявки.
Помимо номера заявки необходимо также указать следующие атрибуты заявки:
Query-параметры
Идентификатор клиентского портфеля
Possible values: [MOEX
]
Биржа
Является стоп-заявкой?
Таким образом, полный URL запроса для снятия заявки выглядит так:
https://api.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/189...560?portfolio=D39004&exchange=MOEX&stop=false
https://apidev.alor.ru/commandapi/warptrans/TRADE/v2/client/orders/189...560?portfolio=D39004&exchange=MOEX&stop=false
Заявка с номером 189...560
отменена.
В случае успешного выполнения запроса прежняя заявка будет отменена и API вернёт сообщение с кодом ответа 200:
success
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Выставление заявки
Полное описание запроса доступно на странице Создание лимитной заявки
Для создания лимитной айсберг-заявки через WebSocket API отправьте в авторизованное соединение сообщение со значением "opcode": "create:limit"
, содержащее все характеристики заявки, включая дополнительные параметры icebergVariance
и checkDuplicates
:
{
// Код операции для создания лимитной заявки:
"opcode": "create:limit",
// Идентификатор запроса:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// Параметры лимитной заявки:
"side": "buy",
"quantity": 1000,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX"
},
"comment": "Первая заявка",
"board": "TQBR",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday",
// Параметры, специфичные для айсберг-заявок:
"icebergFixed": 100,
"icebergVariance": 10,
// Служебный флаг проверки на наличие дубликатов запроса:
"checkDuplicates": true
}
Создана айсберг-заявку на покупку 1000 лотов инструмента SBER на Московской Бирже (MOEX) в режиме T+2 (TQBR) по цене 301.74 рублей за лот.
Видимая часть айсберга составляет 100 лотов с максимальным отклонением в 10% (до 110 лотов суммарно).
В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе биржевой номер заявки:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "An order '189...559' has been created.",
"orderNumber": 189...559
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Изменение заявки
Полное описание запроса доступно на странице Изменение рыночной заявки
Для изменения айсберг-заявки через WebSocket API отправьте в авторизованное соединение сообщение, схожее с тем, которое было отправлено при выставлении предыдущей заявки.
Отличие заключается в добавлении параметра orderId
, в котором указывается номер изменяемой заявки, и значении update:limit
параметра opcode
.
Изменение происходит через отмену ранее выставленной заявки и публикацию новой. Изменение исполненной или отменённой заявки невозможно.
{
// Код операции для изменения лимитной заявки:
"opcode": "update:limit",
// Идентификатор запроса:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// Номер изменяемой заявки:
"orderId": "189...559",
// Параметры лимитной заявки:
"side": "buy",
"quantity": 1,
"price": 301.74,
"instrument": {
"symbol": "SBER",
"exchange": "MOEX"
},
"comment": "Первая заявка",
"board": "TQBR",
"user": {
"portfolio": "D39004"
},
"timeInForce": "oneday",
// Параметры, специфичные для айсберг-заявок:
"icebergFixed": 150,
"icebergVariance": 20,
// Служебный флаг проверки на наличие дубликатов запроса:
"checkDuplicates": true
}
Заявка с номером 189...559
отменена. Создана новая айсберг-заявка на покупку 1000 лотов инструмента SBER на Московской Бирже (MOEX) в режиме T+2 (TQBR) по цене 301.74 рублей за лот. При этом видимая часть заявки должна составлять 150 лотов с максимальным отклонением в 20% (до 180 лотов суммарно).
В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе биржевой номер заявки:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "An order has been updated. New order Id is '189...560'.",
"orderNumber": "189...560"
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
Полный список всех параметров и возможных ответов доступен на странице описания запроса.
Снятие заявки
Полное описание запроса доступно на странице Снятие лимитной заявки
Отменить можно только ожидающую исполнения заявку. Отмена исполненной заявки невозможна.
Для снятия ранее выставленной айсберг-заявки через WebSocket API отправьте в авторизованное соединение сообщение, содержащее код операции delete:limit
, номер заявки, код биржи и идентификатор портфеля, от имени которого была выставлена заявка. Как и любой другой, запрос на снятие заявки должен содержать уникальный идентификатор в параметре guid
.
{
// Код операции для снятия айсберг-заявки:
"opcode": "delete:limit",
// Идентификатор запроса:
"guid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
// Номер и принадлежность снимаемой заявки:
"orderId": "189...560",
"exchange": "MOEX",
"user": {
"portfolio": "D39004"
},
// Служебный флаг проверки на наличие дубликатов запроса:
"checkDuplicates": true
}
Заявка с номером 189...560
отменена.
В случае успешного выполнения запроса API вернёт сообщение с кодом ответа 200, содержащее в себе биржевой номер заявки:
{
"requestGuid": "c328fcf1-e495-408a-a0ed-e20f95d6b813",
"httpCode": 200,
"message": "An order '189...560' has been deleted.",
"orderNumber": "189...560"
}
Если обработка запроса завершилась ошибкой, API вернёт информацию о причинах этой ошибки.
В отличии от HTTP API, позволяющего одним и тем же запросом отменять заявки любого типа, в WebSocket API запрос с кодом "opcode": "delete:limit"
позволяет отменять только лимитные заявки. Если нужно отменить заявку другого типа, воспользуйтесь HTTP-запросом или используйте коды, соответствующие рыночным и условным заявкам.
При необходимости лимитную заявку можно объединить в группу с другими заявками для связности выполнения.
Что дальше?
- Узнайте, как получить биржевую информацию, используемую в заявках
- Ознакомьтесь с возможностями рыночных заявок, позволяющих с бо́льшей вероятностью совершить сделку на весь объём заявки
- Ознакомьтесь с возможностями лимитных заявок, позволяющих опубликовать весь объём заявки сразу
- Изучите возможности условных заявок и объединения заявок в группы для упрощения торгов
- Детальнее ознакомьтесь с возможностями и требованиями HTTP API и WebSocket API для лучшего понимания выполняемых действий
- Если возникли вопросы по использованию API, воспользуйтесь списком часто задаваемых вопросов для получения ответа
Для быстрого погружения в процессы использования API можете воспользоваться руководствами по быстрому старту для тестового и боевого контуров системы.