diff --git a/app/bybit/telegram_message_handler.py b/app/bybit/telegram_message_handler.py index f2a3407..a17ac58 100644 --- a/app/bybit/telegram_message_handler.py +++ b/app/bybit/telegram_message_handler.py @@ -4,7 +4,6 @@ import math import app.telegram.keyboards.inline as kbi import database.request as rq from app.bybit.get_functions.get_instruments_info import get_instruments_info -from app.bybit.get_functions.get_positions import get_active_positions_by_symbol from app.bybit.logger_bybit.logger_bybit import LOGGING_CONFIG from app.bybit.open_positions import trading_cycle, trading_cycle_profit from app.bybit.set_functions.set_tp_sl import set_tp_sl_for_position @@ -123,7 +122,6 @@ class TelegramMessageHandler: current_step = user_deals_data.current_step order_quantity = user_deals_data.order_quantity pnl_series = user_deals_data.pnl_series - margin_type = user_deals_data.margin_type take_profit_percent = user_deals_data.take_profit_percent stop_loss_percent = user_deals_data.stop_loss_percent leverage = safe_float(user_deals_data.leverage) @@ -167,24 +165,14 @@ class TelegramMessageHandler: if commission_place == "Commission_for_tp": total_commission = safe_float(total_fee) / qty_formatted - if margin_type == "ISOLATED_MARGIN": - if side == "Buy": - take_profit_price = safe_float(exec_price) * ( - 1 + take_profit_percent / 100) + total_commission - stop_loss_price = None - else: - take_profit_price = safe_float(exec_price) * ( - 1 - take_profit_percent / 100) - total_commission - stop_loss_price = None + if side == "Buy": + take_profit_price = safe_float(exec_price) * ( + 1 + take_profit_percent / 100) + total_commission + stop_loss_price = safe_float(exec_price) * (1 - stop_loss_percent / 100) else: - if side == "Buy": - take_profit_price = safe_float(exec_price) * ( - 1 + take_profit_percent / 100) + total_commission - stop_loss_price = safe_float(exec_price) * (1 - stop_loss_percent / 100) - else: - take_profit_price = safe_float(exec_price) * ( - 1 - take_profit_percent / 100) - total_commission - stop_loss_price = safe_float(exec_price) * (1 + stop_loss_percent / 100) + take_profit_price = safe_float(exec_price) * ( + 1 - take_profit_percent / 100) - total_commission + stop_loss_price = safe_float(exec_price) * (1 + stop_loss_percent / 100) ress = await set_tp_sl_for_position(tg_id=tg_id, symbol=symbol, @@ -193,27 +181,11 @@ class TelegramMessageHandler: position_idx=0) if ress or ress == "not modified": take_profit_truncated = await truncate_float(take_profit_price, 6) + stop_loss_truncated = await truncate_float(stop_loss_price, 6) text += (f"Движение: {side_rus}\n" f"Тейк-профит: {take_profit_truncated}\n" + f"Стоп-лосс: {stop_loss_truncated}\n" ) - if stop_loss_price is not None: - stop_loss_truncated = await truncate_float(stop_loss_price, 6) - else: - stop_loss_truncated = None - - if stop_loss_truncated is not None: - text += f"Стоп-лосс: {stop_loss_truncated}\n" - else: - deals = await get_active_positions_by_symbol( - tg_id=tg_id, symbol=symbol - ) - position = next((d for d in deals if d.get("symbol") == symbol), None) - - if position: - liq_price = position.get("liqPrice", 0) - text += f"Цена ликвидации: {liq_price}\n" - - else: text += (f"Движение: {side_rus}\n" "Не удалось установить ТП и СЛ\n") @@ -258,7 +230,6 @@ class TelegramMessageHandler: pass else: errors = { - "Max bets in series": "❗️ Максимальное количество сделок в серии достигнуто", "Risk is too high for this trade": "❗️ Риск сделки слишком высок для продолжения", "ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли", "InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.", @@ -285,49 +256,105 @@ class TelegramMessageHandler: ) elif stop_order_type == "StopLoss" or exec_type == "BustTrade": - open_order_text = "\n❗️ Открываю новую сделку с увеличенной ставкой.\n" - await self.telegram_bot.send_message( - chat_id=tg_id, text=open_order_text - ) + current_step = user_deals_data.current_step + max_bets_in_series = user_deals_data.max_bets_in_series + current_step += 1 - if side == "Buy": - r_side = "Sell" - else: - r_side = "Buy" - - res = await trading_cycle( - tg_id=tg_id, symbol=symbol, side=r_side - ) - - if res == "OK": - pass - else: - errors = { - "Max bets in series": "❗️ Максимальное количество сделок в серии достигнуто", - "Risk is too high for this trade": "❗️ Риск сделки слишком высок для продолжения", - "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, "❗️ Не удалось открыть новую сделку" - ) - await rq.set_auto_trading( - tg_id=tg_id, symbol=symbol, auto_trading=False + if max_bets_in_series < current_step: + text_series = ("\n❗️ Максимальное количество сделок в серии достигнуто.\n" + "📈 Начинаю новую серию с базовой ставки\n") + await self.telegram_bot.send_message( + chat_id=tg_id, text=text_series ) + if side == "Buy": + r_side = "Sell" + else: + r_side = "Buy" + await rq.set_last_side_by_symbol( + tg_id=tg_id, symbol=symbol, last_side=r_side) await rq.set_total_fee_user_auto_trading( tg_id=tg_id, symbol=symbol, total_fee=0 ) await rq.set_fee_user_auto_trading( tg_id=tg_id, symbol=symbol, fee=0 ) - await self.telegram_bot.send_message( - chat_id=tg_id, - text=error_text, - reply_markup=kbi.profile_bybit, + await rq.set_pnl_series_by_symbol(tg_id=tg_id, symbol=symbol, pnl_series=0) + + res = await trading_cycle_profit( + tg_id=tg_id, symbol=symbol, side=r_side ) + if res == "OK": + pass + else: + errors = { + "Risk is too high for this trade": "❗️ Риск сделки слишком высок для продолжения", + "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, "❗️ Не удалось открыть новую сделку" + ) + await rq.set_auto_trading( + tg_id=tg_id, symbol=symbol, auto_trading=False + ) + + await rq.set_total_fee_user_auto_trading( + tg_id=tg_id, symbol=symbol, total_fee=0 + ) + await rq.set_fee_user_auto_trading( + tg_id=tg_id, symbol=symbol, fee=0 + ) + await self.telegram_bot.send_message( + chat_id=tg_id, + text=error_text, + reply_markup=kbi.profile_bybit, + ) + else: + open_order_text = "\n❗️ Открываю новую сделку с увеличенной ставкой.\n" + await self.telegram_bot.send_message( + chat_id=tg_id, text=open_order_text + ) + + if side == "Buy": + r_side = "Sell" + else: + r_side = "Buy" + + res = await trading_cycle( + tg_id=tg_id, symbol=symbol, side=r_side + ) + + if res == "OK": + pass + else: + errors = { + "Risk is too high for this trade": "❗️ Риск сделки слишком высок для продолжения", + "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, "❗️ Не удалось открыть новую сделку" + ) + await rq.set_auto_trading( + tg_id=tg_id, symbol=symbol, auto_trading=False + ) + + await rq.set_total_fee_user_auto_trading( + tg_id=tg_id, symbol=symbol, total_fee=0 + ) + await rq.set_fee_user_auto_trading( + tg_id=tg_id, symbol=symbol, fee=0 + ) + await self.telegram_bot.send_message( + chat_id=tg_id, + text=error_text, + reply_markup=kbi.profile_bybit, + ) elif create_type == "CreateByClosing": await self.telegram_bot.send_message( chat_id=tg_id,