develop #3
@@ -2,12 +2,12 @@
|
|||||||
import logging.config
|
import logging.config
|
||||||
from aiogram import F, Router
|
from aiogram import F, Router
|
||||||
|
|
||||||
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 logger_helper.logger_helper import LOGGING_CONFIG
|
||||||
|
|
||||||
from app.services.Bybit.functions.Futures import (close_user_trade, open_position, set_take_profit_stop_loss, \
|
from app.services.Bybit.functions.Futures import (close_user_trade, set_take_profit_stop_loss, \
|
||||||
get_active_positions_by_symbol, get_active_orders_by_symbol,
|
get_active_positions_by_symbol, get_active_orders_by_symbol,
|
||||||
get_active_positions, get_active_orders, cancel_all_tp_sl_orders,
|
get_active_positions, get_active_orders, cancel_all_tp_sl_orders,
|
||||||
|
trading_cycle, open_position, close_trade_after_delay,
|
||||||
)
|
)
|
||||||
from app.services.Bybit.functions.balance import get_balance
|
from app.services.Bybit.functions.balance import get_balance
|
||||||
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
import app.telegram.Keyboards.inline_keyboards as inline_markup
|
||||||
@@ -50,7 +50,7 @@ async def clb_start_bybit_trade_message(callback: CallbackQuery) -> None:
|
|||||||
"Как начать торговлю?\n\n"
|
"Как начать торговлю?\n\n"
|
||||||
"1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.\n"
|
"1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.\n"
|
||||||
"2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару, без лишних символов (например: BTCUSDT).\n"
|
"2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару, без лишних символов (например: BTCUSDT).\n"
|
||||||
"3️⃣ Нажмите кнопку 'Выбрать тип входа' и после нажмите начать торговлю.\n"
|
"3️⃣ Нажмите кнопку 'Начать торговать'.\n"
|
||||||
)
|
)
|
||||||
await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
await callback.message.edit_text(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ async def start_bybit_trade_message(message: Message) -> None:
|
|||||||
"Как начать торговлю?\n\n"
|
"Как начать торговлю?\n\n"
|
||||||
"1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.\n"
|
"1️⃣ Проверьте и тщательно настройте все параметры в вашем профиле.\n"
|
||||||
"2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару, без лишних символов (например: BTCUSDT).\n"
|
"2️⃣ Нажмите ниже кнопку 'Указать торговую пару' и введите торговую пару, без лишних символов (например: BTCUSDT).\n"
|
||||||
"3️⃣ Нажмите кнопку 'Выбрать тип входа' и после нажмите начать торговлю.\n"
|
"3️⃣ Нажмите кнопку 'Начать торговать'.\n"
|
||||||
)
|
)
|
||||||
|
|
||||||
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
await message.answer(text=text, parse_mode='html', reply_markup=inline_markup.trading_markup)
|
||||||
@@ -124,6 +124,7 @@ async def update_entry_type_message(callback: CallbackQuery, state: FSMContext)
|
|||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:'))
|
@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith('entry_order_type:'))
|
||||||
async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext) -> None:
|
async def entry_order_type_callback(callback: CallbackQuery, state: FSMContext) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -196,13 +197,14 @@ async def start_trading_process(callback: CallbackQuery) -> None:
|
|||||||
symbol = await rq.get_symbol(tg_id)
|
symbol = await rq.get_symbol(tg_id)
|
||||||
margin_mode = data_main_stgs.get('margin_type', 'Isolated')
|
margin_mode = data_main_stgs.get('margin_type', 'Isolated')
|
||||||
trading_mode = data_main_stgs.get('trading_mode')
|
trading_mode = data_main_stgs.get('trading_mode')
|
||||||
|
switch_mode = data_main_stgs.get('switch_mode_enabled')
|
||||||
|
|
||||||
if not api_key or not secret_key:
|
if not api_key or not secret_key:
|
||||||
await message.answer("❗️ У вас не настроены API ключи для Bybit.")
|
await message.answer("❗️ У вас не настроены API ключи для Bybit.")
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
return
|
return
|
||||||
|
|
||||||
if trading_mode not in ['Long', 'Short', 'Smart', 'Switch']:
|
if trading_mode not in ['Long', 'Short', 'Smart']:
|
||||||
await message.answer(f"❗️ Некорректный торговый режим: {trading_mode}")
|
await message.answer(f"❗️ Некорректный торговый режим: {trading_mode}")
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
return
|
return
|
||||||
@@ -228,15 +230,20 @@ async def start_trading_process(callback: CallbackQuery) -> None:
|
|||||||
f"(текущий режим: {existing_margin_mode})", show_alert=True)
|
f"(текущий режим: {existing_margin_mode})", show_alert=True)
|
||||||
return
|
return
|
||||||
|
|
||||||
if trading_mode == 'Long':
|
side = None
|
||||||
side = 'Buy'
|
if switch_mode == 'Включено':
|
||||||
elif trading_mode == 'Short':
|
switch_state = data_main_stgs.get('switch_state', 'Long')
|
||||||
side = 'Sell'
|
side = 'Buy' if switch_state == 'Long' else 'Sell'
|
||||||
else:
|
else:
|
||||||
await message.answer(f"Режим торговли '{trading_mode}' пока не поддерживается.",
|
if trading_mode == 'Long':
|
||||||
reply_markup=inline_markup.back_to_main)
|
side = 'Buy'
|
||||||
await callback.answer()
|
elif trading_mode == 'Short':
|
||||||
return
|
side = 'Sell'
|
||||||
|
else:
|
||||||
|
await message.answer(f"Режим торговли '{trading_mode}' пока не поддерживается.",
|
||||||
|
reply_markup=inline_markup.back_to_main)
|
||||||
|
await callback.answer()
|
||||||
|
return
|
||||||
|
|
||||||
await message.answer("Начинаю торговлю с использованием текущих настроек...")
|
await message.answer("Начинаю торговлю с использованием текущих настроек...")
|
||||||
|
|
||||||
@@ -248,12 +255,11 @@ async def start_trading_process(callback: CallbackQuery) -> None:
|
|||||||
timer_minute = timer_data or 0
|
timer_minute = timer_data or 0
|
||||||
|
|
||||||
if timer_minute > 0:
|
if timer_minute > 0:
|
||||||
await handle_start_trading(tg_id, message, side=side, margin_mode=margin_mode, use_timer=True)
|
await trading_cycle(tg_id, message)
|
||||||
await message.answer(f"Торговля начнётся через {timer_minute} мин. Для отмены нажмите кнопку ниже.",
|
await message.answer(f"Торговля начнётся через {timer_minute} мин.")
|
||||||
reply_markup=inline_markup.cancel_start_markup)
|
|
||||||
await rq.update_user_timer(tg_id, minutes=0)
|
await rq.update_user_timer(tg_id, minutes=0)
|
||||||
else:
|
else:
|
||||||
await handle_start_trading(tg_id, message, side=side, margin_mode=margin_mode, use_timer=False)
|
await open_position(tg_id, message, side, margin_mode)
|
||||||
|
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
@@ -292,6 +298,7 @@ async def show_deal_callback(callback_query: CallbackQuery) -> None:
|
|||||||
await callback_query.answer()
|
await callback_query.answer()
|
||||||
try:
|
try:
|
||||||
symbol = callback_query.data[len("show_deal_"):]
|
symbol = callback_query.data[len("show_deal_"):]
|
||||||
|
await rq.update_symbol(callback_query.from_user.id, symbol)
|
||||||
tg_id = callback_query.from_user.id
|
tg_id = callback_query.from_user.id
|
||||||
await get_active_positions_by_symbol(tg_id, symbol, message=callback_query.message)
|
await get_active_positions_by_symbol(tg_id, symbol, message=callback_query.message)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -321,6 +328,7 @@ async def show_limit_callback(callback_query: CallbackQuery) -> None:
|
|||||||
await callback_query.answer()
|
await callback_query.answer()
|
||||||
try:
|
try:
|
||||||
symbol = callback_query.data[len("show_limit_"):]
|
symbol = callback_query.data[len("show_limit_"):]
|
||||||
|
await rq.update_symbol(callback_query.from_user.id, symbol)
|
||||||
tg_id = callback_query.from_user.id
|
tg_id = callback_query.from_user.id
|
||||||
await get_active_orders_by_symbol(tg_id, symbol, message=callback_query.message)
|
await get_active_orders_by_symbol(tg_id, symbol, message=callback_query.message)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -391,18 +399,6 @@ async def process_stop_loss(message: Message, state: FSMContext) -> None:
|
|||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
|
|
||||||
@router_functions_bybit_trade.callback_query(F.data == "clb_stop_timer")
|
|
||||||
async def cancel_start_callback(callback: CallbackQuery) -> None:
|
|
||||||
"""
|
|
||||||
Отменяет задачу старта торговли по таймеру, если она активна.
|
|
||||||
"""
|
|
||||||
tg_id = callback.from_user.id
|
|
||||||
await handle_stop_close_trade(tg_id)
|
|
||||||
|
|
||||||
await callback.message.answer("Торговля по таймеру отменена.", reply_markup=inline_markup.back_to_main)
|
|
||||||
await callback.answer()
|
|
||||||
|
|
||||||
|
|
||||||
@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith("close_deal:"))
|
@router_functions_bybit_trade.callback_query(lambda c: c.data and c.data.startswith("close_deal:"))
|
||||||
async def close_trade_callback(callback: CallbackQuery) -> None:
|
async def close_trade_callback(callback: CallbackQuery) -> None:
|
||||||
"""
|
"""
|
||||||
@@ -414,7 +410,6 @@ async def close_trade_callback(callback: CallbackQuery) -> None:
|
|||||||
result = await close_user_trade(tg_id, symbol, message=callback.message)
|
result = await close_user_trade(tg_id, symbol, message=callback.message)
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
await handle_stop_trading(tg_id)
|
|
||||||
logger.info(f"Сделка {symbol} успешно закрыта.")
|
logger.info(f"Сделка {symbol} успешно закрыта.")
|
||||||
else:
|
else:
|
||||||
logger.error(f"Не удалось закрыть сделку {symbol}.")
|
logger.error(f"Не удалось закрыть сделку {symbol}.")
|
||||||
@@ -434,7 +429,6 @@ async def close_trade_callback(callback: CallbackQuery) -> None:
|
|||||||
result = await cancel_all_tp_sl_orders(tg_id, symbol)
|
result = await cancel_all_tp_sl_orders(tg_id, symbol)
|
||||||
|
|
||||||
if result:
|
if result:
|
||||||
await callback.message.answer(f"Ордер {result} успешно закрыт.", reply_markup=inline_markup.back_to_main)
|
|
||||||
logger.info(f"Ордер {result} успешно закрыт.")
|
logger.info(f"Ордер {result} успешно закрыт.")
|
||||||
else:
|
else:
|
||||||
await callback.message.answer(f"Не удалось закрыть ордер {result}.")
|
await callback.message.answer(f"Не удалось закрыть ордер {result}.")
|
||||||
@@ -450,7 +444,7 @@ async def ask_close_delay(callback: CallbackQuery, state: FSMContext) -> None:
|
|||||||
symbol = callback.data.split(":")[1]
|
symbol = callback.data.split(":")[1]
|
||||||
await state.update_data(symbol=symbol)
|
await state.update_data(symbol=symbol)
|
||||||
await state.set_state(CloseTradeTimerState.waiting_for_delay)
|
await state.set_state(CloseTradeTimerState.waiting_for_delay)
|
||||||
await callback.message.answer("Введите задержку в минутах до закрытия сделки (например, 60):",
|
await callback.message.answer("Введите задержку в минутах до закрытия сделки:",
|
||||||
reply_markup=inline_markup.cancel)
|
reply_markup=inline_markup.cancel)
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
@@ -458,7 +452,7 @@ async def ask_close_delay(callback: CallbackQuery, state: FSMContext) -> None:
|
|||||||
@router_functions_bybit_trade.message(CloseTradeTimerState.waiting_for_delay)
|
@router_functions_bybit_trade.message(CloseTradeTimerState.waiting_for_delay)
|
||||||
async def process_close_delay(message: Message, state: FSMContext) -> None:
|
async def process_close_delay(message: Message, state: FSMContext) -> None:
|
||||||
"""
|
"""
|
||||||
Обрабатывает ввод задержки и запускает задачу закрытия сделки с задержкой.
|
Обрабатывает ввод закрытия сделки с задержкой.
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
delay_minutes = int(message.text.strip())
|
delay_minutes = int(message.text.strip())
|
||||||
@@ -471,14 +465,10 @@ async def process_close_delay(message: Message, state: FSMContext) -> None:
|
|||||||
|
|
||||||
data = await state.get_data()
|
data = await state.get_data()
|
||||||
symbol = data.get("symbol")
|
symbol = data.get("symbol")
|
||||||
tg_id = message.from_user.id
|
|
||||||
|
|
||||||
delay = delay_minutes * 60
|
delay = delay_minutes * 60
|
||||||
|
await message.answer(f"Закрытие сделки {symbol} запланировано через {delay_minutes} мин.")
|
||||||
await handle_start_close_trade(tg_id, message, symbol, delay)
|
await close_trade_after_delay(message.from_user.id, message, symbol, delay)
|
||||||
|
|
||||||
await message.answer(f"Закрытие сделки {symbol} запланировано через {delay} секунд.",
|
|
||||||
reply_markup=inline_markup.cancel_start_markup)
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
|
|
||||||
@@ -509,7 +499,7 @@ async def stop_immediately(callback: CallbackQuery):
|
|||||||
"""
|
"""
|
||||||
tg_id = callback.from_user.id
|
tg_id = callback.from_user.id
|
||||||
|
|
||||||
await handle_stop_trading(tg_id, use_timer=False)
|
await rq.update_trigger(tg_id, "Ручной")
|
||||||
await callback.message.answer("Торговля остановлена.", reply_markup=inline_markup.back_to_main)
|
await callback.message.answer("Торговля остановлена.", reply_markup=inline_markup.back_to_main)
|
||||||
await callback.answer()
|
await callback.answer()
|
||||||
|
|
||||||
@@ -540,16 +530,12 @@ async def process_stop_delay(message: Message, state: FSMContext):
|
|||||||
tg_id = message.from_user.id
|
tg_id = message.from_user.id
|
||||||
delay_seconds = delay_minutes * 60
|
delay_seconds = delay_minutes * 60
|
||||||
|
|
||||||
# Остановка задачи с таймером через заданную задержку
|
await message.answer(f"Торговля будет остановлена через {delay_minutes} минут.",
|
||||||
# Можно реализовать через запуск отдельной асинхронной задачи, которая через delay_seconds отменит торговый цикл
|
reply_markup=inline_markup.back_to_main)
|
||||||
async def delayed_stop():
|
await asyncio.sleep(delay_seconds)
|
||||||
await asyncio.sleep(delay_seconds)
|
await rq.update_trigger(tg_id, "Ручной")
|
||||||
await handle_stop_trading(tg_id, use_timer=True)
|
await message.answer("Торговля по таймеру остановлена.")
|
||||||
await message.answer("Торговля по таймеру остановлена.")
|
|
||||||
|
|
||||||
asyncio.create_task(delayed_stop())
|
|
||||||
|
|
||||||
await message.answer(f"Торговля будет остановлена через {delay_minutes} минут.", reply_markup=inline_markup.back_to_main)
|
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|
||||||
|
|
||||||
|
@@ -10,7 +10,7 @@ async def start_message(message):
|
|||||||
username = message.from_user.first_name
|
username = message.from_user.first_name
|
||||||
else:
|
else:
|
||||||
username = f'{message.from_user.first_name} {message.from_user.last_name}'
|
username = f'{message.from_user.first_name} {message.from_user.last_name}'
|
||||||
await message.answer(f""" Привет <b>{username}</b>! 👋""", parse_mode='html', reply_markup=reply_markup.base_buttons_markup)
|
await message.answer(f""" Привет <b>{username}</b>! 👋""", parse_mode='html')
|
||||||
await message.answer("Добро пожаловать в чат-робот для автоматизации трейдинга — вашего надежного помощника для анализа рынка и принятия взвешенных решений.",
|
await message.answer("Добро пожаловать в чат-робот для автоматизации трейдинга — вашего надежного помощника для анализа рынка и принятия взвешенных решений.",
|
||||||
parse_mode='html', reply_markup=inline_markup.start_markup)
|
parse_mode='html', reply_markup=inline_markup.start_markup)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user