Path: blob/master/ invest-robot-contest_TinkoffBotTwitch-main/venv/lib/python3.8/site-packages/tinkoff/invest/services.py
7819 views
# pylint:disable=redefined-builtin,too-many-lines1import abc2import logging3from datetime import datetime4from typing import Dict, Generator, Iterable, List, Optional, Tuple56import grpc78from tinkoff.invest.market_data_stream.market_data_stream_manager import (9MarketDataStreamManager,10)1112from . import _grpc_helpers13from ._errors import handle_request_error, handle_request_error_gen14from .caching.cache_settings import MarketDataCacheSettings15from .caching.instrument_date_range_market_data import InstrumentDateRangeData16from .caching.instrument_market_data_storage import InstrumentMarketDataStorage17from .grpc import (18instruments_pb2,19instruments_pb2_grpc,20marketdata_pb2,21marketdata_pb2_grpc,22operations_pb2,23operations_pb2_grpc,24orders_pb2,25orders_pb2_grpc,26sandbox_pb2,27sandbox_pb2_grpc,28stoporders_pb2,29stoporders_pb2_grpc,30users_pb2,31users_pb2_grpc,32)33from .logging import get_tracking_id_from_call, log_request34from .metadata import get_metadata35from .schemas import (36AssetRequest,37AssetResponse,38AssetsRequest,39AssetsResponse,40BondResponse,41BondsResponse,42BrokerReportRequest,43BrokerReportResponse,44CancelOrderRequest,45CancelOrderResponse,46CancelStopOrderRequest,47CancelStopOrderResponse,48CandleInterval,49CloseSandboxAccountRequest,50CloseSandboxAccountResponse,51CurrenciesResponse,52CurrencyResponse,53EditFavoritesActionType,54EditFavoritesRequest,55EditFavoritesRequestInstrument,56EditFavoritesResponse,57EtfResponse,58EtfsResponse,59FutureResponse,60FuturesResponse,61GenerateBrokerReportRequest,62GenerateDividendsForeignIssuerReportRequest,63GetAccountsRequest,64GetAccountsResponse,65GetAccruedInterestsRequest,66GetAccruedInterestsResponse,67GetBondCouponsRequest,68GetBondCouponsResponse,69GetBrokerReportRequest,70GetCandlesRequest,71GetCandlesResponse,72GetDividendsForeignIssuerReportRequest,73GetDividendsForeignIssuerRequest,74GetDividendsForeignIssuerResponse,75GetDividendsRequest,76GetDividendsResponse,77GetFavoritesRequest,78GetFavoritesResponse,79GetFuturesMarginRequest,80GetFuturesMarginResponse,81GetInfoRequest,82GetInfoResponse,83GetLastPricesRequest,84GetLastPricesResponse,85GetLastTradesRequest,86GetLastTradesResponse,87GetMarginAttributesRequest,88GetMarginAttributesResponse,89GetOrderBookRequest,90GetOrderBookResponse,91GetOrdersRequest,92GetOrdersResponse,93GetOrderStateRequest,94GetStopOrdersRequest,95GetStopOrdersResponse,96GetTradingStatusRequest,97GetTradingStatusResponse,98GetUserTariffRequest,99GetUserTariffResponse,100HistoricCandle,101InstrumentIdType,102InstrumentRequest,103InstrumentResponse,104InstrumentsRequest,105InstrumentStatus,106MarketDataRequest,107MarketDataResponse,108MoneyValue,109OpenSandboxAccountRequest,110OpenSandboxAccountResponse,111OperationsRequest,112OperationsResponse,113OperationState,114OrderDirection,115OrderState,116OrderType,117PortfolioRequest,118PortfolioResponse,119PositionsRequest,120PositionsResponse,121PostOrderRequest,122PostOrderResponse,123PostStopOrderRequest,124PostStopOrderResponse,125Quotation,126SandboxPayInRequest,127SandboxPayInResponse,128ShareResponse,129SharesResponse,130StopOrderDirection,131StopOrderExpirationType,132StopOrderType,133TradesStreamRequest,134TradesStreamResponse,135TradingSchedulesRequest,136TradingSchedulesResponse,137WithdrawLimitsRequest,138WithdrawLimitsResponse,139)140from .typedefs import AccountId141from .utils import (142candle_interval_to_timedelta,143datetime_range_floor,144get_intervals,145now,146)147148__all__ = (149"Services",150"InstrumentsService",151"MarketDataService",152"MarketDataStreamService",153"OperationsService",154"OrdersStreamService",155"OrdersService",156"UsersService",157"SandboxService",158"StopOrdersService",159)160logger = logging.getLogger(__name__)161162163class ICandleGetter(abc.ABC):164@abc.abstractmethod165def get_all_candles(166self,167*,168from_: datetime,169to: Optional[datetime],170interval: CandleInterval,171figi: str,172) -> Generator[HistoricCandle, None, None]:173pass174175176class MarketDataCache(ICandleGetter):177def __init__(self, settings: MarketDataCacheSettings, services: "Services"):178self._settings = settings179self._settings.base_cache_dir.mkdir(parents=True, exist_ok=True)180self._services = services181self._figi_cache_storages: Dict[182Tuple[str, CandleInterval], InstrumentMarketDataStorage183] = {}184185def _get_candles_from_net(186self, figi: str, interval: CandleInterval, from_: datetime, to: datetime187) -> Iterable[HistoricCandle]:188yield from self._services.get_all_candles(189figi=figi,190interval=interval,191from_=from_,192to=to,193)194195def _with_saving_into_cache(196self,197storage: InstrumentMarketDataStorage,198from_net: Iterable[HistoricCandle],199net_range: Tuple[datetime, datetime],200) -> Iterable[HistoricCandle]:201candles = list(from_net)202storage.update(203[InstrumentDateRangeData(date_range=net_range, historic_candles=candles)]204)205logger.debug("From net [\n%s\n%s\n]", str(net_range[0]), str(net_range[1]))206logger.debug(207"From net real [\n%s\n%s\n]",208str(min(list(map(lambda x: x.time, candles)))),209str(max(list(map(lambda x: x.time, candles)))),210)211212yield from candles213214def get_all_candles(215self,216*,217from_: datetime,218to: Optional[datetime] = None,219interval: CandleInterval = CandleInterval(0),220figi: str = "",221) -> Generator[HistoricCandle, None, None]:222to = to or now()223from_, to = datetime_range_floor((from_, to))224logger.debug("Request [\n%s\n%s\n]", str(from_), str(to))225226processed_time = from_227figi_cache_storage = self._get_figi_cache_storage(figi=figi, interval=interval)228for cached in figi_cache_storage.get(request_range=(from_, to)):229cached_start, cached_end = cached.date_range230cached_candles = list(cached.historic_candles)231assert cached_start >= processed_time232if cached_start > processed_time:233yield from self._with_saving_into_cache(234storage=figi_cache_storage,235from_net=self._get_candles_from_net(236figi, interval, processed_time, cached_start237),238net_range=(processed_time, cached_start),239)240logger.debug(241"Returning from cache [\n%s\n%s\n]", str(cached_start), str(cached_end)242)243244yield from cached_candles245processed_time = cached_end246if processed_time + candle_interval_to_timedelta(interval) <= to:247yield from self._with_saving_into_cache(248storage=figi_cache_storage,249from_net=self._get_candles_from_net(figi, interval, processed_time, to),250net_range=(processed_time, to),251)252253def _get_figi_cache_storage(254self, figi: str, interval: CandleInterval255) -> InstrumentMarketDataStorage:256figi_tuple = (figi, interval)257storage = self._figi_cache_storages.get(figi_tuple)258if storage is None:259storage = InstrumentMarketDataStorage(260figi=figi, interval=interval, settings=self._settings261)262self._figi_cache_storages[figi_tuple] = storage263return storage # noqa: R504264265266class Services(ICandleGetter):267def __init__(268self,269channel: grpc.Channel,270token: str,271sandbox_token: Optional[str] = None,272app_name: Optional[str] = None,273) -> None:274metadata = get_metadata(token, app_name)275sandbox_metadata = get_metadata(sandbox_token or token, app_name)276self.instruments = InstrumentsService(channel, metadata)277self.market_data = MarketDataService(channel, metadata)278self.market_data_stream = MarketDataStreamService(channel, metadata)279self.operations = OperationsService(channel, metadata)280self.orders_stream = OrdersStreamService(channel, metadata)281self.orders = OrdersService(channel, metadata)282self.users = UsersService(channel, metadata)283self.sandbox = SandboxService(channel, sandbox_metadata)284self.stop_orders = StopOrdersService(channel, metadata)285286def create_market_data_stream(self) -> MarketDataStreamManager:287return MarketDataStreamManager(288market_data_stream_service=self.market_data_stream289)290291def cancel_all_orders(self, account_id: AccountId) -> None:292orders_service: OrdersService = self.orders293stop_orders_service: StopOrdersService = self.stop_orders294295orders_response = orders_service.get_orders(account_id=account_id)296for order in orders_response.orders:297orders_service.cancel_order(account_id=account_id, order_id=order.order_id)298299stop_orders_response = stop_orders_service.get_stop_orders(300account_id=account_id301)302for stop_order in stop_orders_response.stop_orders:303stop_orders_service.cancel_stop_order(304account_id=account_id, stop_order_id=stop_order.stop_order_id305)306307def get_all_candles(308self,309*,310from_: datetime,311to: Optional[datetime] = None,312interval: CandleInterval = CandleInterval(0),313figi: str = "",314) -> Generator[HistoricCandle, None, None]:315to = to or now()316317for local_from_, local_to in get_intervals(interval, from_, to):318candles_response = self.market_data.get_candles(319figi=figi,320interval=interval,321from_=local_from_,322to=local_to,323)324yield from candles_response.candles325326327class InstrumentsService(_grpc_helpers.Service):328_stub_factory = instruments_pb2_grpc.InstrumentsServiceStub329330@handle_request_error("TradingSchedules")331def trading_schedules(332self,333*,334exchange: str = "",335from_: Optional[datetime] = None,336to: Optional[datetime] = None,337) -> TradingSchedulesResponse:338request = TradingSchedulesRequest()339request.exchange = exchange340if from_ is not None:341request.from_ = from_342if to is not None:343request.to = to344response, call = self.stub.TradingSchedules.with_call(345request=_grpc_helpers.dataclass_to_protobuff(346request, instruments_pb2.TradingSchedulesRequest()347),348metadata=self.metadata,349)350log_request(get_tracking_id_from_call(call), "TradingSchedules")351return _grpc_helpers.protobuf_to_dataclass(response, TradingSchedulesResponse)352353@handle_request_error("BondBy")354def bond_by(355self,356*,357id_type: InstrumentIdType = InstrumentIdType(0),358class_code: str = "",359id: str = "",360) -> BondResponse:361request = InstrumentRequest()362request.id_type = id_type363request.class_code = class_code364request.id = id365response, call = self.stub.BondBy.with_call(366request=_grpc_helpers.dataclass_to_protobuff(367request, instruments_pb2.InstrumentRequest()368),369metadata=self.metadata,370)371log_request(get_tracking_id_from_call(call), "BondBy")372return _grpc_helpers.protobuf_to_dataclass(response, BondResponse)373374@handle_request_error("Bonds")375def bonds(376self, *, instrument_status: InstrumentStatus = InstrumentStatus(0)377) -> BondsResponse:378request = InstrumentsRequest()379request.instrument_status = instrument_status380response, call = self.stub.Bonds.with_call(381request=_grpc_helpers.dataclass_to_protobuff(382request, instruments_pb2.InstrumentsRequest()383),384metadata=self.metadata,385)386log_request(get_tracking_id_from_call(call), "Bonds")387return _grpc_helpers.protobuf_to_dataclass(response, BondsResponse)388389@handle_request_error("CurrencyBy")390def currency_by(391self,392*,393id_type: InstrumentIdType = InstrumentIdType(0),394class_code: str = "",395id: str = "",396) -> CurrencyResponse:397request = InstrumentRequest()398request.id_type = id_type399request.class_code = class_code400request.id = id401response, call = self.stub.CurrencyBy.with_call(402request=_grpc_helpers.dataclass_to_protobuff(403request, instruments_pb2.InstrumentRequest()404),405metadata=self.metadata,406)407log_request(get_tracking_id_from_call(call), "CurrencyBy")408return _grpc_helpers.protobuf_to_dataclass(response, CurrencyResponse)409410@handle_request_error("Currencies")411def currencies(412self, *, instrument_status: InstrumentStatus = InstrumentStatus(0)413) -> CurrenciesResponse:414request = InstrumentsRequest()415request.instrument_status = instrument_status416response, call = self.stub.Currencies.with_call(417request=_grpc_helpers.dataclass_to_protobuff(418request, instruments_pb2.InstrumentsRequest()419),420metadata=self.metadata,421)422log_request(get_tracking_id_from_call(call), "Currencies")423return _grpc_helpers.protobuf_to_dataclass(response, CurrenciesResponse)424425@handle_request_error("EtfBy")426def etf_by(427self,428*,429id_type: InstrumentIdType = InstrumentIdType(0),430class_code: str = "",431id: str = "",432) -> EtfResponse:433request = InstrumentRequest()434request.id_type = id_type435request.class_code = class_code436request.id = id437response, call = self.stub.EtfBy.with_call(438request=_grpc_helpers.dataclass_to_protobuff(439request, instruments_pb2.InstrumentRequest()440),441metadata=self.metadata,442)443log_request(get_tracking_id_from_call(call), "EtfBy")444return _grpc_helpers.protobuf_to_dataclass(response, EtfResponse)445446@handle_request_error("Etfs")447def etfs(448self, *, instrument_status: InstrumentStatus = InstrumentStatus(0)449) -> EtfsResponse:450request = InstrumentsRequest()451request.instrument_status = instrument_status452response, call = self.stub.Etfs.with_call(453request=_grpc_helpers.dataclass_to_protobuff(454request, instruments_pb2.InstrumentsRequest()455),456metadata=self.metadata,457)458log_request(get_tracking_id_from_call(call), "Etfs")459return _grpc_helpers.protobuf_to_dataclass(response, EtfsResponse)460461@handle_request_error("FutureBy")462def future_by(463self,464*,465id_type: InstrumentIdType = InstrumentIdType(0),466class_code: str = "",467id: str = "",468) -> FutureResponse:469request = InstrumentRequest()470request.id_type = id_type471request.class_code = class_code472request.id = id473response, call = self.stub.FutureBy.with_call(474request=_grpc_helpers.dataclass_to_protobuff(475request, instruments_pb2.InstrumentRequest()476),477metadata=self.metadata,478)479log_request(get_tracking_id_from_call(call), "FutureBy")480return _grpc_helpers.protobuf_to_dataclass(response, FutureResponse)481482@handle_request_error("Futures")483def futures(484self, *, instrument_status: InstrumentStatus = InstrumentStatus(0)485) -> FuturesResponse:486request = InstrumentsRequest()487request.instrument_status = instrument_status488response, call = self.stub.Futures.with_call(489request=_grpc_helpers.dataclass_to_protobuff(490request, instruments_pb2.InstrumentsRequest()491),492metadata=self.metadata,493)494log_request(get_tracking_id_from_call(call), "Futures")495return _grpc_helpers.protobuf_to_dataclass(response, FuturesResponse)496497@handle_request_error("ShareBy")498def share_by(499self,500*,501id_type: InstrumentIdType = InstrumentIdType(0),502class_code: str = "",503id: str = "",504) -> ShareResponse:505request = InstrumentRequest()506request.id_type = id_type507request.class_code = class_code508request.id = id509response, call = self.stub.ShareBy.with_call(510request=_grpc_helpers.dataclass_to_protobuff(511request, instruments_pb2.InstrumentRequest()512),513metadata=self.metadata,514)515log_request(get_tracking_id_from_call(call), "ShareBy")516return _grpc_helpers.protobuf_to_dataclass(response, ShareResponse)517518@handle_request_error("Shares")519def shares(520self, *, instrument_status: InstrumentStatus = InstrumentStatus(0)521) -> SharesResponse:522request = InstrumentsRequest()523request.instrument_status = instrument_status524response, call = self.stub.Shares.with_call(525request=_grpc_helpers.dataclass_to_protobuff(526request, instruments_pb2.InstrumentsRequest()527),528metadata=self.metadata,529)530log_request(get_tracking_id_from_call(call), "Shares")531return _grpc_helpers.protobuf_to_dataclass(response, SharesResponse)532533@handle_request_error("GetAccruedInterests")534def get_accrued_interests(535self,536*,537figi: str = "",538from_: Optional[datetime] = None,539to: Optional[datetime] = None,540) -> GetAccruedInterestsResponse:541request = GetAccruedInterestsRequest()542request.figi = figi543if from_ is not None:544request.from_ = from_545if to is not None:546request.to = to547response, call = self.stub.GetAccruedInterests.with_call(548request=_grpc_helpers.dataclass_to_protobuff(549request, instruments_pb2.GetAccruedInterestsRequest()550),551metadata=self.metadata,552)553log_request(get_tracking_id_from_call(call), "GetAccruedInterests")554return _grpc_helpers.protobuf_to_dataclass(555response, GetAccruedInterestsResponse556)557558@handle_request_error("GetFuturesMargin")559def get_futures_margin(self, *, figi: str = "") -> GetFuturesMarginResponse:560request = GetFuturesMarginRequest()561request.figi = figi562response, call = self.stub.GetFuturesMargin.with_call(563request=_grpc_helpers.dataclass_to_protobuff(564request, instruments_pb2.GetFuturesMarginRequest()565),566metadata=self.metadata,567)568log_request(get_tracking_id_from_call(call), "GetFuturesMargin")569return _grpc_helpers.protobuf_to_dataclass(response, GetFuturesMarginResponse)570571@handle_request_error("GetInstrumentBy")572def get_instrument_by(573self,574*,575id_type: InstrumentIdType = InstrumentIdType(0),576class_code: str = "",577id: str = "",578) -> InstrumentResponse:579request = InstrumentRequest()580request.id_type = id_type581request.class_code = class_code582request.id = id583response, call = self.stub.GetInstrumentBy.with_call(584request=_grpc_helpers.dataclass_to_protobuff(585request, instruments_pb2.InstrumentRequest()586),587metadata=self.metadata,588)589log_request(get_tracking_id_from_call(call), "GetInstrumentBy")590return _grpc_helpers.protobuf_to_dataclass(response, InstrumentResponse)591592@handle_request_error("GetDividends")593def get_dividends(594self,595*,596figi: str = "",597from_: Optional[datetime] = None,598to: Optional[datetime] = None,599) -> GetDividendsResponse:600request = GetDividendsRequest()601request.figi = figi602if from_ is not None:603request.from_ = from_604if to is not None:605request.to = to606response, call = self.stub.GetDividends.with_call(607request=_grpc_helpers.dataclass_to_protobuff(608request, instruments_pb2.GetDividendsRequest()609),610metadata=self.metadata,611)612log_request(get_tracking_id_from_call(call), "GetDividends")613return _grpc_helpers.protobuf_to_dataclass(response, GetDividendsResponse)614615@handle_request_error("GetBondCoupons")616def get_bond_coupons(617self,618*,619figi: str = "",620from_: Optional[datetime] = None,621to: Optional[datetime] = None,622) -> GetBondCouponsResponse:623request = GetBondCouponsRequest()624request.figi = figi625if from_ is not None:626request.from_ = from_627if to is not None:628request.to = to629response, call = self.stub.GetBondCoupons.with_call(630request=_grpc_helpers.dataclass_to_protobuff(631request, instruments_pb2.GetBondCouponsRequest()632),633metadata=self.metadata,634)635log_request(get_tracking_id_from_call(call), "GetBondCoupons")636return _grpc_helpers.protobuf_to_dataclass(response, GetBondCouponsResponse)637638@handle_request_error("GetAssetBy")639def get_asset_by(640self,641*,642id: str = "",643) -> AssetResponse:644request = AssetRequest()645request.id = id646response, call = self.stub.GetAssetBy.with_call(647request=_grpc_helpers.dataclass_to_protobuff(648request, instruments_pb2.AssetRequest()649),650metadata=self.metadata,651)652log_request(get_tracking_id_from_call(call), "GetAssetBy")653return _grpc_helpers.protobuf_to_dataclass(response, AssetResponse)654655@handle_request_error("GetAssets")656def get_assets(657self,658) -> AssetsResponse:659request = AssetsRequest()660response, call = self.stub.GetAssets.with_call(661request=_grpc_helpers.dataclass_to_protobuff(662request, instruments_pb2.AssetsRequest()663),664metadata=self.metadata,665)666log_request(get_tracking_id_from_call(call), "GetAssets")667return _grpc_helpers.protobuf_to_dataclass(response, AssetsResponse)668669@handle_request_error("GetFavorites")670def get_favorites(671self,672) -> GetFavoritesResponse:673request = GetFavoritesRequest()674response, call = self.stub.GetFavorites.with_call(675request=_grpc_helpers.dataclass_to_protobuff(676request, instruments_pb2.GetFavoritesRequest()677),678metadata=self.metadata,679)680log_request(get_tracking_id_from_call(call), "GetFavorites")681return _grpc_helpers.protobuf_to_dataclass(response, GetFavoritesResponse)682683@handle_request_error("EditFavorites")684def edit_favorites(685self,686*,687instruments: Optional[List[EditFavoritesRequestInstrument]] = None,688action_type: Optional[EditFavoritesActionType] = None,689) -> EditFavoritesResponse:690request = EditFavoritesRequest()691if action_type is not None:692request.action_type = action_type693if instruments is not None:694request.instruments = instruments695response, call = self.stub.EditFavorites.with_call(696request=_grpc_helpers.dataclass_to_protobuff(697request, instruments_pb2.EditFavoritesRequest()698),699metadata=self.metadata,700)701log_request(get_tracking_id_from_call(call), "EditFavorites")702return _grpc_helpers.protobuf_to_dataclass(response, EditFavoritesResponse)703704705class MarketDataService(_grpc_helpers.Service):706_stub_factory = marketdata_pb2_grpc.MarketDataServiceStub707708@handle_request_error("GetCandles")709def get_candles(710self,711*,712figi: str = "",713from_: Optional[datetime] = None,714to: Optional[datetime] = None,715interval: CandleInterval = CandleInterval(0),716) -> GetCandlesResponse:717request = GetCandlesRequest()718request.figi = figi719if from_ is not None:720request.from_ = from_721if to is not None:722request.to = to723request.interval = interval724response, call = self.stub.GetCandles.with_call(725request=_grpc_helpers.dataclass_to_protobuff(726request, marketdata_pb2.GetCandlesRequest()727),728metadata=self.metadata,729)730log_request(get_tracking_id_from_call(call), "GetCandles")731return _grpc_helpers.protobuf_to_dataclass(response, GetCandlesResponse)732733@handle_request_error("GetLastPrices")734def get_last_prices(735self, *, figi: Optional[List[str]] = None736) -> GetLastPricesResponse:737figi = figi or []738739request = GetLastPricesRequest()740request.figi = figi741response, call = self.stub.GetLastPrices.with_call(742request=_grpc_helpers.dataclass_to_protobuff(743request, marketdata_pb2.GetLastPricesRequest()744),745metadata=self.metadata,746)747log_request(get_tracking_id_from_call(call), "GetLastPrices")748return _grpc_helpers.protobuf_to_dataclass(response, GetLastPricesResponse)749750@handle_request_error("GetOrderBook")751def get_order_book(self, *, figi: str = "", depth: int = 0) -> GetOrderBookResponse:752request = GetOrderBookRequest()753request.figi = figi754request.depth = depth755response, call = self.stub.GetOrderBook.with_call(756request=_grpc_helpers.dataclass_to_protobuff(757request, marketdata_pb2.GetOrderBookRequest()758),759metadata=self.metadata,760)761log_request(get_tracking_id_from_call(call), "GetOrderBook")762return _grpc_helpers.protobuf_to_dataclass(response, GetOrderBookResponse)763764@handle_request_error("GetTradingStatus")765def get_trading_status(self, *, figi: str = "") -> GetTradingStatusResponse:766request = GetTradingStatusRequest()767request.figi = figi768response, call = self.stub.GetTradingStatus.with_call(769request=_grpc_helpers.dataclass_to_protobuff(770request, marketdata_pb2.GetTradingStatusRequest()771),772metadata=self.metadata,773)774log_request(get_tracking_id_from_call(call), "GetTradingStatus")775return _grpc_helpers.protobuf_to_dataclass(response, GetTradingStatusResponse)776777@handle_request_error("GetLastTrades")778def get_last_trades(779self,780*,781figi: str = "",782from_: Optional[datetime] = None,783to: Optional[datetime] = None,784) -> GetLastTradesResponse:785request = GetLastTradesRequest()786request.figi = figi787if from_ is not None:788request.from_ = from_789if to is not None:790request.to = to791response, call = self.stub.GetLastTrades.with_call(792request=_grpc_helpers.dataclass_to_protobuff(793request, marketdata_pb2.GetLastTradesRequest()794),795metadata=self.metadata,796)797log_request(get_tracking_id_from_call(call), "GetLastTrades")798return _grpc_helpers.protobuf_to_dataclass(response, GetLastTradesResponse)799800801class MarketDataStreamService(_grpc_helpers.Service):802_stub_factory = marketdata_pb2_grpc.MarketDataStreamServiceStub803804@staticmethod805def _convert_market_data_stream_request(806request_iterator: Iterable[MarketDataRequest],807) -> Iterable[marketdata_pb2.MarketDataRequest]:808for request in request_iterator:809yield _grpc_helpers.dataclass_to_protobuff(810request, marketdata_pb2.MarketDataRequest()811)812813@handle_request_error_gen("MarketDataStream")814def market_data_stream(815self,816request_iterator: Iterable[MarketDataRequest],817) -> Iterable[MarketDataResponse]:818for response in self.stub.MarketDataStream(819request_iterator=self._convert_market_data_stream_request(request_iterator),820metadata=self.metadata,821):822yield _grpc_helpers.protobuf_to_dataclass(response, MarketDataResponse)823824825class OperationsService(_grpc_helpers.Service):826_stub_factory = operations_pb2_grpc.OperationsServiceStub827828@handle_request_error("GetOperations")829def get_operations(830self,831*,832account_id: str = "",833from_: Optional[datetime] = None,834to: Optional[datetime] = None,835state: OperationState = OperationState(0),836figi: str = "",837) -> OperationsResponse:838request = OperationsRequest()839request.account_id = account_id840if from_ is not None:841request.from_ = from_842if to is not None:843request.to = to844request.state = state845request.figi = figi846response, call = self.stub.GetOperations.with_call(847request=_grpc_helpers.dataclass_to_protobuff(848request, operations_pb2.OperationsRequest()849),850metadata=self.metadata,851)852log_request(get_tracking_id_from_call(call), "GetOperations")853return _grpc_helpers.protobuf_to_dataclass(response, OperationsResponse)854855@handle_request_error("GetPortfolio")856def get_portfolio(self, *, account_id: str = "") -> PortfolioResponse:857request = PortfolioRequest()858request.account_id = account_id859response, call = self.stub.GetPortfolio.with_call(860request=_grpc_helpers.dataclass_to_protobuff(861request, operations_pb2.PortfolioRequest()862),863metadata=self.metadata,864)865log_request(get_tracking_id_from_call(call), "GetPortfolio")866return _grpc_helpers.protobuf_to_dataclass(response, PortfolioResponse)867868@handle_request_error("GetPositions")869def get_positions(self, *, account_id: str = "") -> PositionsResponse:870request = PositionsRequest()871request.account_id = account_id872response, call = self.stub.GetPositions.with_call(873request=_grpc_helpers.dataclass_to_protobuff(874request, operations_pb2.PositionsRequest()875),876metadata=self.metadata,877)878log_request(get_tracking_id_from_call(call), "GetPositions")879return _grpc_helpers.protobuf_to_dataclass(response, PositionsResponse)880881@handle_request_error("GetWithdrawLimits")882def get_withdraw_limits(self, *, account_id: str = "") -> WithdrawLimitsResponse:883request = WithdrawLimitsRequest()884request.account_id = account_id885response, call = self.stub.GetWithdrawLimits.with_call(886request=_grpc_helpers.dataclass_to_protobuff(887request, operations_pb2.WithdrawLimitsRequest()888),889metadata=self.metadata,890)891log_request(get_tracking_id_from_call(call), "GetWithdrawLimits")892return _grpc_helpers.protobuf_to_dataclass(response, WithdrawLimitsResponse)893894@handle_request_error("GetBrokerReport")895def get_broker_report(896self,897*,898generate_broker_report_request: Optional[GenerateBrokerReportRequest] = None,899get_broker_report_request: Optional[GetBrokerReportRequest] = None,900) -> BrokerReportResponse:901request = BrokerReportRequest()902if generate_broker_report_request:903request.generate_broker_report_request = generate_broker_report_request904if get_broker_report_request:905request.get_broker_report_request = get_broker_report_request906response, call = self.stub.GetBrokerReport.with_call(907request=_grpc_helpers.dataclass_to_protobuff(908request, operations_pb2.BrokerReportRequest()909),910metadata=self.metadata,911)912log_request(get_tracking_id_from_call(call), "GetBrokerReport")913return _grpc_helpers.protobuf_to_dataclass(response, BrokerReportResponse)914915@handle_request_error("GetDividendsForeignIssuer")916def get_dividends_foreign_issuer(917self,918*,919generate_div_foreign_issuer_report: Optional[920GenerateDividendsForeignIssuerReportRequest921] = None,922get_div_foreign_issuer_report: Optional[923GetDividendsForeignIssuerReportRequest924] = None,925) -> GetDividendsForeignIssuerResponse:926request = GetDividendsForeignIssuerRequest()927if generate_div_foreign_issuer_report is not None:928request.generate_div_foreign_issuer_report = (929generate_div_foreign_issuer_report930)931if get_div_foreign_issuer_report is not None:932request.get_div_foreign_issuer_report = get_div_foreign_issuer_report933response, call = self.stub.GetDividendsForeignIssuer.with_call(934request=_grpc_helpers.dataclass_to_protobuff(935request, operations_pb2.GetDividendsForeignIssuerRequest()936),937metadata=self.metadata,938)939log_request(get_tracking_id_from_call(call), "GetDividendsForeignIssuer")940return _grpc_helpers.protobuf_to_dataclass(941response, GetDividendsForeignIssuerResponse942)943944945class OrdersStreamService(_grpc_helpers.Service):946_stub_factory = orders_pb2_grpc.OrdersStreamServiceStub947948@handle_request_error_gen("TradesStream")949def trades_stream(self, accounts: List[str]) -> Iterable[TradesStreamResponse]:950request = TradesStreamRequest(accounts=accounts)951for response in self.stub.TradesStream(952request=_grpc_helpers.dataclass_to_protobuff(953request, orders_pb2.TradesStreamRequest()954),955metadata=self.metadata,956):957yield _grpc_helpers.protobuf_to_dataclass(response, TradesStreamResponse)958959960class OrdersService(_grpc_helpers.Service):961_stub_factory = orders_pb2_grpc.OrdersServiceStub962963@handle_request_error("PostOrder")964def post_order(965self,966*,967figi: str = "",968quantity: int = 0,969price: Optional[Quotation] = None,970direction: OrderDirection = OrderDirection(0),971account_id: str = "",972order_type: OrderType = OrderType(0),973order_id: str = "",974) -> PostOrderResponse:975request = PostOrderRequest()976request.figi = figi977request.quantity = quantity978if price is not None:979request.price = price980request.direction = direction981request.account_id = account_id982request.order_type = order_type983request.order_id = order_id984response, call = self.stub.PostOrder.with_call(985request=_grpc_helpers.dataclass_to_protobuff(986request, orders_pb2.PostOrderRequest()987),988metadata=self.metadata,989)990log_request(get_tracking_id_from_call(call), "PostOrder")991return _grpc_helpers.protobuf_to_dataclass(response, PostOrderResponse)992993@handle_request_error("CancelOrder")994def cancel_order(995self, *, account_id: str = "", order_id: str = ""996) -> CancelOrderResponse:997request = CancelOrderRequest()998request.account_id = account_id999request.order_id = order_id1000response, call = self.stub.CancelOrder.with_call(1001request=_grpc_helpers.dataclass_to_protobuff(1002request, orders_pb2.CancelOrderRequest()1003),1004metadata=self.metadata,1005)1006log_request(get_tracking_id_from_call(call), "CancelOrder")1007return _grpc_helpers.protobuf_to_dataclass(response, CancelOrderResponse)10081009@handle_request_error("GetOrderState")1010def get_order_state(1011self, *, account_id: str = "", order_id: str = ""1012) -> OrderState:1013request = GetOrderStateRequest()1014request.account_id = account_id1015request.order_id = order_id1016response, call = self.stub.GetOrderState.with_call(1017request=_grpc_helpers.dataclass_to_protobuff(1018request, orders_pb2.GetOrderStateRequest()1019),1020metadata=self.metadata,1021)1022log_request(get_tracking_id_from_call(call), "GetOrderState")1023return _grpc_helpers.protobuf_to_dataclass(response, OrderState)10241025@handle_request_error("GetOrders")1026def get_orders(self, *, account_id: str = "") -> GetOrdersResponse:1027request = GetOrdersRequest()1028request.account_id = account_id1029response, call = self.stub.GetOrders.with_call(1030request=_grpc_helpers.dataclass_to_protobuff(1031request, orders_pb2.GetOrdersRequest()1032),1033metadata=self.metadata,1034)1035log_request(get_tracking_id_from_call(call), "GetOrders")1036return _grpc_helpers.protobuf_to_dataclass(response, GetOrdersResponse)103710381039class UsersService(_grpc_helpers.Service):1040_stub_factory = users_pb2_grpc.UsersServiceStub10411042@handle_request_error("GetAccounts")1043def get_accounts(self) -> GetAccountsResponse:1044request = GetAccountsRequest()1045response, call = self.stub.GetAccounts.with_call(1046request=_grpc_helpers.dataclass_to_protobuff(1047request, users_pb2.GetAccountsRequest()1048),1049metadata=self.metadata,1050)1051log_request(get_tracking_id_from_call(call), "GetAccounts")1052return _grpc_helpers.protobuf_to_dataclass(response, GetAccountsResponse)10531054@handle_request_error("GetMarginAttributes")1055def get_margin_attributes(1056self, *, account_id: str = ""1057) -> GetMarginAttributesResponse:1058request = GetMarginAttributesRequest()1059request.account_id = account_id1060response, call = self.stub.GetMarginAttributes.with_call(1061request=_grpc_helpers.dataclass_to_protobuff(1062request, users_pb2.GetMarginAttributesRequest()1063),1064metadata=self.metadata,1065)1066log_request(get_tracking_id_from_call(call), "GetMarginAttributes")1067return _grpc_helpers.protobuf_to_dataclass(1068response, GetMarginAttributesResponse1069)10701071@handle_request_error("GetUserTariff")1072def get_user_tariff(self) -> GetUserTariffResponse:1073request = GetUserTariffRequest()1074response, call = self.stub.GetUserTariff.with_call(1075request=_grpc_helpers.dataclass_to_protobuff(1076request, users_pb2.GetUserTariffRequest()1077),1078metadata=self.metadata,1079)1080log_request(get_tracking_id_from_call(call), "GetUserTariff")1081return _grpc_helpers.protobuf_to_dataclass(response, GetUserTariffResponse)10821083@handle_request_error("GetInfo")1084def get_info(self) -> GetInfoResponse:1085request = GetInfoRequest()1086response, call = self.stub.GetInfo.with_call(1087request=_grpc_helpers.dataclass_to_protobuff(1088request, users_pb2.GetInfoRequest()1089),1090metadata=self.metadata,1091)1092log_request(get_tracking_id_from_call(call), "GetInfo")1093return _grpc_helpers.protobuf_to_dataclass(response, GetInfoResponse)109410951096class SandboxService(_grpc_helpers.Service):1097_stub_factory = sandbox_pb2_grpc.SandboxServiceStub10981099@handle_request_error("OpenSandboxAccount")1100def open_sandbox_account(self) -> OpenSandboxAccountResponse:1101request = OpenSandboxAccountRequest()1102response, call = self.stub.OpenSandboxAccount.with_call(1103request=_grpc_helpers.dataclass_to_protobuff(1104request, sandbox_pb2.OpenSandboxAccountRequest()1105),1106metadata=self.metadata,1107)1108log_request(get_tracking_id_from_call(call), "OpenSandboxAccount")1109return _grpc_helpers.protobuf_to_dataclass(response, OpenSandboxAccountResponse)11101111@handle_request_error("GetSandboxAccounts")1112def get_sandbox_accounts(self) -> GetAccountsResponse:1113request = GetAccountsRequest()1114response, call = self.stub.GetSandboxAccounts.with_call(1115request=_grpc_helpers.dataclass_to_protobuff(1116request, users_pb2.GetAccountsRequest()1117),1118metadata=self.metadata,1119)1120log_request(get_tracking_id_from_call(call), "GetSandboxAccounts")1121return _grpc_helpers.protobuf_to_dataclass(response, GetAccountsResponse)11221123@handle_request_error("CloseSandboxAccount")1124def close_sandbox_account(1125self, *, account_id: str = ""1126) -> CloseSandboxAccountResponse:1127request = CloseSandboxAccountRequest()1128request.account_id = account_id1129response, call = self.stub.CloseSandboxAccount.with_call(1130request=_grpc_helpers.dataclass_to_protobuff(1131request, sandbox_pb2.CloseSandboxAccountRequest()1132),1133metadata=self.metadata,1134)1135log_request(get_tracking_id_from_call(call), "CloseSandboxAccount")1136return _grpc_helpers.protobuf_to_dataclass(1137response, CloseSandboxAccountResponse1138)11391140@handle_request_error("PostSandboxOrder")1141def post_sandbox_order(1142self,1143*,1144figi: str = "",1145quantity: int = 0,1146price: Optional[Quotation] = None,1147direction: OrderDirection = OrderDirection(0),1148account_id: str = "",1149order_type: OrderType = OrderType(0),1150order_id: str = "",1151) -> PostOrderResponse:1152request = PostOrderRequest()1153request.figi = figi1154request.quantity = quantity1155if price is not None:1156request.price = price1157request.direction = direction1158request.account_id = account_id1159request.order_type = order_type1160request.order_id = order_id1161response, call = self.stub.PostSandboxOrder.with_call(1162request=_grpc_helpers.dataclass_to_protobuff(1163request, orders_pb2.PostOrderRequest()1164),1165metadata=self.metadata,1166)1167log_request(get_tracking_id_from_call(call), "PostSandboxOrder")1168return _grpc_helpers.protobuf_to_dataclass(response, PostOrderResponse)11691170@handle_request_error("GetSandboxOrders")1171def get_sandbox_orders(self, *, account_id: str = "") -> GetOrdersResponse:1172request = GetOrdersRequest()1173request.account_id = account_id1174response, call = self.stub.GetSandboxOrders.with_call(1175request=_grpc_helpers.dataclass_to_protobuff(1176request, orders_pb2.GetOrdersRequest()1177),1178metadata=self.metadata,1179)1180log_request(get_tracking_id_from_call(call), "GetSandboxOrders")1181return _grpc_helpers.protobuf_to_dataclass(response, GetOrdersResponse)11821183@handle_request_error("CancelSandboxOrder")1184def cancel_sandbox_order(1185self, *, account_id: str = "", order_id: str = ""1186) -> CancelOrderResponse:1187request = CancelOrderRequest()1188request.account_id = account_id1189request.order_id = order_id1190response, call = self.stub.CancelSandboxOrder.with_call(1191request=_grpc_helpers.dataclass_to_protobuff(1192request, orders_pb2.CancelOrderRequest()1193),1194metadata=self.metadata,1195)1196log_request(get_tracking_id_from_call(call), "CancelSandboxOrder")1197return _grpc_helpers.protobuf_to_dataclass(response, CancelOrderResponse)11981199@handle_request_error("GetSandboxOrderState")1200def get_sandbox_order_state(1201self, *, account_id: str = "", order_id: str = ""1202) -> OrderState:1203request = GetOrderStateRequest()1204request.account_id = account_id1205request.order_id = order_id1206response, call = self.stub.GetSandboxOrderState.with_call(1207request=_grpc_helpers.dataclass_to_protobuff(1208request, orders_pb2.GetOrderStateRequest()1209),1210metadata=self.metadata,1211)1212log_request(get_tracking_id_from_call(call), "GetSandboxOrderState")1213return _grpc_helpers.protobuf_to_dataclass(response, OrderState)12141215@handle_request_error("GetSandboxPositions")1216def get_sandbox_positions(self, *, account_id: str = "") -> PositionsResponse:1217request = PositionsRequest()1218request.account_id = account_id1219response, call = self.stub.GetSandboxPositions.with_call(1220request=_grpc_helpers.dataclass_to_protobuff(1221request, operations_pb2.PositionsRequest()1222),1223metadata=self.metadata,1224)1225log_request(get_tracking_id_from_call(call), "GetSandboxPositions")1226return _grpc_helpers.protobuf_to_dataclass(response, PositionsResponse)12271228@handle_request_error("GetSandboxOperations")1229def get_sandbox_operations(1230self,1231*,1232account_id: str = "",1233from_: Optional[datetime] = None,1234to: Optional[datetime] = None,1235state: OperationState = OperationState(0),1236figi: str = "",1237) -> OperationsResponse:1238request = OperationsRequest()1239request.account_id = account_id1240if from_ is not None:1241request.from_ = from_1242if to is not None:1243request.to = to1244request.state = state1245request.figi = figi1246response, call = self.stub.GetSandboxOperations.with_call(1247request=_grpc_helpers.dataclass_to_protobuff(1248request, operations_pb2.OperationsRequest()1249),1250metadata=self.metadata,1251)1252log_request(get_tracking_id_from_call(call), "GetSandboxOperations")1253return _grpc_helpers.protobuf_to_dataclass(response, OperationsResponse)12541255@handle_request_error("GetSandboxPortfolio")1256def get_sandbox_portfolio(self, *, account_id: str = "") -> PortfolioResponse:1257request = PortfolioRequest()1258request.account_id = account_id1259response, call = self.stub.GetSandboxPortfolio.with_call(1260request=_grpc_helpers.dataclass_to_protobuff(1261request, operations_pb2.PortfolioRequest()1262),1263metadata=self.metadata,1264)1265log_request(get_tracking_id_from_call(call), "GetSandboxPortfolio")1266return _grpc_helpers.protobuf_to_dataclass(response, PortfolioResponse)12671268@handle_request_error("SandboxPayIn")1269def sandbox_pay_in(1270self, *, account_id: str = "", amount: Optional[MoneyValue] = None1271) -> SandboxPayInResponse:1272request = SandboxPayInRequest()1273request.account_id = account_id1274if amount is not None:1275request.amount = amount1276response, call = self.stub.SandboxPayIn.with_call(1277request=_grpc_helpers.dataclass_to_protobuff(1278request, sandbox_pb2.SandboxPayInRequest()1279),1280metadata=self.metadata,1281)1282log_request(get_tracking_id_from_call(call), "SandboxPayIn")1283return _grpc_helpers.protobuf_to_dataclass(response, SandboxPayInResponse)128412851286class StopOrdersService(_grpc_helpers.Service):1287_stub_factory = stoporders_pb2_grpc.StopOrdersServiceStub12881289@handle_request_error("PostStopOrder")1290def post_stop_order(1291self,1292*,1293figi: str = "",1294quantity: int = 0,1295price: Optional[Quotation] = None,1296stop_price: Optional[Quotation] = None,1297direction: StopOrderDirection = StopOrderDirection(0),1298account_id: str = "",1299expiration_type: StopOrderExpirationType = StopOrderExpirationType(0),1300stop_order_type: StopOrderType = StopOrderType(0),1301expire_date: Optional[datetime] = None,1302) -> PostStopOrderResponse:1303request = PostStopOrderRequest()1304request.figi = figi1305request.quantity = quantity1306if price is not None:1307request.price = price1308if stop_price is not None:1309request.stop_price = stop_price1310request.direction = direction1311request.account_id = account_id1312request.expiration_type = expiration_type1313request.stop_order_type = stop_order_type1314if expire_date is not None:1315request.expire_date = expire_date1316response, call = self.stub.PostStopOrder.with_call(1317request=_grpc_helpers.dataclass_to_protobuff(1318request, stoporders_pb2.PostStopOrderRequest()1319),1320metadata=self.metadata,1321)1322log_request(get_tracking_id_from_call(call), "PostStopOrder")1323return _grpc_helpers.protobuf_to_dataclass(response, PostStopOrderResponse)13241325@handle_request_error("GetStopOrders")1326def get_stop_orders(self, *, account_id: str = "") -> GetStopOrdersResponse:1327request = GetStopOrdersRequest()1328request.account_id = account_id1329response, call = self.stub.GetStopOrders.with_call(1330request=_grpc_helpers.dataclass_to_protobuff(1331request, stoporders_pb2.GetStopOrdersRequest()1332),1333metadata=self.metadata,1334)1335log_request(get_tracking_id_from_call(call), "GetStopOrders")1336return _grpc_helpers.protobuf_to_dataclass(response, GetStopOrdersResponse)13371338@handle_request_error("CancelStopOrder")1339def cancel_stop_order(1340self, *, account_id: str = "", stop_order_id: str = ""1341) -> CancelStopOrderResponse:1342request = CancelStopOrderRequest()1343request.account_id = account_id1344request.stop_order_id = stop_order_id1345response, call = self.stub.CancelStopOrder.with_call(1346request=_grpc_helpers.dataclass_to_protobuff(1347request, stoporders_pb2.CancelStopOrderRequest()1348),1349metadata=self.metadata,1350)1351log_request(get_tracking_id_from_call(call), "CancelStopOrder")1352return _grpc_helpers.protobuf_to_dataclass(response, CancelStopOrderResponse)135313541355