Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
wiseplat
GitHub Repository: wiseplat/python-code
Path: blob/master/ invest-robot-contest_trading_bot-master/bot/handlers/info_handlers.py
5935 views
1
from trading.get_account_info import get_all_stat, get_my_order, get_all_currency, get_all_securities, get_my_operations
2
from main import dp, bot
3
from aiogram.types import Message
4
from aiogram.dispatcher.filters import Text
5
from trading.get_securities import security_name_by_figi
6
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
7
from trading.place_order import cancel_order
8
from config.personal_data import get_account_access
9
10
"""
11
12
Здесь собраны все хэндлеры, которые отвечают за вывод информации о счёте
13
14
"""
15
16
"""
17
18
Баланс
19
20
"""
21
22
23
@dp.message_handler(Text(contains="баланс", ignore_case=True))
24
async def get_balance(message: Message):
25
currency_df = get_all_currency(message.from_user.id)
26
27
await message.answer(f"💸<b>Доступная валюта</b>💸")
28
29
text = ""
30
31
for i in currency_df.index:
32
33
if currency_df['exchange_rate'][i] != 0.0 and currency_df['exchange_rate'][i] != 1.0:
34
text += (
35
f"<b>{currency_df['name'][i]}</b>\n"
36
f"{round(currency_df['sum'][i], 2)}{currency_df['sign'][i]} <i>({round(currency_df['sum_in_ruble'][i], 2)}₽)</i>\n\n")
37
else:
38
text += (
39
f"<b>{currency_df['name'][i]}</b>\n"
40
f"{round(currency_df['sum'][i], 2)}{currency_df['sign'][i]}\n\n")
41
42
if text:
43
await message.answer(text=text)
44
else:
45
await message.answer(text="У Вас нет средств!")
46
47
48
"""
49
50
Бумаги
51
52
"""
53
54
55
@dp.message_handler(Text(contains="бумаги", ignore_case=True))
56
async def get_share(message: Message):
57
security_df = get_all_securities(message.from_user.id)
58
59
empty_portfolio = True
60
await message.answer(f"💼Ценные бумаги в портфеле💼")
61
62
for i in security_df.index:
63
64
inst = ""
65
66
if security_df['instrument'][i] == "share":
67
inst = "Акции"
68
empty_portfolio = False
69
70
elif security_df['instrument'][i] == "bond":
71
inst = "Бонды"
72
empty_portfolio = False
73
74
elif security_df['instrument'][i] == "etf":
75
inst = "ETF"
76
empty_portfolio = False
77
78
elif security_df['instrument'][i] == "currency":
79
continue
80
81
elif security_df['instrument'][i] == "future":
82
inst = "Фьючерсы"
83
empty_portfolio = False
84
85
if security_df['exp_yield'][i] >= 0:
86
exp_yield = f"Ожидаемый доход: {round(security_df['exp_yield'][i], 2)}₽"
87
else:
88
exp_yield = f"Ожидаемая убыль: {round(security_df['exp_yield'][i], 2)}₽"
89
90
await message.answer(
91
f"🧾<b>{inst} {security_df['security_name'][i]}</b>\n"
92
f"FIGI: {security_df['figi'][i]}\n\n"
93
f"Лотов: {int(security_df['lots'][i])}\n"
94
f"Всего: {round(security_df['quantity'][i], 2)}\n\n"
95
f"Средняя цена: {security_df['average_price'][i]}{security_df['currency_sign'][i]}\n"
96
f"Средняя цена FIFO: {security_df['average_price_fifo'][i]}{security_df['currency_sign'][i]}\n"
97
f"Текущая цена: {round(security_df['current_price'][i], 6)}{security_df['currency_sign'][i]}\n\n"
98
f"НКД: {security_df['nkd'][i]}{security_df['currency_sign'][i]}\n"
99
f"{exp_yield}{security_df['currency_sign'][i]}\n"
100
)
101
102
if empty_portfolio:
103
await message.answer(f"У Вас нет ценных бумаг в портфеле!")
104
105
106
"""
107
108
Статистика по счёту
109
110
"""
111
112
113
@dp.message_handler(Text(contains="статистика", ignore_case=True))
114
async def get_stat(message: Message):
115
await message.answer(f"📈<b>Статистика по счёту</b>📉 ")
116
117
stat = get_all_stat(message.from_user.id)
118
119
# Посчитаем сумму всех бумаг
120
sum = stat['sum_total'][0]
121
122
# Переведём доход/убыток из процентов в рубли
123
dif = round(sum - (sum / (100 + stat['exp_yield'][0])) * 100, 2)
124
125
if dif >= 0:
126
dif_text = f"<b>Прибыль</b>: {dif}₽ ({stat['exp_yield'][0]}%)"
127
else:
128
dif_text = f"<b>Убыль</b>: {dif}₽ ({stat['exp_yield'][0]}%)"
129
130
await message.answer(
131
f"<b>Акции</b> на сумму: {stat['sum_shares'][0]}₽\n"
132
f"<b>Бонды</b> на сумму: {stat['sum_bonds'][0]}₽\n"
133
f"<b>ETF</b> на сумму: {stat['sum_etf'][0]}₽\n"
134
f"<b>Валюта</b> на сумму: {stat['sum_curr'][0]}₽\n"
135
f"<b>Фьючерсы</b> на сумму: {stat['sum_fut'][0]}₽\n\n"
136
f"<b>Итого</b>: {round(sum, 2)}₽\n"
137
f"{dif_text}\n"
138
139
)
140
141
142
'''
143
Открытые ордера
144
'''
145
146
147
@dp.message_handler(Text(contains="ордер", ignore_case=True))
148
async def get_orders(message: Message):
149
order_df = get_my_order(message.from_user.id)
150
151
await message.answer(f"📋Открытые ордера📋")
152
153
no_orders = True
154
155
for i in order_df.index:
156
157
no_orders = False
158
159
cancel_order_keyboard = InlineKeyboardMarkup()
160
if get_account_access(user_id=message.from_user.id) == 1:
161
cancel_order_keyboard.add(InlineKeyboardButton(text=f"Отменить ордер", callback_data=f"cancel_order:{order_df['order_id'][i]}"))
162
163
if order_df['direction'][i] == 2:
164
direction = "Продажа"
165
else:
166
direction = "Покупка"
167
168
await message.answer(
169
f"✅<b>{direction}</b> бумаг {security_name_by_figi(order_df['figi'][i], message.from_user.id)}\n"
170
f"Открыт: {order_df['order_date'][i]}\n\n"
171
f"ID: {order_df['order_id'][i]}\n\n"
172
f"FIGI: {order_df['figi'][i]}\n\n"
173
f"Лотов запрошено: {order_df['lots_req'][i]}\n"
174
f"Лотов исполнено: {order_df['lots_ex'][i]}\n\n"
175
f"Сумма запрошена: {order_df['sum_req'][i]}{order_df['currency_sign'][i]}\n"
176
f"Сумма исполнено: {order_df['sum_ex'][i]}{order_df['currency_sign'][i]}\n\n"
177
f"Цена одной акции: {round(order_df['price_one'][i], 6)}{order_df['currency_sign'][i]}\n\n"
178
f"Комиссия: {round(order_df['commission'][i], 3)}{order_df['currency_sign'][i]}\n"
179
f"Комиссия сервиса: {round(order_df['serv_commission'][i], 3)}{order_df['currency_sign'][i]}\n\n"
180
f"Итого: {order_df['sum_total'][i]}{order_df['currency_sign'][i]}\n",
181
reply_markup=cancel_order_keyboard
182
)
183
if no_orders:
184
await message.answer(text="У Вас нет открытых ордеров!")
185
186
187
'''
188
Закрытие ордера по id
189
'''
190
191
192
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('cancel_order'))
193
async def close_order(callback_query):
194
data = callback_query.data.split(":")
195
order_id = data[1]
196
197
await cancel_order(order_id=order_id, user_id=callback_query.from_user.id)
198
199
await bot.edit_message_text(chat_id=callback_query.from_user.id, message_id=callback_query.message.message_id,
200
text="❌Ордер отменён❌")
201
202
203
'''
204
Операции
205
'''
206
207
208
@dp.message_handler(Text(contains="операции", ignore_case=True))
209
async def get_operations(message: Message):
210
211
try:
212
operations = get_my_operations(user_id=message.from_user.id)
213
except:
214
await message.answer("Ошибка!")
215
216
else:
217
if operations:
218
await message.answer(f"Ваши операции:")
219
220
with open(f"img/operations/all_operations_{message.from_user.id}.png", "rb") as operations_img:
221
await bot.send_photo(chat_id=message.from_user.id, photo=operations_img)
222
223
else:
224
await message.answer(f"У Вас пока не было операций!")
225
226