diff --git a/app/bybit/telegram_message_handler.py b/app/bybit/telegram_message_handler.py index 084dcf0..90b75a2 100644 --- a/app/bybit/telegram_message_handler.py +++ b/app/bybit/telegram_message_handler.py @@ -71,243 +71,246 @@ class TelegramMessageHandler: auto_trading = ( user_auto_trading.auto_trading if user_auto_trading else False ) - if auto_trading: - side_rus = ( - "Покупка" - if side == "Buy" - else "Продажа" if side == "Sell" else "Нет данных" + + side_rus = ( + "Покупка" + if side == "Buy" + else "Продажа" if side == "Sell" else "Нет данных" + ) + if safe_float(exec_fees) == 0: + exec_fee = safe_float(exec_price) * safe_float(exec_qty) * safe_float( + fee_rate ) - if safe_float(exec_fees) == 0: - exec_fee = safe_float(exec_price) * safe_float(exec_qty) * safe_float( - fee_rate - ) - else: - exec_fee = safe_float(exec_fees) + else: + exec_fee = safe_float(exec_fees) - if safe_float(closed_size) == 0: - await rq.set_fee_user_auto_trading( - tg_id=tg_id, symbol=symbol, fee=safe_float(exec_fee) - ) - - get_total_fee = user_auto_trading.total_fee - total_fee = safe_float(exec_fee) + safe_float(get_total_fee) - - exec_pnl = format_value(execution.get("execPnl")) - ex_pnl = safe_float(exec_pnl) - pnl = safe_float(exec_pnl) - - header = ( - "Сделка закрыта:" if safe_float(closed_size) > 0 else "Сделка открыта:" + if safe_float(closed_size) == 0: + await rq.set_fee_user_auto_trading( + tg_id=tg_id, symbol=symbol, fee=safe_float(exec_fee) ) - text = f"{header}\n" f"Торговая пара: {symbol}\n" - user_deals_data = await rq.get_user_deal_by_symbol( - tg_id=tg_id, symbol=symbol - ) - 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 - 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 - fee = safe_float(user_auto_trading.fee) - total_pnl = safe_float(exec_pnl) - safe_float(exec_fee) - fee - leverage = safe_float(user_deals_data.leverage) - if commission_fee == "Yes_commission_fee": - if commission_place == "Commission_for_qty": - total_quantity = safe_float(order_quantity) + safe_float( - total_fee - ) * 2 - else: - total_quantity = safe_float(order_quantity) + get_total_fee = user_auto_trading.total_fee + total_fee = safe_float(exec_fee) + safe_float(get_total_fee) + + exec_pnl = format_value(execution.get("execPnl")) + ex_pnl = safe_float(exec_pnl) + pnl = safe_float(exec_pnl) + + header = ( + "Сделка закрыта:" if safe_float(closed_size) > 0 else "Сделка открыта:" + ) + text = f"{header}\n" f"Торговая пара: {symbol}\n" + user_deals_data = await rq.get_user_deal_by_symbol( + tg_id=tg_id, symbol=symbol + ) + 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 + 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 + fee = safe_float(user_auto_trading.fee) + total_pnl = safe_float(exec_pnl) - safe_float(exec_fee) - fee + leverage = safe_float(user_deals_data.leverage) + + if commission_fee == "Yes_commission_fee": + if commission_place == "Commission_for_qty": + total_quantity = safe_float(order_quantity) + safe_float( + total_fee + ) * 2 else: total_quantity = safe_float(order_quantity) + else: + total_quantity = safe_float(order_quantity) - if user_deals_data is not None and auto_trading and safe_float(closed_size) == 0: - await rq.set_total_fee_user_auto_trading( - tg_id=tg_id, symbol=symbol, total_fee=total_fee - ) - text += f"Текущая ставка: {total_quantity:.2f} USDT\n" - text += f"Серия №: {current_series}\n" - text += f"Сделка №: {current_step}\n" - - text += ( - f"Цена исполнения: {exec_price}\n" - f"Комиссия: {exec_fee:.8f}\n" + if user_deals_data is not None and auto_trading and safe_float(closed_size) == 0: + await rq.set_total_fee_user_auto_trading( + tg_id=tg_id, symbol=symbol, total_fee=total_fee ) + text += f"Текущая ставка: {total_quantity:.2f} USDT\n" + text += f"Серия №: {current_series}\n" + text += f"Сделка №: {current_step}\n" - if safe_float(closed_size) == 0: - instruments_info = await get_instruments_info(tg_id=tg_id, symbol=symbol) - qty_step_str = instruments_info.get("lotSizeFilter").get("qtyStep") - qty_step = safe_float(qty_step_str) - qty = (safe_float(order_quantity) * safe_float(leverage)) / safe_float(exec_price) - decimals = abs(int(round(math.log10(qty_step)))) - qty_format = math.floor(qty / qty_step) * qty_step - qty_formatted = round(qty_format, decimals) - total_commission = 0 + text += ( + f"Цена исполнения: {exec_price}\n" + f"Комиссия: {exec_fee:.8f}\n" + ) - if commission_fee == "Yes_commission_fee": - if commission_place == "Commission_for_tp": - total_commission = safe_float(total_fee) / qty_formatted + if safe_float(closed_size) == 0: + instruments_info = await get_instruments_info(tg_id=tg_id, symbol=symbol) + qty_step_str = instruments_info.get("lotSizeFilter").get("qtyStep") + qty_step = safe_float(qty_step_str) + qty = (safe_float(order_quantity) * safe_float(leverage)) / safe_float(exec_price) + decimals = abs(int(round(math.log10(qty_step)))) + qty_format = math.floor(qty / qty_step) * qty_step + qty_formatted = round(qty_format, decimals) + total_commission = 0 - 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 commission_fee == "Yes_commission_fee": + 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: - 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 = max(take_profit_price, 0) - stop_loss_price = max(stop_loss_price, 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) - - text += (f"Движение: {side_rus}\n" - f"Тейк-профит: {take_profit_truncated}\n" - f"Стоп-лосс: {stop_loss_truncated}\n" - ) - else: - text += (f"Движение: {side_rus}\n" - "Не удалось установить ТП и СЛ\n") - + take_profit_price = safe_float(exec_price) * ( + 1 - take_profit_percent / 100) - total_commission + stop_loss_price = None 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 = max(take_profit_price, 0) + stop_loss_price = max(stop_loss_price, 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) + + text += (f"Движение: {side_rus}\n" + f"Тейк-профит: {take_profit_truncated}\n" + f"Стоп-лосс: {stop_loss_truncated}\n" + ) + else: + text += (f"Движение: {side_rus}\n" + "Не удалось установить ТП и СЛ\n") + + else: + 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 - ) + await self.telegram_bot.send_message( + chat_id=tg_id, text=text, reply_markup=kbi.profile_bybit + ) - 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 - and safe_float(closed_size) > 0 - and user_symbols is not None - ): - if safe_float(pnl) > 0: - profit_text = "📈 Начинаю новую серию с базовой ставки\n" - await self.telegram_bot.send_message( - chat_id=tg_id, text=profit_text, reply_markup=kbi.profile_bybit + if ( + auto_trading + and safe_float(closed_size) > 0 + and user_symbols is not None + ): + if safe_float(pnl) > 0: + profit_text = "📈 Начинаю новую серию с базовой ставки\n" + await self.telegram_bot.send_message( + chat_id=tg_id, text=profit_text, reply_markup=kbi.profile_bybit + ) + + 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 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 = { + "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 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 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 = { - "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 - ) - - 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 + 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 = { + "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 side == "Buy": - r_side = "Sell" - else: - r_side = "Buy" - - res = await trading_cycle( - tg_id=tg_id, symbol=symbol, 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, ) - - 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 - ) - - 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, - ) - except Exception as e: logger.error("Error in telegram_message_handler: %s", e, exc_info=True)