
    tgj                        S SK Jr  S SKJr  S SKJr  S SKJr  S SKJrJ	r	  S SK
Jr  SSKJrJr  SS	KJr  SS
KJrJr  SSKJr  \\/S4   r " S S5      rg)    )annotations)defaultdict)datetime)isfinite)meanpstdev)Callable   )SymbolStateTick)OpportunityQueue)
PricePointRollingWindow)SmartSchedulerNc                      \ rS rSrSr   S
       SS jjrSS jr\SS j5       r\SS j5       r	\SS j5       r
S	rg)RealtimeGateway   zIncremental tick processor.

This module does not open a market-data connection itself. It validates and
consumes normalized ticks from any provider adapter.
Nc                    U=(       d
    [        5       U l        U=(       d
    [        5       U l        X0l        0 U l        [        S 5      U l        g )Nc                     [        SSS9$ )Ni,  )
max_pointsmax_age_seconds)r        A/mnt/data/HANZ_v2.2_Realtime_Gateway/src/hanz_realtime/gateway.py<lambda>*RealtimeGateway.__init__.<locals>.<lambda>$   s    MS#Fr   )r   	schedulerr   queueon_candidatestatesr   windows)selfr   r   r   s       r   __init__RealtimeGateway.__init__   s?     #6n&60.0
(:<=HF>
r   c                J   U R                  U5        UR                  UR                  4nU R                  R	                  U5      nUc,  [        UR                  UR                  S9nX0R                  U'   UR                  nUR                  n[        SUR                  UR                  -
  5      nU=R                  S-  sl        U=R                  U-  sl        UR                  Ul        UR                  Ul
        UR                  Ul        U(       a   US:  a  UR                  U-  S-
  S-  Ul        U(       aQ  UR                  U:  aA  UR                  U-
  R!                  5       nUS:  a  U(       a  UR                  U-
  U-  Ul        UR$                  bK  UR&                  b>  UR&                  S:  a.  UR&                  UR$                  -
  UR&                  -  S-  Ul        U R*                  U   nUR-                  [/        UR                  UR                  UR                  5      5        U R1                  X5      Ul        UR4                  R7                  SS15        UR2                  S	:  at  U R8                  R;                  UR                  UR                  UR2                  U R=                  U5      UR                  S
9  U R>                  b  U R?                  U5        U$ UR2                  S:  a0  U R8                  RA                  UR                  UR                  5        U$ )N)symbolmarket        r
   r         ?      Y@pricevolumeg     K@)r&   r'   scorereason
updated_at     A@)!_validate_tickr'   r&   r    getr   
last_pricelast_timestampmaxr,   last_volume
tick_countcumulative_volumer+   	timestampprice_change_pcttotal_secondsvelocitybidask
spread_pctr!   addr   _anomaly_scoreanomaly_scoredirty_flagsupdater   upsert_reasonr   remove)	r"   tickkeystateprevious_priceprevious_timeincremental_volumesecondswindows	            r   ingestRealtimeGateway.ingest'   sx   D!{{DKK($=t{{4;;GE$KK)),, dkkE4E4E&EFA#55:: KK#~~nq0'+zzN'Bc&IU%RE"T^^m;~~5DDFG{~"&**~"=!H88DHH$8TXX\!%DHH!4 @EIEc"

:dnndjj$++FG"11&@  '8!45$&JJ{{{{))||E*>>     ,!!%(    4'JJdkk4;;7r   c                   U R                   R                  5       (       d  [        S5      eU R                  R                  5       (       d  [        S5      e[	        U R
                  5      (       a  U R
                  S::  a  [        S5      e[	        U R                  5      (       a  U R                  S:  a  [        S5      eg )Nzsymbol is requiredzmarket is requiredr   z!price must be positive and finitez&volume must be non-negative and finite)r&   strip
ValueErrorr'   r   r+   r,   )rH   s    r   r1   RealtimeGateway._validate_tickX   s    {{  ""122{{  ""122

##tzzQ@AA$$aEFF )8r   c           	        U R                  5       nU R                  5       n[        U5      S:  a  gUS   nUS   nU(       a  [        XT-  S-
  S-  5      OSn[        U5      S:  a  [	        US S 5      OUS   nUS:  a  US   U-  OSn[	        U5      (       a  [        U5      [	        U5      -  S-  OSn	[        UR                  =(       d    SS-  S	5      n
[        US
-  S5      [        [        US-
  S5      S	-  S5      -   [        U	S-  S	5      -   [        [        UR                  5      S-  S5      -   U
-
  n[        [        S[        US5      5      S5      $ )N   r(   r   r)   r*   r
   g       @g      4@g      2@r0   g      $@g       @   )pricesvolumeslenabsr   r   minr?   r5   r<   round)rO   rJ   rZ   r[   firstlastmove_pctaverage_volumevolume_ratio
volatilityspread_penaltyr-   s               r   rA   RealtimeGateway._anomaly_scorec   sX   .."v;?q	bz8=3s*e343/27|a/?gcrl+WR[7E7Iwr{^3s>B6llVF^d6l2U:PS
e..5#<dC 4&#lS(#.5t<=*t#T*+ #enn%+T23 	 	 Sc%/0!44r   c                H    U R                   S:  a  gU R                   S:  a  gg)NP   zANOMALI KUATA   MENGUATPANTAU)rB   )rJ   s    r   rF   RealtimeGateway._reason~   s'    "$!"$r   )r   r   r   r    r!   )NNN)r   zSmartScheduler | Noner   zOpportunityQueue | Noner   zDecisionCallback | NonereturnNone)rH   r   rn   r   )rH   r   rn   ro   )rO   r   rJ   r   rn   float)rJ   r   rn   str)__name__
__module____qualname____firstlineno____doc__r#   rP   staticmethodr1   rA   rF   __static_attributes__r   r   r   r   r      s     ,0)-04	
(
 '
 .	

 

/b G G 5 54  r   r   )
__future__r   collectionsr   r   mathr   
statisticsr   r   typingr	   modelsr   r   r   r   rollingr   r   r   r   DecisionCallbackr   r   r   r   <module>r      sC    " #   #  % # . % [M4/0 r rr   