a
    jFwj                     @  sr   d dl mZ d dlmZmZ d dlmZ d dlmZ ddlm	Z	 ddl
mZ ddlmZmZmZ G d	d
 d
ZdS )    )annotations)datetimetimezone)Iterable)SymbolState   )DeltaScanner)RadarHistory)RadarSignalRadarSnapshotRadarStatusc                   @  s   e Zd ZdZd&dddddd	d
Zd'ddddddZddddddZedddddZeddddddZ	eddddd Z
edddd!d"Zeddd#d$d%ZdS )(OpportunityRadarz?Convert realtime symbol states into ranked opportunity signals.N   zDeltaScanner | NonezRadarHistory | NoneintNone)deltahistorymax_resultsreturnc                 C  s"   |pt  | _|pt | _|| _d S N)r   r   r	   r   r   )selfr   r   r    r   5/home/opc/hanz-radar/runtime/src/hanz_radar/engine.py__init__   s    zOpportunityRadar.__init__zIterable[SymbolState]zdatetime | Noner   )statesnowr   c                   s   |pt tj}g }d}|D ]L}|d7 } j||r8q j|sFq ||}||  j	
| q|j fddd t||t|d  j dS )Nr   r   c                   s     | j| j | j | jfS r   )_status_rankstatusevidenceanomalysymbol)itemr   r   r   <lambda>/   s
    
z+OpportunityRadar.evaluate.<locals>.<lambda>)key)generated_attotal_symbolsactive_signals)r   r   r   utcr   Zis_staleZis_interesting_signal_from_stateappendr   recordsortr   tupler   )r   r   r   Zsignalstotalstatesignalr   r"   r   evaluate   s(    

	zOpportunityRadar.evaluater   r   r
   )r/   r   r   c                 C  s   |  |}| ||}| |}| |}d }|tjkrP|jd urPd|jd}t|j|j	||t
|jd||j|||jpz|d
S )Nzmonitor_above:g   )
r    marketr   r   r   riskpricetriggerreason	timestamp)_evidence_score_status_risk_reasonr   PREPARE
last_pricer
   r    r4   roundanomaly_scorelast_timestamp)r   r/   r   r   r   r5   r8   r7   r   r   r   r)   =   s&    



z#OpportunityRadar._signal_from_state)r/   r   c                 C  s   d}|t t| jd d7 }|t | jd d7 }|t t| jd d7 }| jd url|tdd| jd  7 }n|d	7 }| jd
kr|d	7 }tt	tdt |dS )Ng        g      2@g      9@g?g      D@g      $@g      .@g      4@g      @r   g      Y@)
minabsprice_change_pctrA   velocity
spread_pctmaxcumulative_volumer   r@   )r/   scorer   r   r   r:   X   s    

z OpportunityRadar._evidence_scorer   )r   r/   r   c                 C  s:   | dkr|j dkrtjS | dkr&tjS | dkr4tjS tjS )NR   F   D   4   )rA   r   READYr>   EARLYSKIP)r   r/   r   r   r   r;   f   s    zOpportunityRadar._statusstrc                 C  s.   | j }|d u rdS |dkrdS |dkr*dS dS )Nz	BELUM ADAgffffff?ZRENDAHg?ZSEDANGZTINGGI)rG   )r/   Zspreadr   r   r   r<   p   s    zOpportunityRadar._riskc                 C  s2   | j dkrdS | j dkrdS t| jdkr.dS dS )NP   zANOMALI KUATA   z
MOMEN KUATg      ?zGERAK CEPATPANTAU)rA   rD   rE   )r/   r   r   r   r=   {   s    

zOpportunityRadar._reason)r   r   c                 C  s6   t jdt jdt jdt jdt jdt jdt jdi}||  S )Nr   r   r3               )r   rO   r>   rP   HOLDRELEASESELLrQ   )r   orderr   r   r   r      s    	zOpportunityRadar._status_rank)NNr   )N)__name__
__module____qualname____doc__r   r1   r)   staticmethodr:   r;   r<   r=   r   r   r   r   r   r      s$       #	
	r   N)
__future__r   r   r   typingr   Zhanz_realtime.modelsr   r   r   r   r	   modelsr
   r   r   r   r   r   r   r   <module>   s   