yatis 0.2.1

Yet Another T-bank Investment Sdk
Documentation
# Сервис котировок

Сервис котировок предназначен для получения различной биржевой информации, в том числе исторической. Все методы сервиса принимают на вход параметр `instrumentId`, в котором можно передать значение **instrument_uid** или **FIGI**.

[Подробнее об идентификаторах инструментов](/investAPI/faq_identification/)
<p>Есть несколько вариантов взаимодействия с сервисом: </p>
<ol>
<li><p><strong>Unary-методы</strong> — используются для загрузки исторических данных и получения информации, когда не нужна оперативность. Для методов есть ограничение на <a href="/investAPI/limits">количество запросов в минуту</a>.</p>
</li>
<li><p><strong>Bidirectional stream</strong> — используется для получения биржевой информации в реальном времени с минимально 
возможными задержками. Для работы со стримом есть <a href="/investAPI/limits">лимитные ограничения</a>.</p>
<p>Также в стриме есть метод для <a href="/investAPI/head-marketdata/#_14">контроля консистентности активных подписок</a>.</p>
</li>
<li><p><strong>Server-side stream</strong> — используется для получения биржевой информации в реальном времени с минимально возможными задержками. В отличие от <a href="/investAPI/marketdata#marketdatastream">MarketDataStream</a>, в этом стриме передаётся объект со всеми типами подписок.</p>
<p>ServerSideStream нужен для корректной трансляции маркет-даты в браузерные клиенты по gRPC-web, который не поддерживает Bidirectional-стримы.</p>
<p>Для работы со стримом есть <a href="/investAPI/limits">лимитные ограничения</a>.</p>
</li>
</ol>

<blockquote>
<p><strong>Важно</strong><br>
Цены облигаций и фьючерсов в T-Invest API отображаются в пунктах. Для облигаций один пункт равен одному проценту номинала облигации. </p>
<p>Формула расчёта реальной стоимости фьючерса: <strong>price</strong> / <strong>min_price_increment</strong> * <strong>min_price_increment_amount</strong></p>
</blockquote>

## Формулы расчёта реальной стоимости инструментов в валюте

Значения: 

* **price** — текущая котировка ценной бумаги;
* **nominal** — номинал облигации;
* **min_price_increment** — шаг цены;
* **min_price_increment_amount** — стоимость шага цены;
* **lot** — лотность инструмента.

### Акции

Формула расчёта: **price** * **lot**.

### Облигации

Пункты цены для котировок облигаций — это проценты номинала облигации. Формулы расчёта:

<ul>
<li><p>Пункты в валюту: <strong>price</strong> / 100 * <strong>nominal</strong>.</p>
</li>
<li><p>Пункты в валюту с учётом НКД: <strong>price</strong> / 100 * <strong>nominal</strong> + <strong>current_nkd</strong>. </p>
<p> НКД — накопленный купонный доход. Может возвращаться в параметрах <code>current_nkd</code> или <code>aci_value</code>. </p>
</li>
</ul>

### Валюта

Формула расчёта: **price** * **lot** / **nominal**.

>**Важно**<br>
>При торговле валютой учитывайте, что у таких валют как Иена, Армянский драм и Тенге `nominal` = `100`.

### Фьючерсы

Стоимость фьючерсов предоставляется в пунктах. Формула расчёта: **price** / **min_price_increment** * **min_price_increment_amount**.

## Получить исторические свечи

В процессе разработки торгового робота нужно анализировать различную историческую информацию — например,
свечи. Для получения исторических свечей по инструменту можно использовать метод [getCandles](/investAPI/marketdata#getcandles).

>**Обратите внимание**<br>
>Максимально допустимый период получения свечей за один запрос — один календарный год. 
Получить данные за более длинный период можно поочередным вызовом метода. 

>**Обратите внимание**<br>
>По фьючерсным контрактам дневные свечи в API и на Бирже отличаются. 
Это связано с тем, что бокер считает день в пределах календарного дня, а Биржа от открытия предыдущей вечерней сессии. 

## Получить цены последних сделок

Чтобы получить цены последних сделок всех доступных для торговли инструментов, используйте метод [getLastPrices](/investAPI/marketdata#getlastprices). В запросе нужно передать пустой массив `instruments`.

Если вам нужно оперативно получать информацию о цене последней сделки, мы рекомендуем использовать [подписку на поток обезличенных сделок](/investAPI/marketdata#subscribetradesrequest) в рамках [stream-соединения сервиса](/investAPI/marketdata#marketdatastream).

## Получить текущий стакан

[Биржевой стакан](https://www.tbank.ru/invest/account/help/trade-on-bs/bids/#q13) — один из ключевых показателей торгового инструмента. Стакан содержит заявки пользователей на покупку или продажу определённого инструмента.

Для получения стакана можно использовать метод [getOrderbook](/investAPI/marketdata#getorderbook). 
Он также позволяет получать время формирования стакана на бирже, время получения цены закрытия и цены последней сделки.

Для высоколиквидных инструментов стакан может изменяться на бирже несколько раз в секунду, поэтому 
использовать unary-метод не всегда удобно. В таком случае рекомендуем использовать 
[подписку на стаканы](/investAPI/marketdata#subscribeorderbookrequest) в рамках 
[stream-соединения сервиса](/investAPI/marketdata#marketdatastream).

## Bidirectional stream получения биржевой информации

В рамках stream-соединения можно получать поток интересующих данных. В рамках одного соединения пользователь
может подписаться на получение:

- стаканов — с глубиной 1, 10, 20, 30, 40 или 50; 

- свечей; 

- потока обезличенных сделок; 

- статуса торговли инструментов;

- цен последних сделок;

- информации о своих подписках.

>**Важно**<br>
>В рамках одного запроса можно управлять подпиской только одного типа данных. <br>
>Чтобы подписаться на свечи и стаканы, нужно отправить два запроса через метод [marketdataRequest]/investAPI/marketdata#marketdatarequest с информацией об изменении статуса подписки на свечи и стаканы. 

Чтобы сохранить стабильное подключение при отсутствии данных в stream-соединении, сервер периодически
отправляется ping-пакет. Клиенту не нужно реагировать на него.

>**Обратите внимание**<br>
>Максимальное количество подписок на одно соединение ограничено [лимитной политикой]/investAPI/limits/ T-Invest API, но это ограничение не распространяется на подписку **info** — получение торгового статуса инструмента.

### Особенности трансляции свечей

Свечи в рамках bidirectional stream собираются из ленты обезличенных сделок в режиме реального времени.

Свечи отправляются не чаще одного раза в 300мс + свеча закрытия периода сбора. Но бывают ситуации, когда сделки с биржи фактически доходят уже после окончания периода сбора свечи — в таком случае в стрим отправляется ещё одна или более «корректирующая» свеча. 

Если вам нужно получать свечи после закрытия интервала, используйте параметр `waiting_close`.

### Получить исторические рыночные данные по инструментам в виде годового архива

Через метод [GetHistory](/investAPI/get_history) можно получить ZIP-архив исторических минутных свечей за год.

>**Обратите внимание**<br>
>Максимально допустимый период получения свечей за один запрос — один календарный год. 
Получить данные за более длинный период можно поочередным вызовом метода. 

Также в методе [GetHistory](/investAPI/get_history) есть скрипт получения ZIP-архивов по списку инструментов за все доступные года. Скрипт выполняет поочередный вызов метода по всем доступным годам.

>**Обратите внимание**<br>
>Данные в архиве обновляются один раз в день — как правило, ночью. Текущего дня в архиве не будет.

### Лимиты на количество запросов на подписку

Для всех типов подписок в [bidirectional stream](/investAPI/marketdata/#marketdatastream) установлены ограничения максимального количества запросов на подписку. 

Если количество запросов за минуту превысит 100, для всех элементов будет установлен статус [SUBSCRIPTION_STATUS_TOO_MANY_REQUESTS](/investAPI/marketdata/#subscriptionstatus).

### Получить информацию о своих подписках

Информацию о своих подписках можно запросить через метод [marketDataStream](/investAPI/marketdata/#marketdatastream), передав параметр [GetMySubscriptions](/investAPI/marketdata/#getmysubscriptions).
Метод также используется для контроля активных подписок.

Запрос вернёт по одному сообщению на каждый тип активных подписок — `SubscribeLastPriceResponse`, `SubscribeInfoResponse`, `SubscribeTradesResponse`, `SubscribeOrderBookResponse`, `SubscribeCandlesResponse`.

#### Контроль активности стрима

Чтобы проверить работу стрима, используйте следующий механизм:

1. Храните информацию о подписках в своих приложениях.

2. Периодически или при возникновении сомнений отправляйте в стрим запрос [GetMySubscriptions]/investAPI/marketdata/#getmysubscriptions.

3. Запросите информацию об активных подписках из стрима.

4. Если данные из стрима расходятся с данными из собственного хранилища, повторно подпишитесь на недостающие данные. Если в стриме нет данных с активными подписками, перезапустите стрим.

### Получить цену закрытия

Чтобы получить цены закрытия всех доступных для торговли инструментов, используйте  метод [GetClosePrices](/investAPI/marketdata/#getcloseprices). В запросе передайте пустой массив `instruments`.

Чтобы получить цену закрытия за предыдущий торговый день, в [запросе](/investAPI/marketdata/#instrumentclosepricerequest) передайте параметр `instrumentId` — идентификатор инструмента. Он принимает значение **instrument_uid** или **FIGI**. 

### Торговые статусы инструментов и расписание торгов

[Торговые статусы инструментов и расписание торгов](https://russianinvestments.github.io/investAPI/faq_trading_status/)

Также рекомендуем смотреть актуальную информацию по режимам и статусам торгов на сайтах [Московской биржи](https://www.moex.com/) и [СПБ биржи](https://spbexchange.ru/).