From 01fe339d56d0e4dbab8713830dc7b5b85c25afb2 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Sat, 4 Oct 2025 11:03:49 +0500 Subject: [PATCH] Updated --- app/bybit/open_positions.py | 4 +- app/bybit/telegram_message_handler.py | 25 ++++-- app/helper_functions.py | 1 - .../main_settings/additional_settings.py | 4 +- app/telegram/handlers/start_trading.py | 87 +++++++++++++------ 5 files changed, 82 insertions(+), 39 deletions(-) diff --git a/app/bybit/open_positions.py b/app/bybit/open_positions.py index 90ca3ac..5e5eed5 100644 --- a/app/bybit/open_positions.py +++ b/app/bybit/open_positions.py @@ -123,7 +123,7 @@ async def start_trading_cycle( "Order does not meet minimum order value", "position idx not match position mode", "Qty invalid", - "The number of contracts exceeds maximum limit allowed" + "The number of contracts exceeds maximum limit allowed", } else None ) @@ -241,7 +241,7 @@ async def trading_cycle( "Risk is too high for this trade", "ab not enough for new order", "InvalidRequestError", - "The number of contracts exceeds maximum limit allowed" + "The number of contracts exceeds maximum limit allowed", } else None ) diff --git a/app/bybit/telegram_message_handler.py b/app/bybit/telegram_message_handler.py index 15b8d00..6ac14f1 100644 --- a/app/bybit/telegram_message_handler.py +++ b/app/bybit/telegram_message_handler.py @@ -163,9 +163,7 @@ class TelegramMessageHandler: auto_trading = ( user_auto_trading.auto_trading if user_auto_trading else False ) - user_symbols = ( - user_auto_trading.symbol if user_auto_trading else None - ) + user_symbols = user_auto_trading.symbol if user_auto_trading else None if ( auto_trading @@ -181,10 +179,16 @@ class TelegramMessageHandler: r_side = "Sell" else: r_side = "Buy" - await rq.set_auto_trading(tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side) - user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) + await rq.set_auto_trading( + tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side + ) + user_deals_data = await rq.get_user_deal_by_symbol( + tg_id=tg_id, symbol=symbol + ) if user_deals_data and user_deals_data.switch_side_mode: - await rq.set_auto_trading(tg_id=tg_id, symbol=symbol, auto_trading=False, side=side) + await rq.set_auto_trading( + tg_id=tg_id, symbol=symbol, auto_trading=False, side=side + ) else: open_order_text = "\n❗️ Сделка закрылась в минус, открываю новую сделку с увеличенной ставкой.\n" await self.telegram_bot.send_message( @@ -214,10 +218,15 @@ class TelegramMessageHandler: await rq.set_auto_trading( tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side ) - user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) + user_deals_data = await rq.get_user_deal_by_symbol( + tg_id=tg_id, symbol=symbol + ) if user_deals_data and user_deals_data.switch_side_mode: await rq.set_auto_trading( - tg_id=tg_id, symbol=symbol, auto_trading=False, side=side + tg_id=tg_id, + symbol=symbol, + auto_trading=False, + side=side, ) await self.telegram_bot.send_message( chat_id=tg_id, diff --git a/app/helper_functions.py b/app/helper_functions.py index 205e26d..d12f42f 100644 --- a/app/helper_functions.py +++ b/app/helper_functions.py @@ -146,7 +146,6 @@ async def get_liquidation_price( risk_level = risk_list[0] if risk_list else {} maintenance_margin_rate = safe_float(risk_level.get("maintenanceMargin")) - liq_price_long = entry_price * (1 - 1 / leverage + maintenance_margin_rate) liq_price_short = entry_price * (1 + 1 / leverage - maintenance_margin_rate) diff --git a/app/telegram/handlers/main_settings/additional_settings.py b/app/telegram/handlers/main_settings/additional_settings.py index 79929b6..b60036a 100644 --- a/app/telegram/handlers/main_settings/additional_settings.py +++ b/app/telegram/handlers/main_settings/additional_settings.py @@ -186,7 +186,9 @@ async def settings_for_margin_type( try: await state.clear() await callback_query.message.edit_text( - text="Выберите тип маржи:", reply_markup=kbi.margin_type + text="Выберите тип маржи:\n\n" + "Примечание: Если у вас есть открытые позиции, то маржа примениться ко всем позициям", + reply_markup=kbi.margin_type ) logger.debug( "Command margin_type processed successfully for user: %s", diff --git a/app/telegram/handlers/start_trading.py b/app/telegram/handlers/start_trading.py index 85683f6..351bb33 100644 --- a/app/telegram/handlers/start_trading.py +++ b/app/telegram/handlers/start_trading.py @@ -5,13 +5,17 @@ from aiogram import F, Router from aiogram.fsm.context import FSMContext from aiogram.types import CallbackQuery -from app.telegram.tasks.tasks import add_start_task_merged, cancel_start_task_merged, add_start_task_switch, \ - cancel_start_task_switch import app.telegram.keyboards.inline as kbi import database.request as rq from app.bybit.get_functions.get_positions import get_active_positions_by_symbol from app.bybit.open_positions import start_trading_cycle from app.helper_functions import safe_float +from app.telegram.tasks.tasks import ( + add_start_task_merged, + add_start_task_switch, + cancel_start_task_merged, + cancel_start_task_switch, +) from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) @@ -50,30 +54,30 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non if position_idx != 0 and safe_float(size) > 0 and trade_mode == "Merged_Single": await callback_query.answer( text="У вас есть активная позиция в режиме хеджирования. " - "Открытие сделки в одностороннем режиме невозможно.", + "Открытие сделки в одностороннем режиме невозможно.", ) return if position_idx == 0 and safe_float(size) > 0 and trade_mode == "Both_Sides": await callback_query.answer( text="У вас есть активная позиция в одностороннем режиме. " - "Открытие сделки в режиме хеджирования невозможно.", + "Открытие сделки в режиме хеджирования невозможно.", ) return if trade_mode == "Merged_Single": await callback_query.message.edit_text( text="Выберите режим торговли:\n\n" - "Лонг - все сделки серии открываются на покупку.\n" - "Шорт - все сделки серии открываются на продажу.\n" - "Свитч - направление каждой сделки серии меняется по переменно.\n", + "Лонг - все сделки серии открываются на покупку.\n" + "Шорт - все сделки серии открываются на продажу.\n" + "Свитч - направление каждой сделки серии меняется по переменно.\n", reply_markup=kbi.merged_start_trading, ) else: # trade_mode == "Both_Sides": await callback_query.message.edit_text( text="Выберите режим торговли:\n\n" - "Лонг - все сделки открываются на покупку.\n" - "Шорт - все сделки открываются на продажу.\n", + "Лонг - все сделки открываются на покупку.\n" + "Шорт - все сделки открываются на продажу.\n", reply_markup=kbi.both_start_trading, ) logger.debug( @@ -144,7 +148,10 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) - await asyncio.sleep(timer_start * 60) await rq.set_auto_trading( - tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=side + tg_id=callback_query.from_user.id, + symbol=symbol, + auto_trading=True, + side=side, ) res = await start_trading_cycle( tg_id=callback_query.from_user.id, @@ -170,10 +177,15 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) - await state.clear() else: await rq.set_auto_trading( - tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, side=side + tg_id=callback_query.from_user.id, + symbol=symbol, + auto_trading=False, + side=side, ) text = error_messages.get(res, "Произошла ошибка при запуске торговли") - await callback_query.message.edit_text(text=text, reply_markup=kbi.profile_bybit) + await callback_query.message.edit_text( + text=text, reply_markup=kbi.profile_bybit + ) await callback_query.message.edit_text("Запуск торговли...") task = asyncio.create_task(delay_start()) @@ -192,7 +204,7 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) - @router_start_trading.callback_query(lambda c: c.data == "switch") async def start_trading_switch( - callback_query: CallbackQuery, state: FSMContext + callback_query: CallbackQuery, state: FSMContext ) -> None: """ Handles the "switch" callback query. @@ -205,10 +217,10 @@ async def start_trading_switch( await state.clear() await callback_query.message.edit_text( text="Выберите направление первой сделки серии:\n\n" - "Лонг - открывается первая сделка на покупку.\n" - "Шорт - открывается первая сделка на продажу.\n" - "По направлению - сделка открывается в направлении последней сделки предыдущей серии.\n" - "Противоположно - сделка открывается в противоположном направлении последней сделки предыдущей серии.\n", + "Лонг - открывается первая сделка на покупку.\n" + "Шорт - открывается первая сделка на продажу.\n" + "По направлению - сделка открывается в направлении последней сделки предыдущей серии.\n" + "Противоположно - сделка открывается в противоположном направлении последней сделки предыдущей серии.\n", reply_markup=kbi.switch_side, ) except Exception as e: @@ -222,7 +234,7 @@ async def start_trading_switch( @router_start_trading.callback_query( lambda c: c.data - in {"switch_long", "switch_short", "switch_direction", "switch_opposite"} + in {"switch_long", "switch_short", "switch_direction", "switch_opposite"} ) async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None: """ @@ -298,13 +310,21 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None ) await asyncio.sleep(timer_start * 60) await rq.set_auto_trading( - tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=side + tg_id=callback_query.from_user.id, + symbol=symbol, + auto_trading=True, + side=side, ) if side == "Buy": r_side = "Sell" else: r_side = "Buy" - await rq.set_auto_trading(tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=r_side) + await rq.set_auto_trading( + tg_id=callback_query.from_user.id, + symbol=symbol, + auto_trading=True, + side=r_side, + ) res = await start_trading_cycle( tg_id=callback_query.from_user.id, side=side, @@ -329,16 +349,25 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None await state.clear() else: await rq.set_auto_trading( - tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, side=side + tg_id=callback_query.from_user.id, + symbol=symbol, + auto_trading=False, + side=side, ) if side == "Buy": r_side = "Sell" else: r_side = "Buy" - await rq.set_auto_trading(tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, - side=r_side) + await rq.set_auto_trading( + tg_id=callback_query.from_user.id, + symbol=symbol, + auto_trading=False, + side=r_side, + ) text = error_messages.get(res, "Произошла ошибка при запуске торговли") - await callback_query.message.edit_text(text=text, reply_markup=kbi.profile_bybit) + await callback_query.message.edit_text( + text=text, reply_markup=kbi.profile_bybit + ) await callback_query.message.edit_text("Запуск торговли...") task = asyncio.create_task(delay_start()) @@ -354,9 +383,11 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None ) -@router_start_trading.callback_query(lambda c: c.data == "cancel_timer_merged" or c.data == "cancel_timer_switch") +@router_start_trading.callback_query( + lambda c: c.data == "cancel_timer_merged" or c.data == "cancel_timer_switch" +) async def cancel_start_trading( - callback_query: CallbackQuery, state: FSMContext + callback_query: CallbackQuery, state: FSMContext ) -> None: """ Handles the "cancel_timer" callback query. @@ -371,7 +402,9 @@ async def cancel_start_trading( cancel_start_task_merged(user_id=callback_query.from_user.id) elif callback_query.data == "cancel_timer_switch": cancel_start_task_switch(user_id=callback_query.from_user.id) - await callback_query.message.edit_text(text="Запуск торговли отменен", reply_markup=kbi.profile_bybit) + await callback_query.message.edit_text( + text="Запуск торговли отменен", reply_markup=kbi.profile_bybit + ) except Exception as e: await callback_query.answer("Произошла ошибка при отмене запуска торговли") logger.error(