
    >i                    4    d Z ddlmZ ddlZdZdZdZdZd	dZ	y)
u   
Volume-based indicators — port fedele da V15.

Currently exposes `calc_absorption`: detects when a directional candle
is absorbed by the opposing side (high volume + small range = exhaustion).
    )annotationsNg      ?g      ?   g?c                   |dk  st        |       t        k  ryd| j                  v rdnd}|| j                  vry| |   j                  t              j	                         j
                  d   }t        j                  |      s|dk  ryt        | |   j
                  d         }t        | d   j
                  d         }t        | d   j
                  d         }t        | d   j
                  d         }t        | d	   j
                  d         }||z
  }	|	dk  ryt        ||z
        }
|
t        |	z  k  ry|t        t        |      z  kD  }|	t        |z  k  }|r|sy||kD  }||k  }t        |      t        |      fS )
u  
    Returns (buy_absorption, sell_absorption) on the last bar.

    BUY_ABSORPTION  := close > open  AND  vol > 1.5x avg20  AND  range < 0.5x ATR
    SELL_ABSORPTION := close < open  AND  vol > 1.5x avg20  AND  range < 0.5x ATR

    Doji bodies (body <= 10% of range) are excluded — no directional bias.

    Semantics: a directional candle backed by heavy volume but compressed
    range means the opposing side is absorbing the push — exhaustion signal,
    contrarian.

    Safe defaults:
      - missing volume column        → (False, False)
      - rolling NaN (df < 20 bars)   → (False, False)
      - atr <= 0                     → (False, False)
    r   )FFvolumetick_volumeopenhighlowclose)lenVOL_ABSORPTION_LOOKBACKcolumnsrollingmeanilocpdisnafloatabsVOL_ABSORPTION_MIN_BODY_RATIOVOL_ABSORPTION_VOL_MULTIPLIERVOL_ABSORPTION_RANGE_RATIObool)dfatrcolavg_vollast_volohlcrngbodyhigh_volsmall_rangebuy_abssell_abss                  1/home/work/apex_v16/analysis/indicators/volume.pycalc_absorptionr+      sn   $ ax3r744"**,(-C
"**goo56;;=BB2FG	www7a<RW\\"%&Hbjoob!"Abjoob!"AbinnR !Abkr"#A
a%C
axq1u:D,s227%.HHH2S88K!eG1uH=$x.((    )r   zpd.DataFramer   r   returnztuple[bool, bool])
__doc__
__future__r   pandasr   r   r   r   r   r+    r,   r*   <module>r2      s1    #  !$  #  "  # 2)r,   