Tinkoff / invest-python

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

[Bug] Незакрытые свечи в SubscribeCandlesRequest #236

Open Stark-lnk opened 1 year ago

Stark-lnk commented 1 year ago

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

Добрый день!

Столкнулся с багом когда при подписке на стрим свечей с указанием waiting_close=True приходят незакрытые свечи (см скриншот). Т.е приходят данные за 8:36 в нулевую секунду этой свечи (в 8:36:00 вместо 8:36:59). Свеча может придти не только в самом начале самой себя, но и середине и за 5 секунд до конца).

image

При использовании market_data_stream: AsyncMarketDataStreamManager = (client.create_market_data_stream()) market_data_stream.candles.waiting_close().subscribe(figi_instruments) Аналогичная проблема(

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

import asyncio

from tinkoff.invest import (
    AsyncClient,
    SubscriptionInterval,
)
from tinkoff.invest import CandleInstrument, MarketDataRequest, SubscribeCandlesRequest, SubscriptionAction

INSTRUMENTS = [
    {"ticker": "SBER", "figi": "BBG004730N88"},
]

async def request_iterator(instruments):
    figi_instruments = list(map(lambda instrument: CandleInstrument(instrument["figi"],
                                                                    interval=SubscriptionInterval.SUBSCRIPTION_INTERVAL_ONE_MINUTE),
                                instruments))

    yield MarketDataRequest(
        subscribe_candles_request=SubscribeCandlesRequest(
            waiting_close=True,
            subscription_action=SubscriptionAction.SUBSCRIPTION_ACTION_SUBSCRIBE,
            instruments=figi_instruments,
        )
    )
    while True:
        await asyncio.sleep(1)

async def update_data_and_start_strategy(client):
    async for marketdata in client.market_data_stream.market_data_stream(
            request_iterator(INSTRUMENTS)):
        print(marketdata)

async def main():
    async with AsyncClient(TOKEN) as client:
        tasks = [asyncio.ensure_future(update_data_and_start_strategy(client))]
        await asyncio.wait(tasks)

Tinkoff Invest Version

0.2.0-beta58

Python Version

3.11

OS

Mac OS (m1)

Логи

No response

AlexanderVolkovTCS commented 1 year ago

Да, воспроизвели и получили лишнюю свечу при waiting_close=True Баг в API, поправим, отпишусь тут. Спасибо за репорт.

Stark-lnk commented 1 year ago

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