From bf44b481e9476aa8b8192eca09c793a01975664c Mon Sep 17 00:00:00 2001 From: algizn97 Date: Wed, 27 Aug 2025 14:28:23 +0500 Subject: [PATCH] Added new handlers for tasks --- app/services/Bybit/functions/functions.py | 68 +++++++++++++++++++++- app/telegram/Keyboards/inline_keyboards.py | 12 +++- 2 files changed, 76 insertions(+), 4 deletions(-) diff --git a/app/services/Bybit/functions/functions.py b/app/services/Bybit/functions/functions.py index 60d0098..4ac7ee0 100644 --- a/app/services/Bybit/functions/functions.py +++ b/app/services/Bybit/functions/functions.py @@ -1,4 +1,5 @@ -import logging.config +import asyncio +import logging.config from aiogram import F, Router from app.tasks.tasks import handle_stop_close_trade, handle_start_close_trade, handle_stop_trading, handle_start_trading @@ -246,12 +247,12 @@ async def start_trading_process(callback: CallbackQuery) -> None: timer_minute = timer_data or 0 if timer_minute > 0: - await handle_start_trading(tg_id, message) + await handle_start_trading(tg_id, message, side=side, margin_mode=margin_mode, use_timer=True) await message.answer(f"Торговля начнётся через {timer_minute} мин. Для отмены нажмите кнопку ниже.", reply_markup=inline_markup.cancel_start_markup) await rq.update_user_timer(tg_id, minutes=0) else: - await open_position(tg_id, message, side=side, margin_mode=margin_mode) + await handle_start_trading(tg_id, message, side=side, margin_mode=margin_mode, use_timer=False) await callback.answer() @@ -443,6 +444,67 @@ async def reset_martingale(callback: CallbackQuery) -> None: await callback.answer("Сброс шагов выполнен.") +@router_functions_bybit_trade.callback_query(F.data == "clb_stop_trading") +async def confirm_stop_trading(callback: CallbackQuery): + """ + Предлагает пользователю выбрать вариант подтверждение остановки торговли. + """ + await callback.message.answer( + "Выберите вариант остановки торговли:", reply_markup=inline_markup.stop_choice_markup + ) + await callback.answer() + +@router_functions_bybit_trade.callback_query(F.data == "stop_immediately") +async def stop_immediately(callback: CallbackQuery): + """ + Останавливает торговлю немедленно. + """ + tg_id = callback.from_user.id + + await handle_stop_trading(tg_id, use_timer=False) + await callback.message.answer("Торговля остановлена.", reply_markup=inline_markup.back_to_main) + await callback.answer() + +@router_functions_bybit_trade.callback_query(F.data == "stop_with_timer") +async def stop_with_timer_start(callback: CallbackQuery, state: FSMContext): + """ + Запускает диалог с пользователем для задания задержки перед остановкой торговли. + """ + + await state.set_state(CloseTradeTimerState.waiting_for_delay) + await callback.message.answer("Введите задержку в минутах перед остановкой торговли:", reply_markup=inline_markup.cancel) + await callback.answer() + +@router_functions_bybit_trade.message(CloseTradeTimerState.waiting_for_delay) +async def process_stop_delay(message: Message, state: FSMContext): + """ + Обрабатывает ввод задержки и запускает задачу остановки торговли с задержкой. + """ + try: + delay_minutes = int(message.text.strip()) + if delay_minutes <= 0: + await message.answer("Введите положительное число минут.") + return + except ValueError: + await message.answer("Некорректный формат. Введите число в минутах.") + return + + tg_id = message.from_user.id + delay_seconds = delay_minutes * 60 + + # Остановка задачи с таймером через заданную задержку + # Можно реализовать через запуск отдельной асинхронной задачи, которая через delay_seconds отменит торговый цикл + async def delayed_stop(): + await asyncio.sleep(delay_seconds) + await handle_stop_trading(tg_id, use_timer=True) + await message.answer("Торговля по таймеру остановлена.") + + asyncio.create_task(delayed_stop()) + + await message.answer(f"Торговля будет остановлена через {delay_minutes} минут.", reply_markup=inline_markup.back_to_main) + await state.clear() + + @router_functions_bybit_trade.callback_query(F.data == "clb_cancel") async def cancel(callback: CallbackQuery, state: FSMContext) -> None: """ diff --git a/app/telegram/Keyboards/inline_keyboards.py b/app/telegram/Keyboards/inline_keyboards.py index 39b953a..19de990 100644 --- a/app/telegram/Keyboards/inline_keyboards.py +++ b/app/telegram/Keyboards/inline_keyboards.py @@ -32,7 +32,8 @@ trading_markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Настройки", callback_data='clb_settings_message')], [InlineKeyboardButton(text="Мои сделки", callback_data='clb_my_deals')], [InlineKeyboardButton(text="Указать торговую пару", callback_data='clb_update_trading_pair')], - [InlineKeyboardButton(text="Выбрать тип входа", callback_data='clb_update_entry_type')], + [InlineKeyboardButton(text="Начать торговлю", callback_data='clb_update_entry_type')], + [InlineKeyboardButton(text="Остановить торговлю", callback_data='clb_stop_trading')], ]) start_trading_markup = InlineKeyboardMarkup(inline_keyboard=[ @@ -184,3 +185,12 @@ timer_markup = InlineKeyboardMarkup(inline_keyboard=[ cancel_start_markup = InlineKeyboardMarkup(inline_keyboard=[ [InlineKeyboardButton(text="Отменить таймер", callback_data="clb_stop_timer")] ]) + +stop_choice_markup = InlineKeyboardMarkup( + inline_keyboard=[ + [ + InlineKeyboardButton(text="Остановить сразу", callback_data="stop_immediately"), + InlineKeyboardButton(text="Остановить по таймеру", callback_data="stop_with_timer"), + ] + ] +) \ No newline at end of file