From 62e923cefa368a08dae7019077c51f5ee27b5a8b Mon Sep 17 00:00:00 2001 From: algizn97 Date: Sun, 26 Oct 2025 14:03:28 +0500 Subject: [PATCH] Fixed the place for commission compensation --- app/bybit/open_positions.py | 67 ++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/app/bybit/open_positions.py b/app/bybit/open_positions.py index 8d426c6..00968dd 100644 --- a/app/bybit/open_positions.py +++ b/app/bybit/open_positions.py @@ -39,7 +39,8 @@ 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 + commission_fee = risk_management_data.commission_fee + commission_place = risk_management_data.commission_place if trade_mode == "Switch": side = side @@ -70,7 +71,6 @@ async def start_trading_cycle( leverage=leverage, take_profit_percent=take_profit_percent, stop_loss_percent=stop_loss_percent, - commission_fee_percent=total_commission ) if res == "OK": @@ -78,6 +78,7 @@ async def start_trading_cycle( tg_id=tg_id, symbol=symbol, current_step=1, + current_series=1, trade_mode=trade_mode, side_mode=switch_side, margin_type=margin_type, @@ -88,7 +89,9 @@ async def start_trading_cycle( max_bets_in_series=max_bets_in_series, take_profit_percent=take_profit_percent, stop_loss_percent=stop_loss_percent, - base_quantity=order_quantity + base_quantity=order_quantity, + commission_fee=commission_fee, + commission_place=commission_place ) return "OK" return ( @@ -119,8 +122,6 @@ async def trading_cycle_profit( tg_id: int, symbol: str, side: str) -> str | None: try: user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) - user_auto_trading_data = await rq.get_user_auto_trading(tg_id=tg_id, symbol=symbol) - total_fee = user_auto_trading_data.total_fee trade_mode = user_deals_data.trade_mode margin_type = user_deals_data.margin_type leverage = user_deals_data.leverage @@ -131,6 +132,9 @@ async def trading_cycle_profit( martingale_factor = user_deals_data.martingale_factor side_mode = user_deals_data.side_mode base_quantity = user_deals_data.base_quantity + current_series = user_deals_data.current_series + commission_fee = user_deals_data.commission_fee + commission_place = user_deals_data.commission_place await set_margin_mode(tg_id=tg_id, margin_mode=margin_type) await set_leverage( @@ -139,7 +143,6 @@ async def trading_cycle_profit( leverage=leverage, ) - if trade_mode == "Switch": if side_mode == "Противоположно": s_side = "Sell" if side == "Buy" else "Buy" @@ -148,6 +151,8 @@ async def trading_cycle_profit( else: s_side = side + next_series = current_series + 1 + res = await open_positions( tg_id=tg_id, symbol=symbol, @@ -158,7 +163,6 @@ async def trading_cycle_profit( leverage=leverage, take_profit_percent=take_profit_percent, stop_loss_percent=stop_loss_percent, - commission_fee_percent=total_fee ) if res == "OK": @@ -166,6 +170,7 @@ async def trading_cycle_profit( tg_id=tg_id, symbol=symbol, current_step=1, + current_series=next_series, trade_mode=trade_mode, side_mode=side_mode, margin_type=margin_type, @@ -176,7 +181,9 @@ async def trading_cycle_profit( max_bets_in_series=max_bets_in_series, take_profit_percent=take_profit_percent, stop_loss_percent=stop_loss_percent, - base_quantity=base_quantity + base_quantity=base_quantity, + commission_fee=commission_fee, + commission_place=commission_place ) return "OK" @@ -202,8 +209,8 @@ async def trading_cycle( try: user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) user_auto_trading_data = await rq.get_user_auto_trading(tg_id=tg_id, symbol=symbol) - user_risk_management_data = await rq.get_user_risk_management(tg_id=tg_id) - commission_fee = user_risk_management_data.commission_fee + commission_fee = user_deals_data.commission_fee + commission_place = user_deals_data.commission_place total_fee = user_auto_trading_data.total_fee trade_mode = user_deals_data.trade_mode margin_type = user_deals_data.margin_type @@ -217,6 +224,7 @@ async def trading_cycle( order_quantity = user_deals_data.order_quantity base_quantity = user_deals_data.base_quantity side_mode = user_deals_data.side_mode + current_series = user_deals_data.current_series next_quantity = safe_float(order_quantity) * ( safe_float(martingale_factor) @@ -232,10 +240,10 @@ async def trading_cycle( symbol=symbol, leverage=leverage, ) + total_quantity = next_quantity if commission_fee == "Yes_commission_fee": - total_fee = total_fee - else: - total_fee = 0 + if commission_place == "Commission_for_qty": + total_quantity = next_quantity + total_fee if trade_mode == "Switch": if side == "Buy": @@ -249,13 +257,12 @@ async def trading_cycle( tg_id=tg_id, symbol=symbol, side=r_side, - order_quantity=next_quantity, + order_quantity=total_quantity, trigger_price=trigger_price, margin_type=margin_type, leverage=leverage, take_profit_percent=take_profit_percent, stop_loss_percent=stop_loss_percent, - commission_fee_percent=total_fee ) if res == "OK": @@ -263,6 +270,7 @@ async def trading_cycle( tg_id=tg_id, symbol=symbol, current_step=current_step, + current_series=current_series, trade_mode=trade_mode, side_mode=side_mode, margin_type=margin_type, @@ -273,7 +281,9 @@ async def trading_cycle( max_bets_in_series=max_bets_in_series, take_profit_percent=take_profit_percent, stop_loss_percent=stop_loss_percent, - base_quantity=base_quantity + base_quantity=base_quantity, + commission_fee=commission_fee, + commission_place=commission_place ) return "OK" @@ -303,11 +313,15 @@ async def open_positions( margin_type: str, leverage: str, take_profit_percent: float, - stop_loss_percent: float, - commission_fee_percent: float + stop_loss_percent: float ) -> str | None: try: client = await get_bybit_client(tg_id=tg_id) + user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) + commission_fee = user_deals_data.commission_fee + commission_place = user_deals_data.commission_place + user_auto_trading_data = await rq.get_user_auto_trading(tg_id=tg_id, symbol=symbol) + total_fee = user_auto_trading_data.total_fee 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) @@ -315,8 +329,8 @@ async def open_positions( qty_step = safe_float(qty_step_str) 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) + qty_format = math.floor(qty / qty_step) * qty_step + qty_formatted = round(qty_format, decimals) if trigger_price > 0: po_trigger_price = str(trigger_price) @@ -330,23 +344,28 @@ async def open_positions( if qty_formatted <= 0: return "Order does not meet minimum order value" + total_commission = 0 + if commission_fee == "Yes_commission_fee": + if commission_place == "Commission_for_tp": + total_commission = safe_float(total_fee) / qty_formatted + if margin_type == "ISOLATED_MARGIN": if side == "Buy": take_profit_price = price_for_cals * ( - 1 + take_profit_percent / 100) + commission_fee_percent / qty_formatted + 1 + take_profit_percent / 100) + total_commission stop_loss_price = None else: take_profit_price = price_for_cals * ( - 1 - take_profit_percent / 100) - commission_fee_percent / qty_formatted + 1 - take_profit_percent / 100) - total_commission stop_loss_price = None else: if side == "Buy": take_profit_price = price_for_cals * ( - 1 + take_profit_percent / 100) + commission_fee_percent / qty_formatted + 1 + take_profit_percent / 100) + total_commission stop_loss_price = price_for_cals * (1 - stop_loss_percent / 100) else: take_profit_price = price_for_cals * ( - 1 - take_profit_percent / 100) - commission_fee_percent / qty_formatted + 1 - take_profit_percent / 100) - total_commission stop_loss_price = price_for_cals * (1 + stop_loss_percent / 100) take_profit_price = max(take_profit_price, 0)