2
0
forked from kodorvan/stcs
This commit is contained in:
algizn97
2025-09-09 10:24:01 +05:00
parent 058ba09c03
commit cf581dc485
11 changed files with 670 additions and 428 deletions

View File

@@ -2,6 +2,7 @@
import logging.config
from aiogram import F, Router
from app.services.Bybit.functions.bybit_ws import run_ws_for_user
from app.telegram.functions.main_settings.settings import main_settings_message
from logger_helper.logger_helper import LOGGING_CONFIG
@@ -35,10 +36,13 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery) -> None:
Обработка нажатия кнопок запуска торговли или возврата в главное меню.
Отправляет информацию о балансе, символе, цене и инструкциях по торговле.
"""
tg_id = callback.from_user.id
message = callback.message
user_id = callback.from_user.id
balance = await get_balance(user_id, callback.message)
if balance:
await run_ws_for_user(tg_id, message)
symbol = await rq.get_symbol(user_id)
price = await get_price(user_id, symbol=symbol)
@@ -61,8 +65,11 @@ async def start_bybit_trade_message(message: Message) -> None:
вместе с инструкциями по началу торговли.
"""
balance = await get_balance(message.from_user.id, message)
tg_id = message.from_user.id
await run_ws_for_user(tg_id, message)
if balance:
await run_ws_for_user(tg_id, message)
symbol = await rq.get_symbol(message.from_user.id)
price = await get_price(message.from_user.id, symbol=symbol)
@@ -86,6 +93,7 @@ async def update_symbol_for_trade_message(callback: CallbackQuery, state: FSMCon
Начинает процедуру обновления торговой пары, переводит пользователя в состояние ожидания пары.
"""
await state.set_state(state_update_symbol.symbol)
await callback.answer()
await callback.message.answer(
text='Укажите торговую пару заглавными буквами без пробелов и лишних символов (пример: BTCUSDT): ',
@@ -99,7 +107,6 @@ async def update_symbol_for_trade(message: Message, state: FSMContext) -> None:
При успешном обновлении сохранит пару и отправит обновлённую информацию.
"""
user_input = message.text.strip().upper()
exists = await get_valid_symbols(message.from_user.id, user_input)
if not exists:
@@ -189,18 +196,25 @@ async def start_trading_process(callback: CallbackQuery) -> None:
"""
tg_id = callback.from_user.id
message = callback.message
await run_ws_for_user(tg_id, message)
await callback.answer()
data_main_stgs = await rq.get_user_main_settings(tg_id)
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')
starting_quantity = safe_float(data_main_stgs.get('starting_quantity'))
switch_state = data_main_stgs.get("switch_state", "По направлению")
side = None
if switch_mode == 'Включено':
switch_state = data_main_stgs.get('switch_state', 'Long')
side = 'Buy' if switch_state == 'Long' else 'Sell'
if trading_mode == 'Switch':
if switch_state == "По направлению":
side = data_main_stgs.get("last_side")
else:
side = data_main_stgs.get("last_side")
if side.lower() == "buy":
side = "Sell"
else:
side = "Buy"
else:
if trading_mode == 'Long':
side = 'Buy'
@@ -221,9 +235,9 @@ async def start_trading_process(callback: CallbackQuery) -> None:
timer_minute = timer_data or 0
if timer_minute > 0:
await message.answer(f"Торговля начнётся через {timer_minute} мин.")
await trading_cycle(tg_id, message, side=side, margin_mode=margin_mode, symbol=symbol,
starting_quantity=starting_quantity)
await message.answer(f"Торговля начнётся через {timer_minute} мин.")
await rq.update_user_timer(tg_id, minutes=0)
else:
await open_position(tg_id, message, side, margin_mode, symbol=symbol, quantity=starting_quantity)
@@ -437,7 +451,7 @@ async def process_close_delay(message: Message, state: FSMContext) -> None:
symbol = data.get("symbol")
delay = delay_minutes * 60
await message.answer(f"Закрытие сделки {symbol} запланировано через {delay_minutes} мин.")
await message.answer(f"Закрытие сделки {symbol} запланировано через {delay_minutes} мин.", reply_markup=inline_markup.back_to_main)
await close_trade_after_delay(message.from_user.id, message, symbol, delay)
await state.clear()
@@ -479,11 +493,11 @@ async def stop_immediately(callback: CallbackQuery):
@router_functions_bybit_trade.callback_query(F.data == "stop_with_timer")
async def stop_with_timer_start(callback: CallbackQuery, state: FSMContext):
"""
Запускает диалог с пользователем для задания задержки перед остановкой торговли.
Запускает диалог с пользователем для задания задержки до остановки торговли.
"""
await state.set_state(CloseTradeTimerState.waiting_for_trade)
await callback.message.answer("Введите задержку в минутах перед остановкой торговли:",
await callback.message.answer("Введите задержку в минутах до остановки торговли:",
reply_markup=inline_markup.cancel)
await callback.answer()
@@ -505,7 +519,7 @@ async def process_stop_delay(message: Message, state: FSMContext):
tg_id = message.from_user.id
delay_seconds = delay_minutes * 60
await message.answer(f"Торговля будет остановлена через {delay_minutes} минут.")
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("Автоматическая торговля остановлена.", reply_markup=inline_markup.back_to_main)