syntax = "proto3"; package tinkoff.public.invest.api.contract.v1; option go_package = "./;investapi"; option java_package = "ru.tinkoff.piapi.contract.v1"; option java_multiple_files = true; option csharp_namespace = "Tinkoff.InvestApi.V1"; option objc_class_prefix = "TIAPI"; option php_namespace = "Tinkoff\\Invest\\V1"; import "t_tech/invest/grpc/common.proto"; import "google/protobuf/timestamp.proto"; import "t_tech/invest/grpc/google/api/field_behavior.proto"; service OrdersStreamService { //TradesStream — стрим сделок пользователя rpc TradesStream(TradesStreamRequest) returns (stream TradesStreamResponse); //OrderStateStream — стрим поручений пользователя //Перед работой прочитайте [статью](/invest/services/orders/orders_state_stream). rpc OrderStateStream(OrderStateStreamRequest) returns (stream OrderStateStreamResponse); } service OrdersService {/* Сервис предназначен для работы с торговыми поручениями:
**1**. выставление;
**2**. отмена;
**3**. получение статуса;
**4**. расчет полной стоимости;
**5**. получение списка заявок.*/ //PostOrder — выставить заявку rpc PostOrder(PostOrderRequest) returns (PostOrderResponse); //PostOrderAsync — выставить заявку асинхронным методом //Особенности работы приведены в [статье](/invest/services/orders/async). rpc PostOrderAsync(PostOrderAsyncRequest) returns (PostOrderAsyncResponse); //CancelOrder — отменить заявку rpc CancelOrder(CancelOrderRequest) returns (CancelOrderResponse); //GetOrderState — получить статус торгового поручения rpc GetOrderState(GetOrderStateRequest) returns (OrderState); //GetOrders — получить список активных заявок по счету rpc GetOrders(GetOrdersRequest) returns (GetOrdersResponse); //ReplaceOrder — изменить выставленную заявку rpc ReplaceOrder(ReplaceOrderRequest) returns (PostOrderResponse); //GetMaxLots — расчет количества доступных для покупки/продажи лотов rpc GetMaxLots(GetMaxLotsRequest) returns (GetMaxLotsResponse); //GetOrderPrice — получить предварительную стоимость для лимитной заявки rpc GetOrderPrice(GetOrderPriceRequest) returns (GetOrderPriceResponse); } //Запрос установки соединения. message TradesStreamRequest { repeated string accounts = 1; //Идентификаторы счетов. optional int32 ping_delay_ms = 15; //Задержка (пинг) сообщений: 5000–180 000 миллисекунд. Значение по умолчанию — 120 000. } //Информация о торговых поручениях. message TradesStreamResponse { oneof payload { OrderTrades order_trades = 1; //Информация об исполнении торгового поручения. Ping ping = 2; //Проверка активности стрима. SubscriptionResponse subscription = 3; //Ответ на запрос на подписку. } } //Информация об исполнении торгового поручения. message OrderTrades { string order_id = 1; //Идентификатор торгового поручения. google.protobuf.Timestamp created_at = 2; //Дата и время создания сообщения в часовом поясе UTC. OrderDirection direction = 3; //Направление сделки. string figi = 4; //Figi-идентификатор инструмента. repeated OrderTrade trades = 5; //Массив сделок. string account_id = 6; //Идентификатор счета. string instrument_uid = 7; //UID идентификатор инструмента. } //Информация о сделке. message OrderTrade { google.protobuf.Timestamp date_time = 1; //Дата и время совершения сделки в часовом поясе UTC. Quotation price = 2; //Цена за 1 инструмент, по которой совершена сделка. int64 quantity = 3; //Количество штук в сделке. string trade_id = 4; //Идентификатор сделки. } //Запрос выставления торгового поручения. message PostOrderRequest { optional string figi = 1 [deprecated = true]; //Deprecated Figi-идентификатор инструмента. Необходимо использовать instrument_id. int64 quantity = 2 [(google.api.field_behavior) = REQUIRED]; //Количество лотов. optional Quotation price = 3; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Игнорируется для рыночных поручений. OrderDirection direction = 4 [(google.api.field_behavior) = REQUIRED]; //Направление операции. string account_id = 5 [(google.api.field_behavior) = REQUIRED]; //Номер счета. OrderType order_type = 6 [(google.api.field_behavior) = REQUIRED]; //Тип заявки. string order_id = 7 [(google.api.field_behavior) = REQUIRED]; //Идентификатор запроса выставления поручения для целей идемпотентности в формате UID. Максимальная длина 36 символов. string instrument_id = 8; //Идентификатор инструмента. Принимает значение `figi`, `instrument_uid` или `ticker + '_' + class_code`. TimeInForceType time_in_force = 9; //Алгоритм исполнения поручения, применяется только к лимитной заявке. PriceType price_type = 10; //Тип цены. bool confirm_margin_trade = 11; // Согласие на выставление заявки, которая может привести к непокрытой позиции, по умолчанию false. } //Прочитайте про ключ идемпотентности [здесь](./head-orders/) //Информация о выставлении поручения. message PostOrderResponse { string order_id = 1; //Биржевой идентификатор заявки. OrderExecutionReportStatus execution_report_status = 2; //Текущий статус заявки. int64 lots_requested = 3; //Запрошено лотов. int64 lots_executed = 4; //Исполнено лотов. MoneyValue initial_order_price = 5; //Начальная цена заявки. Произведение количества запрошенных лотов на цену. MoneyValue executed_order_price = 6; //Исполненная средняя цена одного инструмента в заявке. MoneyValue total_order_amount = 7; //Итоговая стоимость заявки, включающая все комиссии. MoneyValue initial_commission = 8; //Начальная комиссия. Комиссия рассчитанная при выставлении заявки. MoneyValue executed_commission = 9; //Фактическая комиссия по итогам исполнения заявки. MoneyValue aci_value = 10; //Значение НКД (накопленного купонного дохода) на дату. Подробнее: [НКД при выставлении торговых поручений](./head-orders#coupon) string figi = 11; // Figi-идентификатор инструмента. OrderDirection direction = 12; //Направление сделки. MoneyValue initial_security_price = 13; //Начальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. OrderType order_type = 14; //Тип заявки. string message = 15; //Дополнительные данные об исполнении заявки. Quotation initial_order_price_pt = 16; //Начальная цена заявки в пунктах (для фьючерсов). string instrument_uid = 17; //UID идентификатор инструмента. string ticker = 18; //Тикер инструмента. string class_code = 19; //Класс-код (секция торгов). string order_request_id = 20; //Идентификатор ключа идемпотентности, переданный клиентом, в формате UID. Максимальная длина 36 символов. ResponseMetadata response_metadata = 254; //Метадата } //Запрос выставления асинхронного торгового поручения. message PostOrderAsyncRequest { string instrument_id = 1 [(google.api.field_behavior) = REQUIRED]; //Идентификатор инструмента. Принимает значение `figi`, `instrument_uid` или `ticker + '_' + class_code`. int64 quantity = 2 [(google.api.field_behavior) = REQUIRED]; //Количество лотов. optional Quotation price = 3; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Игнорируется для рыночных поручений. OrderDirection direction = 4 [(google.api.field_behavior) = REQUIRED]; //Направление операции. string account_id = 5 [(google.api.field_behavior) = REQUIRED]; //Номер счета. OrderType order_type = 6 [(google.api.field_behavior) = REQUIRED]; //Тип заявки. string order_id = 7 [(google.api.field_behavior) = REQUIRED]; //Идентификатор запроса выставления поручения для целей идемпотентности в формате UID. Максимальная длина 36 символов. optional TimeInForceType time_in_force = 8; //Алгоритм исполнения поручения, применяется только к лимитной заявке. optional PriceType price_type = 9; //Тип цены. bool confirm_margin_trade = 10; // Согласие на выставление заявки, которая может привести к непокрытой позиции, по умолчанию false. } //Результат выставления асинхронного торгового поручения. message PostOrderAsyncResponse { string order_request_id = 1 [(google.api.field_behavior) = REQUIRED]; //Идентификатор ключа идемпотентности, переданный клиентом, в формате UID. Максимальная длина 36 символов. OrderExecutionReportStatus execution_report_status = 2 [(google.api.field_behavior) = REQUIRED]; //Текущий статус заявки. optional string trade_intent_id = 3; //Идентификатор торгового поручения. } //Запрос отмены торгового поручения. message CancelOrderRequest { string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета. string order_id = 2 [(google.api.field_behavior) = REQUIRED]; //Идентификатор заявки. optional OrderIdType order_id_type = 3; //Тип идентификатора заявки. } //Результат отмены торгового поручения. message CancelOrderResponse { google.protobuf.Timestamp time = 1; //Дата и время отмены заявки в часовом поясе UTC. ResponseMetadata response_metadata = 254; //Метадата } //Запрос получения статуса торгового поручения. message GetOrderStateRequest { string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета. string order_id = 2 [(google.api.field_behavior) = REQUIRED]; //Идентификатор заявки. PriceType price_type = 3; //Тип цены. optional OrderIdType order_id_type = 4; //Тип идентификатора заявки. } //Запрос получения списка активных торговых поручений. message GetOrdersRequest { string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета. optional GetOrdersRequestFilters advanced_filters = 2; //Дополнительные фильтры. message GetOrdersRequestFilters { optional google.protobuf.Timestamp from = 1; //Дата и время, начиная с которой нужно получить информацию в часовом поясе UTC. Параметр применим только к ордерам, созданным сегодня. optional google.protobuf.Timestamp to = 2; //Дата и время, до которой нужно получить информацию в часовом поясе UTC. Параметр применим только к ордерам, созданным сегодня. repeated OrderExecutionReportStatus execution_status = 3; //Статусы заявок. } } //Список активных торговых поручений. message GetOrdersResponse { repeated OrderState orders = 1; //Массив активных заявок. } //Информация о торговом поручении. message OrderState { string order_id = 1; //Биржевой идентификатор заявки. OrderExecutionReportStatus execution_report_status = 2; //Текущий статус заявки. int64 lots_requested = 3; //Запрошено лотов. int64 lots_executed = 4; //Исполнено лотов. MoneyValue initial_order_price = 5; //Начальная цена заявки. Произведение количества запрошенных лотов на цену. MoneyValue executed_order_price = 6; //Исполненная цена заявки. Произведение средней цены покупки на количество лотов. MoneyValue total_order_amount = 7; //Итоговая стоимость заявки, включающая все комиссии. MoneyValue average_position_price = 8; //Средняя цена позиции по сделке. MoneyValue initial_commission = 9; //Начальная комиссия. Комиссия, рассчитанная на момент подачи заявки. MoneyValue executed_commission = 10; //Фактическая комиссия по итогам исполнения заявки. string figi = 11; //Figi-идентификатор инструмента. OrderDirection direction = 12; //Направление заявки. MoneyValue initial_security_price = 13; //Начальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. repeated OrderStage stages = 14; //Стадии выполнения заявки. MoneyValue service_commission = 15; //Сервисная комиссия. string currency = 16; //Валюта заявки. OrderType order_type = 17; //Тип заявки. google.protobuf.Timestamp order_date = 18; //Дата и время выставления заявки в часовом поясе UTC. string instrument_uid = 19; //UID идентификатор инструмента. string order_request_id = 20; //Идентификатор ключа идемпотентности, переданный клиентом, в формате UID. Максимальная длина 36 символов. string ticker = 21; //Тикер инструмента. string class_code = 22; //Класс-код (секция торгов). } //Сделки в рамках торгового поручения. message OrderStage { MoneyValue price = 1; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. int64 quantity = 2; //Количество лотов. string trade_id = 3; //Идентификатор сделки. google.protobuf.Timestamp execution_time = 5; //Время исполнения сделки } //Запрос изменения выставленной заявки. message ReplaceOrderRequest { string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета. optional OrderIdType order_id_type = 5; //Тип идентификатора заявки. string order_id = 6 [(google.api.field_behavior) = REQUIRED]; //Идентификатор заявки на бирже. string idempotency_key = 7 [(google.api.field_behavior) = REQUIRED]; //Новый идентификатор запроса выставления поручения для целей идемпотентности. Максимальная длина 36 символов. Перезатирает старый ключ. int64 quantity = 11 [(google.api.field_behavior) = REQUIRED]; //Количество лотов. optional Quotation price = 12; //Цена за 1 инструмент. optional PriceType price_type = 13; //Тип цены. bool confirm_margin_trade = 14; // Согласие на выставление заявки, которая может привести к непокрытой позиции, по умолчанию false. } //Запрос на расчет количества доступных для покупки/продажи лотов. Если не указывать цену инструмента, то расчет произведется по текущум ценам в стакане: по лучшему предложению для покупки и по лучшему спросу для продажи. message GetMaxLotsRequest { string account_id = 1 [(google.api.field_behavior) = REQUIRED]; //Номер счета string instrument_id = 2 [(google.api.field_behavior) = REQUIRED]; //Идентификатор инструмента. Принимает значение `figi`, `instrument_uid` или `ticker + '_' + class_code`. optional Quotation price = 3; //Цена инструмента } //Результат количество доступных для покупки/продажи лотов message GetMaxLotsResponse { string currency = 1; //Валюта инструмента BuyLimitsView buy_limits = 2; //Лимиты для покупок на собственные деньги BuyLimitsView buy_margin_limits = 3; //Лимиты для покупок с учетом маржинального кредитования SellLimitsView sell_limits = 4; //Лимиты для продаж по собственной позиции SellLimitsView sell_margin_limits = 5; //Лимиты для продаж с учетом маржинального кредитования message BuyLimitsView { Quotation buy_money_amount = 1; //Количество доступной валюты для покупки int64 buy_max_lots = 2; //Максимальное доступное количество лотов для покупки int64 buy_max_market_lots = 3; //Максимальное доступное количество лотов для покупки для заявки по рыночной цене на текущий момент } message SellLimitsView { int64 sell_max_lots = 1; //Максимальное доступное количество лотов для продажи } } //Запрос получения предварительной стоимости заявки message GetOrderPriceRequest { string account_id = 1; //Номер счета string instrument_id = 2; //Идентификатор инструмента. Принимает значение `figi`, `instrument_uid` или `ticker + '_' + class_code`. Quotation price = 3; //Цена инструмента OrderDirection direction = 12; //Направление заявки int64 quantity = 13; //Количество лотов } //Предварительная стоимость заявки message GetOrderPriceResponse { MoneyValue total_order_amount = 1; //Итоговая стоимость заявки MoneyValue initial_order_amount = 5; //Стоимость заявки без комиссий, НКД, ГО (для фьючерсов — стоимость контрактов) int64 lots_requested = 3; //Запрошено лотов MoneyValue executed_commission = 7; //Общая комиссия MoneyValue executed_commission_rub = 8; //Общая комиссия в рублях MoneyValue service_commission = 9; //Сервисная комиссия MoneyValue deal_commission = 10; //Комиссия за проведение сделки oneof instrument_extra { ExtraBond extra_bond = 12; //Дополнительная информация по облигациям ExtraFuture extra_future = 13; //Дополнительная информация по фьючерсам } message ExtraBond { MoneyValue aci_value = 2; //Значение НКД (накопленного купонного дохода) на дату Quotation nominal_conversion_rate = 3; //Курс конвертации для замещающих облигаций } message ExtraFuture { MoneyValue initial_margin = 2; //Гарантийное обеспечение для фьючерса } } //Запрос установки стрим-соединения торговых поручений message OrderStateStreamRequest { repeated string accounts = 1; //Идентификаторы счетов. optional int32 ping_delay_millis = 15; //Задержка (пинг) сообщений: 1000-120 000 миллисекунд. Значение по умолчанию — 120 000. } //Информация по подпискам message SubscriptionResponse { string tracking_id = 1; //Уникальный идентификатор запроса, подробнее: [tracking_id](./grpc#tracking-id). ResultSubscriptionStatus status = 2; //Статус подписки. string stream_id = 4; //Идентификатор открытого соединения repeated string accounts = 5; //Идентификаторы счетов. optional ErrorDetail error = 7; } //Информация по заявкам message OrderStateStreamResponse { oneof payload { OrderState order_state = 1; //Информация об исполнении торгового поручения. Ping ping = 2; //Проверка активности стрима. SubscriptionResponse subscription = 3; //Ответ на запрос на подписку. } //Заявка message OrderState { string order_id = 1; //Биржевой идентификатор заявки. optional string order_request_id = 2; //Идентификатор ключа идемпотентности, переданный клиентом, в формате UID. Максимальная длина 36 символов. string client_code = 3; //Код клиента на бирже. google.protobuf.Timestamp created_at = 4; //Дата создания заявки. OrderExecutionReportStatus execution_report_status = 5; //Статус заявки. optional StatusCauseInfo status_info = 6; //Дополнительная информация по статусу. string ticker = 7; //Тикер инструмента. string class_code = 8; //Класс-код (секция торгов). int32 lot_size = 9; //Лотность инструмента заявки. OrderDirection direction = 10; //Направление заявки. TimeInForceType time_in_force = 11; //Алгоритм исполнения поручения. OrderType order_type = 12; //Тип заявки. string account_id = 13; //Номер счета. string trade_order_id = 14 [(google.api.field_behavior) = REQUIRED]; //Идентификатор торгового поручения. MoneyValue initial_order_price = 22; //Начальная цена заявки. MoneyValue order_price = 23; //Цена выставления заявки. optional MoneyValue amount = 24; //Предрассчитанная стоимость полной заявки. MoneyValue executed_order_price = 25; //Исполненная цена заявки. string currency = 26; //Валюта исполнения. int64 lots_requested = 27; //Запрошено лотов. int64 lots_executed = 28; //Исполнено лотов. int64 lots_left = 29; //Число неисполненных лотов по заявке. int64 lots_cancelled = 30; //Отмененные лоты. optional MarkerType marker = 31; //Спецсимвол. repeated OrderTrade trades = 33; // Список сделок. google.protobuf.Timestamp completion_time = 35; //Время исполнения заявки. string exchange = 36; //Код биржи. string instrument_uid = 41; //UID идентификатор инструмента. } //Маркер enum MarkerType { MARKER_UNKNOWN = 0; //не определено MARKER_BROKER = 1; //сделки брокера MARKER_CHAT = 2; //исполнение поручение, полученного от клиента через каналы связи MARKER_PAPER = 3; //исполнение поручение, полученного от клиента в бумажной форме MARKER_MARGIN = 4; //принудительное закрытие позиций MARKER_TKBNM = 5; //сделки по управлению ликвидностью MARKER_SHORT = 6; //сделки РЕПО по привлечению у клиентов бумаг MARKER_SPECMM = 7; //перенос временно непокрытых позиций MARKER_PO = 8; } //Дополнительная информация по статусу заявки enum StatusCauseInfo { CAUSE_UNSPECIFIED = 0; //Не определено CAUSE_CANCELLED_BY_CLIENT = 15; //Отменено клиентом CAUSE_CANCELLED_BY_EXCHANGE = 1; //Отменено биржей CAUSE_CANCELLED_NOT_ENOUGH_POSITION = 2; //Заявка не выставлена из-за нехватки средств CAUSE_CANCELLED_BY_CLIENT_BLOCK = 3; //Отменено из-за блокировки клиента CAUSE_REJECTED_BY_BROKER = 4; //Отклонено брокером CAUSE_REJECTED_BY_EXCHANGE = 5; //Отклонено биржей CAUSE_CANCELLED_BY_BROKER = 6; //Отменено брокером } } //Направление операции. enum OrderDirection { ORDER_DIRECTION_UNSPECIFIED = 0; //Значение не указано ORDER_DIRECTION_BUY = 1; //Покупка ORDER_DIRECTION_SELL = 2; //Продажа } //Тип заявки. enum OrderType { ORDER_TYPE_UNSPECIFIED = 0; //Значение не указано ORDER_TYPE_LIMIT = 1; //Лимитная ORDER_TYPE_MARKET = 2; //Рыночная ORDER_TYPE_BESTPRICE = 3; //Лучшая цена } //Текущий статус заявки (поручения) enum OrderExecutionReportStatus { EXECUTION_REPORT_STATUS_UNSPECIFIED = 0; EXECUTION_REPORT_STATUS_FILL = 1; //Исполнена EXECUTION_REPORT_STATUS_REJECTED = 2; //Отклонена EXECUTION_REPORT_STATUS_CANCELLED = 3; //Отменена пользователем EXECUTION_REPORT_STATUS_NEW = 4; //Новая EXECUTION_REPORT_STATUS_PARTIALLYFILL = 5; //Частично исполнена } //Алгоритм исполнения заявки enum TimeInForceType { TIME_IN_FORCE_UNSPECIFIED = 0; //Значение не определено см. TIME_IN_FORCE_DAY TIME_IN_FORCE_DAY = 1; //Заявка действует до конца торгового дня. Значение по умолчанию TIME_IN_FORCE_FILL_AND_KILL = 2; //Если в момент выставления возможно исполнение заявки(в т.ч. частичное), заявка будет исполнена или отменена сразу после выставления TIME_IN_FORCE_FILL_OR_KILL = 3; //Если в момент выставления возможно полное исполнение заявки, заявка будет исполнена или отменена сразу после выставления, недоступно для срочного рынка и торговли по выходным } //Тип идентификатора заявки enum OrderIdType { ORDER_ID_TYPE_UNSPECIFIED = 0; //Тип идентификатора не указан. ORDER_ID_TYPE_EXCHANGE = 1; //Биржевой идентификатор ORDER_ID_TYPE_REQUEST = 2; //Ключ идемпотентности, переданный клиентом }