Ë
    Bp±jõ)  ã                   ó˜   — d dl Zd dlZd dlmZ ed„ «       Zed„ «       Zed„ «       Zed„ «       Z	ed„ «       Z
ed„ «       Zdd	„Zed
„ «       Zy)é    N)Únjitc                 ó–  — t        |«      }t        j                  |«      }t        d|«      D ]™  }| |dz
     }	||dz
     }
t	        |
|	z
  «      }| |   }||   }||   }||   }||z
  }t	        ||z
  «      }|
|	kD  }||k  }||
kD  xr ||	k  }|sŒa|sŒd|sŒgd}|dkD  r||z  }||k\  sŒy|dkD  r||z  }n|}t        ||z  d«      }|||<   Œ› |S )a  
    Calculates a score for Bearish Engulfing patterns.
    
    Score is based on:
    1. Pattern validity (Green candle followed by Red engulfing candle)
    2. Body Quality (Body / Range >= quality_ratio)
    3. Confidence (Size of engulfing body relative to previous body)
    é   ç        r   ç      ð?)ÚlenÚnpÚzerosÚrangeÚabsÚmin)Úopen_arrÚ	close_arrÚhigh_arrÚlow_arrÚquality_ratioÚscaling_factorÚnÚscoresÚiÚ	prev_openÚ
prev_closeÚ	prev_bodyÚ	curr_openÚ
curr_closeÚ	curr_highÚcurr_lowÚ
curr_rangeÚ	curr_bodyÚis_prev_greenÚis_curr_redÚengulfsÚqualityÚratioÚ
confidences                           úu/Users/jameslopez/projects/TradingBot25/.worktrees/mlp-comparable-measurement/strategies/library_activation_scores.pyÚcalculate_bearish_engulfingr'      s  € ô 	ˆI‹€AÜ�X‰X�a‹[€Fä�1�aŽ[ˆà˜Q˜q™S‘Mˆ	Ø˜q ™s‘^ˆ
Ü˜
 YÑ.Ó/ˆ	ð ˜Q‘Kˆ	Ø˜q‘\ˆ
Ø˜Q‘Kˆ	Ø˜1‘:ˆØ Ñ)ˆ
Ü˜
 YÑ.Ó/ˆ	ð # YÑ.ˆØ  9Ñ,ˆà˜zÑ)ÒG°
¸YÑ0Fˆâš[ªWàˆGØ˜AŠ~Ø# jÑ0�à˜-Ó'ð ˜q’=Ø%¨	Ñ1‘Eà*�Eô ! ¨Ñ!7¸Ó=�
Ø&��q’	ðI ðL €Mó    c                 óì  — t        |«      }t        j                  |«      }t        d|«      D ]Ä  }| |dz
     }	||dz
     }
| |   }||   }||   }||   }||z
  }t	        ||z
  «      }t	        |
|	z
  «      }|
|	k  }||kD  }||	kD  }|sŒZ|sŒ]|sŒ`||dz
     ||dz
     z
  }|dkD  r||z  nd}|dkD  r||z  nd}||k\  sŒ�||k\  sŒ•|dkD  r||z  nd}|dz
  |dz
  z  }t        dt        d|«      «      ||<   ŒÆ |S )z<Mirror of calculate_bearish_engulfing for bullish reversals.r   r   r   g     8�@r   ©r   r	   r
   r   r   Úmaxr   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Úis_prev_bearishÚis_curr_bullishÚis_engulfingÚ
prev_rangeÚcurr_qualityÚprev_qualityÚ
body_ratioÚscores                             r&   Úcalculate_bullish_engulfingr4   :   sE  € ô 	ˆI‹€AÜ�X‰X�a‹[€FÜ�1�aŽ[ˆØ˜a ™c‘]ˆ	Ø˜q ™s‘^ˆ
Ø˜a‘[ˆ	Ø˜q‘\ˆ
Ø˜a‘[ˆ	Ø˜Q‘ZˆØ Ñ)ˆ
Ü˜ iÑ/Ó0ˆ	Ü˜ iÑ/Ó0ˆ	à$ yÑ0ˆØ$ yÑ0ˆà$ yÑ0ˆâš²<Ø! ! A¡#™¨°°1±©Ñ5ˆJØ7AÀA²~˜I¨
Ò2È3ˆLØ7AÀA²~˜I¨
Ò2È3ˆLØ˜}Ó,°ÀÓ1NØ8AÀAº˜i¨)Ò3È5�
Ø# cÑ)¨n¸sÑ.BÑC�Ü ¤S¨¨e£_Ó5��q’	ð/ ð0 €Mr(   c           	      óž  — t        |«      }t        j                  |«      }t        |«      D ]ž  }	||	   ||	   z
  }
|
dk  rŒt	        ||	   | |	   z
  «      }t        ||	   | |	   «      ||	   z
  }||	   t        ||	   | |	   «      z
  }||
z  }||
z  }||
z  }||k\  sŒm||k  sŒs||k  sŒy||z
  }d|z
  }t        dt        d||z  «      «      ||	<   Œ  |S )z*Detects Bullish Hammer / Pin Bar patterns.r   r   )r   r	   r
   r   r   r   r+   )r   r   r   r   Úmin_lower_shadow_ratioÚmax_body_ratioÚmax_upper_shadow_ratior   r   r   Úcandle_rangeÚbodyÚlower_shadowÚupper_shadowÚlower_ratior2   Úupper_ratioÚexcessÚ
max_excesss                      r&   Úcalculate_bullish_hammerrA   Z   s  € ô 	ˆI‹€AÜ�X‰X�a‹[€FÜ�1ŽXˆØ ‘{ W¨Q¡ZÑ/ˆØ˜3ÒØÜ˜9 Q™<¨(°1©+Ñ5Ó6ˆÜ˜9 Q™<¨°!©Ó5¸À¹
ÑBˆØ ‘{¤S¨°1©°xÀ±{Ó%CÑCˆØ# lÑ2ˆØ lÑ2ˆ
Ø# lÑ2ˆØÐ1Ó1Ø˜~Ó-ØÐ5Ó5Ø$Ð'=Ñ=ˆFØÐ5Ñ5ˆJÜ˜S¤# c¨6°JÑ+>Ó"?Ó@ˆF�1ŠIð ð  €Mr(   c           	      óž  — t        |«      }t        j                  |«      }t        |«      D ]ž  }	||	   ||	   z
  }
|
dk  rŒt	        ||	   | |	   z
  «      }||	   t        ||	   | |	   «      z
  }t        ||	   | |	   «      ||	   z
  }||
z  }||
z  }||
z  }||k\  sŒm||k  sŒs||k  sŒy||z
  }d|z
  }t        dt        d||z  «      «      ||	<   Œ  |S )z:Detects Bearish Shooting Star / Inverted Pin Bar patterns.r   r   r*   )r   r   r   r   Úmin_upper_shadow_ratior7   Úmax_lower_shadow_ratior   r   r   r9   r:   r<   r;   r>   r2   r=   r?   r@   s                      r&   Úcalculate_shooting_starrE   s   s  € ô 	ˆI‹€AÜ�X‰X�a‹[€FÜ�1ŽXˆØ ‘{ W¨Q¡ZÑ/ˆØ˜3ÒØÜ˜9 Q™<¨(°1©+Ñ5Ó6ˆØ ‘{¤S¨°1©°xÀ±{Ó%CÑCˆÜ˜9 Q™<¨°!©Ó5¸À¹
ÑBˆØ# lÑ2ˆØ lÑ2ˆ
Ø# lÑ2ˆØÐ1Ó1Ø˜~Ó-ØÐ5Ó5Ø$Ð'=Ñ=ˆFØÐ5Ñ5ˆJÜ˜S¤# c¨6°JÑ+>Ó"?Ó@ˆF�1ŠIð ð  €Mr(   c                 ó"   — | |k  r|S | |kD  r|S | S )N© )ÚvalueÚ	min_valueÚ	max_values      r&   Úclip_scalarrK   Œ   s#   € àˆyÒØÐØ	�Ò	ØÐàˆr(   c$                 óî  — t        | «      }$t        j                  |$«      }%t        |$«      D �]Å  }&t        j                  | |&   «      s| |&   dz
  dz  nd}'||&   dkD  rdnd}(t        j                  ||&   «      s||&   dz
  dz  nd})||&   rdnd}*||&   dkD  rdnd}+||&   dkD  rdn||&   dk  rdnd},t        j                  ||&   «      st        ||&   dz
   dz  d	d
«      nd}-||&   dkD  rdn||&   dk  rdnd}.t        j                  ||&   «      st        ||&   d	d
«      nd}/|	|&   rdnd}0|
|&   rdnd}1||&   dkD  rdn||&   dk  rdnd}2||&   dkD  rdn||&   dk  rdnd}3||&   dkD  rdn||&   dk  rdnd}4|(|z  |'|z  z   |)|z  z   |*|z  z   |+|z  z   |,|z  z   |-|z  z   |.|z  z   |/|z  z   |0|z  z   |1|z  z   |2|z  z   |3|z  z   |4|z  z   ||&   | z  z   ||&   |!z  z   ||&   |"z  z   ||&   |#z  z   }5|5|%|&<   �ŒÈ |%S )Né2   r   r   éÿÿÿÿg•Ö&è.>g•Ö&è.¾é*   é   g      ð¿r   )r   r	   r
   r   ÚisnanrK   )6Ústoch_valueÚmacd_predictionÚoscÚmacd_flipped_bullishÚm3_momentumÚm2_diff_tinyÚrsid_oscÚstoch_div_oscÚvwap_div_oscÚstoch_is_peakingÚstoch_is_bottomingÚ
m3_div_oscÚm2_div_osc_tinyÚm2_div_osc_noOffsetÚbearish_engulfing_scoreÚbullish_hammer_scoreÚbullish_engulfing_scoreÚshooting_star_scoreÚw_stochÚw_macd_predÚw_oscÚw_macd_bullishÚw_m3_momentumÚ	w_m2_tinyÚ
w_rsid_oscÚw_stoch_div_oscÚw_vwap_div_oscÚw_stoch_peakingÚw_stoch_bottomingÚw_m3_div_oscÚw_m2_div_oscÚw_m2_div_osc_noOffsetÚw_bearish_engulfingÚw_bullish_hammerÚw_bullish_engulfingÚw_shooting_starr   r3   r   Ú
stoch_normÚmacd_pred_normÚosc_normÚmacd_bullish_normÚm3_momentum_normÚm2_tiny_momentum_normÚrsid_osc_normÚstoch_div_osc_normÚvwap_div_osc_normÚstoch_peaking_normÚstoch_bottoming_normÚm3_div_osc_normÚm2_div_osc_normÚm2_div_osc_noOffset_normÚss6                                                         r&   Úcalculate_activation_score_pocr…   •   s  € ô 	ˆKÓ€AÜ�H‰H�Q‹K€EÜ�1�Xˆä79·x±xÀÈAÁÔ7O�k !‘n rÑ)¨RÒ/ÐUVˆ
Ø-¨aÑ0°1Ò4™¸"ˆÜ-/¯X©X°c¸!±fÔ-=�C˜‘F˜R‘K 2Ò%À1ˆØ!5°aÒ!8™A¸aÐØ +¨A¡°Ò 2™1¸Ðð &2°!¡_°tÒ%;¡ÈÐUVÉÐZ_ÒH_Á"ÐefÐÜPR×PXÑPXÐYaÐbcÑYdÔPeœ h¨q¡k°BÑ&6Ð$7¸"Ñ$<¸dÀCÔHÐklˆØ"/°Ñ"2°QÒ"6™QÀ=ÐQRÑCSÐVWÒCW¹RÐ]^ÐÜKMÏ8É8ÐT`ÐabÑTcÔKdœK¨°Q©¸¸sÔCÐjkÐØ#3°AÒ#6™R¸AÐØ$6°qÒ$9™q¸qÐØ)¨!™}¨qÒ0™!¸ZÈ¹]ÈQÒ=N±rÐTUˆð  /¨qÑ1°AÒ5™!À/ÐRSÑBTÐWXÒBX¹BÐ^_ˆØ(;¸AÑ(>ÀÒ(B¡1ÐObÐcdÑOeÐhiÒOiÉÐopÐ ð ˜kÑ)Ø˜'Ñ!ñ#à˜Ññð  Ñ/ñ1ð  Ñ-ñ	/ð
 # YÑ.ñ0ð ˜ZÑ'ñ)ð   /Ñ1ñ3ð  Ñ/ñ1ð   /Ñ1ñ	3ð "Ð$5Ñ5ñ
7ð ˜|Ñ+ñ-ð ˜|Ñ+ñ-ð &Ð(=Ñ=ñ?ð % QÑ'Ð*=Ñ=ñ?ð " !Ñ$Ð'7Ñ7ñ9ð  % QÑ'Ð*=Ñ=ñ!?ð" ! Ñ# oÑ5ñ#7ð 	
ð( ˆˆa‹ðW ðX €Lr(   c                 óV  — | j                  |d¬«      j                  «       }| j                  |d¬«      j                  «       }||z
  }||z   dz  }t        j                  |dk(  || |z
  |z  ||z
  z  |z   «      }t        j                  || j                  ¬«      }|j                  d«      S )zš
    Scales a pandas Series to a given range [min_val, max_val] based on its rolling min/max.
    Equivalent to Pine Script's scale_ToRange function.
    r   )ÚwindowÚmin_periodsé   r   )Úindex)	Úrollingr   r+   r	   ÚwhereÚpdÚSeriesrŠ   Úfillna)	ÚseriesÚlookbackÚmin_valÚmax_valÚrolling_minÚrolling_maxÚdenomÚmid_valÚscaleds	            r&   Úscale_to_ranger™   Ò   s©   € ð
 —.‘.¨¸a�.Ó@×DÑDÓF€KØ—.‘.¨¸a�.Ó@×DÑDÓF€KØ˜+Ñ%€Eð ˜Ñ  AÑ%€Gä�X‰X�e˜q‘j '¨F°[Ñ,@ÀEÑ+IÈWÐW^ÑM^Ñ+_ÐbiÑ+iÓj€FÜ�Y‰Y�v V§\¡\Ô2€FØ�=‰=˜ÓÐr(   c                 ód  — t        | «      }t        j                  |t        j                  ¬«      }t        j                  |t        j                  ¬«      }t        j                  |t        j                  ¬«      }d}t	        |«      D ]"  }|r||   rd||<   d}n| |   rd||<   d}|||<   Œ$ |||fS )zh
    Determines executed trades based on position state.
    Entry only if flat, Exit only if long.
    )ÚdtypeFT)r   r	   r
   Úbool_r   )ÚentriesÚexitsr   Úin_posÚ
exec_entryÚ	exec_exitÚcurrently_in_posr   s           r&   Úcalculate_positionsr£   ã   s¤   € ô 	ˆG‹€AÜ�X‰X�aœrŸx™xÔ(€FÜ—‘˜!¤2§8¡8Ô,€JÜ—‘˜¤"§(¡(Ô+€IàÐä�1ŽXˆÙØ�QŠxØ#�	˜!‘Ø#(Ñ à�qŠzØ $�
˜1‘Ø#'Ð à$ˆˆqŠ	ð ð �:˜yÐ(Ð(r(   )r   éd   )Únumpyr	   Úpandasr�   Únumbar   r'   r4   rA   rE   rK   r…   r™   r£   rG   r(   r&   Ú<module>r¨      sŸ   ðÛ Û Ý àñ2ó ð2ðh ñó ðð> ñó ðð0 ñó ðð0 ñó ðð ñ:ó ð:óxð" ñ)ó ñ)r(   