From 8715b32139ae17f4b14b881af57495bc11ba5d89 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Fri, 29 Aug 2025 11:43:52 +0500 Subject: [PATCH] Fixed --- app/services/Bybit/functions/functions.py | 84 ++++++++++------------- app/telegram/functions/functions.py | 2 +- 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/app/services/Bybit/functions/functions.py b/app/services/Bybit/functions/functions.py index f4f7c1a..54b407e 100644 --- a/app/services/Bybit/functions/functions.py +++ b/app/services/Bybit/functions/functions.py @@ -2,12 +2,12 @@ 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 from logger_helper.logger_helper import LOGGING_CONFIG -from app.services.Bybit.functions.Futures import (close_user_trade, open_position, set_take_profit_stop_loss, \ +from app.services.Bybit.functions.Futures import (close_user_trade, set_take_profit_stop_loss, \ get_active_positions_by_symbol, get_active_orders_by_symbol, get_active_positions, get_active_orders, cancel_all_tp_sl_orders, + trading_cycle, open_position, close_trade_after_delay, ) from app.services.Bybit.functions.balance import get_balance import app.telegram.Keyboards.inline_keyboards as inline_markup @@ -50,7 +50,7 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery) -> None: "Как начать торговлю?\n\n" "1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.\n" "2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару, без лишних символов (например: BTCUSDT).\n" - "3️⃣ Нажмите кнопку 'Выбрать тип входа' и после нажмите начать торговлю.\n" + "3️⃣ Нажмите кнопку 'Начать торговать'.\n" ) await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup) @@ -74,7 +74,7 @@ async def start_bybit_trade_message(message: Message) -> None: "Как начать торговлю?\n\n" "1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.\n" "2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару, без лишних символов (например: BTCUSDT).\n" - "3️⃣ Нажмите кнопку 'Выбрать тип входа' и после нажмите начать торговлю.\n" + "3️⃣ Нажмите кнопку 'Начать торговать'.\n" ) await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup) @@ -124,6 +124,7 @@ async def update_entry_type_message(callback: CallbackQuery, state: FSMContext) await callback.answer() + @router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:')) async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext) -> None: """ @@ -196,13 +197,14 @@ async def start_trading_process(callback: CallbackQuery) -> None: symbol = await rq.get_symbol(tg_id) margin_mode = data_main_stgs.get('margin_type', 'Isolated') trading_mode = data_main_stgs.get('trading_mode') + switch_mode = data_main_stgs.get('switch_mode_enabled') if not api_key or not secret_key: await message.answer("❗️ У вас не настроены API ключи для Bybit.") await callback.answer() return - if trading_mode not in ['Long', 'Short', 'Smart', 'Switch']: + if trading_mode not in ['Long', 'Short', 'Smart']: await message.answer(f"❗️ Некорректный торговый режим: {trading_mode}") await callback.answer() return @@ -228,15 +230,20 @@ async def start_trading_process(callback: CallbackQuery) -> None: f"(текущий режим: {existing_margin_mode})", show_alert=True) return - if trading_mode == 'Long': - side = 'Buy' - elif trading_mode == 'Short': - side = 'Sell' + side = None + if switch_mode == 'Включено': + switch_state = data_main_stgs.get('switch_state', 'Long') + side = 'Buy' if switch_state == 'Long' else 'Sell' else: - await message.answer(f"Режим торговли '{trading_mode}' пока не поддерживается.", - reply_markup=inline_markup.back_to_main) - await callback.answer() - return + if trading_mode == 'Long': + side = 'Buy' + elif trading_mode == 'Short': + side = 'Sell' + else: + await message.answer(f"Режим торговли '{trading_mode}' пока не поддерживается.", + reply_markup=inline_markup.back_to_main) + await callback.answer() + return await message.answer("Начинаю торговлю с использованием текущих настроек...") @@ -248,12 +255,11 @@ 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, side=side, margin_mode=margin_mode, use_timer=True) - await message.answer(f"Торговля начнётся через {timer_minute} мин. Для отмены нажмите кнопку ниже.", - reply_markup=inline_markup.cancel_start_markup) + await trading_cycle(tg_id, message) + await message.answer(f"Торговля начнётся через {timer_minute} мин.") await rq.update_user_timer(tg_id, minutes=0) else: - await handle_start_trading(tg_id, message, side=side, margin_mode=margin_mode, use_timer=False) + await open_position(tg_id, message, side, margin_mode) await callback.answer() @@ -292,6 +298,7 @@ async def show_deal_callback(callback_query: CallbackQuery) -> None: await callback_query.answer() try: symbol = callback_query.data[len("show_deal_"):] + await rq.update_symbol(callback_query.from_user.id, symbol) tg_id = callback_query.from_user.id await get_active_positions_by_symbol(tg_id, symbol, message=callback_query.message) except Exception as e: @@ -321,6 +328,7 @@ async def show_limit_callback(callback_query: CallbackQuery) -> None: await callback_query.answer() try: symbol = callback_query.data[len("show_limit_"):] + await rq.update_symbol(callback_query.from_user.id, symbol) tg_id = callback_query.from_user.id await get_active_orders_by_symbol(tg_id, symbol, message=callback_query.message) except Exception as e: @@ -391,18 +399,6 @@ async def process_stop_loss(message: Message, state: FSMContext) -> None: await state.clear() -@router_functions_bybit_trade.callback_query(F.data == "clb_stop_timer") -async def cancel_start_callback(callback: CallbackQuery) -> None: - """ - Отменяет задачу старта торговли по таймеру, если она активна. - """ - tg_id = callback.from_user.id - await handle_stop_close_trade(tg_id) - - await callback.message.answer("Торговля по таймеру отменена.", reply_markup=inline_markup.back_to_main) - await callback.answer() - - @router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith("close_deal:")) async def close_trade_callback(callback: CallbackQuery) -> None: """ @@ -414,7 +410,6 @@ async def close_trade_callback(callback: CallbackQuery) -> None: result = await close_user_trade(tg_id, symbol, message=callback.message) if result: - await handle_stop_trading(tg_id) logger.info(f"Сделка {symbol} успешно закрыта.") else: logger.error(f"Не удалось закрыть сделку {symbol}.") @@ -434,7 +429,6 @@ async def close_trade_callback(callback: CallbackQuery) -> None: result = await cancel_all_tp_sl_orders(tg_id, symbol) if result: - await callback.message.answer(f"Ордер {result} успешно закрыт.", reply_markup=inline_markup.back_to_main) logger.info(f"Ордер {result} успешно закрыт.") else: await callback.message.answer(f"Не удалось закрыть ордер {result}.") @@ -450,7 +444,7 @@ async def ask_close_delay(callback: CallbackQuery, state: FSMContext) -> None: symbol = callback.data.split(":")[1] await state.update_data(symbol=symbol) await state.set_state(CloseTradeTimerState.waiting_for_delay) - await callback.message.answer("Введите задержку в минутах до закрытия сделки (например, 60):", + await callback.message.answer("Введите задержку в минутах до закрытия сделки:", reply_markup=inline_markup.cancel) await callback.answer() @@ -458,7 +452,7 @@ async def ask_close_delay(callback: CallbackQuery, state: FSMContext) -> None: @router_functions_bybit_trade.message(CloseTradeTimerState.waiting_for_delay) async def process_close_delay(message: Message, state: FSMContext) -> None: """ - Обрабатывает ввод задержки и запускает задачу закрытия сделки с задержкой. + Обрабатывает ввод закрытия сделки с задержкой. """ try: delay_minutes = int(message.text.strip()) @@ -471,14 +465,10 @@ async def process_close_delay(message: Message, state: FSMContext) -> None: data = await state.get_data() symbol = data.get("symbol") - tg_id = message.from_user.id delay = delay_minutes * 60 - - await handle_start_close_trade(tg_id, message, symbol, delay) - - await message.answer(f"Закрытие сделки {symbol} запланировано через {delay} секунд.", - reply_markup=inline_markup.cancel_start_markup) + await message.answer(f"Закрытие сделки {symbol} запланировано через {delay_minutes} мин.") + await close_trade_after_delay(message.from_user.id, message, symbol, delay) await state.clear() @@ -509,7 +499,7 @@ async def stop_immediately(callback: CallbackQuery): """ tg_id = callback.from_user.id - await handle_stop_trading(tg_id, use_timer=False) + await rq.update_trigger(tg_id, "Ручной") await callback.message.answer("Торговля остановлена.", reply_markup=inline_markup.back_to_main) await callback.answer() @@ -540,16 +530,12 @@ async def process_stop_delay(message: Message, state: FSMContext): 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("Торговля по таймеру остановлена.") + await message.answer(f"Торговля будет остановлена через {delay_minutes} минут.", + reply_markup=inline_markup.back_to_main) + await asyncio.sleep(delay_seconds) + await rq.update_trigger(tg_id, "Ручной") + await message.answer("Торговля по таймеру остановлена.") - asyncio.create_task(delayed_stop()) - - await message.answer(f"Торговля будет остановлена через {delay_minutes} минут.", reply_markup=inline_markup.back_to_main) await state.clear() diff --git a/app/telegram/functions/functions.py b/app/telegram/functions/functions.py index d1b7b9b..19ab77b 100644 --- a/app/telegram/functions/functions.py +++ b/app/telegram/functions/functions.py @@ -10,7 +10,7 @@ async def start_message(message): username = message.from_user.first_name else: username = f'{message.from_user.first_name} {message.from_user.last_name}' - await message.answer(f""" Привет {username}! 👋""", parse_mode='html', reply_markup=reply_markup.base_buttons_markup) + await message.answer(f""" Привет {username}! 👋""", parse_mode='html') await message.answer("Добро пожаловать в чат-робот для автоматизации трейдинга — вашего надежного помощника для анализа рынка и принятия взвешенных решений.", parse_mode='html', reply_markup=inline_markup.start_markup)