1
0
forked from kodorvan/stcs

Added documentation, added websocket and tasks

This commit is contained in:
algizn97
2025-08-27 12:54:45 +05:00
parent a140e0eb6f
commit 9032957631
3 changed files with 247 additions and 215 deletions

View File

@@ -1,14 +1,12 @@
import asyncio
import logging.config
import logging.config
from aiogram import F, Router
from app.tasks.tasks import active_close_tasks, active_start_tasks
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, close_trade_after_delay,
trading_cycle, open_position, set_take_profit_stop_loss, \
from app.services.Bybit.functions.Futures import (close_user_trade, open_position, set_take_profit_stop_loss, \
get_active_positions_by_symbol, get_active_orders_by_symbol,
start_execution_ws)
)
from app.services.Bybit.functions.balance import get_balance
import app.telegram.Keyboards.inline_keyboards as inline_markup
@@ -35,15 +33,16 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery) -> None:
Обработка нажатия кнопок запуска торговли или возврата в главное меню.
Отправляет информацию о балансе, символе, цене и инструкциях по торговле.
"""
balance = await get_balance(callback.from_user.id, callback.message)
price = await get_price(callback.from_user.id)
user_id = callback.from_user.id
balance = await get_balance(user_id, callback.message)
price = await get_price(user_id)
if balance:
symbol = await rq.get_symbol(callback.from_user.id)
symbol = await rq.get_symbol(user_id)
text = (
f"💎 Торговля на Bybit\n\n"
f"⚖️ Ваш баланс (USDT): {balance}\n"
f"⚖️ Ваш баланс (USDT): {float(balance):.2f}\n"
f"📊 Текущая торговая пара: {symbol}\n"
f"$$$ Цена: {price}\n\n"
"Как начать торговлю?\n\n"
@@ -52,7 +51,6 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery) -> None:
"3⃣ Нажмите кнопку 'Выбрать тип входа' и после нажмите начать торговлю.\n"
)
await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
asyncio.create_task(start_execution_ws(callback.from_user.id, callback.message))
async def start_bybit_trade_message(message: Message) -> None:
@@ -240,6 +238,7 @@ async def start_trading_process(callback: CallbackQuery) -> None:
await message.answer("Начинаю торговлю с использованием текущих настроек...")
timer_data = await rq.get_user_timer(tg_id)
if isinstance(timer_data, dict):
timer_minute = timer_data.get('timer_minutes', 0)
@@ -247,15 +246,7 @@ async def start_trading_process(callback: CallbackQuery) -> None:
timer_minute = timer_data or 0
if timer_minute > 0:
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} отменена")
task = asyncio.create_task(trading_cycle(tg_id, message))
active_start_tasks[tg_id] = task
await handle_start_trading(tg_id, message)
await message.answer(f"Торговля начнётся через {timer_minute} мин. Для отмены нажмите кнопку ниже.",
reply_markup=inline_markup.cancel_start_markup)
await rq.update_user_timer(tg_id, minutes=0)
@@ -281,6 +272,9 @@ async def show_my_trades(callback: CallbackQuery) -> None:
@router_functions_bybit_trade.callback_query(F.data == "clb_open_deals")
async def show_my_trades_callback(callback: CallbackQuery):
"""
Показывает открытые позиции пользователя по символу.
"""
await callback.answer()
try:
@@ -373,13 +367,9 @@ async def cancel_start_callback(callback: CallbackQuery) -> None:
Отменяет задачу старта торговли по таймеру, если она активна.
"""
tg_id = callback.from_user.id
task = active_start_tasks.get(tg_id)
if task:
task.cancel()
del active_start_tasks[tg_id]
await callback.message.answer("Торговля по таймеру отменена.", reply_markup=inline_markup.back_to_main)
else:
await callback.message.answer("Нет активности для отмены.", reply_markup=inline_markup.back_to_main)
await handle_stop_close_trade(tg_id)
await callback.message.answer("Торговля по таймеру отменена.", reply_markup=inline_markup.back_to_main)
await callback.answer()
@@ -394,7 +384,7 @@ async def close_trade_callback(callback: CallbackQuery) -> None:
result = await close_user_trade(tg_id, symbol, message=callback.message)
if result:
await callback.message.answer("Сделка успешно закрыта.", reply_markup=inline_markup.back_to_main)
await handle_stop_trading(tg_id)
logger.info(f"Сделка {symbol} успешно закрыта.")
else:
logger.error(f"Не удалось закрыть сделку {symbol}.")
@@ -436,17 +426,7 @@ async def process_close_delay(message: Message, state: FSMContext) -> None:
delay = delay_minutes * 60
if tg_id in active_close_tasks:
old_task = active_close_tasks[tg_id]
if not old_task.done():
old_task.cancel()
try:
await old_task
except asyncio.CancelledError:
logger.info(f"Предыдущая задача закрытия сделки пользователя {tg_id} отменена")
task = asyncio.create_task(close_trade_after_delay(tg_id, message, symbol, delay))
active_close_tasks[tg_id] = task
await handle_start_close_trade(tg_id, message, symbol, delay)
await message.answer(f"Закрытие сделки {symbol} запланировано через {delay} секунд.",
reply_markup=inline_markup.cancel_start_markup)
@@ -458,11 +438,9 @@ async def reset_martingale(callback: CallbackQuery) -> None:
"""
Сбрасывает шаги мартингейла пользователя.
"""
await callback.answer()
tg_id = callback.from_user.id
await rq.update_martingale_step(tg_id, 0)
await callback.message.answer("Сброс шагов выполнен.",
reply_markup=inline_markup.back_to_main)
await callback.answer("Сброс шагов выполнен.")
@router_functions_bybit_trade.callback_query(F.data == "clb_cancel")