import math import logging.config from app.services.Bybit.functions.price_symbol import get_price import app.telegram.database.requests as rq from logger_helper.logger_helper import LOGGING_CONFIG from pybit.unified_trading import HTTP logging.config.dictConfig(LOGGING_CONFIG) logger = logging.getLogger("min_qty") def round_up_qty(value: float, step: float) -> float: """ Округление value вверх до ближайшего кратного step. """ return math.ceil(value / step) * step async def get_min_qty(tg_id: int) -> float: """ Получает минимальный объем (количество) ордера для символа пользователя на Bybit, округленное с учетом шага количества qtyStep. :param tg_id: int - идентификатор пользователя Telegram :return: float - минимальное количество лота для ордера """ api_key = await rq.get_bybit_api_key(tg_id) secret_key = await rq.get_bybit_secret_key(tg_id) symbol = await rq.get_symbol(tg_id) client = HTTP(api_key=api_key, api_secret=secret_key) price = await get_price(tg_id) response = client.get_instruments_info(symbol=symbol, category='linear') instrument = response['result'][0] lot_size_filter = instrument.get('lotSizeFilter', {}) min_order_qty = float(lot_size_filter.get('minOrderQty', 0)) min_notional_value = float(lot_size_filter.get('minNotionalValue', 0)) qty_step = float(lot_size_filter.get('qtyStep', 1)) calculated_qty = (5 / price) * 1.1 min_qty = max(min_order_qty, calculated_qty) min_qty_rounded = round_up_qty(min_qty, qty_step) logger.debug(f"tg_id={tg_id}: price={price}, min_order_qty={min_order_qty}, " f"min_notional_value={min_notional_value}, qty_step={qty_step}, " f"calculated_qty={calculated_qty}, min_qty_rounded={min_qty_rounded}") return min_qty_rounded