diff --git a/app/bybit/open_positions.py b/app/bybit/open_positions.py index 9ccb188..5fe98b2 100644 --- a/app/bybit/open_positions.py +++ b/app/bybit/open_positions.py @@ -30,7 +30,7 @@ async def start_trading_cycle( risk_management_data = await rq.get_user_risk_management(tg_id=tg_id) trade_mode = additional_data.trade_mode switch_side = additional_data.switch_side - side= additional_data.side + side = additional_data.side margin_type = additional_data.margin_type leverage = additional_data.leverage order_quantity = additional_data.order_quantity @@ -107,7 +107,8 @@ async def start_trading_cycle( "position idx not match position mode", "Qty invalid", "The number of contracts exceeds maximum limit allowed", - "The number of contracts exceeds minimum limit allowed" + "The number of contracts exceeds minimum limit allowed", + "Order placement failed as your position may exceed the max", } else None ) @@ -193,6 +194,7 @@ async def trading_cycle_profit( "ab not enough for new order", "InvalidRequestError", "The number of contracts exceeds maximum limit allowed", + "Order placement failed as your position may exceed the max", } else None ) @@ -293,6 +295,7 @@ async def trading_cycle( "ab not enough for new order", "InvalidRequestError", "The number of contracts exceeds maximum limit allowed", + "Order placement failed as your position may exceed the max", } else None ) @@ -363,6 +366,7 @@ async def open_positions( "Qty invalid": "Qty invalid", "The number of contracts exceeds maximum limit allowed": "The number of contracts exceeds maximum limit allowed", "The number of contracts exceeds minimum limit allowed": "The number of contracts exceeds minimum limit allowed", + "Order placement failed as your position may exceed the max": "Order placement failed as your position may exceed the max", } for key, msg in known_errors.items(): if key in error_text: diff --git a/app/bybit/telegram_message_handler.py b/app/bybit/telegram_message_handler.py index b5d874b..90b75a2 100644 --- a/app/bybit/telegram_message_handler.py +++ b/app/bybit/telegram_message_handler.py @@ -64,6 +64,14 @@ class TelegramMessageHandler: exec_fees = format_value(execution.get("execFee")) fee_rate = format_value(execution.get("feeRate")) side = format_value(execution.get("side")) + + user_auto_trading = await rq.get_user_auto_trading( + tg_id=tg_id, symbol=symbol + ) + auto_trading = ( + user_auto_trading.auto_trading if user_auto_trading else False + ) + side_rus = ( "Покупка" if side == "Buy" @@ -81,10 +89,6 @@ class TelegramMessageHandler: tg_id=tg_id, symbol=symbol, fee=safe_float(exec_fee) ) - user_auto_trading = await rq.get_user_auto_trading( - tg_id=tg_id, symbol=symbol - ) - get_total_fee = user_auto_trading.total_fee total_fee = safe_float(exec_fee) + safe_float(get_total_fee) @@ -96,15 +100,11 @@ class TelegramMessageHandler: "Сделка закрыта:" if safe_float(closed_size) > 0 else "Сделка открыта:" ) text = f"{header}\n" f"Торговая пара: {symbol}\n" - - auto_trading = ( - user_auto_trading.auto_trading if user_auto_trading else False - ) user_deals_data = await rq.get_user_deal_by_symbol( tg_id=tg_id, symbol=symbol ) - commission_fee = user_deals_data.commission_fee - commission_place = user_deals_data.commission_place + commission_fee = user_deals_data.commission_fee or "Yes_commission_fee" + commission_place = user_deals_data.commission_place or "Commission_for_qty" current_series = user_deals_data.current_series current_step = user_deals_data.current_step order_quantity = user_deals_data.order_quantity @@ -175,26 +175,34 @@ class TelegramMessageHandler: take_profit_price = max(take_profit_price, 0) stop_loss_price = max(stop_loss_price, 0) - await set_tp_sl_for_position(tg_id=tg_id, - symbol=symbol, - take_profit_price=take_profit_price, - stop_loss_price=stop_loss_price, - position_idx=0) + ress = await set_tp_sl_for_position(tg_id=tg_id, + symbol=symbol, + take_profit_price=take_profit_price, + stop_loss_price=stop_loss_price, + position_idx=0) + if ress: + take_profit_truncated = await truncate_float(take_profit_price, 6) + stop_loss_truncated = await truncate_float(stop_loss_price, 6) - take_profit_truncated = await truncate_float(take_profit_price, 4) - stop_loss_truncated = await truncate_float(stop_loss_price, 4) + text += (f"Движение: {side_rus}\n" + f"Тейк-профит: {take_profit_truncated}\n" + f"Стоп-лосс: {stop_loss_truncated}\n" + ) + else: + text += (f"Движение: {side_rus}\n" + "Не удалось установить ТП и СЛ\n") - text += (f"Движение: {side_rus}\n" - f"Тейк-профит: {take_profit_truncated}\n" - f"Стоп-лосс: {stop_loss_truncated}\n" - ) else: - new_pnl = safe_float(pnl_series) + total_pnl - await rq.set_pnl_series_by_symbol( - tg_id=tg_id, symbol=symbol, pnl_series=new_pnl) - text += f"\nДоход: {ex_pnl:.4f}\n" - text += f"Реализованный PNL: {total_pnl:.4f}\n" - text += f"Прибыль серии: {safe_float(new_pnl):.4f}\n" + if auto_trading: + new_pnl = safe_float(pnl_series) + total_pnl + await rq.set_pnl_series_by_symbol( + tg_id=tg_id, symbol=symbol, pnl_series=new_pnl) + text += f"\nПрибыль без комиссии: {ex_pnl:.4f}\n" + text += f"Реализованная прибыль: {total_pnl:.4f}\n" + text += f"Прибыль серии: {safe_float(new_pnl):.4f}\n" + else: + text += f"\nПрибыль без комиссии: {ex_pnl:.4f}\n" + text += f"Реализованная прибыль: {total_pnl:.4f}\n" await self.telegram_bot.send_message( chat_id=tg_id, text=text, reply_markup=kbi.profile_bybit @@ -203,9 +211,9 @@ class TelegramMessageHandler: user_symbols = user_auto_trading.symbol if user_auto_trading else None if ( - auto_trading - and safe_float(closed_size) > 0 - and user_symbols is not None + auto_trading + and safe_float(closed_size) > 0 + and user_symbols is not None ): if safe_float(pnl) > 0: profit_text = "📈 Начинаю новую серию с базовой ставки\n" @@ -240,6 +248,7 @@ class TelegramMessageHandler: "ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли", "InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.", "The number of contracts exceeds maximum limit allowed": "❗️ Превышен максимальный лимит ставки", + "Order placement failed as your position may exceed the max": "❗️ Превышен максимальный лимит ставки", } error_text = errors.get( res, "❗️ Не удалось открыть новую сделку" @@ -283,6 +292,7 @@ class TelegramMessageHandler: "ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли", "InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.", "The number of contracts exceeds maximum limit allowed": "❗️ Превышен максимальный лимит ставки", + "Order placement failed as your position may exceed the max": "❗️ Превышен максимальный лимит ставки", } error_text = errors.get( res, "❗️ Не удалось открыть новую сделку" @@ -302,6 +312,5 @@ class TelegramMessageHandler: text=error_text, reply_markup=kbi.profile_bybit, ) - except Exception as e: logger.error("Error in telegram_message_handler: %s", e, exc_info=True) diff --git a/app/telegram/handlers/start_trading.py b/app/telegram/handlers/start_trading.py index 440f35c..e410d61 100644 --- a/app/telegram/handlers/start_trading.py +++ b/app/telegram/handlers/start_trading.py @@ -97,7 +97,8 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non "Limit price is out min price": "Цена лимитного ордера меньше допустимого", "Limit price is out max price": "Цена лимитного ордера больше допустимого", "Risk is too high for this trade": "Риск сделки превышает допустимый убыток", - "estimated will trigger liq": "Лимитный ордер может вызвать мгновенную ликвидацию. Проверьте параметры ордера.", + "estimated will trigger liq": "Лимитный ордер может вызвать мгновенную ликвидацию. " + "Проверьте параметры ордера.", "ab not enough for new order": "Недостаточно средств для создания нового ордера", "InvalidRequestError": "Произошла ошибка при запуске торговли.", "Order does not meet minimum order value": "Сумма ставки меньше допустимого для запуска торговли. " @@ -106,6 +107,9 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non "Qty invalid": "Некорректное значение ставки для данного инструмента", "The number of contracts exceeds maximum limit allowed": "️️Превышен максимальный лимит ставки", "The number of contracts exceeds minimum limit allowed": "️️Лимит ставки меньше минимально допустимого", + "Order placement failed as your position may exceed the max": + "Не удалось разместить ордер, так как ваша позиция может превышать максимальный лимит." + "Пожалуйста, уменьшите кредитное плечо, чтобы увеличить максимальное значение" } if res == "OK": @@ -141,7 +145,7 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non lambda c: c.data == "cancel_timer_merged" ) async def cancel_start_trading( - callback_query: CallbackQuery, state: FSMContext + callback_query: CallbackQuery, state: FSMContext ) -> None: """ Handles the "cancel_timer" callback query.