
    ](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                           O/Users/jameslopez/projects/TradingBot25/strategies/library_activation_scores.pycalculate_bearish_engulfingr'      s    	IAXXa[F1a[QqSM	qs^

Y./	 QK	q\
QK	1:)

Y./	 #Y. 9,z)G
Y0F[WGA~#j0-' q=%	1E*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XXa[F1a[ac]	qs^
a[	q\
a[	QZ)
i/0	i/0	$y0$y0$y0<!!A#15J7AA~I
23L7AA~I
23L},1N8AAi)35
#c)ns.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XXa[F1X{WQZ/39Q<(1+569Q<!5
B{S1x{%CC#l2l2
#l211~-55$'==F55JS#c6J+>"?@F1I   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XXa[F1X{WQZ/39Q<(1+56{S1x{%CC9Q<!5
B#l2l2
#l211~-55$'==F55JS#c6J+>"?@F1I   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 )N2   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HHQKE1X79xxA7Ok!nr)R/UV
-a014"-/XXc!f-=CFRK2%1!5a!8Aa +A 21 &2!_t%;UVZ_H_"efPRPXPXYabcYdPehqkB&6$7"$<dCHkl"/"2Q"6Q=QRCSVWCWR]^KM88T`abTcKdKQsCjk#3A#6RA$6q$9qq)!}q0!Z]Q=NrTU  /q1A5!/RSBTWXBXB^_(;A(>(B1ObcdOehiOi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FK..a.@DDFK+%E  A%GXXeqj'F[,@E+IWW^M^+_bi+ijFYYvV\\2F==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XXarxx(F!288,J"((+I1XQx#	!#( qz $
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(   