+
    i                    D    R t ^ RIHt ^ RIHtHt ] ! R R4      4       tR# )z;Orderbook management utilities for maintaining local state.)annotations)	dataclassfieldc                  (   ] tR t^t$ RtR]R&   ]! ]R7      tR]R&   ]! ]R7      t	R]R&   R R	 lt
R
 R lt]R R l4       t]R R l4       t]R R l4       t]R R l4       tR"R R lltR"R R llt]R R l4       tR R ltR R ltR R ltR tR!# )#OrderbookManageraC  Maintains local orderbook state from WebSocket updates.

Usage with Feed:
    feed = client.feed()
    books = {}  # ticker -> OrderbookManager

    @feed.on("orderbook_delta")
    def handle_book(msg):
        ticker = msg.market_ticker
        if ticker not in books:
            books[ticker] = OrderbookManager(ticker)

        if hasattr(msg, 'yes'):  # Snapshot
            books[ticker].apply_snapshot(msg.yes, msg.no)
        else:  # Delta
            books[ticker].apply_delta(msg.side, msg.price, msg.delta)

        print(f"{ticker}: {books[ticker].spread}c spread")
strticker)default_factoryzdict[int, int]yesnoc               $    V ^8  d   QhRRRRRR/# )   
yes_levelszlist[tuple[int, int]] | None	no_levelsreturnNone )formats   "Y/home/wkmabra/.openclaw/workspace/venv/lib/python3.14/site-packages/pykalshi/orderbook.py__annotate__OrderbookManager.__annotate__!   s(     7 707 07 
	7    c                    T;'       g    .  UUu/ uF  w  r4W4bK	  	  uppV n         T;'       g    .  UUu/ uF  w  r4W4bK	  	  uppV n        R# u uppi u uppi )z!Reset book from snapshot message.N)r
   r   )selfr   r   pqs   &&&  r   apply_snapshotOrderbookManager.apply_snapshot!   sU     '1&6&6B&68&6TQAD&68%.__"_6_DA14_6 96s
   AAc               (    V ^8  d   QhRRRRRRRR/# )r   sider   priceintdeltar   r   r   )r   s   "r   r   r   *   s(     " " "C " " "r   c                    VR8X  d   V P                   MV P                  pVP                  V^ 4      V,           pV^ 8:  d   VP                  VR4       R# WTV&   R# )z>Apply incremental update. Removes level if quantity hits zero.r
   N)r
   r   getpop)r   r   r    r"   booknew_qtys   &&&&  r   apply_deltaOrderbookManager.apply_delta*   sH    5=txxdgg((5!$u,a<HHUD!!Kr   c                   V ^8  d   QhRR/# r   r   z
int | Noner   )r   s   "r   r   r   4   s     : :* :r   c                p    V P                   '       d$   \        V P                   P                  4       4      # R# )zBest YES bid price.N)r
   maxkeysr   s   &r   best_bidOrderbookManager.best_bid3   s&     (,xxxs488==?#9T9r   c                   V ^8  d   QhRR/# r+   r   )r   s   "r   r   r   9   s     ) )* )r   c                ~    V P                   '       g   R# ^d\        V P                   P                  4       4      ,
          # )z#Best YES ask (= 100 - best NO bid).N)r   r-   r.   r/   s   &r   best_askOrderbookManager.best_ask8   s*     wwwS(((r   c                   V ^8  d   QhRR/# r   r   zfloat | Noner   )r   s   "r   r   r   @   s     3 3\ 3r   c                    V P                   e   V P                  f   R# V P                   V P                  ,           ^,          # )z
Mid price.Nr0   r4   r/   s   &r   midOrderbookManager.mid?   s2     == DMM$9-22r   c                   V ^8  d   QhRR/# r+   r   )r   s   "r   r   r   G   s     - -
 -r   c                x    V P                   e   V P                  f   R# V P                  V P                   ,
          # )zBid-ask spread in cents.Nr9   r/   s   &r   spreadOrderbookManager.spreadF   s-     == DMM$9}}t}},,r   c                    V ^8  d   QhRRRR/# r   levelsr!   r   r   )r   s   "r   r   r   M   s     7 7 7C 7r   c                   a  S P                   '       g   ^ # \        S P                   P                  4       RR7      RV p\        V 3R lV 4       4      # )z#Total quantity in top N bid levels.TreverseNc              3  J   <"   T F  pSP                   V,          x  K  	  R # 5iN)r
   .0r   r   s   & r   	<genexpr>-OrderbookManager.bid_depth.<locals>.<genexpr>R   s     61488A;;    #)r
   sortedr.   sumr   rB   sorted_pricess   f& r   	bid_depthOrderbookManager.bid_depthM   s=    xxxtxx}}=gvF6666r   c                    V ^8  d   QhRRRR/# rA   r   )r   s   "r   r   r   T   s     6 6 6C 6r   c                   a  S P                   '       g   ^ # \        S P                   P                  4       RR7      RV p\        V 3R lV 4       4      # )z#Total quantity in top N ask levels.TrD   Nc              3  J   <"   T F  pSP                   V,          x  K  	  R # 5irG   )r   rH   s   & r   rJ   -OrderbookManager.ask_depth.<locals>.<genexpr>Y   s     5}!4771::}rL   )r   rM   r.   rN   rO   s   f& r   	ask_depthOrderbookManager.ask_depthT   s=    wwwtww||~t<WfE5}555r   c                   V ^8  d   QhRR/# r7   r   )r   s   "r   r   r   \   s     / /< /r   c                   V P                   '       d$   \        V P                   P                  4       4      M^ pV P                  '       d$   \        V P                  P                  4       4      M^ pW,           pV^ 8X  d   R# W,
          V,          # )z.Order imbalance [-1, 1]. Positive = more bids.N)r
   rN   valuesr   )r   	bid_total	ask_totaltotals   &   r   	imbalanceOrderbookManager.imbalance[   sb     /3hhhC)*A	-1WWWC()!	%A:%..r   c                    V ^8  d   QhRRRR/# r   sizer!   r   ztuple[int, float] | Noner   )r   s   "r   r   r   e   s       (@ r   c                0   V P                   '       g   R# Tp^ p\        V P                   P                  4       RR7       FT  pV P                   V,          p\        W%4      p^dV,
          pW6V,          ,          pW&,          pV^ 8:  g   KJ  W3V,          3u # 	  R# )z~Calculate cost to buy `size` YES contracts.

Returns:
    Tuple of (total_cost, avg_price) or None if insufficient liquidity.
NTrD   )r   rM   r.   min)r   rc   	remainingcostno_priceqtytake	yes_prices   &&      r   cost_to_buyOrderbookManager.cost_to_buye   s     www	tww||~t<H''(#Cy&DhI9$$DIA~Tk** = r   c                    V ^8  d   QhRRRR/# rb   r   )r   s   "r   r   r   z   s       )A r   c                   V P                   '       g   R# Tp^ p\        V P                   P                  4       RR7       FK  pV P                   V,          p\        W%4      pW6V,          ,          pW&,          pV^ 8:  g   KA  W3V,          3u # 	  R# )zCalculate proceeds from selling `size` YES contracts.

Returns:
    Tuple of (total_proceeds, avg_price) or None if insufficient liquidity.
NTrD   )r
   rM   r.   re   )r   rc   rf   proceedsr    ri   rj   s   &&     r   cost_to_sellOrderbookManager.cost_to_sellz   sy     xxx	DHHMMOT:E((5/Cy&Du$HIA~ T/22 ; r   c                   V ^8  d   QhRR/# )r   r   r   r   )r   s   "r   r   r      s     8 8# 8r   c                	    V P                   ;'       g    R pV P                  ;'       g    R pRV P                   RV RV R2# )u   —z<Orderbook  />)r0   r4   r   )r   bidasks   &  r   __repr__OrderbookManager.__repr__   sC    mm$$umm$$uT[[M3%qQ77r   )r   r
   N)   )__name__
__module____qualname____firstlineno____doc____annotations__r   dictr
   r   r   r(   propertyr0   r4   r:   r>   rQ   rW   r_   rl   rq   rz   __static_attributes__r   r   r   r   r      s    ( K5C5t4B47" : : ) ) 3 3 - -76 / /*(8 8r   r   N)r   
__future__r   dataclassesr   r   r   r   r   r   <module>r      s*    A " ( I8 I8 I8r   