Fixed and updated tasks

This commit is contained in:
algizn97
2025-08-27 14:28:53 +05:00
parent bf44b481e9
commit 704249d0af
2 changed files with 44 additions and 17 deletions

View File

@@ -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

View File

@@ -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,11 +60,22 @@ 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:
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()
@@ -60,15 +83,19 @@ async def handle_start_trading(tg_id: int, message):
await old_task
except asyncio.CancelledError:
logger.info(f"Старая задача торговли для пользователя {tg_id} отменена")
start_trading_cycle(tg_id, message)
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:
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}")