from aiogram import F, Router from app.services.Bybit.functions import Futures, func_min_qty from app.services.Bybit.functions.balance import get_balance import app.telegram.Keyboards.inline_keyboards as inline_markup import app.telegram.database.requests as rq from aiogram.types import Message, CallbackQuery # FSM - Механизм состояния from aiogram.fsm.state import State, StatesGroup from aiogram.fsm.context import FSMContext router_functions_bybit_trade = Router() class state_update_symbol(StatesGroup): symbol = State() @router_functions_bybit_trade.callback_query(F.data == 'clb_start_trading') async def clb_start_bybit_trade_message(callback: CallbackQuery, state: FSMContext): api = await rq.get_bybit_api_key(callback.from_user.id) secret = await rq.get_bybit_secret_key(callback.from_user.id) balance = await get_balance(callback.from_user.id, callback.message) if balance: symbol = await rq.get_symbol(callback.from_user.id) text = f'''💎 Торговля на Bybit ⚖️ Ваш баланс (USDT): {balance} 📊 Текущая торговая пара: {symbol} Как начать торговлю? 1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле. 2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару заглавными буквами, без лишних символов (например: BTCUSDT). ''' await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup) async def start_bybit_trade_message(message, state): api = await rq.get_bybit_api_key(message.from_user.id) secret = await rq.get_bybit_secret_key(message.from_user.id) balance = await get_balance(message.from_user.id, message) if balance: symbol = await rq.get_symbol(message.from_user.id) text = f'''💎 Торговля на Bybit ⚖️ Ваш баланс (USDT): {balance} 📊 Текущая торговая пара: {symbol} Как начать торговлю? 1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле. 2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару заглавными буквами, без лишних символов (например: BTCUSDT). ''' await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup) @router_functions_bybit_trade.callback_query(F.data == 'clb_update_trading_pair') async def update_symbol_for_trade_message(callback: CallbackQuery, state: FSMContext): await state.set_state(state_update_symbol.symbol) await callback.message.answer(text='Укажите торговую пару заглавными буквами без пробелов и лишних символов (пример: BTCUSDT): ') @router_functions_bybit_trade.message(state_update_symbol.symbol) async def update_symbol_for_trade(message: Message, state: FSMContext): await state.update_data(symbol = message.text) data = await state.get_data() await message.answer('Пара была успешно обновлена') await rq.update_symbol(message.from_user.id, data['symbol']) await start_bybit_trade_message(message, state) await state.clear() @router_functions_bybit_trade.callback_query(F.data == 'clb_open_deal') async def make_deal_bybit (callback: CallbackQuery): data_main_stgs = await rq.get_user_main_settings(callback.from_user.id) trade_mode = data_main_stgs['trading_mode'] qty = data_main_stgs['starting_quantity'] margin_mode = data_main_stgs['margin_type'] qty_min = await func_min_qty.get_min_qty(callback.from_user.id, callback.message) if qty < qty_min: await callback.message.edit_text(f"Количество вашей ставки ({qty}) меньше минимального количества ({qty_min}) для данной торговой пары") else: match trade_mode: case 'Long': await Futures.contract_long(callback.from_user.id, callback.message, margin_mode) case 'Short': await Futures.contract_short(callback.from_user.id, callback.message, margin_mode) case 'Switch': await callback.message.edit_text('Режим Switch пока недоступен') case 'Smart': await callback.message.edit_text('Режим Smart пока недоступен')