Tinkoff / invest-python

Tinkoff Invest Python gRPC client
https://tinkoff.github.io/invest-python/
Apache License 2.0
313 stars 90 forks source link

Подписки приходят не по заданному интервалу подписки #206

Closed cia76 closed 1 year ago

cia76 commented 1 year ago

Что случилось?

В примере easy_stream_client.py мы подписываемся на минутные бары. Указываем interval=SubscriptionInterval.SUBSCRIPTION_INTERVAL_ONE_MINUTE Но результаты приходят после каждой сделки, а не в начале каждой минуты.

Воспроизведение

import os

from tinkoff.invest import (
    CandleInstrument,
    Client,
    InfoInstrument,
    SubscriptionInterval,
)
from tinkoff.invest.services import MarketDataStreamManager

TOKEN = os.environ["INVEST_TOKEN"]

def main():
    with Client(TOKEN) as client:
        market_data_stream: MarketDataStreamManager = client.create_market_data_stream()
        market_data_stream.candles.subscribe(
            [
                CandleInstrument(
                    figi="BBG004730N88",
                    interval=SubscriptionInterval.SUBSCRIPTION_INTERVAL_ONE_MINUTE,
                )
            ]
        )
        for marketdata in market_data_stream:
            print(marketdata)

if __name__ == "__main__":
    main()

Tinkoff Invest Version

0.2.0-beta50

Python Version

3.11

OS

Windows

Логи

No response

Saveprog commented 1 year ago

waiting_close : bool не поддерживается... Было бы здорово увидеть решение этой проблемы

AlexanderVolkovTCS commented 1 year ago

@irusland Подскажи, можно ли добавить параметр waiting_close=true в пример?

cia76 commented 1 year ago

Да, если сгенерировать код на Python из proto-файлов, тогда можно вызывать подписки со всеми ключами. В т.ч. и с waiting_close=True

irusland commented 1 year ago

для waiting_close=True Можно воспользоваться https://github.com/Tinkoff/invest-python/blob/618864e71a5ff91b422927a2fe594eb7d40b6b8d/examples/stream_client.py#L20

irusland commented 1 year ago

@AlexanderVolkovTCS в контракте вижу

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

Для остальных SubscribeOrderBookRequest, SubscribeTradesRequest, SubscribeInfoRequest, SubscribeLastPriceRequest поддерживаемых в easy stream client нету такого флага. Это из-за того, что is_close это атрибут только свечей?

irusland commented 1 year ago

Могу, конечно, прокинуть этот параметр в функцию subscribe(, но easy_stream_client позициорировался как простой способ подписаться на информацию, без особых настроек, если нужно больше управления - можно использовать обычный клиент.

irusland commented 1 year ago

Да, если сгенерировать код на Python из proto-файлов, тогда можно вызывать подписки со всеми ключами. В т.ч. и с waiting_close=True

Сейчас библиотека поддерживает новейший контракт. @cia76, что вы имеете ввиду?

irusland commented 1 year ago

решили попробовать сделать market_data_stream.candles.with_close().subscribe( Кидать ошибку если with_close + не минутки