
    -i                    T    d Z ddlmZ ddlmZ ddlZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 ddZy)u  
Swing pivot detection (V15 patch #13) — port fedele.

Used by structural SL placement: BUY trades anchor the SL behind a
recent swing LOW, SELL trades behind a swing HIGH. When no swing
qualifies, brain_tf / brain_mr fall back to ATR-based SL.

Pivot definition: 5-bar (2 left + 2 right neighbors are higher-low /
lower-high). "Strong" pivots additionally satisfy a wider neighbor
window scaled by atr_ratio (n_strong: 2 / 3 / 4).
    )annotations)AnyNc                   ddd|dk(  rdnddg d}| t        |       dk  r|S | d	   j                  }| d
   j                  }t        |       }	|dk  rd}
n
|dk  rd}
nd}
g }g }t        |	dz
  |z
  |
      }t        |	dz
  |d      D ]{  }|	dz
  |z
  }|dk(  r||   ||dz
     k  xr. ||   ||dz
     k  xr ||   ||dz      k  xr ||   ||dz      k  }|sRt	        t        ||         |      }||
k\  xr( ||
z   |	k  xr ||   |||
z
     k  xr ||   |||
z      k  }||d|d}|j                  |       |s|j                  |       ||   ||dz
     kD  xr. ||   ||dz
     kD  xr ||   ||dz      kD  xr ||   ||dz      kD  }|st	        t        ||         |      }||
k\  xr( ||
z   |	k  xr ||   |||
z
     kD  xr ||   |||
z      kD  }||d|d}|j                  |       |sk|j                  |       ~ |s|S |f|dk(  r1|D cg c]  }|d   |k  s| }}|D cg c]  }|d   |k  s| }}n0|D cg c]  }|d   |kD  s| }}|D cg c]  }|d   |kD  s| }}|s|S |r|n|}|dk(  rt        |d       }nt        |d       }|d   |d   d|d   |j                  d      r|
nd|dd dS c c}w c c}w c c}w c c}w )a  
    Find the most extreme swing point on the correct side of `entry_price`.

    Args:
        df: OHLCV (M5 typical).
        direction: "BUY" -> swing LOW; "SELL" -> swing HIGH.
        lookback: how many bars back from (n-3) to scan.
        atr_ratio: tunes the strength threshold (lower vol -> easier to qualify).
        price_decimals: rounding for swing_price.
        entry_price: filters swings on the wrong side (e.g. swing LOW must be
                     below entry for a BUY). When None no filter.

    Returns:
        dict with keys swing_price, swing_index, swing_found, swing_type,
        swing_strength, all_swings (truncated to first 5).
    NFBUY	SWING_LOW
SWING_HIGHr   )swing_priceswing_indexswing_found
swing_typeswing_strength
all_swings   highlow      ?   g      ?         )pricebars_agotypestrongr   c                    | d   S Nr    xs    0/home/work/apex_v16/analysis/indicators/swing.py<lambda>z'identify_swing_levels.<locals>.<lambda>|   
    1W:     )keyc                    | d   S r   r   r   s    r!   r"   z'identify_swing_levels.<locals>.<lambda>~   r#   r$   r   Tr   r      )	lenvaluesmaxrangeroundfloatappendminget)df	directionlookback	atr_ratioprice_decimalsentry_priceemptyhighslowsnn_strongr   strong_swingsscan_endir   
is_pivot_5r   	is_strongswscandidate_poolchosens                          r!   identify_swing_levelsrE      s   2 &/5&8{lE 
zSWr\vJEe9DBA3	SJ "M1q58#X.H1q5(B' #-EQ;Q$q1u+% @$q'DQK*? @Q$q1u+%@*.q'DQK*?  eDGnn=M 1a(lQ&6 1Gd1x<001Gd1x<00 
  %()Y@!!"%!((, a5Q<' DE!HuQU|,C Da5Q<'D,1!HuQU|,C  eE!Ho~>M 3a(lQ&6 3!HuQ\223!HuQ\22 
  %(*iA!!"%!((,G#-J (2R17k9QQRJR(5R17k9QQRMR(2R17k9QQRJR(5R17k9QQRMR&3]NE^)=>^)=> !/ , .&,jj&:($Ra.  SRRRs0   K K*K8KKKK)K)   r   r   N)r1   zpd.DataFramer2   strr3   intr4   r-   r5   rH   r6   zfloat | Nonereturnzdict[str, Any])__doc__
__future__r   typingr   pandaspdrE   r   r$   r!   <module>rO      sr   
 #    $sss s 	s
 s s sr$   