forked from kodorvan/stcs
The formula for calculating the number of contracts by price has been changed
This commit is contained in:
@@ -25,11 +25,9 @@ async def start_trading_cycle(
|
||||
:param tg_id: Telegram user ID
|
||||
"""
|
||||
try:
|
||||
client = await get_bybit_client(tg_id=tg_id)
|
||||
symbol = await rq.get_user_symbol(tg_id=tg_id)
|
||||
additional_data = await rq.get_user_additional_settings(tg_id=tg_id)
|
||||
risk_management_data = await rq.get_user_risk_management(tg_id=tg_id)
|
||||
commission_fee = risk_management_data.commission_fee
|
||||
user_deals_data = await rq.get_user_deal_by_symbol(
|
||||
tg_id=tg_id, symbol=symbol
|
||||
)
|
||||
@@ -43,6 +41,7 @@ async def start_trading_cycle(
|
||||
max_bets_in_series = additional_data.max_bets_in_series
|
||||
take_profit_percent = risk_management_data.take_profit_percent
|
||||
stop_loss_percent = risk_management_data.stop_loss_percent
|
||||
total_commission = 0
|
||||
|
||||
get_side = "Buy"
|
||||
|
||||
@@ -63,34 +62,6 @@ async def start_trading_cycle(
|
||||
else:
|
||||
side = "Sell"
|
||||
|
||||
# Get fee rates
|
||||
fee_info = client.get_fee_rates(category="linear", symbol=symbol)
|
||||
|
||||
# Check if commission fee is enabled
|
||||
commission_fee_percent = 0.0
|
||||
if commission_fee == "Yes_commission_fee":
|
||||
commission_fee_percent = safe_float(
|
||||
fee_info["result"]["list"][0]["takerFeeRate"]
|
||||
)
|
||||
|
||||
get_ticker = await get_tickers(tg_id, symbol=symbol)
|
||||
price_symbol = safe_float(get_ticker.get("lastPrice")) or 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(price_symbol)
|
||||
decimals = abs(int(round(math.log10(qty_step))))
|
||||
qty_formatted = math.floor(qty / qty_step) * qty_step
|
||||
qty_formatted = round(qty_formatted, decimals)
|
||||
|
||||
if trigger_price > 0:
|
||||
po_trigger_price = str(trigger_price)
|
||||
else:
|
||||
po_trigger_price = None
|
||||
|
||||
price_for_cals = trigger_price if po_trigger_price is not None else price_symbol
|
||||
total_commission = price_for_cals * qty_formatted * commission_fee_percent
|
||||
|
||||
await set_switch_position_mode(
|
||||
tg_id=tg_id,
|
||||
symbol=symbol,
|
||||
@@ -269,7 +240,7 @@ async def open_positions(
|
||||
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(price_symbol)
|
||||
qty = (safe_float(order_quantity) * safe_float(leverage)) / safe_float(price_symbol)
|
||||
decimals = abs(int(round(math.log10(qty_step))))
|
||||
qty_formatted = math.floor(qty / qty_step) * qty_step
|
||||
qty_formatted = round(qty_formatted, decimals)
|
||||
@@ -285,6 +256,9 @@ async def open_positions(
|
||||
|
||||
price_for_cals = trigger_price if po_trigger_price is not None else price_symbol
|
||||
|
||||
if qty_formatted <= 0:
|
||||
return "Order does not meet minimum order value"
|
||||
|
||||
if margin_type == "ISOLATED_MARGIN":
|
||||
liq_long, liq_short = await get_liquidation_price(
|
||||
tg_id=tg_id,
|
||||
@@ -361,5 +335,5 @@ async def open_positions(
|
||||
return "InvalidRequestError"
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Error opening position for user %s: %s", tg_id, e)
|
||||
logger.error("Error opening position for user %s: %s", tg_id, e, exc_info=True)
|
||||
return None
|
||||
|
Reference in New Issue
Block a user