From 7e4c936ef5b585687c3b82cb3de3159863e7afb7 Mon Sep 17 00:00:00 2001 From: algizn97 Date: Wed, 29 Oct 2025 20:54:29 +0500 Subject: [PATCH] Added pnl, tp and sl column --- database/models.py | 3 ++ database/request.py | 67 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 2 deletions(-) diff --git a/database/models.py b/database/models.py index b7fa56f..24c7902 100644 --- a/database/models.py +++ b/database/models.py @@ -160,6 +160,9 @@ class UserDeals(Base): current_series = Column(Integer, nullable=True) commission_fee = Column(String, nullable=True) commission_place = Column(String, nullable=True) + pnl_series = Column(Float, nullable=True) + take_profit = Column(Float, nullable=False, default=0.0) + stop_loss = Column(Float, nullable=False, default=0.0) user = relationship("User", back_populates="user_deals") diff --git a/database/request.py b/database/request.py index 38d51a1..3d34697 100644 --- a/database/request.py +++ b/database/request.py @@ -200,6 +200,8 @@ async def create_user_additional_settings(tg_id: int) -> None: user=user, trade_mode="Long", # Default value switch_side="По направлению", + side="Buy", + trigger_price=0.0, margin_type="ISOLATED_MARGIN", leverage="10", order_quantity=1.0, @@ -990,7 +992,8 @@ async def set_user_deal( stop_loss_percent: int, base_quantity: float, commission_fee: str, - commission_place: str + commission_place: str, + pnl_series: float ): """ Set the user deal in the database. @@ -1011,6 +1014,7 @@ async def set_user_deal( :param base_quantity: Base quantity :param commission_fee: Commission fee :param commission_place: Commission place + :param pnl_series: PNL series :return: bool """ try: @@ -1043,6 +1047,7 @@ async def set_user_deal( deal.base_quantity = base_quantity deal.commission_fee = commission_fee deal.commission_place = commission_place + deal.pnl_series = pnl_series else: # Creating new record new_deal = UserDeals( @@ -1062,7 +1067,8 @@ async def set_user_deal( 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 ) session.add(new_deal) @@ -1199,6 +1205,63 @@ async def set_current_series(tg_id: int, symbol: str, current_series: int): return False +async def set_tp_sl_by_symbol(tg_id: int, symbol: str, tp: float, sl: float): + """Set tp and sl for a user deal by symbol in the database.""" + try: + async with async_session() as session: + result = await session.execute(select(User).filter_by(tg_id=tg_id)) + user = result.scalars().first() + if user is None: + logger.error(f"User with tg_id={tg_id} not found") + return False + + result = await session.execute( + select(UserDeals).filter_by(user_id=user.id, symbol=symbol) + ) + record = result.scalars().first() + + if record: + record.take_profit = tp + record.stop_loss = sl + else: + logger.error(f"User deal with user_id={user.id} and symbol={symbol} not found") + return False + await session.commit() + logger.info("Set tp and sl for user %s and symbol %s", tg_id, symbol) + return True + except Exception as e: + logger.error("Error setting user deal tp and sl for user %s and symbol %s: %s", tg_id, symbol, e) + return False + + +async def set_pnl_series_by_symbol(tg_id: int, symbol: str, pnl_series: float): + """Set pnl series for a user deal by symbol in the database.""" + try: + async with async_session() as session: + result = await session.execute(select(User).filter_by(tg_id=tg_id)) + user = result.scalars().first() + if user is None: + logger.error(f"User with tg_id={tg_id} not found") + return False + + result = await session.execute( + select(UserDeals).filter_by(user_id=user.id, symbol=symbol) + ) + record = result.scalars().first() + + if record: + record.pnl_series = pnl_series + else: + logger.error(f"User deal with user_id={user.id} and symbol={symbol} not found") + return False + await session.commit() + logger.info("Set pnl series for user %s and symbol %s", tg_id, symbol) + return True + except Exception as e: + logger.error("Error setting user deal pnl series for user %s and symbol %s: %s", tg_id, symbol, e) + return False + + # USER AUTO TRADING async def get_all_user_auto_trading(tg_id: int):