2
0
forked from kodorvan/stcs

The logic of setting take profit and stop loss has been changed, added data for the end user

This commit is contained in:
algizn97
2025-10-29 20:58:04 +05:00
parent a8119d2811
commit e043a2429f
3 changed files with 127 additions and 132 deletions

View File

@@ -78,7 +78,8 @@ async def start_trading_cycle(
stop_loss_percent=stop_loss_percent,
base_quantity=order_quantity,
commission_fee=commission_fee,
commission_place=commission_place
commission_place=commission_place,
pnl_series=0
)
res = await open_positions(
@@ -87,10 +88,7 @@ async def start_trading_cycle(
side=side,
order_quantity=order_quantity,
trigger_price=trigger_price,
margin_type=margin_type,
leverage=leverage,
take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_percent,
leverage=leverage
)
if res == "OK":
@@ -171,7 +169,8 @@ async def trading_cycle_profit(
stop_loss_percent=stop_loss_percent,
base_quantity=base_quantity,
commission_fee=commission_fee,
commission_place=commission_place
commission_place=commission_place,
pnl_series=0
)
res = await open_positions(
@@ -180,10 +179,7 @@ async def trading_cycle_profit(
side=s_side,
order_quantity=base_quantity,
trigger_price=trigger_price,
margin_type=margin_type,
leverage=leverage,
take_profit_percent=take_profit_percent,
stop_loss_percent=stop_loss_percent,
leverage=leverage
)
if res == "OK":
@@ -227,6 +223,7 @@ async def trading_cycle(
base_quantity = user_deals_data.base_quantity
side_mode = user_deals_data.side_mode
current_series = user_deals_data.current_series
pnl_series = user_deals_data.pnl_series
next_quantity = safe_float(order_quantity) * (
safe_float(martingale_factor)
@@ -272,7 +269,8 @@ async def trading_cycle(
stop_loss_percent=stop_loss_percent,
base_quantity=base_quantity,
commission_fee=commission_fee,
commission_place=commission_place
commission_place=commission_place,
pnl_series=pnl_series
)
res = await open_positions(
@@ -281,10 +279,7 @@ async def trading_cycle(
side=r_side,
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,
leverage=leverage
)
if res == "OK":
@@ -313,18 +308,10 @@ async def open_positions(
symbol: str,
order_quantity: float,
trigger_price: float,
margin_type: str,
leverage: str,
take_profit_percent: float,
stop_loss_percent: float
leverage: str
) -> 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)
@@ -342,38 +329,6 @@ async def open_positions(
po_trigger_price = None
trigger_direction = None
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"
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) + total_commission
stop_loss_price = None
else:
take_profit_price = price_for_cals * (
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) + 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) - total_commission
stop_loss_price = price_for_cals * (1 + stop_loss_percent / 100)
take_profit_price = max(take_profit_price, 0)
stop_loss_price = max(stop_loss_price, 0)
# Place order
order_params = {
"category": "linear",
@@ -387,8 +342,6 @@ async def open_positions(
"timeInForce": "GTC",
"positionIdx": 0,
"tpslMode": "Full",
"takeProfit": str(take_profit_price) if take_profit_price else None,
"stopLoss": str(stop_loss_price) if stop_loss_price else None,
}
response = client.place_order(**order_params)