
    %j                     H    S r SSKrSSKrSSKr " S S5      r " S S5      rg)u   
V16 — Feeds: Binance (precio spot) y CLOB (orderbook Polymarket).

CLOBFeed mantiene un libro local completo (price→size) para derivar
best_bid/best_ask correctamente, filtrando cancelaciones (size=0).
    Nc                   .    \ rS rSrS\4S jrS rS rSrg)BinanceFeed
   ws_urlc                 :    Xl         SU l        S U l        SU l        g N        F)r   last_px_ws_stop)selfr   s     #/var/www/html/Poly/V16/v16/feeds.py__init__BinanceFeed.__init__   s    
    c                   ^  U 4S jnSnT R                   (       d   [        R                  " T R                  US9T l        T R                  R                  SSS9  SnT R                   (       d%  [        R                  " U5        [        US-  S5      nT R                   (       d  M  g g ! [         a  n[        SU 35         S nANhS nAff = f)	Nc                 v   >  [        [        R                  " U5      S   5      Tl        g ! [         a     g f = f)Np)floatjsonloadsr
   	Exception)wsmsgr   s     r   on_msgBinanceFeed.run.<locals>.on_msg   s3    $TZZ_S%9: s   '+ 
88   )
on_message   r   ping_intervalping_timeoutz[binance] ws error: <   )r   	websocketWebSocketAppr   r   run_foreverr   printtimesleepmin)r   r   backoffes   `   r   runBinanceFeed.run   s    	
 **2$11$++&Q$$2B$G ::

7#gk2. ***
  2,QC0112s   A B' '
C	1CC	c                 h    SU l          U R                  R                  5         g ! [         a     g f = fNTr   r   closer   r   s    r   stopBinanceFeed.stop#   .    
	HHNN 		   $ 
11)r   r   r
   r   N)	__name__
__module____qualname____firstlineno__strr   r-   r4   __static_attributes__ r   r   r   r   
   s    s /$r   r   c                   H    \ rS rSrSrS\S\4S jrS rS rS r	S	 r
S
 rSrg)CLOBFeed+   u8  Tracks best bid/ask for a single token via CLOB websocket.

Mantiene un libro local (dict price→size) para manejar correctamente:
- Snapshot inicial (event_type=book): reconstruye el libro entero
- Updates incrementales (event_type=price_change): aplica deltas,
  eliminando niveles con size=0 (cancelaciones)
token_idr   c                 p    Xl         X l        SU l        SU l        0 U l        0 U l        S U l        SU l        g r   )rB   r   best_bidbest_ask_bids_asksr   r   )r   rB   r   s      r   r   CLOBFeed.__init__4   s6     


r   c                     U R                   (       a#  [        U R                   R                  5       5      OSU l        U R                  (       a)  [        U R                  R                  5       5      U l        g SU l        g )Nr	   )rF   maxkeysrD   rG   r*   rE   r3   s    r   _update_bestCLOBFeed._update_best>   sD    26**DJJOO-.#26**DJJOO-.#r   c                 j    UR                  [        R                  " SU R                  /S.5      5        g )Nmarket)type
assets_ids)sendr   dumpsrB   )r   r   s     r   _on_openCLOBFeed._on_openB   s"    


HT]]OLMNr   c           
          [         R                  " U5      n[        U[        5      (       a  UOU/nU GH  nUR	                  SS5      nUS:X  d  SU;   a  SU;   a  UR	                  S/ 5       Vs0 s H?  n[        UR	                  SS5      5      S:  d  M$  [        US   5      [        US   5      _MA     snU l        UR	                  S/ 5       Vs0 s H?  n[        UR	                  SS5      5      S:  d  M$  [        US   5      [        US   5      _MA     snU l        U R                  5         M  US	:X  d  GM  UR	                  S
/ 5       H  n[        US   5      n	[        UR	                  SS5      5      n
UR	                  SS5      R                  5       nUS;   a4  U
S:  a  XR                  U	'   Mh  U R                  R                  U	S 5        M  US;   d  M  U
S:  a  XR                  U	'   M  U R                  R                  U	S 5        M     U R                  5         GM     g s  snf s  snf ! [         a     g f = f)N
event_type bookbidsaskssizer   priceprice_changechangesside)SELLASK)BUYBID)r   r   
isinstancelistgetr   rF   rG   rL   upperpopr   )r   r   r   ititemsieventxchr]   r\   r`   s               r   _on_msgCLOBFeed._on_msgE   s   '	JJsOB$R..BRDElB/F?v{v{ "#vr!2"!2A vq!12Q6 <aj)56+;;!2"DJ "#vr!2"!2A vq!12Q6 <aj)56+;;!2"DJ
 %%'n,eeIr2 %bk 2 %bffVQ&7 8 "vr 2 8 8 :?2#ax48

5 1 $

ud ;!^3#ax48

5 1 $

ud ; 3 %%'C 
"
"2  		sJ   A.H1 0#H'H'6H1 #H,9H,H1 ;BH1 AH1 '
H1 1
H>=H>c                 X   SnU R                   (       d   [        R                  " U R                  U R                  U R
                  S9U l        U R                  R                  SSS9  SnU R                   (       dg  U R                  R                  5         U R                  R                  5         S	U l        S	U l        [         R"                  " U5        [%        US-  S
5      nU R                   (       d  M  g g ! [         a(  n[        SU R                  S S  SU 35         S nANS nAff = f)Nr   )on_openr   r   r   r    z[clob:   z] reconnect: r	   r#   )r   r$   r%   r   rT   rp   r   r&   r   r'   rB   rF   clearrG   rD   rE   r(   r)   r*   )r   r+   r,   s      r   r-   CLOBFeed.runo   s    **D$11KK4<<Q$$2B$G ::

  "

  " # #

7#gk2. ***  Dt}}Ra01qcBCCDs   AC7 7
D)D$$D)c                 h    SU l          U R                  R                  5         g ! [         a     g f = fr0   r1   r3   s    r   r4   CLOBFeed.stop   r6   r7   )rG   rF   r   r   rE   rD   rB   r   N)r8   r9   r:   r;   __doc__r<   r   rL   rT   rp   r-   r4   r=   r>   r   r   r@   r@   +   s6     c FO(T/&r   r@   )ry   r   r(   r$   r   r@   r>   r   r   <module>rz      s)      B\ \r   