
    kWi                         d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ  e j        e          Z G d d	          Z e            ZdS )
    N)datetime)List)select)AsyncSession)get_current_price)TradeTradeStatusTradeResultTradeSignalc                   x    e Zd ZdZd ZdefdZdedefdZdede	de
fd	Zdede	d
e	de
fdZdedede	defdZdS )TradeMonitorz
    Monitors open trades every 30 seconds.
    Checks stop-loss hits, take-profit hits (partial), and updates max drawdown.
    c                 0    d | _         d | _        d | _        d S N)	on_sl_hit	on_tp_hiton_trade_closed)selfs    =/var/www/html/crypto-bot/backend/app/engines/trade_monitor.py__init__zTradeMonitor.__init__   s    #    dbc                 H  K   |                     t          t                                        t          j        t
          j        k                         d{V }|                                                                }|D ]}| 	                    ||           d{V  dS )z)Called by the scheduler every 30 seconds.N)
executer   r   wherestatusr	   OPENscalarsall_process_trade)r   r   resultopen_tradestrades        r   check_open_tradeszTradeMonitor.check_open_trades   s      zz5MM0@ @AA
 
 
 
 
 
 
 
 $*>>#3#3#7#7#9#9  	1 	1E%%b%0000000000	1 	1r   r"   c           	        K   t          |j                  }|,t                              d|j         d|j                    dS ||_        |j        t          j        k    r||j	        z
  |j	        z  dz  }n|j	        |z
  |j	        z  dz  }|dk     r6t          |          }|j        ||j        k    rt          |d          |_        |                     ||          rL|                     |||t          j                   d{V  | j        r|                     |           d{V  dS t%          |j        pdgt)          |j        pg           z            }d}t-          |j        pg           D ]y\  }}	||         sl|                     |||	          rUd||<   d}t                              d	|j         d
|dz    d|            | j        r|                     ||           d{V  z|rb||_        t5          |          rL|                     |||t          j                   d{V  | j        r|                     |           d{V  dS |                                 d{V  dS )z>Evaluate a single open trade against the current market price.NzCould not fetch price for z, skipping trade d   r      FTTrade z: TP   z hit at )r   pairloggerwarningidcurrent_pricesignalr   BUYentry_priceabsmax_drawdownround_hit_stop_loss_close_trader
   LOSSr   listtp_hitslentake_profit_levels	enumerate_hit_take_profitinfor   r   WINr   commit)
r   r   r"   r-   unrealised_pnldrawdownr8   changeditp_prices
             r   r   zTradeMonitor._process_trade#   s     )%*55 NN_
__UZU]__```F+ <;?**+e.??5CTTWZZNN#/-?5CTTWZZNA>**H!)X8J-J-J%*8Q%7%7" um44 	##B}k>NOOOOOOOOO~ ,nnU+++++++++F u}U#e6N6TRT2U2U(UVV$U%=%CDD 	3 	3KAx1: 3$"7"7}h"W"W 3!
OUXOO1Q3OOOOPPP> 3..222222222 	#EM7|| ''E=+/RRRRRRRRR' 6..u555555555iikkr   r-   returnc                 X    |j         t          j        k    r||j        k    S ||j        k    S r   )r.   r   r/   	stop_loss)r   r"   r-   s      r   r4   zTradeMonitor._hit_stop_lossT   s+    <;?** EO33 EO33r   rD   c                 D    |j         t          j        k    r||k    S ||k    S r   )r.   r   r/   )r   r"   r-   rD   s       r   r<   zTradeMonitor._hit_take_profitZ   s'    <;?** H,, H,,r   
exit_pricer    c           
        K   t           j        |_        t          j                    |_        ||_        ||_        |j        t          j
        k    r||j        z
  |j        z  dz  }n|j        |z
  |j        z  dz  }t          |d          |_        |j        r(t          |dz  |j        z  |j        z  d          |_        |                                 d{V  t"                              d|j         d| d|dd	|            dS )
z-Mark a trade as closed and compute final PnL.r%   r&      Nr'   z	 closed: z | PnL=z.2fz	% | exit=)r	   CLOSEDr   r   utcnow	closed_atr    r-   r.   r   r/   r0   r3   pnl_percentagequantity
pnl_amountr?   r*   r=   r,   )r   r   r"   rI   r    pnl_pcts         r   r5   zTradeMonitor._close_trade`   s       #)"/++(<;?**!E$559JJSPGG(:59JJSPG$Wa00> 	\$Ws]U5F%F%WYZ[[EiikkYUXYYYYwYYYZYY	
 	
 	
 	
 	
r   N)__name__
__module____qualname____doc__r   r   r#   r   r   floatboolr4   r<   r
   r5    r   r   r   r      s         
$ $ $1, 1 1 1 1/| /E / / / /b4E 4% 4D 4 4 4 4-e -E -U -W[ - - - -

 
 	

 
 
 
 
 
 
r   r   )loggingr   typingr   
sqlalchemyr   sqlalchemy.ext.asyncior   app.data_layer.market_datar   app.models.trader   r	   r
   r   	getLoggerrS   r*   r   trade_monitorrY   r   r   <module>rb      s                       / / / / / / 8 8 8 8 8 8 I I I I I I I I I I I I		8	$	$l
 l
 l
 l
 l
 l
 l
 l
^ r   