syntax = "proto3"; package tinkoff.public.invest.api.contract.v1; import "google/protobuf/timestamp.proto"; import "invest/common.proto"; service MarketDataService { //Сервис получения биржевой информации:
**1**. свечи;
**2**. стаканы;
**3**. торговые статусы;
**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); } 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; //Интервал свечей. } //Результат изменения статус подписки на свечи. 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; //Статус подписки. } //Результат подписки. 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; //Глубина стакана. } //Результат изменения статуса подписки на стаканы. 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; //Статус подписки. } //Изменение статуса подписки на поток обезличенных сделок. message SubscribeTradesRequest { SubscriptionAction subscription_action = 1; //Изменение статуса подписки. repeated TradeInstrument instruments = 2; //Массив инструментов для подписки на поток обезличенных сделок. } //Запрос подписки на поток обезличенных сделок. message TradeInstrument { string figi = 1; //Figi-идентификатор инструмента. } //Результат изменения статуса подписки на поток обезличенных сделок. 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; //Статус подписки. } //Изменение статуса подписки на торговый статус инструмента. message SubscribeInfoRequest { SubscriptionAction subscription_action = 1; //Изменение статуса подписки. repeated InfoInstrument instruments = 2; //Массив инструментов для подписки на торговый статус. } //Запрос подписки на торговый статус. message InfoInstrument { string figi = 1; //Figi-идентификатор инструмента. } //Результат изменения статуса подписки на торговый статус. 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; //Статус подписки. } //Изменение статуса подписки на последнюю цену инструмента. message SubscribeLastPriceRequest { SubscriptionAction subscription_action = 1; //Изменение статуса подписки. repeated LastPriceInstrument instruments = 2; //Массив инструментов для подписки на последнюю цену. } //Запрос подписки на последнюю цену. message LastPriceInstrument { string figi = 1; //Figi-идентификатор инструмента. } //Результат изменения статуса подписки на последнюю цену. 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; //Статус подписки. } //Пакет свечей в рамках стрима. message Candle { string figi = 1; //Figi-идентификатор инструмента. SubscriptionInterval interval = 2; //Интервал свечи. Quotation open = 3; //Цена открытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation high = 4; //Максимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation low = 5; //Минимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation close = 6; //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. int64 volume = 7; //Объём сделок в лотах. google.protobuf.Timestamp time = 8; //Время начала интервала свечи в часовом поясе UTC. google.protobuf.Timestamp last_trade_ts = 9; //Время последней сделки, вошедшей в свечу в часовом поясе UTC. } //Пакет стаканов в рамках стрима. 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 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation limit_down = 8; //Нижний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. } //Массив предложений/спроса. message Order { Quotation price = 1; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. int64 quantity = 2; //Количество в лотах. } //Информация о сделке. message Trade { string figi = 1; //Figi-идентификатор инструмента. TradeDirection direction = 2; //Направление сделки. Quotation price = 3; //Цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. int64 quantity = 4; //Количество лотов. google.protobuf.Timestamp time = 5; //Время сделки в часовом поясе UTC по времени биржи. } //Направление сделки. 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; //Признак доступности выставления рыночной заявки по инструменту. } //Запрос исторических свечей. message GetCandlesRequest { string figi = 1; //Figi-идентификатор инструмента. google.protobuf.Timestamp from = 2; //Начало запрашиваемого периода в часовом поясе UTC. google.protobuf.Timestamp to = 3; //Окончание запрашиваемого периода в часовом поясе UTC. CandleInterval interval = 4; //Интервал запрошенных свечей. } //Интервал свечей. 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 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation high = 2; //Максимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation low = 3; //Минимальная цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation close = 4; //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. int64 volume = 5; //Объём торгов в лотах. google.protobuf.Timestamp time = 6; //Время свечи в часовом поясе UTC. bool is_complete = 7; //Признак завершённости свечи. **false** значит, свеча за текущие интервал ещё сформирована не полностью. } //Запрос получения последних цен. message GetLastPricesRequest { repeated string figi = 1; //Массив figi-идентификаторов инструментов. } //Список последних цен. message GetLastPricesResponse { repeated LastPrice last_prices = 1; //Массив последних цен. } //Информация о цене. message LastPrice { string figi = 1; //Идентификатор инструмента. Quotation price = 2; //Последняя цена за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. google.protobuf.Timestamp time = 3; //Время получения последней цены в часовом поясе UTC по времени биржи. } //Запрос стакана. message GetOrderBookRequest { string figi = 1; //Figi-идентификатор инструмента. int32 depth = 2; //Глубина стакана. } //Информация о стакане. message GetOrderBookResponse { string figi = 1; //Figi-идентификатор инструмента. int32 depth = 2; //Глубина стакана. repeated Order bids = 3; //Множество пар значений на покупку. repeated Order asks = 4; //Множество пар значений на продажу. Quotation last_price = 5; //Цена последней сделки за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation close_price = 6; //Цена закрытия за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation limit_up = 7; //Верхний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. Quotation limit_down = 8; //Нижний лимит цены за 1 инструмент. Для получения стоимости лота требуется умножить на лотность инструмента. } //Запрос получения торгового статуса. message GetTradingStatusRequest { string figi = 1; //Идентификатор инструмента. } //Информация о торговом статусе. 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. } //Запрос обезличенных сделок за последний час. message GetLastTradesRequest { string figi = 1; //Figi-идентификатор инструмента google.protobuf.Timestamp from = 2; //Начало запрашиваемого периода в часовом поясе UTC. google.protobuf.Timestamp to = 3; //Окончание запрашиваемого периода в часовом поясе UTC. } //Обезличенных сделок за последний час. message GetLastTradesResponse { repeated Trade trades = 1; //Массив сделок } //Запрос активных подписок. message GetMySubscriptions { }