Path: blob/master/ invest-robot-contest_invest-bot-main/invest_api/services/operations_service.py
7824 views
import datetime1import logging2from decimal import Decimal3from typing import Optional45from tinkoff.invest import Client, PositionsResponse, PositionsSecurities, OperationState, Operation, PortfolioResponse67from invest_api.invest_error_decorators import invest_error_logging, invest_api_retry8from invest_api.utils import moneyvalue_to_decimal, rub_currency_name910__all__ = ("OperationService")1112logger = logging.getLogger(__name__)131415class OperationService:16"""17The class encapsulate tinkoff operations service api18"""19def __init__(self, token: str, app_name: str) -> None:20self.__token = token21self.__app_name = app_name2223def available_rub_on_account(self, account_id: str) -> Optional[Decimal]:24"""25Return available amount of rub on account26"""27position = self.__get_positions(account_id)2829if position:30for money in position.money:31if money.currency == rub_currency_name():32logger.debug(f"Amount of RUB on account: {money}")33return moneyvalue_to_decimal(money)3435return None3637def positions_securities(self, account_id: str) -> list[PositionsSecurities]:38"""39:return: All open positions for account40"""41positions = self.__get_positions(account_id)4243return positions.securities if positions else None4445@invest_api_retry()46@invest_error_logging47def __get_positions(self, account_id: str) -> PositionsResponse:48with Client(self.__token, app_name=self.__app_name) as client:49logger.debug(f"Get Positions for: {account_id}:")5051positions = client.operations.get_positions(account_id=account_id)5253logger.debug(f"{positions}")5455return positions5657@invest_api_retry()58@invest_error_logging59def __get_operations(60self,61account_id: str,62from_: datetime,63to_: datetime,64state: OperationState,65figi: str = ""66) -> list[Operation]:67with Client(self.__token, app_name=self.__app_name) as client:68logger.debug(f"Get operations for: {account_id}, from: {from_}, to: {to_}, state: {state}, figi: {figi}")6970operations = client.operations.get_operations(71account_id=account_id,72from_=from_,73to=to_,74state=state,75figi=figi76).operations7778logger.debug(f"{operations}")7980return operations8182@invest_api_retry()83@invest_error_logging84def __get_portfolio(self, account_id: str) -> PortfolioResponse:85with Client(self.__token, app_name=self.__app_name) as client:86logger.debug(f"Get portfolio for: {account_id}")8788portfolio = client.operations.get_portfolio(account_id=account_id)8990logger.debug(f"{portfolio}")9192return portfolio939495