
    rWi
                         d dl Z d dlmZ 	 ddee         dedefdZde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 )    N)List{Gz?returnsrisk_free_ratereturnc                 N   t          |           dk     rdS t          |           }t          |           |z  t          fd| D                       |dz
  z  }t          j        |          }|dk    rdS |dz  }|z
  |z  t          j        d          z  }t	          |d          S )z
    Annualised Sharpe ratio.

    Args:
        returns: list of period returns (e.g. daily PnL percentages as decimals).
        risk_free_rate: annual risk-free rate (default 2%).

    Returns:
        Sharpe ratio, or 0.0 if insufficient data.
               c              3   (   K   | ]}|z
  d z  V  dS )r	   N ).0rmean_returns     9/var/www/html/crypto-bot/backend/app/analytics/metrics.py	<genexpr>z)calculate_sharpe_ratio.<locals>.<genexpr>   s,      ;;aAO);;;;;;       r         )lensummathsqrtround)r   r   nvariancestd_devdaily_rfsharper   s          @r   calculate_sharpe_ratior       s     7||asGAg,,"K;;;;7;;;;;q1uEHi!!G!||s #HH$/$)C..@Fr   equity_curvec                     t          |           dk     rdS | d         }d}| D ]}||k    r|}||z
  |z  dz  }||k    r|}t          |d          S )z
    Maximum drawdown as a positive percentage (0-100).

    Args:
        equity_curve: list of portfolio values over time.

    Returns:
        Max drawdown percentage, or 0.0 if curve is empty.
    r	   r
   r   d   r   )r   r   )r!   peakmax_ddvaluedrawdowns        r   calculate_max_drawdownr(   #   s{     <1s?DF  4<<D5LD(3.fFr   gross_profit
gross_lossc                 |    |dk    r| dk    rdnt          d          S t          | t          |          z  d          S )z[
    Profit factor = gross_profit / gross_loss.
    Returns 0.0 if gross_loss is zero.
    r   r
   infr   )floatr   abs)r)   r*   s     r   calculate_profit_factorr/   =   sB    
 Q"a''ssU5\\9J/333r   win_rateavg_winavg_lossc                 B    d| z
  }| |z  ||z  z
  }t          |d          S )a"  
    Expectancy per trade = (win_rate * avg_win) - (loss_rate * avg_loss).

    Args:
        win_rate: fraction 0.0-1.0
        avg_win:  average winning trade PnL (positive)
        avg_loss: average losing trade PnL (positive magnitude)

    Returns:
        Expected PnL per trade.
    g      ?r   )r   )r0   r1   r2   	loss_rate
expectancys        r   calculate_expectancyr6   G   s1     hIW$X)=>JQr   entrysltpc                     t          | |z
            }t          || z
            }|dk    rdS t          ||z  d          S )z^
    Risk-to-Reward ratio = |tp - entry| / |entry - sl|.
    Returns 0.0 if risk is zero.
    r   r
   r   )r.   r   )r7   r8   r9   riskrewards        r   calculate_rr_ratior=   Z   sD    
 urz??De__Fqyys$"""r   )r   )	r   typingr   r-   r    r(   r/   r6   r=   r   r   r   <module>r?      s          37 %[*/
   <e     44% 4U 4u 4 4 4 4  # /4 
       &	#e 	# 	#E 	#e 	# 	# 	# 	# 	# 	#r   