Added error information output #28

Merged
Arsen Mirzaev Tatyano-Muradovich merged 3 commits from Alex/stcs:devel into stable 2025-10-30 23:37:39 +07:00
3 changed files with 52 additions and 35 deletions

View File

@@ -30,7 +30,7 @@ async def start_trading_cycle(
risk_management_data = await rq.get_user_risk_management(tg_id=tg_id) risk_management_data = await rq.get_user_risk_management(tg_id=tg_id)
trade_mode = additional_data.trade_mode trade_mode = additional_data.trade_mode
switch_side = additional_data.switch_side switch_side = additional_data.switch_side
side= additional_data.side side = additional_data.side
margin_type = additional_data.margin_type margin_type = additional_data.margin_type
leverage = additional_data.leverage leverage = additional_data.leverage
order_quantity = additional_data.order_quantity order_quantity = additional_data.order_quantity
@@ -107,7 +107,8 @@ async def start_trading_cycle(
"position idx not match position mode", "position idx not match position mode",
"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",
} }
else None else None
) )
@@ -193,6 +194,7 @@ async def trading_cycle_profit(
"ab not enough for new order", "ab not enough for new order",
"InvalidRequestError", "InvalidRequestError",
"The number of contracts exceeds maximum limit allowed", "The number of contracts exceeds maximum limit allowed",
"Order placement failed as your position may exceed the max",
} }
else None else None
) )
@@ -293,6 +295,7 @@ async def trading_cycle(
"ab not enough for new order", "ab not enough for new order",
"InvalidRequestError", "InvalidRequestError",
"The number of contracts exceeds maximum limit allowed", "The number of contracts exceeds maximum limit allowed",
"Order placement failed as your position may exceed the max",
} }
else None else None
) )
@@ -363,6 +366,7 @@ async def open_positions(
"Qty invalid": "Qty invalid", "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 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", "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(): for key, msg in known_errors.items():
if key in error_text: if key in error_text:

View File

@@ -64,6 +64,14 @@ class TelegramMessageHandler:
exec_fees = format_value(execution.get("execFee")) exec_fees = format_value(execution.get("execFee"))
fee_rate = format_value(execution.get("feeRate")) fee_rate = format_value(execution.get("feeRate"))
side = format_value(execution.get("side")) 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 = ( side_rus = (
"Покупка" "Покупка"
if side == "Buy" if side == "Buy"
@@ -81,10 +89,6 @@ class TelegramMessageHandler:
tg_id=tg_id, symbol=symbol, fee=safe_float(exec_fee) 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 get_total_fee = user_auto_trading.total_fee
total_fee = safe_float(exec_fee) + safe_float(get_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 "Сделка открыта:" "Сделка закрыта:" if safe_float(closed_size) > 0 else "Сделка открыта:"
) )
text = f"{header}\n" f"Торговая пара: {symbol}\n" 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( user_deals_data = await rq.get_user_deal_by_symbol(
tg_id=tg_id, symbol=symbol tg_id=tg_id, symbol=symbol
) )
commission_fee = user_deals_data.commission_fee commission_fee = user_deals_data.commission_fee or "Yes_commission_fee"
commission_place = user_deals_data.commission_place commission_place = user_deals_data.commission_place or "Commission_for_qty"
current_series = user_deals_data.current_series current_series = user_deals_data.current_series
current_step = user_deals_data.current_step current_step = user_deals_data.current_step
order_quantity = user_deals_data.order_quantity order_quantity = user_deals_data.order_quantity
@@ -175,26 +175,34 @@ class TelegramMessageHandler:
take_profit_price = max(take_profit_price, 0) take_profit_price = max(take_profit_price, 0)
stop_loss_price = max(stop_loss_price, 0) stop_loss_price = max(stop_loss_price, 0)
await set_tp_sl_for_position(tg_id=tg_id, ress = await set_tp_sl_for_position(tg_id=tg_id,
symbol=symbol, symbol=symbol,
take_profit_price=take_profit_price, take_profit_price=take_profit_price,
stop_loss_price=stop_loss_price, stop_loss_price=stop_loss_price,
position_idx=0) 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) text += (f"Движение: {side_rus}\n"
stop_loss_truncated = await truncate_float(stop_loss_price, 4) 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: else:
new_pnl = safe_float(pnl_series) + total_pnl if auto_trading:
await rq.set_pnl_series_by_symbol( new_pnl = safe_float(pnl_series) + total_pnl
tg_id=tg_id, symbol=symbol, pnl_series=new_pnl) await rq.set_pnl_series_by_symbol(
text += f"\nДоход: {ex_pnl:.4f}\n" tg_id=tg_id, symbol=symbol, pnl_series=new_pnl)
text += f"Реализованный PNL: {total_pnl:.4f}\n" text += f"\nПрибыль без комиссии: {ex_pnl:.4f}\n"
text += f"Прибыль серии: {safe_float(new_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( await self.telegram_bot.send_message(
chat_id=tg_id, text=text, reply_markup=kbi.profile_bybit 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 user_symbols = user_auto_trading.symbol if user_auto_trading else None
if ( if (
auto_trading auto_trading
and safe_float(closed_size) > 0 and safe_float(closed_size) > 0
and user_symbols is not None and user_symbols is not None
): ):
if safe_float(pnl) > 0: if safe_float(pnl) > 0:
profit_text = "📈 Начинаю новую серию с базовой ставки\n" profit_text = "📈 Начинаю новую серию с базовой ставки\n"
@@ -240,6 +248,7 @@ class TelegramMessageHandler:
"ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли", "ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли",
"InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.", "InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.",
"The number of contracts exceeds maximum limit allowed": "❗️ Превышен максимальный лимит ставки", "The number of contracts exceeds maximum limit allowed": "❗️ Превышен максимальный лимит ставки",
"Order placement failed as your position may exceed the max": "❗️ Превышен максимальный лимит ставки",
} }
error_text = errors.get( error_text = errors.get(
res, "❗️ Не удалось открыть новую сделку" res, "❗️ Не удалось открыть новую сделку"
@@ -283,6 +292,7 @@ class TelegramMessageHandler:
"ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли", "ab not enough for new order": "❗️ Недостаточно средств для продолжения торговли",
"InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.", "InvalidRequestError": "❗️ Недостаточно средств для размещения нового ордера с заданным количеством и плечом.",
"The number of contracts exceeds maximum limit allowed": "❗️ Превышен максимальный лимит ставки", "The number of contracts exceeds maximum limit allowed": "❗️ Превышен максимальный лимит ставки",
"Order placement failed as your position may exceed the max": "❗️ Превышен максимальный лимит ставки",
} }
error_text = errors.get( error_text = errors.get(
res, "❗️ Не удалось открыть новую сделку" res, "❗️ Не удалось открыть новую сделку"
@@ -302,6 +312,5 @@ class TelegramMessageHandler:
text=error_text, text=error_text,
reply_markup=kbi.profile_bybit, reply_markup=kbi.profile_bybit,
) )
except Exception as e: except Exception as e:
logger.error("Error in telegram_message_handler: %s", e, exc_info=True) logger.error("Error in telegram_message_handler: %s", e, exc_info=True)

View File

@@ -97,7 +97,8 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non
"Limit price is out min price": "Цена лимитного ордера меньше допустимого", "Limit price is out min price": "Цена лимитного ордера меньше допустимого",
"Limit price is out max price": "Цена лимитного ордера больше допустимого", "Limit price is out max price": "Цена лимитного ордера больше допустимого",
"Risk is too high for this trade": "Риск сделки превышает допустимый убыток", "Risk is too high for this trade": "Риск сделки превышает допустимый убыток",
"estimated will trigger liq": "Лимитный ордер может вызвать мгновенную ликвидацию. Проверьте параметры ордера.", "estimated will trigger liq": "Лимитный ордер может вызвать мгновенную ликвидацию. "
"Проверьте параметры ордера.",
"ab not enough for new order": "Недостаточно средств для создания нового ордера", "ab not enough for new order": "Недостаточно средств для создания нового ордера",
"InvalidRequestError": "Произошла ошибка при запуске торговли.", "InvalidRequestError": "Произошла ошибка при запуске торговли.",
"Order does not meet minimum order value": "Сумма ставки меньше допустимого для запуска торговли. " "Order does not meet minimum order value": "Сумма ставки меньше допустимого для запуска торговли. "
@@ -106,6 +107,9 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non
"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":
"Не удалось разместить ордер, так как ваша позиция может превышать максимальный лимит."
"Пожалуйста, уменьшите кредитное плечо, чтобы увеличить максимальное значение"
} }
if res == "OK": if res == "OK":
@@ -141,7 +145,7 @@ async def start_trading(callback_query: CallbackQuery, state: FSMContext) -> Non
lambda c: c.data == "cancel_timer_merged" lambda c: c.data == "cancel_timer_merged"
) )
async def cancel_start_trading( async def cancel_start_trading(
callback_query: CallbackQuery, state: FSMContext callback_query: CallbackQuery, state: FSMContext
) -> None: ) -> None:
""" """
Handles the "cancel_timer" callback query. Handles the "cancel_timer" callback query.