Path: blob/master/ invest-robot-contest_trading_bot-master/bot/handlers/info_handlers.py
5935 views
from trading.get_account_info import get_all_stat, get_my_order, get_all_currency, get_all_securities, get_my_operations1from main import dp, bot2from aiogram.types import Message3from aiogram.dispatcher.filters import Text4from trading.get_securities import security_name_by_figi5from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton6from trading.place_order import cancel_order7from config.personal_data import get_account_access89"""1011Здесь собраны все хэндлеры, которые отвечают за вывод информации о счёте1213"""1415"""1617Баланс1819"""202122@dp.message_handler(Text(contains="баланс", ignore_case=True))23async def get_balance(message: Message):24currency_df = get_all_currency(message.from_user.id)2526await message.answer(f"💸<b>Доступная валюта</b>💸")2728text = ""2930for i in currency_df.index:3132if currency_df['exchange_rate'][i] != 0.0 and currency_df['exchange_rate'][i] != 1.0:33text += (34f"<b>{currency_df['name'][i]}</b>\n"35f"{round(currency_df['sum'][i], 2)}{currency_df['sign'][i]} <i>({round(currency_df['sum_in_ruble'][i], 2)}₽)</i>\n\n")36else:37text += (38f"<b>{currency_df['name'][i]}</b>\n"39f"{round(currency_df['sum'][i], 2)}{currency_df['sign'][i]}\n\n")4041if text:42await message.answer(text=text)43else:44await message.answer(text="У Вас нет средств!")454647"""4849Бумаги5051"""525354@dp.message_handler(Text(contains="бумаги", ignore_case=True))55async def get_share(message: Message):56security_df = get_all_securities(message.from_user.id)5758empty_portfolio = True59await message.answer(f"💼Ценные бумаги в портфеле💼")6061for i in security_df.index:6263inst = ""6465if security_df['instrument'][i] == "share":66inst = "Акции"67empty_portfolio = False6869elif security_df['instrument'][i] == "bond":70inst = "Бонды"71empty_portfolio = False7273elif security_df['instrument'][i] == "etf":74inst = "ETF"75empty_portfolio = False7677elif security_df['instrument'][i] == "currency":78continue7980elif security_df['instrument'][i] == "future":81inst = "Фьючерсы"82empty_portfolio = False8384if security_df['exp_yield'][i] >= 0:85exp_yield = f"Ожидаемый доход: {round(security_df['exp_yield'][i], 2)}₽"86else:87exp_yield = f"Ожидаемая убыль: {round(security_df['exp_yield'][i], 2)}₽"8889await message.answer(90f"🧾<b>{inst} {security_df['security_name'][i]}</b>\n"91f"FIGI: {security_df['figi'][i]}\n\n"92f"Лотов: {int(security_df['lots'][i])}\n"93f"Всего: {round(security_df['quantity'][i], 2)}\n\n"94f"Средняя цена: {security_df['average_price'][i]}{security_df['currency_sign'][i]}\n"95f"Средняя цена FIFO: {security_df['average_price_fifo'][i]}{security_df['currency_sign'][i]}\n"96f"Текущая цена: {round(security_df['current_price'][i], 6)}{security_df['currency_sign'][i]}\n\n"97f"НКД: {security_df['nkd'][i]}{security_df['currency_sign'][i]}\n"98f"{exp_yield}{security_df['currency_sign'][i]}\n"99)100101if empty_portfolio:102await message.answer(f"У Вас нет ценных бумаг в портфеле!")103104105"""106107Статистика по счёту108109"""110111112@dp.message_handler(Text(contains="статистика", ignore_case=True))113async def get_stat(message: Message):114await message.answer(f"📈<b>Статистика по счёту</b>📉 ")115116stat = get_all_stat(message.from_user.id)117118# Посчитаем сумму всех бумаг119sum = stat['sum_total'][0]120121# Переведём доход/убыток из процентов в рубли122dif = round(sum - (sum / (100 + stat['exp_yield'][0])) * 100, 2)123124if dif >= 0:125dif_text = f"<b>Прибыль</b>: {dif}₽ ({stat['exp_yield'][0]}%)"126else:127dif_text = f"<b>Убыль</b>: {dif}₽ ({stat['exp_yield'][0]}%)"128129await message.answer(130f"<b>Акции</b> на сумму: {stat['sum_shares'][0]}₽\n"131f"<b>Бонды</b> на сумму: {stat['sum_bonds'][0]}₽\n"132f"<b>ETF</b> на сумму: {stat['sum_etf'][0]}₽\n"133f"<b>Валюта</b> на сумму: {stat['sum_curr'][0]}₽\n"134f"<b>Фьючерсы</b> на сумму: {stat['sum_fut'][0]}₽\n\n"135f"<b>Итого</b>: {round(sum, 2)}₽\n"136f"{dif_text}\n"137138)139140141'''142Открытые ордера143'''144145146@dp.message_handler(Text(contains="ордер", ignore_case=True))147async def get_orders(message: Message):148order_df = get_my_order(message.from_user.id)149150await message.answer(f"📋Открытые ордера📋")151152no_orders = True153154for i in order_df.index:155156no_orders = False157158cancel_order_keyboard = InlineKeyboardMarkup()159if get_account_access(user_id=message.from_user.id) == 1:160cancel_order_keyboard.add(InlineKeyboardButton(text=f"Отменить ордер", callback_data=f"cancel_order:{order_df['order_id'][i]}"))161162if order_df['direction'][i] == 2:163direction = "Продажа"164else:165direction = "Покупка"166167await message.answer(168f"✅<b>{direction}</b> бумаг {security_name_by_figi(order_df['figi'][i], message.from_user.id)}\n"169f"Открыт: {order_df['order_date'][i]}\n\n"170f"ID: {order_df['order_id'][i]}\n\n"171f"FIGI: {order_df['figi'][i]}\n\n"172f"Лотов запрошено: {order_df['lots_req'][i]}\n"173f"Лотов исполнено: {order_df['lots_ex'][i]}\n\n"174f"Сумма запрошена: {order_df['sum_req'][i]}{order_df['currency_sign'][i]}\n"175f"Сумма исполнено: {order_df['sum_ex'][i]}{order_df['currency_sign'][i]}\n\n"176f"Цена одной акции: {round(order_df['price_one'][i], 6)}{order_df['currency_sign'][i]}\n\n"177f"Комиссия: {round(order_df['commission'][i], 3)}{order_df['currency_sign'][i]}\n"178f"Комиссия сервиса: {round(order_df['serv_commission'][i], 3)}{order_df['currency_sign'][i]}\n\n"179f"Итого: {order_df['sum_total'][i]}{order_df['currency_sign'][i]}\n",180reply_markup=cancel_order_keyboard181)182if no_orders:183await message.answer(text="У Вас нет открытых ордеров!")184185186'''187Закрытие ордера по id188'''189190191@dp.callback_query_handler(lambda c: c.data and c.data.startswith('cancel_order'))192async def close_order(callback_query):193data = callback_query.data.split(":")194order_id = data[1]195196await cancel_order(order_id=order_id, user_id=callback_query.from_user.id)197198await bot.edit_message_text(chat_id=callback_query.from_user.id, message_id=callback_query.message.message_id,199text="❌Ордер отменён❌")200201202'''203Операции204'''205206207@dp.message_handler(Text(contains="операции", ignore_case=True))208async def get_operations(message: Message):209210try:211operations = get_my_operations(user_id=message.from_user.id)212except:213await message.answer("Ошибка!")214215else:216if operations:217await message.answer(f"Ваши операции:")218219with open(f"img/operations/all_operations_{message.from_user.id}.png", "rb") as operations_img:220await bot.send_photo(chat_id=message.from_user.id, photo=operations_img)221222else:223await message.answer(f"У Вас пока не было операций!")224225226