Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_trading_bot-master/trading/trade_help.py
5932 views
1
from config.personal_data import get_token, get_account, get_account_type
2
import math
3
from tinkoff.invest import Client, Quotation, CandleInterval
4
from datetime import datetime, timedelta
5
from pycbrf.toolbox import ExchangeRates
6
7
"""
8
9
Тут представлены все небольшие вспомогательные функции
10
11
"""
12
13
'''
14
Функция для расчёта полной стоимости актива / общего количества средств
15
Тинькофф возвращает стоимость в units и nano
16
units - целая часть
17
nano - дробная (9 знаков после запятой)
18
'''
19
20
21
def quotation_to_float(quotation: Quotation):
22
sum = quotation.units + (quotation.nano * 1e-9)
23
return sum
24
25
26
'''
27
Функция для перевода дробного числа в Quotation
28
Тинькофф получает стоимость в units и nano
29
units - целая часть
30
nano - дробная (9 знаков после запятой)
31
'''
32
33
34
def to_quotation(price):
35
quotation = Quotation()
36
quotation.units = int(math.modf(price)[1])
37
quotation.nano = int(round(math.modf(price)[0] * 1e9))
38
return quotation
39
40
41
'''
42
Позволяет узнать количество бумаг в одном лоте по FIGI
43
'''
44
45
46
def in_lot_figi(figi, user_id):
47
with Client(get_token(user_id)) as client:
48
in_lot = client.instruments.get_instrument_by(id_type=1, id=figi).instrument.lot
49
50
return int(in_lot)
51
52
53
'''
54
Позволяет узнать, есть ли такой инструмент в портфеле
55
Сравнение идёт по FIGI
56
'''
57
58
59
def is_in_portfolio(figi, user_id, account_id="", account_type=""):
60
with Client(get_token(user_id)) as client:
61
62
if account_id == "":
63
account_id = get_account(user_id=user_id)
64
65
if account_type == "":
66
account_type = get_account_type(user_id=user_id)
67
68
if account_type == "sandbox":
69
portfolio = client.sandbox.get_sandbox_portfolio(account_id=account_id)
70
else:
71
portfolio = client.operations.get_portfolio(account_id=account_id)
72
for i in portfolio.positions:
73
if i.figi == figi:
74
return True
75
76
return False
77
78
79
'''
80
Функция для получения средней цены акции по свече
81
82
В API Tinkoff нет функции, которая позволит узнать стоимость бумаги по FIGI
83
По этой причине было решено получить свечки за неделю и взять последнюю доступную.
84
Такое решение связано с тем, что торги не проходят в выходные дни, поэтому наилучшим решением будет выбрать
85
большой интервал времени для избежания ошибок.
86
'''
87
88
89
def get_price_figi(figi, user_id):
90
with Client(get_token(user_id)) as client:
91
try:
92
candle = client.market_data.get_candles(
93
figi=figi,
94
from_=datetime.utcnow() - timedelta(days=7),
95
to=datetime.utcnow(),
96
interval=CandleInterval.CANDLE_INTERVAL_HOUR)
97
# Выбираем последнюю доступную свечку
98
# Получаем среднюю стоимость бумаги путём складывания самой высокой и самой низкой цен
99
average_price = ((quotation_to_float(candle.candles[-1].high) + quotation_to_float(candle.candles[-1].low)) / 2)
100
return average_price
101
except:
102
return 0.0
103
104
105
'''
106
Функция для получения знака валюты
107
'''
108
109
110
def get_currency_sing(currency):
111
if currency == "try":
112
sign = "₺"
113
elif currency == "eur":
114
sign = "€"
115
elif currency == "kzt":
116
sign = "₸"
117
elif currency == "byn":
118
sign = "Br"
119
elif currency == "hkd":
120
sign = "HK$"
121
elif currency == "cny":
122
sign = "¥"
123
elif currency == "rub":
124
sign = "₽"
125
elif currency == "usd":
126
sign = "$"
127
elif currency == "jpy":
128
sign = "¥"
129
elif currency == "chf":
130
sign = "₣"
131
elif currency == "gbp":
132
sign = "£"
133
else:
134
sign = currency
135
136
return sign
137
138
139
'''
140
Функция для получения курса валюты по отношению к рублю
141
Используется библиотека ЦБ РФ
142
'''
143
144
145
def get_exchange_rate(currency):
146
rates = ExchangeRates()
147
exchange = rates[f'{currency.upper()}']
148
149
if exchange is not None:
150
exchange_rate = exchange.rate
151
elif currency.upper() == "RUB":
152
exchange_rate = 1
153
else:
154
exchange_rate = 0
155
156
return float(exchange_rate)
157
158