This commit is contained in:
algizn97
2025-10-04 11:03:49 +05:00
parent 220c45d54c
commit 01fe339d56
5 changed files with 82 additions and 39 deletions

View File

@@ -123,7 +123,7 @@ async def start_trading_cycle(
"Order does not meet minimum order value",
"position idx not match position mode",
"Qty invalid",
"The number of contracts exceeds maximum limit allowed"
"The number of contracts exceeds maximum limit allowed",
}
else None
)
@@ -241,7 +241,7 @@ async def trading_cycle(
"Risk is too high for this trade",
"ab not enough for new order",
"InvalidRequestError",
"The number of contracts exceeds maximum limit allowed"
"The number of contracts exceeds maximum limit allowed",
}
else None
)

View File

@@ -163,9 +163,7 @@ class TelegramMessageHandler:
auto_trading = (
user_auto_trading.auto_trading if user_auto_trading else False
)
user_symbols = (
user_auto_trading.symbol if user_auto_trading else None
)
user_symbols = user_auto_trading.symbol if user_auto_trading else None
if (
auto_trading
@@ -181,10 +179,16 @@ class TelegramMessageHandler:
r_side = "Sell"
else:
r_side = "Buy"
await rq.set_auto_trading(tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side)
user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol)
await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side
)
user_deals_data = await rq.get_user_deal_by_symbol(
tg_id=tg_id, symbol=symbol
)
if user_deals_data and user_deals_data.switch_side_mode:
await rq.set_auto_trading(tg_id=tg_id, symbol=symbol, auto_trading=False, side=side)
await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=side
)
else:
open_order_text = "\n❗️ Сделка закрылась в минус, открываю новую сделку с увеличенной ставкой.\n"
await self.telegram_bot.send_message(
@@ -214,10 +218,15 @@ class TelegramMessageHandler:
await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=r_side
)
user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol)
user_deals_data = await rq.get_user_deal_by_symbol(
tg_id=tg_id, symbol=symbol
)
if user_deals_data and user_deals_data.switch_side_mode:
await rq.set_auto_trading(
tg_id=tg_id, symbol=symbol, auto_trading=False, side=side
tg_id=tg_id,
symbol=symbol,
auto_trading=False,
side=side,
)
await self.telegram_bot.send_message(
chat_id=tg_id,

View File

@@ -146,7 +146,6 @@ async def get_liquidation_price(
risk_level = risk_list[0] if risk_list else {}
maintenance_margin_rate = safe_float(risk_level.get("maintenanceMargin"))
liq_price_long = entry_price * (1 - 1 / leverage + maintenance_margin_rate)
liq_price_short = entry_price * (1 + 1 / leverage - maintenance_margin_rate)

View File

@@ -186,7 +186,9 @@ async def settings_for_margin_type(
try:
await state.clear()
await callback_query.message.edit_text(
text="Выберите тип маржи:", reply_markup=kbi.margin_type
text="Выберите тип маржи:\n\n"
"Примечание: Если у вас есть открытые позиции, то маржа примениться ко всем позициям",
reply_markup=kbi.margin_type
)
logger.debug(
"Command margin_type processed successfully for user: %s",

View File

@@ -5,13 +5,17 @@ from aiogram import F, Router
from aiogram.fsm.context import FSMContext
from aiogram.types import CallbackQuery
from app.telegram.tasks.tasks import add_start_task_merged, cancel_start_task_merged, add_start_task_switch, \
cancel_start_task_switch
import app.telegram.keyboards.inline as kbi
import database.request as rq
from app.bybit.get_functions.get_positions import get_active_positions_by_symbol
from app.bybit.open_positions import start_trading_cycle
from app.helper_functions import safe_float
from app.telegram.tasks.tasks import (
add_start_task_merged,
add_start_task_switch,
cancel_start_task_merged,
cancel_start_task_switch,
)
from logger_helper.logger_helper import LOGGING_CONFIG
logging.config.dictConfig(LOGGING_CONFIG)
@@ -50,30 +54,30 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non
if position_idx != 0 and safe_float(size) > 0 and trade_mode == "Merged_Single":
await callback_query.answer(
text="У вас есть активная позиция в режиме хеджирования. "
"Открытие сделки в одностороннем режиме невозможно.",
"Открытие сделки в одностороннем режиме невозможно.",
)
return
if position_idx == 0 and safe_float(size) > 0 and trade_mode == "Both_Sides":
await callback_query.answer(
text="У вас есть активная позиция в одностороннем режиме. "
"Открытие сделки в режиме хеджирования невозможно.",
"Открытие сделки в режиме хеджирования невозможно.",
)
return
if trade_mode == "Merged_Single":
await callback_query.message.edit_text(
text="Выберите режим торговли:\n\n"
"Лонг - все сделки серии открываются на покупку.\n"
"Шорт - все сделки серии открываются на продажу.\n"
"Свитч - направление каждой сделки серии меняется по переменно.\n",
"Лонг - все сделки серии открываются на покупку.\n"
"Шорт - все сделки серии открываются на продажу.\n"
"Свитч - направление каждой сделки серии меняется по переменно.\n",
reply_markup=kbi.merged_start_trading,
)
else: # trade_mode == "Both_Sides":
await callback_query.message.edit_text(
text="Выберите режим торговли:\n\n"
"Лонг - все сделки открываются на покупку.\n"
"Шорт - все сделки открываются на продажу.\n",
"Лонг - все сделки открываются на покупку.\n"
"Шорт - все сделки открываются на продажу.\n",
reply_markup=kbi.both_start_trading,
)
logger.debug(
@@ -144,7 +148,10 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) -
await asyncio.sleep(timer_start * 60)
await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=side
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=True,
side=side,
)
res = await start_trading_cycle(
tg_id=callback_query.from_user.id,
@@ -170,10 +177,15 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) -
await state.clear()
else:
await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, side=side
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=False,
side=side,
)
text = error_messages.get(res, "Произошла ошибка при запуске торговли")
await callback_query.message.edit_text(text=text, reply_markup=kbi.profile_bybit)
await callback_query.message.edit_text(
text=text, reply_markup=kbi.profile_bybit
)
await callback_query.message.edit_text("Запуск торговли...")
task = asyncio.create_task(delay_start())
@@ -192,7 +204,7 @@ async def start_trading_long(callback_query: CallbackQuery, state: FSMContext) -
@router_start_trading.callback_query(lambda c: c.data == "switch")
async def start_trading_switch(
callback_query: CallbackQuery, state: FSMContext
callback_query: CallbackQuery, state: FSMContext
) -> None:
"""
Handles the "switch" callback query.
@@ -205,10 +217,10 @@ async def start_trading_switch(
await state.clear()
await callback_query.message.edit_text(
text="Выберите направление первой сделки серии:\n\n"
"Лонг - открывается первая сделка на покупку.\n"
"Шорт - открывается первая сделка на продажу.\n"
"По направлению - сделка открывается в направлении последней сделки предыдущей серии.\n"
"Противоположно - сделка открывается в противоположном направлении последней сделки предыдущей серии.\n",
"Лонг - открывается первая сделка на покупку.\n"
"Шорт - открывается первая сделка на продажу.\n"
"По направлению - сделка открывается в направлении последней сделки предыдущей серии.\n"
"Противоположно - сделка открывается в противоположном направлении последней сделки предыдущей серии.\n",
reply_markup=kbi.switch_side,
)
except Exception as e:
@@ -222,7 +234,7 @@ async def start_trading_switch(
@router_start_trading.callback_query(
lambda c: c.data
in {"switch_long", "switch_short", "switch_direction", "switch_opposite"}
in {"switch_long", "switch_short", "switch_direction", "switch_opposite"}
)
async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None:
"""
@@ -298,13 +310,21 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None
)
await asyncio.sleep(timer_start * 60)
await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=side
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=True,
side=side,
)
if side == "Buy":
r_side = "Sell"
else:
r_side = "Buy"
await rq.set_auto_trading(tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=True, side=r_side)
await rq.set_auto_trading(
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=True,
side=r_side,
)
res = await start_trading_cycle(
tg_id=callback_query.from_user.id,
side=side,
@@ -329,16 +349,25 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None
await state.clear()
else:
await rq.set_auto_trading(
tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False, side=side
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=False,
side=side,
)
if side == "Buy":
r_side = "Sell"
else:
r_side = "Buy"
await rq.set_auto_trading(tg_id=callback_query.from_user.id, symbol=symbol, auto_trading=False,
side=r_side)
await rq.set_auto_trading(
tg_id=callback_query.from_user.id,
symbol=symbol,
auto_trading=False,
side=r_side,
)
text = error_messages.get(res, "Произошла ошибка при запуске торговли")
await callback_query.message.edit_text(text=text, reply_markup=kbi.profile_bybit)
await callback_query.message.edit_text(
text=text, reply_markup=kbi.profile_bybit
)
await callback_query.message.edit_text("Запуск торговли...")
task = asyncio.create_task(delay_start())
@@ -354,9 +383,11 @@ async def start_switch(callback_query: CallbackQuery, state: FSMContext) -> None
)
@router_start_trading.callback_query(lambda c: c.data == "cancel_timer_merged" or c.data == "cancel_timer_switch")
@router_start_trading.callback_query(
lambda c: c.data == "cancel_timer_merged" or c.data == "cancel_timer_switch"
)
async def cancel_start_trading(
callback_query: CallbackQuery, state: FSMContext
callback_query: CallbackQuery, state: FSMContext
) -> None:
"""
Handles the "cancel_timer" callback query.
@@ -371,7 +402,9 @@ async def cancel_start_trading(
cancel_start_task_merged(user_id=callback_query.from_user.id)
elif callback_query.data == "cancel_timer_switch":
cancel_start_task_switch(user_id=callback_query.from_user.id)
await callback_query.message.edit_text(text="Запуск торговли отменен", reply_markup=kbi.profile_bybit)
await callback_query.message.edit_text(
text="Запуск торговли отменен", reply_markup=kbi.profile_bybit
)
except Exception as e:
await callback_query.answer("Произошла ошибка при отмене запуска торговли")
logger.error(