
    Ӿil                    X    d Z ddlmZ ddlmZ ddlZddZddZddZ	ddZ
dd	Zdd
Zy)un  
Candlestick pattern detectors — port fedele da V15.

Each function scans the last 1-3 bars and returns boolean flags.
Scope: hammer/shooting_star, engulfing (bull/bear), doji (+ type),
piercing/dark_cloud, morning_star/evening_star, volume_weak.

These flags become the input to analysis.price_action which
computes the weighted PA score consumed by both Brains.
    )annotations)OptionalNc                   dD ]  }| d   j                   |   }| d   j                   |   }| d   j                   |   }| d   j                   |   }t        ||z
        dz   }t        ||      |z
  }|t        ||      z
  }||z
  dz   }	|d|z  k\  xr ||z
  |	z  dk\  }
|d|z  k\  xr ||z
  |	z  dk\  }|
s|st	        |
      t	        |      fc S  y	)
u   
    Returns (hammer, shooting_star). Scans last 2 bars.

    Hammer: body small near top, lower shadow >= 2x body, close in
            top 60% of range.
    Shooting star: mirrored — upper shadow >= 2x body, close in bottom 60%.
    openhighlowclose&.>   g333333?)FF)ilocabsminmaxbool)dfiohlcbodylower_shadowupper_shadowcandle_rangehammershooting_stars               2/home/work/apex_v16/analysis/indicators/candles.pycalc_hammerr!      s      5vJOOAvJOOAuINN1wKQ1q5zD 1ay1}3q!9}1ut|!d(*LA/E/L%T1Sq1u6LPS6S]<m!4445     c                :   d}d}dD ]  }| d   j                   |dz
     }| d   j                   |dz
     }| d   j                   |   }| d   j                   |   }||k  }||kD  }	||k  xr ||k\  }
|r|	r|
rd}||kD  }||k  }||k\  xr ||k  }|s|s|sd} ||fS )zK
    Returns (bull_engulfing, bear_engulfing). Scans last 3 bar-pairs.
    Fr   r   r	      r   Tr   )r   bull_engbear_engr   o_prevc_prevo_currc_currprev_bearishcurr_bullishcoversprev_bullishcurr_bearishcovers_bears                 r    calc_engulfingr4   3   s     HH FQ'G!!!a%(F#G!!!$6!6f&6LVH&;6V+;L[H Xr"   c                J   dD ]  }| d   j                   |   }| d   j                   |   }| d   j                   |   }| d   j                   |   }t        ||z
        }||z
  dz   }t        ||      |z
  }|t        ||      z
  }	||dz  k  }
|
s||	dz  kD  r y	|	|dz  kD  r y
 y y)u-  
    Returns (doji_type, has_doji). doji_type ∈ {"dragonfly",
    "gravestone", "standard"} — body < 10% of range.

    NOTE: the price-action engine maps "dragonfly" -> doji_bull and
    "gravestone" -> doji_bear; "standard" doji has no directional bias
    so it is ignored by the PA score.
    r   r	   r
   r   r   r   g?r   )	dragonflyT)
gravestoneT)standardT)NF)r   r   r   r   )r   r   r   r   r   r   r   r   r   r   is_dojis              r    	calc_dojir:   O   s      $vJOOAvJOOAuINN1wKQ1q5z1ut|1ay1}3q!9}++lQ..(lQ..)#$  r"   c                <   d}d}dD ]  }| d   j                   |dz
     }| d   j                   |dz
     }| d   j                   |   }| d   j                   |   }||z   dz  }||k  }	||kD  }
|	r|
r||kD  r||k  rd}||kD  }||k  }|s|s||k  s||kD  sd} ||fS )z
    Returns (piercing, dark_cloud). Scans last 3 bar-pairs.

    Piercing: prev bearish, curr bullish, closes above prev midpoint
              but below prev open.
    Dark cloud: mirrored.
    Fr$   r	   r&   r   r   Tr'   )r   piercing
dark_cloudr   r*   r+   r,   r-   prev_midr.   r/   r1   r2   s                r    calc_piercing_darkr?   o   s     HJ FQ'G!!!a%(F#G!!!$VOq(LVh->6F?HLVh->6F?J Zr"   c                   d}d}dD ]  }| d   j                   |dz
     }| d   j                   |dz
     }| d   j                   |dz
     }| d   j                   |dz
     }| d   j                   |   }| d   j                   |   }	t        ||z
        t        ||z
        dz  k  }
||k  r|
r|	|kD  r|	||z   dz  kD  rd}||kD  s|
s|	|k  s|	||z   dz  k  sd} ||fS )	z
    Returns (morning_star, evening_star). 3-bar pattern.

    Morning: bearish | small | bullish closing above midpoint of bar1.
    Evening: mirrored.
    Fr   r	   r   r   r&   g333333?T)r   r   )r   morning_starevening_starr   o1c1o2c2o3c3second_smalls              r    calc_star_patternsrJ      s    LL  Z__QU#[a!e$Z__QU#[a!e$Z__Q[a 27|c"r'lS&88GbR27a-5GLGbR27a-5GL  %%r"   c                    d| j                   v rdnd}|| j                   vry| |   j                  d      j                         j                  d   }| |   j                  d   }t	        ||dz  k        S )z
    True when last bar volume < 85% of 20-bar avg.

    V14 used 'tick_volume'; V15+ uses real CME 'volume' from
    TopstepX. Logic identical, data quality much better.
    volumetick_volumeF   r   g333333?)columnsrollingmeanr   r   )r   colavg_vollast_vols       r    calc_volume_weakrU      sq     "**,(-C
"**goob!&&(--b1G#w||BH7T>)**r"   )r   pd.DataFramereturnztuple[bool, bool])r   rV   rW   ztuple[Optional[str], bool])r   rV   rW   r   )__doc__
__future__r   typingr   pandaspdr!   r4   r:   r?   rJ   rU    r"   r    <module>r^      s4   	 #  88@ >&8+r"   