2
0
forked from kodorvan/stcs

Fixed the place for commission compensation

This commit is contained in:
algizn97
2025-10-26 14:03:28 +05:00
parent faae2475c1
commit 62e923cefa

View File

@@ -39,7 +39,8 @@ async def start_trading_cycle(
max_bets_in_series = additional_data.max_bets_in_series max_bets_in_series = additional_data.max_bets_in_series
take_profit_percent = risk_management_data.take_profit_percent take_profit_percent = risk_management_data.take_profit_percent
stop_loss_percent = risk_management_data.stop_loss_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": if trade_mode == "Switch":
side = side side = side
@@ -70,7 +71,6 @@ async def start_trading_cycle(
leverage=leverage, leverage=leverage,
take_profit_percent=take_profit_percent, take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_percent, stop_loss_percent=stop_loss_percent,
commission_fee_percent=total_commission
) )
if res == "OK": if res == "OK":
@@ -78,6 +78,7 @@ async def start_trading_cycle(
tg_id=tg_id, tg_id=tg_id,
symbol=symbol, symbol=symbol,
current_step=1, current_step=1,
current_series=1,
trade_mode=trade_mode, trade_mode=trade_mode,
side_mode=switch_side, side_mode=switch_side,
margin_type=margin_type, margin_type=margin_type,
@@ -88,7 +89,9 @@ async def start_trading_cycle(
max_bets_in_series=max_bets_in_series, max_bets_in_series=max_bets_in_series,
take_profit_percent=take_profit_percent, take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_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 "OK"
return ( return (
@@ -119,8 +122,6 @@ async def trading_cycle_profit(
tg_id: int, symbol: str, side: str) -> str | None: tg_id: int, symbol: str, side: str) -> str | None:
try: try:
user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) 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 trade_mode = user_deals_data.trade_mode
margin_type = user_deals_data.margin_type margin_type = user_deals_data.margin_type
leverage = user_deals_data.leverage leverage = user_deals_data.leverage
@@ -131,6 +132,9 @@ async def trading_cycle_profit(
martingale_factor = user_deals_data.martingale_factor martingale_factor = user_deals_data.martingale_factor
side_mode = user_deals_data.side_mode side_mode = user_deals_data.side_mode
base_quantity = user_deals_data.base_quantity 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_margin_mode(tg_id=tg_id, margin_mode=margin_type)
await set_leverage( await set_leverage(
@@ -139,7 +143,6 @@ async def trading_cycle_profit(
leverage=leverage, leverage=leverage,
) )
if trade_mode == "Switch": if trade_mode == "Switch":
if side_mode == "Противоположно": if side_mode == "Противоположно":
s_side = "Sell" if side == "Buy" else "Buy" s_side = "Sell" if side == "Buy" else "Buy"
@@ -148,6 +151,8 @@ async def trading_cycle_profit(
else: else:
s_side = side s_side = side
next_series = current_series + 1
res = await open_positions( res = await open_positions(
tg_id=tg_id, tg_id=tg_id,
symbol=symbol, symbol=symbol,
@@ -158,7 +163,6 @@ async def trading_cycle_profit(
leverage=leverage, leverage=leverage,
take_profit_percent=take_profit_percent, take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_percent, stop_loss_percent=stop_loss_percent,
commission_fee_percent=total_fee
) )
if res == "OK": if res == "OK":
@@ -166,6 +170,7 @@ async def trading_cycle_profit(
tg_id=tg_id, tg_id=tg_id,
symbol=symbol, symbol=symbol,
current_step=1, current_step=1,
current_series=next_series,
trade_mode=trade_mode, trade_mode=trade_mode,
side_mode=side_mode, side_mode=side_mode,
margin_type=margin_type, margin_type=margin_type,
@@ -176,7 +181,9 @@ async def trading_cycle_profit(
max_bets_in_series=max_bets_in_series, max_bets_in_series=max_bets_in_series,
take_profit_percent=take_profit_percent, take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_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" return "OK"
@@ -202,8 +209,8 @@ async def trading_cycle(
try: try:
user_deals_data = await rq.get_user_deal_by_symbol(tg_id=tg_id, symbol=symbol) 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_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_deals_data.commission_fee
commission_fee = user_risk_management_data.commission_fee commission_place = user_deals_data.commission_place
total_fee = user_auto_trading_data.total_fee total_fee = user_auto_trading_data.total_fee
trade_mode = user_deals_data.trade_mode trade_mode = user_deals_data.trade_mode
margin_type = user_deals_data.margin_type margin_type = user_deals_data.margin_type
@@ -217,6 +224,7 @@ async def trading_cycle(
order_quantity = user_deals_data.order_quantity order_quantity = user_deals_data.order_quantity
base_quantity = user_deals_data.base_quantity base_quantity = user_deals_data.base_quantity
side_mode = user_deals_data.side_mode side_mode = user_deals_data.side_mode
current_series = user_deals_data.current_series
next_quantity = safe_float(order_quantity) * ( next_quantity = safe_float(order_quantity) * (
safe_float(martingale_factor) safe_float(martingale_factor)
@@ -232,10 +240,10 @@ async def trading_cycle(
symbol=symbol, symbol=symbol,
leverage=leverage, leverage=leverage,
) )
total_quantity = next_quantity
if commission_fee == "Yes_commission_fee": if commission_fee == "Yes_commission_fee":
total_fee = total_fee if commission_place == "Commission_for_qty":
else: total_quantity = next_quantity + total_fee
total_fee = 0
if trade_mode == "Switch": if trade_mode == "Switch":
if side == "Buy": if side == "Buy":
@@ -249,13 +257,12 @@ async def trading_cycle(
tg_id=tg_id, tg_id=tg_id,
symbol=symbol, symbol=symbol,
side=r_side, side=r_side,
order_quantity=next_quantity, order_quantity=total_quantity,
trigger_price=trigger_price, trigger_price=trigger_price,
margin_type=margin_type, margin_type=margin_type,
leverage=leverage, leverage=leverage,
take_profit_percent=take_profit_percent, take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_percent, stop_loss_percent=stop_loss_percent,
commission_fee_percent=total_fee
) )
if res == "OK": if res == "OK":
@@ -263,6 +270,7 @@ async def trading_cycle(
tg_id=tg_id, tg_id=tg_id,
symbol=symbol, symbol=symbol,
current_step=current_step, current_step=current_step,
current_series=current_series,
trade_mode=trade_mode, trade_mode=trade_mode,
side_mode=side_mode, side_mode=side_mode,
margin_type=margin_type, margin_type=margin_type,
@@ -273,7 +281,9 @@ async def trading_cycle(
max_bets_in_series=max_bets_in_series, max_bets_in_series=max_bets_in_series,
take_profit_percent=take_profit_percent, take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_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" return "OK"
@@ -303,11 +313,15 @@ async def open_positions(
margin_type: str, margin_type: str,
leverage: str, leverage: str,
take_profit_percent: float, take_profit_percent: float,
stop_loss_percent: float, stop_loss_percent: float
commission_fee_percent: float
) -> str | None: ) -> str | None:
try: try:
client = await get_bybit_client(tg_id=tg_id) 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) get_ticker = await get_tickers(tg_id, symbol=symbol)
price_symbol = safe_float(get_ticker.get("lastPrice")) or 0 price_symbol = safe_float(get_ticker.get("lastPrice")) or 0
instruments_info = await get_instruments_info(tg_id=tg_id, symbol=symbol) 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_step = safe_float(qty_step_str)
qty = (safe_float(order_quantity) * safe_float(leverage)) / safe_float(price_symbol) qty = (safe_float(order_quantity) * safe_float(leverage)) / safe_float(price_symbol)
decimals = abs(int(round(math.log10(qty_step)))) decimals = abs(int(round(math.log10(qty_step))))
qty_formatted = math.floor(qty / qty_step) * qty_step qty_format = math.floor(qty / qty_step) * qty_step
qty_formatted = round(qty_formatted, decimals) qty_formatted = round(qty_format, decimals)
if trigger_price > 0: if trigger_price > 0:
po_trigger_price = str(trigger_price) po_trigger_price = str(trigger_price)
@@ -330,23 +344,28 @@ async def open_positions(
if qty_formatted <= 0: if qty_formatted <= 0:
return "Order does not meet minimum order value" 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 margin_type == "ISOLATED_MARGIN":
if side == "Buy": if side == "Buy":
take_profit_price = price_for_cals * ( 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 stop_loss_price = None
else: else:
take_profit_price = price_for_cals * ( 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 stop_loss_price = None
else: else:
if side == "Buy": if side == "Buy":
take_profit_price = price_for_cals * ( 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) stop_loss_price = price_for_cals * (1 - stop_loss_percent / 100)
else: else:
take_profit_price = price_for_cals * ( 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) stop_loss_price = price_for_cals * (1 + stop_loss_percent / 100)
take_profit_price = max(take_profit_price, 0) take_profit_price = max(take_profit_price, 0)