
    nWi              
           d dl Zd dlZd dlmZmZ ddej        dedee	ee
         f         fdZde
d	ee
         de
fd
ZdS )    N)DictList2   dflookbackreturnc                    |                      |                                          }|d         j        }|d         j        }g }g }t          dt	          |          dz
            D ]}||         ||dz
           k    rh||         ||dz
           k    rS||         ||dz            k    r>||         ||dz            k    r)|                    t          ||         d                     t          dt	          |          dz
            D ]}||         ||dz
           k     rh||         ||dz
           k     rS||         ||dz            k     r>||         ||dz            k     r)|                    t          ||         d                     ddt          t                   dt          d	t          t                   fd
} ||           ||          dS )a  
    Detect support and resistance levels using pivot points.

    Args:
        df: OHLCV DataFrame with at least `lookback` rows.
        lookback: Number of candles to analyze.

    Returns:
        dict with keys "support" and "resistance", each a sorted list of price levels.
    highlow         {Gzt?levels	tolerancer   c                     | sg S t          |           }|d         g}|dd          D ]<}t          ||d         z
            |d         z  |k    r|                    |           =|S )Nr   r   )sortedabsappend)r   r   sorted_lvls	clusteredlvls        ?/var/www/html/crypto-bot/backend/app/core/support_resistance.pyclusterzdetect_levels.<locals>.cluster%   s}     	IVnn ^$	qrr? 	& 	&C32&'')B-7)CC  %%%    )support
resistance)r   )	tailcopyvaluesrangelenr   roundr   float)	r   r   datahighslowssupport_levelsresistance_levelsir   s	            r   detect_levelsr,      s    778!!##DLE;D"$N%' 1c%jj1n%% 9 98eAEl""uQx%A,'>'>!HuQU|++a5Q<0G0G$$U58Q%7%7888 1c$ii!m$$ 5 57T!a%[  T!WtAE{%:%:Gd1q5k))d1gQU.C.C!!%Q"3"3444 U  $u+     7>**g/00  r   pricer   c                 4     |s S t          | fd          S )z:Return the level closest to `price` from a list of levels.c                 (    t          | z
            S )N)r   )r   r-   s    r   <lambda>znearest_level.<locals>.<lambda>9   s    s3;'7'7 r   )key)min)r-   r   s   ` r   nearest_levelr3   5   s-     v77778888r   )r   )pandaspdnumpynptypingr   r   	DataFrameintstrr%   r,   r3    r   r   <module>r=      s                   , ,bl ,c ,4T%[@P;Q , , , ,^9 9U 9 9 9 9 9 9 9r   