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
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)