110 lines
3.5 KiB
Python
110 lines
3.5 KiB
Python
import logging.config
|
|
|
|
from aiogram import Router
|
|
from aiogram.fsm.context import FSMContext
|
|
from aiogram.types import CallbackQuery
|
|
|
|
import database.request as rq
|
|
from app.bybit.close_positions import cancel_order, close_position
|
|
from app.helper_functions import safe_float
|
|
from logger_helper.logger_helper import LOGGING_CONFIG
|
|
|
|
logging.config.dictConfig(LOGGING_CONFIG)
|
|
logger = logging.getLogger("close_orders")
|
|
|
|
router_close_orders = Router(name="close_orders")
|
|
|
|
|
|
@router_close_orders.callback_query(
|
|
lambda c: c.data and c.data.startswith("close_position_")
|
|
)
|
|
async def close_position_handler(
|
|
callback_query: CallbackQuery, state: FSMContext
|
|
) -> None:
|
|
"""
|
|
Close a position.
|
|
:param callback_query: Incoming callback query from Telegram inline keyboard.
|
|
:param state: Finite State Machine context for the current user session.
|
|
:return: None
|
|
"""
|
|
try:
|
|
data = callback_query.data
|
|
parts = data.split("_")
|
|
symbol = parts[2]
|
|
side = parts[3]
|
|
position_idx = int(parts[4])
|
|
qty = safe_float(parts[5])
|
|
await rq.set_auto_trading(
|
|
tg_id=callback_query.from_user.id,
|
|
symbol=symbol,
|
|
auto_trading=False,
|
|
side=side,
|
|
)
|
|
res = await close_position(
|
|
tg_id=callback_query.from_user.id,
|
|
symbol=symbol,
|
|
side=side,
|
|
position_idx=position_idx,
|
|
qty=qty,
|
|
)
|
|
|
|
if not res:
|
|
await callback_query.answer(text="Произошла ошибка при закрытии позиции.")
|
|
return
|
|
|
|
await callback_query.answer(text="Позиция успешно закрыта.")
|
|
logger.debug(
|
|
"Command close_position processed successfully for user: %s",
|
|
callback_query.from_user.id,
|
|
)
|
|
except Exception as e:
|
|
await callback_query.answer(text="Произошла ошибка при закрытии позиции.")
|
|
logger.error(
|
|
"Error processing command close_position for user %s: %s",
|
|
callback_query.from_user.id,
|
|
e,
|
|
)
|
|
finally:
|
|
await state.clear()
|
|
|
|
|
|
@router_close_orders.callback_query(
|
|
lambda c: c.data and c.data.startswith("close_order_")
|
|
)
|
|
async def cancel_order_handler(
|
|
callback_query: CallbackQuery, state: FSMContext
|
|
) -> None:
|
|
"""
|
|
Cancel an order.
|
|
:param callback_query: Incoming callback query from Telegram inline keyboard.
|
|
:param state: Finite State Machine context for the current user session.
|
|
:return: None
|
|
"""
|
|
try:
|
|
data = callback_query.data
|
|
parts = data.split("_")
|
|
symbol = parts[2]
|
|
order_id = parts[3]
|
|
res = await cancel_order(
|
|
tg_id=callback_query.from_user.id, symbol=symbol, order_id=order_id
|
|
)
|
|
|
|
if not res:
|
|
await callback_query.answer(text="Произошла ошибка при закрытии ордера.")
|
|
return
|
|
|
|
await callback_query.answer(text="Ордер успешно закрыт.")
|
|
logger.debug(
|
|
"Command close_order processed successfully for user: %s",
|
|
callback_query.from_user.id,
|
|
)
|
|
except Exception as e:
|
|
await callback_query.answer(text="Произошла ошибка при закрытии ордера.")
|
|
logger.error(
|
|
"Error processing command close_order for user %s: %s",
|
|
callback_query.from_user.id,
|
|
e,
|
|
)
|
|
finally:
|
|
await state.clear()
|