Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_tinkoff_invest_robot-main/src/algotrading/get_account.py
7815 views
1
from tinkoff.invest import GetMarginAttributesResponse
2
from tinkoff.invest import RequestError
3
4
from loguru import logger
5
6
from . import glossary, utils
7
8
9
def print_accounts(accounts):
10
print(f"У вас счетов: {len(accounts)} ")
11
accounts_id = []
12
for account in accounts:
13
accounts_id.append(account.id)
14
print(account.id, " ".join(account.type._name_.split('_')[2:]), account.name,
15
" ".join(account.status._name_.split('_')[2:]),
16
account.opened_date.strftime("%Y-%m-%d")
17
)
18
19
return accounts_id
20
21
22
def get_users_info(client):
23
user_info = client.users.get_info()
24
users = {}
25
users.update(user_info.__dict__)
26
27
users['qualified_for_work_with'] = [glossary.qualified_for_work_with[qualified] for qualified in
28
user_info.qualified_for_work_with]
29
30
return users
31
32
33
def get_margin_attributes(client, account_id: int) -> GetMarginAttributesResponse:
34
try:
35
margin_attributes = client.users.get_margin_attributes(account_id=account_id)
36
37
except RequestError as err:
38
logger.debug(f"для счета {account_id}, {err.metadata.message}")
39
return None
40
41
return margin_attributes
42
43
44
def get_user_accounts(client):
45
accounts = {}
46
47
for account in client.users.get_accounts().accounts:
48
accounts[account.id] = {}
49
accounts[account.id]["account"] = {}
50
accounts[account.id]["account"]['name'] = account.name
51
accounts[account.id]["account"]['id'] = account.id
52
accounts[account.id]["account"]['status'] = " ".join(account.status._name_.split('_')[2:])
53
accounts[account.id]["account"]['opened_date'] = account.opened_date.strftime("%Y-%m-%d")
54
accounts[account.id]["account"]['token_access_level'] = " ".join(account.access_level._name_.split('_')[3:])
55
56
margin_attr = get_margin_attributes(client, account.id)
57
accounts[account.id]["margin_attributes"] = {}
58
if margin_attr:
59
liquid_portfolio = f"{margin_attr.liquid_portfolio.units} {margin_attr.liquid_portfolio.currency}"
60
starting_margin = f"{margin_attr.starting_margin.units} {margin_attr.starting_margin.currency}"
61
minimal_margin = f"{margin_attr.minimal_margin.units} {margin_attr.minimal_margin.currency}"
62
amount_of_missing_funds = f"{margin_attr.amount_of_missing_funds.units} {margin_attr.amount_of_missing_funds.currency}"
63
64
accounts[account.id]["margin_attributes"]['liquid_portfolio'] = liquid_portfolio
65
accounts[account.id]["margin_attributes"]['starting_margin'] = starting_margin
66
accounts[account.id]["margin_attributes"]['minimal_margin'] = minimal_margin
67
accounts[account.id]["margin_attributes"]['amount_of_missing_funds'] = amount_of_missing_funds
68
69
else:
70
accounts[account.id]["margin_attributes"]["status"] = "margin status is disabled"
71
72
return accounts
73
74
75
def get_account(client):
76
user_info = get_users_info(client)
77
78
return user_info
79
80
81
def main():
82
api_client = utils.api_client_configure()
83
with api_client as client:
84
user_info = get_account(client)
85
user_info['accounts'] = get_user_accounts(client)
86
87
return user_info
88
89
90
def test_connect():
91
api_client = utils.api_client_configure()
92
try:
93
with api_client as client:
94
get_account(client)
95
96
except RequestError as err:
97
logger.critical(err.metadata.message)
98
raise err
99
100
101
if __name__ == "__main__":
102
main()
103
104