Path: blob/master/ invest-robot-contest_invest-bot-main/invest_api/services/instruments_service.py
7826 views
import datetime1import logging23from tinkoff.invest import Client, TradingSchedule, InstrumentIdType, InstrumentStatus45from configuration.settings import ShareSettings6from invest_api.invest_error_decorators import invest_error_logging, invest_api_retry7from invest_api.utils import moex_exchange_name89__all__ = ("InstrumentService")1011logger = logging.getLogger(__name__)121314class InstrumentService:15"""16The class encapsulate tinkoff instruments api17"""18def __init__(self, token: str, app_name: str) -> None:19self.__token = token20self.__app_name = app_name2122def moex_today_trading_schedule(self) -> (bool, datetime, datetime):23"""24:return: Information about trading day status, datetime trading day start, datetime trading day end25(both on today)26"""27for schedule in self.__trading_schedules(28exchange=moex_exchange_name(),29_from=datetime.datetime.utcnow(),30_to=datetime.datetime.utcnow() + datetime.timedelta(days=1)31):32for day in schedule.days:33if day.date.date() == datetime.date.today():34logger.info(f"MOEX today schedule: {day}")35return day.is_trading_day, day.start_time, day.end_time3637return False, datetime.datetime.utcnow(), datetime.datetime.utcnow()3839@invest_api_retry()40@invest_error_logging41def __trading_schedules(42self,43exchange: str,44_from: datetime,45_to: datetime46) -> list[TradingSchedule]:47result = []4849with Client(self.__token, app_name=self.__app_name) as client:50logger.debug(f"Trading Schedules for exchange: {exchange}, from: {_from}, to: {_to}")5152for schedule in client.instruments.trading_schedules(53exchange=exchange,54from_=_from,55to=_to56).exchanges:57logger.debug(f"{schedule}")58result.append(schedule)5960return result6162@invest_api_retry()63@invest_error_logging64def share_by_figi(self, figi: str) -> ShareSettings:65"""66:return: Information about share settings by it figi67"""68with Client(self.__token, app_name=self.__app_name) as client:69logger.debug(f"ShareBy figi: {figi}:")7071share = client.instruments.share_by(72id_type=InstrumentIdType.INSTRUMENT_ID_TYPE_FIGI,73id=figi74).instrument75logger.debug(f"{share}")7677return ShareSettings(78ticker=share.ticker,79lot=share.lot,80short_enabled_flag=share.short_enabled_flag,81otc_flag=share.otc_flag,82buy_available_flag=share.buy_available_flag,83sell_available_flag=share.sell_available_flag,84api_trade_available_flag=share.api_trade_available_flag85)8687@invest_api_retry()88@invest_error_logging89def __currencies(self) -> None:90with Client(self.__token, app_name=self.__app_name) as client:91for cur in client.instruments.currencies(92instrument_status=InstrumentStatus.INSTRUMENT_STATUS_BASE93).instruments:94logger.debug(f"{cur}")9596@invest_api_retry()97@invest_error_logging98def __instrument_by_figi(self, figi: str) -> None:99with Client(self.__token, app_name=self.__app_name) as client:100logger.debug(f"InstrumentBy figi: {figi}:")101102instrument = client.instruments.get_instrument_by(id_type=InstrumentIdType.INSTRUMENT_ID_TYPE_FIGI,103id=figi).instrument104105logger.debug(f"{instrument}")106107108