From 704249d0af980dd54e85da6c742ed22f0494ceb7 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Wed, 27 Aug 2025 14:28:53 +0500 Subject: [PATCH] Fixed and updated tasks --- app/services/Bybit/functions/Futures.py | 2 +- app/tasks/tasks.py | 59 ++++++++++++++++++------- 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/app/services/Bybit/functions/Futures.py b/app/services/Bybit/functions/Futures.py index 9bd7415..4412bf4 100644 --- a/app/services/Bybit/functions/Futures.py +++ b/app/services/Bybit/functions/Futures.py @@ -98,7 +98,7 @@ async def handle_execution_message(message, msg: dict) -> None: Обработчик сообщений об исполнении сделки. Логирует событие и проверяет условия для мартингейла и TP. """ - logger.info(f"Исполнена сделка:\n{json.dumps(msg, indent=4, ensure_ascii=False)}") + # logger.info(f"Исполнена сделка:\n{json.dumps(msg, indent=4, ensure_ascii=False)}") pnl = parse_pnl_from_msg(msg) tg_id = message.from_user.id diff --git a/app/tasks/tasks.py b/app/tasks/tasks.py index a59c859..af81ad1 100644 --- a/app/tasks/tasks.py +++ b/app/tasks/tasks.py @@ -1,7 +1,7 @@ import asyncio import logging.config from typing import Optional -from app.services.Bybit.functions.Futures import close_trade_after_delay, trading_cycle +from app.services.Bybit.functions.Futures import close_trade_after_delay, trading_cycle, open_position from logger_helper.logger_helper import LOGGING_CONFIG logging.config.dictConfig(LOGGING_CONFIG) @@ -9,16 +9,17 @@ logger = logging.getLogger("tasks") active_start_tasks = {} active_close_tasks = {} +active_start_tasks_timer = {} lock_start_tasks = asyncio.Lock() lock_close_tasks = asyncio.Lock() -def start_trading_cycle(tg_id, message) -> None: +def start_trading_cycle(tg_id, message, side: str, margin_mode: str, tpsl_mode='Full') -> None: """ Запускает асинхронную задачу торгового цикла для пользователя с указанным tg_id. """ - task = asyncio.create_task(trading_cycle(tg_id, message)) + task = asyncio.create_task(open_position(tg_id, message, side, margin_mode, tpsl_mode)) active_start_tasks[tg_id] = task @@ -31,6 +32,17 @@ def stop_trading_cycle(tg_id) -> None: task.cancel() +def start_trading_for_timer(tg_id, message, side: str, margin_mode: str, tpsl_mode='Full') -> None: + # Старт с задержкой (trading_cycle) + task = asyncio.create_task(trading_cycle(tg_id, message)) + active_start_tasks_timer[tg_id] = task + +def stop_trading_for_timer(tg_id) -> None: + task: Optional[asyncio.Task] = active_start_tasks_timer.pop(tg_id, None) + if task: + task.cancel() + + def start_close_trade_task(tg_id, message, symbol, delay_sec) -> None: """ Запускает асинхронную задачу автоматического закрытия сделки после задержки. @@ -48,29 +60,44 @@ def stop_close_trade_task(tg_id) -> None: task.cancel() -async def handle_start_trading(tg_id: int, message): +async def handle_start_trading(tg_id: int, message, side: str, margin_mode: str, tpsl_mode='Full', use_timer=False): """ Запускает торговый цикл. Если уже есть запущенная задача, отменяет её. """ async with lock_start_tasks: - old_task = active_start_tasks.get(tg_id) - if old_task and not old_task.done(): - old_task.cancel() - try: - await old_task - except asyncio.CancelledError: - logger.info(f"Старая задача торговли для пользователя {tg_id} отменена") - start_trading_cycle(tg_id, message) - logger.info(f"Новая задача торговли запущена для пользователя {tg_id}") + if use_timer: + old_task = active_start_tasks_timer.get(tg_id) + if old_task and not old_task.done(): + old_task.cancel() + try: + await old_task + except asyncio.CancelledError: + logger.info(f"Старая задача торговли с таймером для пользователя {tg_id} отменена") + start_trading_for_timer(tg_id, message, side, margin_mode, tpsl_mode) + logger.info(f"Новая задача торговли с таймером запущена для пользователя {tg_id}") + else: + old_task = active_start_tasks.get(tg_id) + if old_task and not old_task.done(): + old_task.cancel() + try: + await old_task + except asyncio.CancelledError: + logger.info(f"Старая задача торговли для пользователя {tg_id} отменена") + start_trading_cycle(tg_id, message, side, margin_mode, tpsl_mode) + logger.info(f"Новая задача торговли запущена для пользователя {tg_id}") -async def handle_stop_trading(tg_id: int): +async def handle_stop_trading(tg_id: int, use_timer=False): """ Останавливает торговую задачу пользователя, если она активна. """ async with lock_start_tasks: - stop_trading_cycle(tg_id) - logger.info(f"Задача торговли остановлена для пользователя {tg_id}") + if use_timer: + stop_trading_for_timer(tg_id) + logger.info(f"Задача торговли с таймером остановлена для пользователя {tg_id}") + else: + stop_trading_cycle(tg_id) + logger.info(f"Задача торговли остановлена для пользователя {tg_id}") async def handle_start_close_trade(tg_id: int, message, symbol: str, delay_sec: int):