Tinkoff / investAPI

395 stars 138 forks source link

Как правильно получать цену последний сделки с помощью MarketDataStreamService? #347

Closed Kosty1024Bit closed 1 year ago

Kosty1024Bit commented 1 year ago

Всем доброго дня и заранее спасибо всем кто сможет мне объяснить в чём тут дело. Я пытался сделать по аналогии как это было указано в примерах, но для свечек

async def main():
    async with AsyncClient(TOKEN) as client:
        market_data_stream: AsyncMarketDataStreamManager = (client.create_market_data_stream())

        market_data_stream.candles.subscribe([CandleInstrument(
            figi=SBER_figi,
            interval=SubscriptionInterval.SUBSCRIPTION_INTERVAL_ONE_MINUTE)])

        async for marketdata in market_data_stream:
            print(marketdata)

if __name__ == "__main__":
    asyncio.run(main())

Я заменили market_data_stream.candles.subscribe на market_data_stream.last_price.subscribe и CandleInstrument на LastPriceInstrument.

async def main():
    async with AsyncClient(TOKEN) as client:
        market_data_stream: AsyncMarketDataStreamManager = (client.create_market_data_stream())

        market_data_stream.last_price.subscribe([LastPriceInstrument(
            figi=SBER_figi,
            instrument_uid=SBER_figi
        )])

        async for marketdata in market_data_stream:
            print(marketdata)

if __name__ == "__main__":
    asyncio.run(main())

В первый раз я запустил без указания параметра instrument_uid=SBER_figi в LastPriceInstrument и я получил следующий результат:

Traceback (most recent call last):
  File "C:\Users\konst\Jupyter Notebook\money\TradeBOT\websocket_tinkoff.py", line 63, in <module>
    asyncio.run(main())
  File "C:\Users\konst\miniconda3\lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "C:\Users\konst\miniconda3\lib\asyncio\base_events.py", line 647, in run_until_complete
    return future.result()
  File "C:\Users\konst\Jupyter Notebook\money\TradeBOT\websocket_tinkoff.py", line 45, in main
    async for marketdata in market_data_stream:
  File "C:\Users\konst\miniconda3\lib\site-packages\tinkoff\invest\_errors.py", line 91, in wrapper
    async for result in func(*args, **kwargs):
  File "C:\Users\konst\miniconda3\lib\site-packages\tinkoff\invest\async_services.py", line 884, in market_data_stream
    yield _grpc_helpers.protobuf_to_dataclass(response, MarketDataResponse)
  File "C:\Users\konst\miniconda3\lib\site-packages\tinkoff\invest\_grpc_helpers.py", line 318, in protobuf_to_dataclass
    field_value = protobuf_to_dataclass(pb_value, field_type)
  File "C:\Users\konst\miniconda3\lib\site-packages\tinkoff\invest\_grpc_helpers.py", line 302, in protobuf_to_dataclass
    pb_value = getattr(pb_obj, unsafe_field_name)
AttributeError: instrument_uid

Во второй раз я указал параметр, как описано в примере моего кода выше, и снова получил ошибку:

Traceback (most recent call last):
  File "C:\Users\konst\Jupyter Notebook\money\TradeBOT\websocket_tinkoff.py", line 45, in main
    async for marketdata in market_data_stream:
  File "C:\Users\konst\miniconda3\lib\site-packages\tinkoff\invest\_errors.py", line 91, in wrapper
    async for result in func(*args, **kwargs):
  File "C:\Users\konst\miniconda3\lib\site-packages\tinkoff\invest\async_services.py", line 880, in market_data_stream
    async for response in self.stub.MarketDataStream(
  File "C:\Users\konst\miniconda3\lib\site-packages\grpc\aio\_call.py", line 326, in _fetch_stream_responses
    await self._raise_for_status()
  File "C:\Users\konst\miniconda3\lib\site-packages\grpc\aio\_call.py", line 233, in _raise_for_status
    raise asyncio.CancelledError()
asyncio.exceptions.CancelledError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Users\konst\Jupyter Notebook\money\TradeBOT\websocket_tinkoff.py", line 63, in <module>
    asyncio.run(main())
  File "C:\Users\konst\miniconda3\lib\asyncio\runners.py", line 44, in run
    return loop.run_until_complete(main)
  File "C:\Users\konst\miniconda3\lib\asyncio\base_events.py", line 647, in run_until_complete
    return future.result()
asyncio.exceptions.CancelledError

В документации насчёт этого мало чего существенного. Как это правильно исправить или есть другой путь?

irusland commented 1 year ago

Проблема относится к другому репозиторию: https://github.com/Tinkoff/invest-python/issues там следует задать этот вопрос и заполнить нужные поля включая версию библиотеки, питона и операционную систему.

Поле называется instrument_id

Работающий пример

import asyncio
import os

from tinkoff.invest import AsyncClient, CandleInstrument, SubscriptionInterval
from tinkoff.invest.market_data_stream.async_market_data_stream_manager import AsyncMarketDataStreamManager

TOKEN = os.environ['INVEST_TOKEN']

some_figi = "BBG004730N88"

async def main():
    async with AsyncClient(TOKEN) as client:
        market_data_stream: AsyncMarketDataStreamManager = (client.create_market_data_stream())

        market_data_stream.candles.subscribe([CandleInstrument(
            instrument_id=some_figi,
            interval=SubscriptionInterval.SUBSCRIPTION_INTERVAL_ONE_MINUTE,
        )])

        async for marketdata in market_data_stream:
            print(marketdata)

if __name__ == "__main__":
    asyncio.run(main())