
    Ii                         d dl Zd dlZd dlZd dlmZmZ d dlm	Z	  ej
        e          Z G d d          Z e            ZdS )    N)ListOptional)settingsc            	           e Zd ZdZ	 	 	 ddededefdZddej        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e         fdZdededed
efdZded
efdZdS )
RiskEnginez
    Calculates stop-loss, take-profit levels, and position size.

    Stop-loss is ATR-based (volatility-adjusted).
    Take-profit levels: TP1 = 1.5R, TP2 = 3R.
    Position size is determined by fixed % risk per trade.
    Natr_multiplierrisk_pctmax_open_tradesc                 x    |pt           j        | _        |pt           j        | _        |pt           j        | _        d S )N)r   ATR_MULTIPLIER_SLr   RISK_PER_TRADE_PCTr	   MAX_OPEN_TRADESr
   )selfr   r	   r
   s       ;/var/www/html/crypto-bot/backend/app/engines/risk_engine.py__init__zRiskEngine.__init__   s9     -J0J ?H$?.J(2J       dfperiodreturnc                 d   t           j                            |d         |d         |d         |                                          }||                                j        r#t          |d         j        d                   dz  S t          |                                j        d                   S )z-Return the latest ATR value from a DataFrame.highlowclose)windowNg{Gz?)ta_lib
volatilityAverageTrueRangeaverage_true_rangedropnaemptyfloatiloc)r   r   r   
atr_seriess       r   calculate_atrzRiskEngine.calculate_atr   s    &77vJ5	2g;v 8 
 




 	 !2!2!4!4!:G)"-..55Z&&((-b1222r   entry_pricesignalatrc                 n    || j         z  }|dk    rt          ||z
  d          S t          ||z   d          S )z
        ATR-based stop-loss.
        BUY:  SL = entry - (ATR * multiplier)
        SELL: SL = entry + (ATR * multiplier)
        BUY   )r   round)r   r'   r(   r)   offsets        r   calculate_stop_losszRiskEngine.calculate_stop_loss'   sD     t**U??v-q111v-q111r   	stop_lossc                     t          ||z
            }|dk    r-t          ||dz  z   d          }t          ||dz  z   d          }n,t          ||dz  z
  d          }t          ||dz  z
  d          }||gS )zE
        TP1 = 1.5R, TP2 = 3R where R = |entry - stop_loss|.
        r+   g      ?r,   g      @)absr-   )r   r'   r0   r(   risktp1tp2s          r   calculate_take_profitsz!RiskEngine.calculate_take_profits5   s     ;*++U??dSj0!44CdSj0!44CCdSj0!44CdSj0!44CSzr   capitalc                 z    || j         z  dz  }t          ||z
            }|dk    rdS ||z  }t          |d          S )z
        Position size based on fixed risk % of capital.
        quantity = (capital * risk_pct / 100) / |entry - stop_loss|
        d   r   g           )r	   r2   r-   )r   r7   r'   r0   risk_amount
price_riskquantitys          r   calculate_position_sizez"RiskEngine.calculate_position_sizeD   sO     -3y011
??3+Xq!!!r   open_trade_countc                     || j         k     S )zDCheck if another trade can be opened given current open trade count.)r
   )r   r?   s     r   can_open_tradezRiskEngine.can_open_tradeU   s    $"666r   )NNN)r   )__name__
__module____qualname____doc__r#   intr   pd	DataFramer&   strr/   r   r6   r>   boolrA    r   r   r   r   
   s^         !%#	K KK K 	K K K K3 3 3c 35 3 3 3 32 2*-2492	2 2 2 2 -2<?	e   "" " 	"
 
" " " ""7s 7t 7 7 7 7 7 7r   r   )pandasrG   tar   loggingtypingr   r   
app.configr   	getLoggerrB   loggerr   risk_enginerK   r   r   <module>rT      s             ! ! ! ! ! ! ! !      		8	$	$M7 M7 M7 M7 M7 M7 M7 M7` jllr   