Tinkoff / invest-python

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

Автоматическая пауза/возобновление при получении RESOURCE_EXHAUSTED #96

Closed fingoldo closed 2 years ago

fingoldo commented 2 years ago

Описание

Тот же пример закачки свечей, но за более длительный период.

from tinkoff.invest import CandleInterval, Client
from tinkoff.invest.caching.cache_settings import MarketDataCacheSettings
from tinkoff.invest.services import MarketDataCache
from tinkoff.invest.utils import now
from pathlib import Path

with Client(TOKEN) as client:
    settings = MarketDataCacheSettings(base_cache_dir=Path("tnkf_data_cache"))
    market_data_cache = MarketDataCache(settings=settings, services=client)
    for candle in market_data_cache.get_all_candles(
        figi="BBG000B9XRY4", from_=now() - timedelta(days=365 * 10), interval=CandleInterval.CANDLE_INTERVAL_1_MIN,
    ):
        print(candle)

Обрывается через 20 секунд на

C:\ProgramData\Anaconda3\lib\site-packages\tinkoff\invest\_errors.py in wrapper(*args, **kwargs)
     26                         f"{e.code().name} {e.details()}",  # type:ignore
     27                     )
---> 28                     raise RequestError(
     29                         e.code(), e.details(), metadata  # type:ignore
     30                     ) from e

RequestError: (<StatusCode.RESOURCE_EXHAUSTED: (8, 'resource exhausted')>, '', Metadata(tracking_id=None, ratelimit_limit='300, 300;w=60', ratelimit_remaining=0, ratelimit_reset=25, message=None))

Без возможности возобновления.

Желаемое решение

Может, возможно сделать автоматическую паузу при получении RESOURCE_EXHAUSTED, вывод предупреждения, и автовозобновление, прямо в обработчике ошибок?

Дополнительно

Ещё в документации я нашёл точку доступа к годовым архивам, но, похоже, питоновской обёртки готовой под неё нет? Может, получится добавить её на будущее в план развития SDK.

AlexanderVolkovTCS commented 2 years ago

Ещё в документации я нашёл точку доступа к годовым архивам, но, похоже, питоновской обёртки готовой под неё нет

уточните просто для информации - зачем обертка на питоне, если можно шелл запустить?

fingoldo commented 2 years ago

Ещё в документации я нашёл точку доступа к годовым архивам, но, похоже, питоновской обёртки готовой под неё нет

уточните просто для информации - зачем обертка на питоне, если можно шелл запустить?

Не у всех же Юникс. Многие на Win работают, да и могут нуждаться в более сложных сценариях обновления данных.

AlexanderVolkovTCS commented 2 years ago

Предлагаю добавить в конфиг:

Энвой в заголовках ответа возвращает оставшееся количество запросов + время, через которое счетчик обнулится, подробнее о полях см на странице https://tinkoff.github.io/investAPI/grpc/#kreya

В случае получения RESOURCE_EXHAUSTED засыпать на время x-ratelimit-reset, возвращенное энвоем. Повторяем MAX_RETRY_ATTEMPT попыток.

fingoldo commented 2 years ago

Предлагаю добавить в конфиг:

  • флаг use_retry
  • константу MAX_RETRY_ATTEMPT = 3

Энвой в заголовках ответа возвращает оставшееся количество запросов + время, через которое счетчик обнулится, подробнее о полях см на странице https://tinkoff.github.io/investAPI/grpc/#kreya

В случае получения RESOURCE_EXHAUSTED засыпать на время x-ratelimit-reset, возвращенное энвоем. Повторяем MAX_RETRY_ATTEMPT попыток.

Если это получится сделать в рамках самого SDK, пользователям будет гораздо удобнее, я думаю. Надеюсь, об этом речь и шла )