Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_invest-bot-main/invest_api/services/operations_service.py
7824 views
1
import datetime
2
import logging
3
from decimal import Decimal
4
from typing import Optional
5
6
from tinkoff.invest import Client, PositionsResponse, PositionsSecurities, OperationState, Operation, PortfolioResponse
7
8
from invest_api.invest_error_decorators import invest_error_logging, invest_api_retry
9
from invest_api.utils import moneyvalue_to_decimal, rub_currency_name
10
11
__all__ = ("OperationService")
12
13
logger = logging.getLogger(__name__)
14
15
16
class OperationService:
17
"""
18
The class encapsulate tinkoff operations service api
19
"""
20
def __init__(self, token: str, app_name: str) -> None:
21
self.__token = token
22
self.__app_name = app_name
23
24
def available_rub_on_account(self, account_id: str) -> Optional[Decimal]:
25
"""
26
Return available amount of rub on account
27
"""
28
position = self.__get_positions(account_id)
29
30
if position:
31
for money in position.money:
32
if money.currency == rub_currency_name():
33
logger.debug(f"Amount of RUB on account: {money}")
34
return moneyvalue_to_decimal(money)
35
36
return None
37
38
def positions_securities(self, account_id: str) -> list[PositionsSecurities]:
39
"""
40
:return: All open positions for account
41
"""
42
positions = self.__get_positions(account_id)
43
44
return positions.securities if positions else None
45
46
@invest_api_retry()
47
@invest_error_logging
48
def __get_positions(self, account_id: str) -> PositionsResponse:
49
with Client(self.__token, app_name=self.__app_name) as client:
50
logger.debug(f"Get Positions for: {account_id}:")
51
52
positions = client.operations.get_positions(account_id=account_id)
53
54
logger.debug(f"{positions}")
55
56
return positions
57
58
@invest_api_retry()
59
@invest_error_logging
60
def __get_operations(
61
self,
62
account_id: str,
63
from_: datetime,
64
to_: datetime,
65
state: OperationState,
66
figi: str = ""
67
) -> list[Operation]:
68
with Client(self.__token, app_name=self.__app_name) as client:
69
logger.debug(f"Get operations for: {account_id}, from: {from_}, to: {to_}, state: {state}, figi: {figi}")
70
71
operations = client.operations.get_operations(
72
account_id=account_id,
73
from_=from_,
74
to=to_,
75
state=state,
76
figi=figi
77
).operations
78
79
logger.debug(f"{operations}")
80
81
return operations
82
83
@invest_api_retry()
84
@invest_error_logging
85
def __get_portfolio(self, account_id: str) -> PortfolioResponse:
86
with Client(self.__token, app_name=self.__app_name) as client:
87
logger.debug(f"Get portfolio for: {account_id}")
88
89
portfolio = client.operations.get_portfolio(account_id=account_id)
90
91
logger.debug(f"{portfolio}")
92
93
return portfolio
94
95