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/search_handlers.py
5935 views
1
from main import dp, bot
2
from aiogram.types import Message
3
from aiogram.dispatcher import FSMContext
4
from aiogram.dispatcher.filters.state import State, StatesGroup
5
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
6
from trading.get_securities import get_security_list
7
from trading.place_order import buy_order
8
from trading.trade_help import get_price_figi, get_currency_sing
9
from config.personal_data import get_account_access
10
11
"""
12
13
Тут представлены все хэндлеры, которые отвечают за поиск бумаг
14
15
"""
16
17
"""
18
Создаём состояние ожидания названия
19
"""
20
21
22
class SearchSFB(StatesGroup):
23
wait_sfb = State()
24
25
26
"""
27
Хэндлер, который запускает состояние поиска
28
"""
29
30
31
@dp.message_handler(text="Поиск")
32
async def search_start(callback_query):
33
await bot.send_message(chat_id=callback_query.from_user.id, text="Введите название бумаги или FIGI:")
34
await SearchSFB.wait_sfb.set()
35
36
37
"""
38
Ждём название или FIGI и выводим информацию по бумаге
39
"""
40
41
42
@dp.message_handler(state=SearchSFB.wait_sfb)
43
async def search_finish(message: Message, state: FSMContext):
44
security_list = get_security_list(user_id=message.from_user.id, name=message.text)
45
if len(security_list) != 0:
46
for security in security_list:
47
48
choose_share_keyboard = InlineKeyboardMarkup()
49
choose_share_keyboard.add(
50
InlineKeyboardButton(text=f"Анализ",
51
callback_data=f"str1:stat:show:{message.from_user.id}:{security.figi}"))
52
if get_account_access(user_id=message.from_user.id) == 1:
53
choose_share_keyboard.add(
54
InlineKeyboardButton(text=f"Купить 1 лот", callback_data=f"sfb:buy_now:{security.figi}"))
55
56
try:
57
inst_type = security.instrument_type
58
59
if inst_type == "share":
60
inst = "Акции"
61
elif inst_type == "future":
62
inst = "Фьючерсы"
63
elif inst_type == "bond":
64
inst = "Бонды"
65
elif inst_type == "etf":
66
inst = "ETF"
67
elif inst_type == "currency":
68
inst = "Валюта"
69
else:
70
inst = inst_type
71
72
except:
73
inst = "Акции"
74
75
await message.answer(
76
text=
77
f"🧾<b>{inst} {security.name}</b>\n"
78
f"FIGI: {security.figi}\n\n"
79
f"Бумаг в лоте: {security.lot}\n"
80
f"Средняя цена бумаги: {round(get_price_figi(user_id=message.from_user.id, figi=security.figi), 4)}{get_currency_sing(security.currency)}\n"
81
f"Итого стоимость: {round(security.lot * get_price_figi(user_id=message.from_user.id, figi=security.figi), 4)}{get_currency_sing(security.currency)}\n"
82
, reply_markup=choose_share_keyboard)
83
84
await state.finish()
85
else:
86
await bot.send_message(chat_id=message.from_user.id, text=f"Такой бумаги нет!")
87
await bot.send_message(chat_id=message.from_user.id, text=f"Повторите ввод или напишите 'Отмена':")
88
return 0
89
90
91
"""
92
93
Бумаги
94
95
"""
96
97
98
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('sfb:buy_now:'))
99
async def search_buy_now(callback_query):
100
data = callback_query.data.split(":")
101
figi = data[2]
102
103
order = buy_order(figi=figi, user_id=callback_query.from_user.id, quantity_lots=1, price=0.0, via="bot")
104
105
if order:
106
await bot.send_message(chat_id=callback_query.from_user.id, text=f"Покупка успешно выполнена!")
107
else:
108
await bot.send_message(chat_id=callback_query.from_user.id, text="Ошибка! Вероятно, у Вас мало средств на счёте!")
109
110
111