forked from kodorvan/stcs
53 lines
2.0 KiB
Python
53 lines
2.0 KiB
Python
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
|