o
    éHi°3  ã                   @   s:   d dl mZ d dlZd dlZddlmZ G dd„ dƒZdS )é    )ÚDictNé   )ÚIndicatorCalculatorc                	   @   sÎ   e Zd Zg d¢Zedejdefdd„ƒZedd	d
„ƒZ	edejdefdd„ƒZ
edejdefdd„ƒZedejdefdd„ƒZedejdefdd„ƒZedeeejf deeeeef f defdd„ƒZdS )ÚStrategyEvaluator©é   é	   é   é   é   é7   éd   éÈ   ÚdfÚreturnc              	   C   sô   | d j d | d j d | d j d | d j d | d j d t| ƒdkr+| d j d nd	t| ƒd
kr>| d  d
¡ ¡ j d n| d  ¡ dœ}dD ]}|| jv rX| | j d ||< qHi }tjD ]}d|› }|| jv rs| | j d ||< q^||d< |S )z1Extract current values from the latest data pointÚcloseéÿÿÿÿÚopenÚhighÚlowÚvolumer   éþÿÿÿNé   )r   r   r   r   r   Ú
prev_closeÚ
avg_volume)ÚvwapÚrsiÚ	macd_histÚema_Ú	ema_stack)ÚilocÚlenÚrollingÚmeanÚcolumnsr   ÚEMA_PERIODS)r   ÚvalsÚ	indicatorÚ
ema_valuesÚperiodÚcol© r+   ú@/var/www/html/Trade-python/app/v1/services/zerodha/strategies.pyÚ_current_values
   s(   .ù
€


€z!StrategyEvaluator._current_valuesé   é   Nc                 C   s¾   |durBt |ƒ|krB|d |d  }t |d |d  ¡  ¡}t |d |d  ¡  ¡}tj|||gddjdd}| |¡ ¡ }n| d }| |d  }	| ||  }
| || d	  }|	|
|fS )
z3Calculate targets and stop loss based on volatilityNr   r   r   r   )Úaxisg{®Gáz”?ç      ø?r.   )	r!   ÚnpÚabsÚshiftÚpdÚconcatÚmaxÚtailr#   )Úclose_priceÚrisk_reward_ratioÚ
atr_periodr   Úhigh_lowÚ
high_closeÚ	low_closeÚ
true_rangeÚatrÚ	stop_lossÚtarget_1Útarget_2r+   r+   r,   Ú_calculate_targets_stop_loss&   s   
z.StrategyEvaluator._calculate_targets_stop_lossc                    s¬  t  | ¡‰ ˆ d d u rdddœS g }g }t‡ fdd„dD ƒƒrHˆ d ˆ d	 d
   kr<ˆ d	 d   kr<ˆ d	 d krHn n
| d¡ | d¡ dˆ v r^ˆ d ˆ d kr^| d¡ | d¡ dˆ v r}ˆ d dkr}ˆ d | d jd kr}| d¡ | d¡ dˆ v r‘ˆ d dkr‘| d¡ | d¡ ˆ d ˆ d kr£| d¡ | d¡ |r¯tt|ƒd
 d ƒnd}|dkrÑt jˆ d | d\}}}dt|dƒd 	|¡||g|d œS dddœS )!Nr   ÚHOLDr   ©ÚsignalÚ
confidencec                 3   ó    | ]	}|ˆ d  v V  qdS ©r   Nr+   ©Ú.0r)   ©r&   r+   r,   Ú	<genexpr>D   ó   € z6StrategyEvaluator.strategy_momentum.<locals>.<genexpr>)r   r   r	   r   r   r   r   r	   TzPrice above EMA stackr   zPrice above VWAPr   r   r   zRSI > 55 and risingr   zMACD histogram positiver   r   úVolume above averager   éF   ©r   ÚBUYéc   ú, ©rG   rH   ÚreasonÚtargetsrA   )
r   r-   ÚallÚappendr    Úintr!   rD   ÚminÚjoin)r   Ú
conditionsÚreasonsrH   rA   rB   rC   r+   rM   r,   Ústrategy_momentum:   sD   

>



"





ÿû
z#StrategyEvaluator.strategy_momentumc                 C   sT  t  | ¡}|d d u sd|vrdddœS g }g }|d |d kr*| d¡ | d¡ |d	 |d   kr:|d
 krFn n
| d¡ | d¡ |d |d kr`|d |d kr`| d¡ | d¡ |d |d krr| d¡ | d¡ |r~tt|ƒd d ƒnd}|dkr¥t j|d | d\}}}dt|dƒd |¡||gt|d |ƒdœS dddœS )Nr   r   rE   r   rF   r   TzPrice in uptrend (above VWAP)r   r   zPrice pulled back to VWAPr   zBullish reversal candler   r   rP   é   r   éK   rR   rS   rT   rU   rV   )r   r-   rZ   r[   r!   rD   r\   r]   )r   r&   r^   r_   rH   rA   rB   rC   r+   r+   r,   Ústrategy_vwap_pullbackn   s:   



$

 



ÿû
z(StrategyEvaluator.strategy_vwap_pullbackc                    sŒ  t  | ¡‰ t| ƒdk st‡ fdd„dD ƒƒsdddœS g }g }ˆ d d	 }| d
 jd }ˆ d d }| d jd }||krK||krK| d¡ | d¡ ˆ d d	 ˆ d d   kraˆ d d krmn n
| d¡ | d¡ ˆ d ˆ d d	 kr| d¡ | d¡ ˆ d ˆ d kr“| d¡ | d¡ |rŸtt|ƒd d ƒnd}|dkrÁt jˆ d | d\}}	}
dt|dƒd 	|¡|	|
g|dœS dddœS )Nr.   c                 3   rI   rJ   r+   rK   rM   r+   r,   rN      rO   z;StrategyEvaluator.strategy_ema_crossover.<locals>.<genexpr>)r   r   r
   rE   r   rF   r   r   Úema_5r   r   Úema_9Tz5 EMA crossed above 9 EMAr
   zEMA stack in bullish orderr   zPrice above all EMAsr   r   rP   ra   r   rb   rR   rS   rT   rU   rV   )
r   r-   r!   rY   r    rZ   r[   rD   r\   r]   )r   r^   r_   Úema_5_todayÚema_5_yesterdayÚema_9_todayÚema_9_yesterdayrH   rA   rB   rC   r+   rM   r,   Ústrategy_ema_crossoverš   sB   
"


0





ÿû
z(StrategyEvaluator.strategy_ema_crossoverc                 C   s~  t  | ¡}|d d u sd|vrdddœS g }g }|d }| d jd }|d  k r-|k r9n n
| d¡ | d	¡ |d
 dkrG|d |d
  nd}|dkr\| d¡ | d|d›d¡ |d |d krŒ|d | d jd k rŒ|d | d jd krŒ|d |d k rŒ| d¡ | d¡ |r˜tt|ƒd d ƒnd}|dkrºt j|d | d\}}	}
dt|dƒd |¡|	|
g|dœS dddœS )Nr   r   rE   r   rF   r   r   Tz"RSI crossed above 30 from oversoldr   r   r   r1   zVolume spike (z.1fzx avg)r   r   zBullish engulfing patterné   r   rQ   rR   rS   rT   rU   rV   )	r   r-   r    rZ   r[   r!   rD   r\   r]   )r   r&   r^   r_   Ú	rsi_todayÚrsi_yesterdayÚvolume_ratiorH   rA   rB   rC   r+   r+   r,   Ústrategy_rsi_volume_reversalË   s@   



 


ÿû
z.StrategyEvaluator.strategy_rsi_volume_reversalÚtimeframe_dataÚpivotsc                    sZ  |   d¡}|du s|jrdddœS g }g }d}dD ]"}|   |¡}|dur;|js;t |¡‰ t‡ fdd	„d
D ƒƒs;d} nq|rH| d¡ | d¡ |  di ¡}|rs|d jd }	|	|  dd¡krs|	|  dtdƒ¡k rs| d¡ | d¡ d}
dD ].}|   |¡}|dur¥t|ƒdkr¥|d jd }|d  	d¡ 
¡ jd }||d k r¥d}
 nqw|
r²| d¡ | d¡ d}dD ]}|   |¡}|durÓd|jv rÓ|d jd dkrÓd} nq¶|rà| d¡ | d¡ |rìtt|ƒd d ƒnd}|dkr(|  d|d jd d ¡}|  d|d jd d ¡}|  d |d jd d! ¡}d"|d# |¡||g|d$d%œS dddœS )&zA
        Analyze across all timeframes with pivot points
        ÚdayNrE   r   rF   T)Ú5minÚ15minÚ30minrr   ÚweekÚmonthc                 3   s.    | ]}ˆ d  ˆ d   d|› d¡kV  qdS )r   r   r   r   N)ÚgetrK   rM   r+   r,   rN     s   € &ÿz<StrategyEvaluator.analyze_multi_timeframe.<locals>.<genexpr>r   Fz*Price above all EMAs across all timeframesr   r   ÚS1ÚR1ÚinfzPrice between S1-R1 pivot range)rt   ru   rr   r   r   gš™™™™™é?z"Volume confirmed across timeframesÚsupertrend_directionr   z$Supertrend bullish across timeframesra   r   rb   g
×£p=
ï?g{®Gázð?ÚR2gö(\Âõð?rS   rU   zMulti-Timeframe Momentum)rG   rH   rW   rX   rA   Ústrategy_name)rx   Úemptyr   r-   rY   rZ   r    Úfloatr!   r"   r#   r$   r[   r]   )rp   rq   Údaily_dfr^   r_   Útrend_alignedÚtfr   Údaily_pivotsÚcurrent_closeÚvolume_confirmedÚcurrent_volÚavg_volÚsupertrend_bullishrH   rA   rB   rC   r+   rM   r,   Úanalyze_multi_timeframeú   s|   



ÿ€

$


€


€


ú
	z)StrategyEvaluator.analyze_multi_timeframe)r.   r/   N)Ú__name__Ú
__module__Ú__qualname__r%   Ústaticmethodr5   Ú	DataFrameÚdictr-   rD   r`   rc   rj   ro   r   Ústrr€   rŠ   r+   r+   r+   r,   r      s     3+0.6r   )	Útypingr   Úpandasr5   Únumpyr2   Ú
indicatorsr   r   r+   r+   r+   r,   Ú<module>   s
    