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 "google/protobuf/timestamp.proto";
import "common.proto";

service MarketDataService { //Сервис получения биржевой информации:</br> **1**. свечи;</br> **2**. стаканы;</br> **3**. торговые статусы;</br> **4**. лента сделок.

  //Метод запроса исторических свечей по инструменту.
  rpc GetCandles(GetCandlesRequest) returns (GetCandlesResponse);

  //Метод запроса цен последних сделок по инструментам.
  rpc GetLastPrices(GetLastPricesRequest) returns (GetLastPricesResponse);

  //Метод получения стакана по инструменту.
  rpc GetOrderBook(GetOrderBookRequest) returns (GetOrderBookResponse);

  //Метод запроса статуса торгов по инструментам.
  rpc GetTradingStatus(GetTradingStatusRequest) returns (GetTradingStatusResponse);

  //Метод запроса обезличенных сделок за последний час.
  rpc GetLastTrades(GetLastTradesRequest) returns (GetLastTradesResponse);

  //Метод запроса цен закрытия торговой сессии по инструментам.
  rpc GetClosePrices(GetClosePricesRequest) returns (GetClosePricesResponse);
}

service MarketDataStreamService {
  //Bi-directional стрим предоставления биржевой информации.
  rpc MarketDataStream(stream MarketDataRequest) returns (stream MarketDataResponse);

  //Server-side стрим предоставления биржевой информации.
  rpc MarketDataServerSideStream(MarketDataServerSideStreamRequest) returns (stream MarketDataResponse);
}

//Запрос подписки или отписки на определённые биржевые данные.
message MarketDataRequest {
  oneof payload {
    SubscribeCandlesRequest subscribe_candles_request = 1; //Запрос подписки на свечи.
    SubscribeOrderBookRequest subscribe_order_book_request = 2; //Запрос подписки на стаканы.
    SubscribeTradesRequest subscribe_trades_request = 3; //Запрос подписки на ленту обезличенных сделок.
    SubscribeInfoRequest subscribe_info_request = 4; //Запрос подписки на торговые статусы инструментов.
    SubscribeLastPriceRequest subscribe_last_price_request = 5; //Запрос подписки на цены последних сделок.
    GetMySubscriptions get_my_subscriptions = 6; //Запрос своих подписок.
  }
}

message MarketDataServerSideStreamRequest {
  SubscribeCandlesRequest subscribe_candles_request = 1; //Запрос подписки на свечи.
  SubscribeOrderBookRequest subscribe_order_book_request = 2; //Запрос подписки на стаканы.
  SubscribeTradesRequest subscribe_trades_request = 3; //Запрос подписки на ленту обезличенных сделок.
  SubscribeInfoRequest subscribe_info_request = 4; //Запрос подписки на торговые статусы инструментов.
  SubscribeLastPriceRequest subscribe_last_price_request = 5; //Запрос подписки на цены последних сделок.
}

//Пакет биржевой информации по подписке.
message MarketDataResponse {
  oneof payload {
    SubscribeCandlesResponse subscribe_candles_response = 1; //Результат подписки на свечи.
    SubscribeOrderBookResponse subscribe_order_book_response = 2; //Результат подписки на стаканы.
    SubscribeTradesResponse subscribe_trades_response = 3; //Результат подписки на поток обезличенных сделок.
    SubscribeInfoResponse subscribe_info_response = 4; //Результат подписки на торговые статусы инструментов.
    Candle candle = 5; //Свеча.
    Trade trade = 6; //Сделки.
    OrderBook orderbook = 7; //Стакан.
    TradingStatus trading_status = 8; //Торговый статус.
    Ping ping = 9; //Проверка активности стрима.
    SubscribeLastPriceResponse subscribe_last_price_response = 10; //Результат подписки на цены последние сделок по инструментам.
    LastPrice last_price = 11; //Цена последней сделки.
  }
}

// subscribeCandles | Изменения статуса подписки на свечи.
message SubscribeCandlesRequest {
  SubscriptionAction subscription_action = 1; //Изменение статуса подписки.
  repeated CandleInstrument instruments = 2; //Массив инструментов для подписки на свечи.
  bool waiting_close = 3; //Флаг ожидания закрытия временного интервала для отправки свечи, применяется только для минутных свечей.
}

//Тип операции со списком подписок.
enum SubscriptionAction {
  SUBSCRIPTION_ACTION_UNSPECIFIED = 0; //Статус подписки не определён.
  SUBSCRIPTION_ACTION_SUBSCRIBE = 1; //Подписаться.
  SUBSCRIPTION_ACTION_UNSUBSCRIBE = 2; //Отписаться.
}

//Интервал свечи.
enum SubscriptionInterval {
  SUBSCRIPTION_INTERVAL_UNSPECIFIED = 0; //Интервал свечи не определён.
  SUBSCRIPTION_INTERVAL_ONE_MINUTE = 1; //Минутные свечи.
  SUBSCRIPTION_INTERVAL_FIVE_MINUTES = 2; //Пятиминутные свечи.
}

//Запрос изменения статус подписки на свечи.
message CandleInstrument {
  string figi = 1; //Figi-идентификатор инструмента.
  SubscriptionInterval interval = 2; //Интервал свечей.
  string instrument_id = 3; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Результат изменения статус подписки на свечи.
message SubscribeCandlesResponse {
  string tracking_id = 1; //Уникальный идентификатор запроса, подробнее: [tracking_id](https://tinkoff.github.io/investAPI/grpc#tracking-id).
  repeated CandleSubscription candles_subscriptions = 2; //Массив статусов подписки на свечи.
}

//Статус подписки на свечи.
message CandleSubscription {
  string figi = 1; //Figi-идентификатор инструмента.
  SubscriptionInterval interval = 2; //Интервал свечей.
  SubscriptionStatus subscription_status = 3; //Статус подписки.
  string instrument_uid = 4; //Uid инструмента
}

//Результат подписки.
enum SubscriptionStatus {
  SUBSCRIPTION_STATUS_UNSPECIFIED = 0; //Статус подписки не определён.
  SUBSCRIPTION_STATUS_SUCCESS = 1; //Успешно.
  SUBSCRIPTION_STATUS_INSTRUMENT_NOT_FOUND = 2; //Инструмент не найден.
  SUBSCRIPTION_STATUS_SUBSCRIPTION_ACTION_IS_INVALID = 3; //Некорректный статус подписки, список возможных значений: [SubscriptionAction](https://tinkoff.github.io/investAPI/marketdata#subscriptionaction).
  SUBSCRIPTION_STATUS_DEPTH_IS_INVALID = 4; //Некорректная глубина стакана, доступные значения: 1, 10, 20, 30, 40, 50.
  SUBSCRIPTION_STATUS_INTERVAL_IS_INVALID = 5; //Некорректный интервал свечей, список возможных значений: [SubscriptionInterval](https://tinkoff.github.io/investAPI/marketdata#subscriptioninterval).
  SUBSCRIPTION_STATUS_LIMIT_IS_EXCEEDED = 6; //Превышен лимит на общее количество подписок в рамках стрима, подробнее: [Лимитная политика](https://tinkoff.github.io/investAPI/limits/).
  SUBSCRIPTION_STATUS_INTERNAL_ERROR = 7; //Внутренняя ошибка сервиса.
  SUBSCRIPTION_STATUS_TOO_MANY_REQUESTS = 8; //Превышен лимит на количество запросов на подписки в течение установленного отрезка времени
}

//Запрос на изменение статуса подписки на стаканы.
message SubscribeOrderBookRequest {
  SubscriptionAction subscription_action = 1; //Изменение статуса подписки.
  repeated OrderBookInstrument instruments = 2; //Массив инструментов для подписки на стаканы.
}

//Запрос подписки на стаканы.
message OrderBookInstrument {
  string figi = 1; //Figi-идентификатор инструмента.
  int32 depth = 2; //Глубина стакана.
  string instrument_id = 3; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Результат изменения статуса подписки на стаканы.
message SubscribeOrderBookResponse {
  string tracking_id = 1; //Уникальный идентификатор запроса, подробнее: [tracking_id](https://tinkoff.github.io/investAPI/grpc#tracking-id).
  repeated OrderBookSubscription order_book_subscriptions = 2; //Массив статусов подписки на стаканы.
}

//Статус подписки.
message OrderBookSubscription {
  string figi = 1; //Figi-идентификатор инструмента.
  int32 depth = 2; //Глубина стакана.
  SubscriptionStatus subscription_status = 3; //Статус подписки.
  string instrument_uid = 4; //Uid инструмента
}

//Изменение статуса подписки на поток обезличенных сделок.
message SubscribeTradesRequest {
  SubscriptionAction subscription_action = 1; //Изменение статуса подписки.
  repeated TradeInstrument instruments = 2; //Массив инструментов для подписки на поток обезличенных сделок.
}

//Запрос подписки на поток обезличенных сделок.
message TradeInstrument {
  string figi = 1; //Figi-идентификатор инструмента.
  string instrument_id = 2; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Результат изменения статуса подписки на поток обезличенных сделок.
message SubscribeTradesResponse {
  string tracking_id = 1; //Уникальный идентификатор запроса, подробнее: [tracking_id](https://tinkoff.github.io/investAPI/grpc#tracking-id).
  repeated TradeSubscription trade_subscriptions = 2; //Массив статусов подписки на поток сделок.
}

//Статус подписки.
message TradeSubscription {
  string figi = 1; //Figi-идентификатор инструмента.
  SubscriptionStatus subscription_status = 2; //Статус подписки.
  string instrument_uid = 3; //Uid инструмента
}

//Изменение статуса подписки на торговый статус инструмента.
message SubscribeInfoRequest {
  SubscriptionAction subscription_action = 1; //Изменение статуса подписки.
  repeated InfoInstrument instruments = 2; //Массив инструментов для подписки на торговый статус.
}

//Запрос подписки на торговый статус.
message InfoInstrument {
  string figi = 1; //Figi-идентификатор инструмента.
  string instrument_id = 2; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Результат изменения статуса подписки на торговый статус.
message SubscribeInfoResponse {
  string tracking_id = 1; //Уникальный идентификатор запроса, подробнее: [tracking_id](https://tinkoff.github.io/investAPI/grpc#tracking-id).
  repeated InfoSubscription info_subscriptions = 2; //Массив статусов подписки на торговый статус.
}

//Статус подписки.
message InfoSubscription {
  string figi = 1; //Figi-идентификатор инструмента.
  SubscriptionStatus subscription_status = 2; //Статус подписки.
  string instrument_uid = 3; //Uid инструмента
}

//Изменение статуса подписки на цену последней сделки по инструменту.
message SubscribeLastPriceRequest {
  SubscriptionAction subscription_action = 1; //Изменение статуса подписки.
  repeated LastPriceInstrument instruments = 2; //Массив инструментов для подписки на цену последней сделки.
}

//Запрос подписки на последнюю цену.
message LastPriceInstrument {
  string figi = 1; //Figi-идентификатор инструмента.
  string instrument_id = 2; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Результат изменения статуса подписки на цену последней сделки.
message SubscribeLastPriceResponse {
  string tracking_id = 1; //Уникальный идентификатор запроса, подробнее: [tracking_id](https://tinkoff.github.io/investAPI/grpc#tracking-id).
  repeated LastPriceSubscription last_price_subscriptions = 2; //Массив статусов подписки на цену последней сделки.
}

//Статус подписки на цену последней сделки.
message LastPriceSubscription {
  string figi = 1; //Figi-идентификатор инструмента.
  SubscriptionStatus subscription_status = 2; //Статус подписки.
  string instrument_uid = 3; //Uid инструмента
}

//Пакет свечей в рамках стрима.
message Candle {
  string figi = 1; //Figi-идентификатор инструмента.
  SubscriptionInterval interval = 2; //Интервал свечи.
  Quotation open = 3; //Цена открытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation high = 4; //Максимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation low = 5; //Минимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation close = 6; //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  int64 volume = 7; //Объём сделок в лотах.
  google.protobuf.Timestamp time = 8; //Время начала интервала свечи в часовом поясе UTC.
  google.protobuf.Timestamp last_trade_ts = 9; //Время последней сделки, вошедшей в свечу в часовом поясе UTC.
  string instrument_uid = 10; //Uid инструмента
}

//Пакет стаканов в рамках стрима.
message OrderBook {
  string figi = 1; //Figi-идентификатор инструмента.
  int32 depth = 2; //Глубина стакана.
  bool is_consistent = 3; //Флаг консистентности стакана. **false** значит не все заявки попали в стакан по причинам сетевых задержек или нарушения порядка доставки.
  repeated Order bids = 4; //Массив предложений.
  repeated Order asks = 5; //Массив спроса.
  google.protobuf.Timestamp time = 6; //Время формирования стакана в часовом поясе UTC по времени биржи.
  Quotation limit_up = 7; //Верхний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation limit_down = 8; //Нижний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  string instrument_uid = 9; //Uid инструмента
}

//Массив предложений/спроса.
message Order {
  Quotation price = 1; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  int64 quantity = 2; //Количество в лотах.
}

//Информация о сделке.
message Trade {
  string figi = 1; //Figi-идентификатор инструмента.
  TradeDirection direction = 2; //Направление сделки.
  Quotation price = 3; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  int64 quantity = 4; //Количество лотов.
  google.protobuf.Timestamp time = 5; //Время сделки в часовом поясе UTC по времени биржи.
  string instrument_uid = 6; //Uid инструмента
}

//Направление сделки.
enum TradeDirection {
  TRADE_DIRECTION_UNSPECIFIED = 0; //Направление сделки не определено.
  TRADE_DIRECTION_BUY = 1; //Покупка.
  TRADE_DIRECTION_SELL = 2; //Продажа.
}

//Пакет изменения торгового статуса.
message TradingStatus {
  string figi = 1; //Figi-идентификатор инструмента.
  SecurityTradingStatus trading_status = 2; //Статус торговли инструментом.
  google.protobuf.Timestamp time = 3; //Время изменения торгового статуса в часовом поясе UTC.
  bool limit_order_available_flag = 4; //Признак доступности выставления лимитной заявки по инструменту.
  bool market_order_available_flag = 5; //Признак доступности выставления рыночной заявки по инструменту.
  string instrument_uid = 6; //Uid инструмента
}

//Запрос исторических свечей.
message GetCandlesRequest {
  string figi = 1; //Figi-идентификатор инструмента.
  google.protobuf.Timestamp from = 2; //Начало запрашиваемого периода в часовом поясе UTC.
  google.protobuf.Timestamp to = 3; //Окончание запрашиваемого периода в часовом поясе UTC.
  CandleInterval interval = 4; //Интервал запрошенных свечей.
  string instrument_id = 5; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Интервал свечей.
enum CandleInterval {
  CANDLE_INTERVAL_UNSPECIFIED = 0; //Интервал не определён.
  CANDLE_INTERVAL_1_MIN = 1; //1 минута.
  CANDLE_INTERVAL_5_MIN = 2; //5 минут.
  CANDLE_INTERVAL_15_MIN = 3; //15 минут.
  CANDLE_INTERVAL_HOUR = 4; //1 час.
  CANDLE_INTERVAL_DAY = 5; //1 день.
}

//Список свечей.
message GetCandlesResponse {
  repeated HistoricCandle candles = 1; //Массив свечей.
}

//Информация о свече.
message HistoricCandle {
  Quotation open = 1; //Цена открытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation high = 2; //Максимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation low = 3; //Минимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation close = 4; //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  int64 volume = 5; //Объём торгов в лотах.
  google.protobuf.Timestamp time = 6; //Время свечи в часовом поясе UTC.
  bool is_complete = 7; //Признак завершённости свечи. **false** значит, свеча за текущие интервал ещё сформирована не полностью.
}

//Запрос получения цен последних сделок.
message GetLastPricesRequest {
  repeated string figi = 1; //Массив figi-идентификаторов инструментов.
  repeated string instrument_id = 2; //Массив идентификаторов инструмента, принимает значения figi или instrument_uid
}

//Список цен последних сделок.
message GetLastPricesResponse {
  repeated LastPrice last_prices = 1; //Массив цен последних сделок.
}

//Информация о цене последней сделки.
message LastPrice {
  string figi = 1; //Figi инструмента.
  Quotation price = 2; //Цена последней сделки за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  google.protobuf.Timestamp time = 3; //Время получения последней цены в часовом поясе UTC по времени биржи.
  string instrument_uid = 11; //Uid инструмента
}

//Запрос стакана.
message GetOrderBookRequest {
  string figi = 1; //Figi-идентификатор инструмента.
  int32 depth = 2; //Глубина стакана.
  string instrument_id = 3; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Информация о стакане.
message GetOrderBookResponse {
  string figi = 1; //Figi-идентификатор инструмента.
  int32 depth = 2; //Глубина стакана.
  repeated Order bids = 3; //Множество пар значений на покупку.
  repeated Order asks = 4; //Множество пар значений на продажу.
  Quotation last_price = 5; //Цена последней сделки за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation close_price = 6; //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation limit_up = 7; //Верхний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  Quotation limit_down = 8; //Нижний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Для перевод цен в валюту рекомендуем использовать [информацию со страницы](https://tinkoff.github.io/investAPI/faq_marketdata/)
  google.protobuf.Timestamp last_price_ts = 21; //Время получения цены последней сделки.
  google.protobuf.Timestamp close_price_ts = 22; //Время получения цены закрытия.
  google.protobuf.Timestamp orderbook_ts = 23; //Время формирования стакана на бирже.
  string instrument_uid = 9; //Uid инструмента
}

//Запрос получения торгового статуса.
message GetTradingStatusRequest {
  string figi = 1; //Идентификатор инструмента.
  string instrument_id = 2; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Информация о торговом статусе.
message GetTradingStatusResponse {
  string figi = 1; //Figi-идентификатор инструмента.
  SecurityTradingStatus trading_status = 2; //Статус торговли инструментом.
  bool limit_order_available_flag = 3; //Признак доступности выставления лимитной заявки по инструменту.
  bool market_order_available_flag = 4; //Признак доступности выставления рыночной заявки по инструменту.
  bool api_trade_available_flag = 5; //Признак доступности торгов через API.
  string instrument_uid = 6; //Uid инструмента
}

//Запрос обезличенных сделок за последний час.
message GetLastTradesRequest {
  string figi = 1; //Figi-идентификатор инструмента
  google.protobuf.Timestamp from = 2; //Начало запрашиваемого периода в часовом поясе UTC.
  google.protobuf.Timestamp to = 3; //Окончание запрашиваемого периода в часовом поясе UTC.
  string instrument_id = 4; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Обезличенных сделок за последний час.
message GetLastTradesResponse {
  repeated Trade trades = 1; //Массив сделок
}

//Запрос активных подписок.
message GetMySubscriptions { }

//Запрос цен закрытия торговой сессии по инструментам.
message GetClosePricesRequest {
  repeated InstrumentClosePriceRequest instruments = 1; //Массив по инструментам.
}

//Запрос цен закрытия торговой сессии по инструменту.
message InstrumentClosePriceRequest {
  string instrument_id = 1; //Идентификатор инструмента, принимает значение figi или instrument_uid
}

//Цены закрытия торговой сессии по инструментам.
message GetClosePricesResponse {
  repeated InstrumentClosePriceResponse close_prices = 1; //Массив по инструментам.
}

//Цена закрытия торговой сессии по инструменту.
message InstrumentClosePriceResponse {
  string figi = 1; //Figi инструмента.
  string instrument_uid = 2; //Uid инструмента.
  Quotation price = 11; //Цена закрытия торговой сессии.
  google.protobuf.Timestamp time = 21; //Дата совершения торгов.
}
