o
    ̿SiG9                     @  s   d dl mZ d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZ d9d
dZdddd:ddZd;ddZd<dd Zd=d%d&Zd>d)d*Zd?d,d-Zed.d/G d0d1 d1Zdd2d@d7d8ZdS )A    )annotationsN)	dataclass)datetime)AnyDictListOptionalTuplevr   returnOptional[float]c                 C  sd   z'| d u rW d S t | trW d S t| }||ks"|tdtdfv r%W d S |W S  ty1   Y d S w )Ninf-inf)
isinstanceboolfloat	Exception)r
   f r   :/var/www/html/Trade-python/app/v1/services/entry_engine.py_safe_float	   s   
r           g    eA	min_value	max_valuenamestrdefaultr   r   r   c                C  s   t | }|d u st| dkrt|S z
tt| }W n ty,   t| Y S w ||ks;|tdtdfv r?t|S tt|t||S )N r   r   )osgetenvr   stripr   r   maxmin)r   r   r   r   rawr
   r   r   r   
_env_float   s   
r%   market_dataDict[str, Any]	timeframeList[Dict[str, Any]]c                 C  sL   t | tsg S | d}t |tsg S ||}t |tsg S dd |D S )Ncandlesc                 S  s   g | ]	}t |tr|qS r   )r   dict.0cr   r   r   
<listcomp>-   s    z _get_candles.<locals>.<listcomp>)r   r+   getlist)r&   r(   candles_by_tfarrr   r   r   _get_candles$   s   




r4   r.   keyc                 C  s    t | |p| |d d S )N   )r   r0   )r.   r5   r   r   r   _candle_num0   s    r7   r*   lookbackint'Tuple[Optional[float], Optional[float]]c                C  s~   | sdS t dt|}| | d  }dd |D }dd |D }dd |D }dd |D }|r4t |nd |r<t|fS d fS )N)NNr6   c                 S     g | ]}t |d qS )highr7   r,   r   r   r   r/   9       z#_swing_high_low.<locals>.<listcomp>c                 S  r;   )lowr=   r,   r   r   r   r/   :   r>   c                 S     g | ]}|d ur|qS Nr   )r-   hr   r   r   r/   ;       c                 S  r@   rA   r   )r-   lr   r   r   r/   <   rC   )r"   r9   r#   )r*   r8   windowhighslowsr   r   r   _swing_high_low4   s   "rH   	preferredfallbackc                 C  sX   t | tr
| dnd }t |tsi S ||fD ]}||}t |tr)|r)|  S qi S )N
indicators)r   r+   r0   )r&   rI   rJ   indtfsr   r   r   _latest_indicator_summary@   s   

rO   Dict[str, float]c                 C  sr   t | tr
| dnd }t |tsi S |d}t |tsi S i }dD ]}t||}|d ur6t|||< q#|S )Npivotsday)R1R2R3PS1S2S3)r   r+   r0   r   r   )r&   rQ   rR   outkr
   r   r   r   _get_pivots_dayK   s   


r\   T)frozenc                   @  sF   e Zd ZU ded< ded< ded< ded< ded	< d
ed< ded< dS )ExecutionPlanrP   
entry_zonez	List[str]entry_trigger_reasonr   slzList[float]targetsrr_ratior   stater'   diagnosticsN)__name__
__module____qualname____annotations__r   r   r   r   r^   [   s   
 r^   )now_utcdecisionrj   Optional[datetime]Optional[ExecutionPlan]c           8   
     s
  | pd   }|dvrdS |pt }tddddd}ttd	d
ddd}tddddd}tddddd}t|d}t|d}	t|d}
t|dd}t|	dt
rX|	dni }t|	d}t|	d}t|	d}t|	d}t|}d}d}|dur|durtt|t|}tt|t|}|dkr|dkr||kr||d}d}nddd}nddd}|	dddks|	dddkrf|dkrdD ]}||v rt|| }d | } nqnd!D ]}||v rt|| }d | } nq|du r;|	r;t|	d"kr|	d# n|	d$ }t|d}t|d}|dkr+|dur+t|}d%}n|d&kr;|dur;t|}d'}|du rK|durKt|}d(}|durf|dkrft|d)|  t|d)|  d}t|pk|	|d*\}}d}d}|
r|
d$ }t|d}t|d}d} g }!|dkrg }"|dur|"t| d+|v r|"t|d+  |dur|"t| |"rt|"} d,D ]}||v r|!t||  qt|	dpd  fd-d.|!D }!|!s
|dur| kr|!t| |dur
| kr
|!t| n{g }"|dur|"t| d/|v r'|"t|d/  |dur3|"t| |"r:t|"} d0D ]}||v rL|!t||  q<t|	dpVdfd1d.|!D }!|!s|duru|k ru|!t| |dur|k r|!t| zet|	d}#t|	d}$| dur|#dur|$dur|#dkr|$dkr|dkrt|#d)t|  }%| t|#k s|%} n#tt| |%} nt|$d)t|  }&| t|$ks|&} ntt| |&} W n
 ty   Y nw |!dd" }!g }'d2}(|rdn|	r
dnd})|r|n|	}*|*r.|*d$ }+t|*d"kr%|*d# nd}t|+d3},t|+d}-t|+d}.t|+d}/t|	dpCdt|	dpMd |dkr|-durk|- krk|'|)dkrgd4nd5 n|,dur|, kr|'|)dkr~d6nd7 |durt|d}0|0dur|0 kr|/dur|/ kr|-dur|- kr|'|)dkrd8nd9 |'s|.dur̈ dkr|. d)|  kr	 na|-dur|-kr|'|)dkrd:nd; n|,dur|,k r|'|)dkrd<nd= |dur.t|d}0|0dur.|0kr.|.dur.|.kr.|-dur.|-k r.|'|)dkr+d>nd? |'r3d@}(d}1| dur|!rt|	dpEdt|	dpNd dA }2t|!d }3|dkri|2t|  }4|3|2 }5n
t| |2 }4|2|3 }5|4dkr|5dkrt|5|4 dB}1||||||||| dC dD	}6g }7|(d2kr|*r|*d$ }+t|+d}.t|+d}/t|	dpdt|	dpd |dkr|.dur dkr|. d)|  kr|7|)dkrdEndF |d&kr|/durdkr|/d)|  kr|7|)dkrdGndH |7r|7|6dI< |)r|)|6dJ< tt|	dpdt|	dp(dd|'| dur5t| nddKd. |!D |1durEt|1nd|(|6dLS )Ma  Rule-based execution plan.

    - Does NOT use LTP/current price as entry.
    - Produces an entry_zone + trigger-based activation state.
    - SL/Targets are derived from pivots + recent swings (structure).

    This function is intentionally deterministic and read-only.
    r   >   BUYSELLNENTRY_ZONE_BUFFER_PCTgMbP?r   g{Gz?r   ENTRY_SWING_LOOKBACK   g      @g      i@ENTRY_MISSED_PCTg{Gz?g      ?ENTRY_SL_BUFFER_PCT5minute15minuterR   ema921vwapcloser   )r?   r<   EMA_PULLBACK_ZONEr?   r<   rn   )rS   rV   PIVOT_)rW   rV      PREV_15M_HIGH_BREAKOUTro   PREV_15M_LOW_BREAKDOWNFALLBACK_CLOSE_LEVELg      ?)r8   rW   )rS   rT   rU   c                   s   g | ]}| kr|qS r   r   r-   t)	zone_highr   r   r/      rC   z(build_execution_plan.<locals>.<listcomp>rS   )rW   rX   rY   c                   s   g | ]}| k r|qS r   r   r   )zone_lowr   r   r/      rC   WAITING_FOR_ENTRYopen5M_CLOSE_ABOVE_ZONE15M_CLOSE_ABOVE_ZONE5M_GAP_OPEN_ABOVE_ZONE15M_GAP_OPEN_ABOVE_ZONEBREAKOUT_RETEST_HOLDBREAKOUT_RETEST_HOLD_15M5M_CLOSE_BELOW_ZONE15M_CLOSE_BELOW_ZONE5M_GAP_OPEN_BELOW_ZONE15M_GAP_OPEN_BELOW_ZONEBREAKDOWN_RETEST_HOLDBREAKDOWN_RETEST_HOLD_15MENTRY_ACTIVATEDg       @   Z)	
ref_reasonema9ema21rz   r{   
swing_high	swing_lowrQ   computed_atPRICE_RAN_UP_WITHOUT_TRIGGER PRICE_RAN_UP_WITHOUT_TRIGGER_15MPRICE_DROPPED_WITHOUT_TRIGGER!PRICE_DROPPED_WITHOUT_TRIGGER_15Mmissed_trade_reasonstrigger_timeframec                 S  s   g | ]
}|d urt |qS rA   )r   r   r   r   r   r/   z  s    )r_   r`   ra   rb   rc   rd   re   )r!   upperr   utcnowr%   r9   r4   rO   r   r0   r+   r   r\   r#   r   r"   lenr7   rH   appendr   round	isoformatr^   )8rk   r&   rj   dzone_buffer_pctswing_lookback
missed_pctsl_buffer_pct
candles_5mcandles_15mcandles_dayrL   rw   r   r   rz   r{   piv	ref_levelr   r?   r<   r_   r[   prev	prev_highprev_lowr   r   day_highday_lowlast_dayra   rb   
candidateszlzhmax_okmin_okreasonsrd   
trigger_tftrigger_candleslastc_openc_closec_highc_low
prev_closerrzone_midt1riskrewardre   missedr   )r   r   r   build_execution_planf   s  




"














2







<,

<,




00(r   )r
   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )r&   r'   r(   r   r   r)   )r.   r'   r5   r   r   r   )r*   r)   r8   r9   r   r:   )r&   r'   rI   r   rJ   r   r   r'   )r&   r'   r   rP   )rk   r   r&   r'   rj   rl   r   rm   )
__future__r   r   dataclassesr   r   typingr   r   r   r   r	   r   r%   r4   r7   rH   rO   r\   r^   r   r   r   r   r   <module>   s     





