ó
    ´]ßj#h ã                  óZ  • S r SSKJr  SSKrSSKrSSKrSSKrSSK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Jr  SSKJrJr  S	S
KJr  S	SKJrJrJr  S	SKJrJr  SrSr S	SK!J"r"J#r#J$r$  \RJ                  " S5      r&\ " S S5      5       r'\ " S S5      5       r(\ " S S5      5       r)\ " S S5      5       r*S.S jr+S/S jr,SS.               S0S jjr-Sr.Sr/S r0S!r1S"r2S#r3S"r4S$r5S%r6S&r7S'r8S(r9Sr:S#r;\/\0\.\1S)\2S*.                               S1S+ jjr< " S, S-5      r=g)2z?Live trading engine: post-only quotes via Lighter SignerClient.é    )ÚannotationsN©Údeque)Ú	dataclassÚfield)ÚPath)ÚListÚOptionalÚTuple)Ú
AccountApiÚSignerClienté   )ÚBookTop)ÚQuoteÚQuoteLadderÚ
QuoteLevel)Úget_limiterÚis_rate_limit_errorTg       @)ÚSessionStoreÚfill_to_dictÚtrim_for_uizlighter_mm.livec                  ó\   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   Srg)ÚFillé   ÚstrÚidÚfloatÚtsÚsideÚpriceÚsize_btcÚfee_usdÚmid_at_fill© N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__annotations__Ú__static_attributes__r$   ó    Úsrc/live_engine.pyr   r      s&   ‡ àƒGØƒIØ
ƒIØƒLØƒOØƒNØÖr,   r   c                  óR   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S
rg)ÚOpenLoté&   r   r   r   r   r    r!   Únotional_usdr   r$   Nr%   r$   r,   r-   r/   r/   &   s!   ‡ àƒGØ
ƒIØƒLØƒOØÓØ†Ir,   r/   c                  óp   • \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   S\S'   Srg)ÚClosedTradeé0   r   r   r   r   r   Úentry_priceÚ
exit_pricer!   Úpnl_usdr"   ÚboolÚ
profitabler$   Nr%   r$   r,   r-   r3   r3   0   s2   ‡ àƒGØƒIØ
ƒIØÓØÓØƒOØƒNØƒNØÖr,   r3   c                  óÚ  • \ rS rSr% S\S'   S\S'   SrS\S'   SrS\S'   \" \S9r	S	\S
'   \" \S9r
S\S'   \" \S9rS\S'   \" \R                  S9rS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   SrS\S'   \" S S9rS\S'   \" S S9rS\S'   SrS\S'   SrS\S '   SrS\S!'   S"rS#\S$'   S%rS&\S''   S"rS#\S('   S"rS#\S)'   S"rS#\S*'   S%r S&\S+'   S.S, jr!S-r"g)/Ú	LiveStateé=   r   Úequity0Úcash_usdç        Úinventory_btcÚrealized_pnl)Údefault_factoryú
List[Fill]ÚfillszList[OpenLot]Ú	open_lotszList[ClosedTrade]Úclosed_tradesÚday_start_tsÚday_start_equityNúOptional[Quote]ÚquoteÚlast_midÚprev_midÚbuy_notionalÚbuy_qtyÚsell_notionalÚsell_qtyc                 ó   • [        SS9$ )NiX  ©Úmaxlenr   r$   r,   r-   Ú<lambda>ÚLiveState.<lambda>O   s	   € ¼ÀcÒ9Jr,   r   Úprice_historyc                 ó   • [        SS9$ )Ni   rR   r   r$   r,   r-   rT   rU   Q   s	   € ´5ÀÒ3Dr,   ÚcandlesÚavailable_balanceÚ
collateralÚunrealized_pnlr   ÚintÚpending_ordersÚ r   Ú
last_errorÚladder_ordersÚladder_bidsÚladder_asksÚlast_refresh_reasonc                óJ   • U R                   (       d  U R                  U l         g g ©N)rH   r=   ©Úselfs    r-   Ú__post_init__ÚLiveState.__post_init__\   s   € Ø×$×$Ø$(§L¡LˆDÕ!ð %r,   )rH   ©ÚreturnÚNone)#r&   r'   r(   r)   r*   r@   rA   r   ÚlistrD   rE   rF   ÚtimerG   rH   rJ   rK   rL   rM   rN   rO   rP   rV   rX   rY   rZ   r[   r]   r_   r`   ra   rb   rc   rh   r+   r$   r,   r-   r;   r;   =   s3  ‡ àƒNØƒOØ€M�5ÓØ€L�%ÓÙ¨dÑ3€Eˆ:Ó3Ù$°TÑ:€Iˆ}Ó:Ù',¸TÑ'B€MÐ$ÓBÙ°·	±	Ñ:€L�%Ó:Ø!Ð�eÓ!Ø!€Eˆ?Ó!Ø€HˆeÓØ€HˆeÓØ€L�%ÓØ€GˆUÓØ€M�5ÓØ€HˆeÓÙ Ñ1JÑK€M�5ÓKáÑ+DÑE€GˆUÓEØ"Ð�uÓ"Ø€J�ÓØ€N�EÓØ€N�CÓØ€J�ÓØ€M�3ÓØ€K�ÓØ€K�ÓØ!Ð˜Ó!÷1r,   r;   c                ó6   • [        [        U SU-  -  5      5      $ )Né
   )r\   Úround)ÚvalueÚdecimalss     r-   Ú_to_int_amountrt   a   s   € ÜŒu�U˜b (™lÑ+Ó,Ó-Ð-r,   c                óN   • U c  g [        U 5      $ ! [        [        4 a     gf = f)Nr?   )r   Ú	TypeErrorÚ
ValueError)Úss    r-   Ú_from_str_amountry   e   s/   € Ø�yØðÜ�Q‹xˆøÜ”zÐ"ó Ùðús   †
 ‘$£$g{®Gáz”?)Úmax_mid_devc                óH  • [        U 5      nUS::  a  gSnU S:  a  US:”  a  UnO\US:”  a  UnOSUS:¼  a6  US:”  a0  US:”  a*  [        U5      S::  a  UnOUS:”  a  US:”  a  X!-  XC-  -
  U -  nUS::  a  US:”  a  UnOUS:”  a  UnUS:”  a  US:”  a  [        X…-
  5      U-  U:”  a  UnU$ )uß   Infer execution price from inventory change (not exchange avg_entry alone).

Sell fills must NOT use avg_entry â€” exchange keeps the entry average while
inventory is still open, so sells would wrongly match the buy price.
çê-�™—q=r?   r   gê-�™—q½)Úabs)	ÚdeltaÚinvÚ	avg_entryÚprev_invÚprev_avgÚmidrz   ÚsizeÚpxs	            r-   Úinfer_fill_pricer†   n   sÌ   € ô ˆu‹:€DØˆuƒ}Øà	€BØˆqƒyà�‹7Ø‰BØ˜‹]ØˆBøð �vÓ #¨£+°)¸a³-Ü�8‹} Ó%Ø‘Ø˜A“ (¨Q£,Ø‘o¨Ñ(;Ñ;¸uÑD�Ø�‹7Ø�Q‹wØ‘Ø˜Q“Ø�à	ˆAƒv�#˜“'œc "¡(›m¨cÑ1°KÓ?àˆØ€Ir,   é   g      6@g      ,@g      @g      >@g      .@g     €V@é   g      N@g      (@ç       @ç    eÍÍA)Úmax_stale_keep_bpsÚforce_recenter_bpsÚrate_headroomÚtoxic_eps_bpsÚseconds_since_placeÚpost_place_grace_sc                óL  • [        U=(       d    S5      n[        U =(       d    S5      nUU[        U5      -
  :  n[        U=(       d    S5      nUR                  S5      nUR                  S5      nUS:H  nUS;   =(       d2    UR                  S5      =(       d    UR                  S5      =(       d    UnS	nUS:”  a  US:”  a  [        XE-
  5      U-  S
-  nSnUS:”  aU  U[	        U5      -  S
-  nUS:”  a  XdU-   :¼  a  [        UXd-
  U-  S
-  5      nUS:”  a  XtU-
  ::  a  [        UXG-
  U-  S
-  5      nUnUR                  S5      =(       a    U[	        U
5      :¬  nU[	        U	5      :¬  =(       d    U=(       d    U=(       d    US:H  nUn[        U5      S::  a  U(       a  S$ S$ U(       aR  U(       d  US:X  a  g[        U5      S:”  a4  U(       d,  UR                  S5      (       d  UR                  S5      (       a  ggUR                  S5      (       d  UR                  S5      (       a  Ung[	        U5      [	        U5      :  a  U(       d  U(       a  U(       a  S$ S$ gU(       d  U(       a  U(       a  S$ S$ UR                  S5      (       d  UR                  S5      (       a  UngUng)uh  Anti-thrash rate gate. PIN: MAX_STALE=22 FORCE_RECENTER=14 GRACE=30 TOXIC=2.5 GAP=2.0 CD=90

- empty book â†’ proceed / defer_place (never idle)
- force (initial/post_fill/risk/adverse_cross/side_trim) â†’ proceed
- mid_moved with stale â‰¥ FORCE_RECENTER may wipe (recenter frozen quotes)
- extreme mid-stale (â‰¥ MAX_STALE) may wipe; rate full â†’ clear_stale
- toxic_* / through-market NEVER wipe by toxic reason alone (Denis t192u)
- adverse_cross_* (bid>=mid or ask<=mid) ALWAYS force proceed (post-only)
- soft_refresh / soft_keep: ALWAYS defer_keep
- other mild mid reasons â†’ defer_keep even with rate room
é%   r   r^   Ú	risk_sideÚadverse_crossÚtouch_recenter)Úinitial_placeÚpost_fill_replenishÚladder_clearedÚ	side_trimr•   r™   rŠ   ç     ˆÃ@r?   Ú
mid_moved_r˜   ÚproceedÚdefer_placer—   Ú
defer_keepÚtoxic_Úsoft_keep_toxicÚclear_staleÚsoft_refreshÚ	soft_keep)r\   r   Ú
startswithr}   r   Úmax)Ú	in_windowÚmax_per_windowÚworking_n_levelsÚreasonrƒ   Úworking_midÚworking_bid0Úworking_ask0Úrest_threshold_bpsr‹   rŒ   r�   rŽ   r�   r�   Úmax_pwÚin_wÚrate_okÚreason_sÚis_riskÚ
is_adverseÚis_touchÚforce_proceedÚ	stale_bpsÚthrough_bpsÚepsÚ_Ú	mid_forceÚ
hard_stales                                r-   Údecide_rate_constrained_refreshr¼   ¼   s¯  € ô: �×% 2Ó&€FÜˆy�~˜AÓ€DØ�Vœc -Ó0Ñ0Ñ0€GÜ�6—<˜RÓ €HØ×!Ñ! +Ó.€GØ×$Ñ$ _Ó5€JØÐ+Ñ+€HàÐmÑm÷ 	Ø×Ñ˜{Ó+÷	à×Ñ˜Ó/÷	ð ð	 ð €IØ�Qƒ˜3 ›7Ü˜Ñ)Ó*¨[Ñ8¸8ÑCˆ	à€KØ
ˆQƒwØ”E˜-Ó(Ñ(¨8Ñ3ˆØ˜!Ó °c±	Ó 9Ü˜k¨LÑ,>À#Ñ+EÈÑ+PÓQˆKØ˜!Ó °c±	Ó 9Ü˜k¨CÑ,>À#Ñ+EÈÑ+PÓQˆKØ€Að 	×Ñ˜LÓ)÷ 	3ØœÐ1Ó2Ñ2ð ð
 	”UÐ-Ó.Ñ.÷ 	(Ø÷	(à÷	(ð Ð'Ñ'ð	 ð 	€Aä
ÐÓ Ó!Þ#ˆyÐ6¨Ð6ÞÞ�hÐ"7Ó7ØäÐÓ  1Ó$ÞØ×"Ñ" <×0Ñ0Ø×"Ñ" ;×/Ñ/àØà×Ñ˜8×$Ñ$¨×(;Ñ(;Ð<M×(NÑ(NØˆØÜÐ Ó!¤EÐ*<Ó$=Ó=ÆgÞÞ '�9Ð:¨]Ð:Øæ–WÞ#ˆyÐ6¨Ð6à×Ñ˜>×*Ñ*¨h×.AÑ.AÀ+×.NÑ.NØˆØØ€AØr,   c                  ó  • \ rS rSrSrSr              S@S jrSAS jrSBS jr            SCS jr	SDS jr
SES	 jrSFS
 jrSGS jrSFS jrSHS jrSHS jrSISJS jjrSHS jrSKS jrSLS jrSFS jrSMS jrSNS jrSOS jrSSSS.       SPS jjrSQS jr        SRS jrSFS jr        SSS  jrSTS! jrSUS" jrSVS# jr SVS$ jr!      SWS% jr"SXSYS& jjr#SZS' jr$        S[S( jr%        S[S) jr& S\           S]S* jjr'S+S,S-S..             S^S/ jjr(        S_S0 jr)SIS`S1 jjr*SIS`S2 jjr+SIS`S3 jjr,SHS4 jr-SaS5 jr.SaS6 jr/SbS7 jr0S8r1ScS9 jr2SbS: jr3SFS; jr4SFS< jr5SbS= jr6SISJS> jjr7S?r8g)dÚ
LiveEnginei"  zIPlaces real post-only bid/ask; state mirrors PaperEngine for risk/status.é   c                ó   • Xl         X l        X0l        X@l        XPl        X`l        [        XwS9U l        [        [        R                  " 5       S-  5      S-  U l
        S U l        S U l        SU l        SU l        SU l        S U l        S U l        SU l        / U l        SU l        S U l        SU l        SU l        SU l        SU l        SU l        SU l        SSS.U l        SU l        SU l        SU l        SU l         / U l!        [E        [F        5      RI                  5       RJ                  S   S	-  nURM                  S
S
S9  US-  U l'        US-  U l(        [S        US-  5      U l*        U RT                  RW                  5       U l,        U RT                  R[                  U RX                  U RN                  5      n	U	(       a%  U RT                  R]                  U RX                  5        U R_                  5         U Ra                  5         g )N)r=   r>   iè  i Êš;r?   r   F©ÚbidÚaskr   ÚdataT)ÚparentsÚexist_okzfills_live.jsonlzcandles_5m.jsonzsession_state.json)1ÚclientÚaccount_indexÚapi_key_indexÚ	market_idÚprice_decimalsÚsize_decimalsr;   Ústater\   rn   Ú_client_order_seqÚ_bid_order_indexÚ_ask_order_indexÚ_working_midÚ_working_bid0Ú_working_ask0Ú_working_allow_bidÚ_working_allow_askÚ_working_n_levelsÚ_working_levelsÚ_last_side_trim_tsÚ_quote_targetÚ_last_place_tsÚ_last_full_rebuild_tsÚ_cancel_all_countÚ_place_batch_countÚ_rest_skip_countÚ_replenish_after_fillÚ_fills_to_replaceÚ_prev_inventoryÚ_prev_avg_entryÚ_boot_syncedÚ_day_equity_restoredÚ_persisted_close_eventsr   Ú__file__ÚresolverÅ   ÚmkdirÚ
_fills_logÚ_candles_pathr   Ú_session_storeÚload_or_rotateÚ_sessionÚseed_from_jsonlÚsaveÚ_apply_session_to_stateÚ_load_candles)
rg   rÇ   rÈ   rÉ   rÊ   rË   rÌ   Ú
equity_usdÚdata_dirÚseededs
             r-   Ú__init__ÚLiveEngine.__init__'  sÚ  € ð ŒØ*ÔØ*ÔØ"ŒØ,ÔØ*ÔÜ zÑGˆŒ
Ü!$¤T§Y¢Y£[°4Ñ%7Ó!8¸=Ñ!HˆÔØ/3ˆÔØ/3ˆÔØ#&ˆÔØ$'ˆÔØ$'ˆÔØ26ˆÔØ26ˆÔØ&'ˆÔØ+-ˆÔØ),ˆÔØ.2ˆÔØ%(ˆÔØ,/ˆÔ"Ø&'ˆÔØ'(ˆÔØ%&ˆÔØ+0ˆÔ"à/0¸Ñ';ˆÔØ&)ˆÔØ&)ˆÔØ"'ˆÔØ*/ˆÔ!Ø35ˆÔ$Üœ“>×)Ñ)Ó+×3Ñ3°AÑ6¸Ñ?ˆØ�‰˜t¨dˆÑ3Ø"Ð%7Ñ7ˆŒØ%Ð(9Ñ9ˆÔÜ*¨8Ð6JÑ+JÓKˆÔØ×+Ñ+×:Ñ:Ó<ˆŒà×$Ñ$×4Ñ4Ø�M‰M˜4Ÿ?™?ó
ˆö Ø×Ñ×$Ñ$ T§]¡]Ô3Ø×$Ñ$Ô&Ø×ÑÕr,   c                ó$   • XR                   l        g re   )rÍ   rJ   ©rg   Úqs     r-   Ú	set_quoteÚLiveEngine.set_quote`  s   € Ø�
‰
Õr,   c                ó"  • / nU H†  nUR                  UR                  [        UR                  5      [	        UR
                  5      [	        UR                  5      [	        UR
                  5      [	        UR                  5      -  S.5        Mˆ     U$ )N)r   Úlevelr    r!   r1   )Úappendr   r\   rý   r   r    r!   )rg   ÚlevelsÚoutÚlvs       r-   Ú_levels_to_statusÚLiveEngine._levels_to_statusc  sk   € ØˆÛˆBØ�J‰JàŸG™GÜ  §¡›]Ü" 2§8¡8›_Ü % b§k¡kÓ 2Ü$)¨"¯(©(£O´e¸B¿K¹KÓ6HÑ$Hñöñ ð ˆ
r,   c                ó¤  • [        S U 5       5      n[        S U 5       5      n[        U5      U R                  l        [        U5      U R                  l        X`R                  l        XpR                  l        UR                  5       U R                  l        UR                  5       U l	        U R                  U5      U l        [        UR                  =(       d    S5      U l        U Vs/ s H   oˆR                  S:X  d  M  UR                   PM"     n	nU Vs/ s H   oˆR                  S:X  d  M  UR                   PM"     n
n[        U	(       a  [#        U	5      OUR$                  =(       d    S5      U l        [        U
(       a  [)        U
5      OUR*                  =(       d    S5      U l        U R                  R                  bj  U R&                  S:”  a%  U R&                  U R                  R                  l        U R,                  S:”  a%  U R,                  U R                  R                  l        [/        U5      U l        X@l        XPl        gs  snf s  snf )zHRecord resting ladder after a successful place (source of truth for UI).c              3  óH   #   • U  H  oR                   S :X  d  M  Sv •  M     g7f)rÂ   r   N©r   ©Ú.0r  s     r-   Ú	<genexpr>Ú2LiveEngine._mark_working_placed.<locals>.<genexpr>z  ó   é € Ð;¢˜"¯'©'°UÑ*:—A‘A¢ùó   ‚"™	"c              3  óH   #   • U  H  oR                   S :X  d  M  Sv •  M     g7f)rÃ   r   Nr  r  s     r-   r	  r
  {  r  r  r?   rÂ   rÃ   Nr   )Úsumr\   rÍ   r`   r]   ra   rb   Úas_quoterJ   rÙ   r  r×   r   rƒ   rÑ   r   r    r¥   Úbid_pxrÒ   ÚminÚask_pxrÓ   ÚlenrÖ   rÔ   rÕ   )rg   rÿ   ÚladderÚn_placedÚ	allow_bidÚ	allow_askÚn_bidÚn_askr  ÚbidsÚaskss              r-   Ú_mark_working_placedÚLiveEngine._mark_working_placedq  s¡  € ô Ñ;¡Ó;Ó;ˆÜÑ;¡Ó;Ó;ˆÜ#& x£=ˆ�
‰
Ô Ü$'¨£Mˆ�
‰
Ô!Ø!&�
‰
ÔØ!&�
‰
ÔØ!Ÿ?™?Ó,ˆ�
‰
ÔØ#Ÿ_™_Ó.ˆÔØ#×5Ñ5°fÓ=ˆÔÜ! &§*¡*×"3°Ó4ˆÔá#)Ó>¢6˜R¯W©W¸Ñ-=“�—”¡6ˆÐ>Ù#)Ó>¢6˜R¯W©W¸Ñ-=“�—”¡6ˆÐ>Ü"¶¤3 t¤9¸6¿=¹=×;OÈCÓQˆÔÜ"¶¤3 t¤9¸6¿=¹=×;OÈCÓQˆÔØ�:‰:×ÑÑ'Ø×!Ñ! AÓ%Ø*.×*<Ñ*<�—
‘
× Ñ Ô'Ø×!Ñ! AÓ%Ø*.×*<Ñ*<�—
‘
× Ñ Ô'Ü!$ V£ˆÔØ"+ÔØ"+Õùò ?ùÚ>s   Ã*IÄIÄIÄ.Ic                ó,   • [        U R                  5      $ re   )rm   r×   rf   s    r-   Úladder_levels_for_statusÚ#LiveEngine.ladder_levels_for_status’  s   € Ü�D×(Ñ(Ó)Ð)r,   c                ó€   • U R                   nUc  g UR                  UR                  UR                  UR                  S.$ )N)r  r  r!   Úskew_bps)rÙ   r  r  r!   r"  rø   s     r-   Úquote_target_for_statusÚ"LiveEngine.quote_target_for_status•  s;   € Ø×ÑˆØ‰9Øà—h‘hØ—h‘hØŸ
™
ØŸ
™
ñ	
ð 	
r,   c                ó`  • U R                   nU R                  n/ Ul        UR                   Hâ  n UR                  R                  [	        [        UR                  S5      =(       d"    [        R                  " 5       R                  SS 5      [        US   5      [        US   5      [        US   5      [        US   5      [        UR                  S5      =(       d    S	5      [        UR                  S
5      =(       d    US   5      S95        Mä     [        UR                  =(       d    S	5      Ul        [        UR                  =(       d    S	5      Ul        [        UR                  =(       d    S	5      Ul        [        UR                  =(       d    S	5      Ul        UR                   (       a  [        UR                   5      Ul        UR"                  (       aK  UR"                  S:”  a;  [        UR"                  5      Ul        [        UR"                  5      Ul        SU l        [)        UR*                  =(       d    / 5      U l        [.        R1                  S[3        UR                  5      UR4                  UR6                  UR"                  U R&                  5        g! [         a     GM€  f = f)z>Hydrate in-memory fills / day baseline from persisted session.r   Né   r   r   r    r!   r"   r?   r#   ©r   r   r   r    r!   r"   r#   r   TzFsession hydrated: fills=%s buy=%s sell=%s day_equity0=%.2f restored=%s)rÍ   rí   rD   rþ   r   r   ÚgetÚuuidÚuuid4Úhexr   Ú	ExceptionrM   rN   rO   rP   rG   rH   r=   rä   rm   Úclose_eventsrå   ÚlogÚinfor  Ú	fills_buyÚ
fills_sell)rg   ÚstÚsessÚds       r-   rð   Ú"LiveEngine._apply_session_to_state¡  së  € à�Z‰ZˆØ�}‰}ˆØˆŒØ—”ˆAðØ—‘—‘ÜÜ˜qŸu™u T›{×C¬d¯jªj«l×.>Ñ.>¸sÀÐ.CÓDÜ   4¡›>Ü   6¡›^Ü# A g¡JÓ/Ü!& q¨¡}Ó!5Ü % a§e¡e¨IÓ&6×&=¸#Ó >Ü$)¨!¯%©%°Ó*>×*LÀ!ÀGÁ*Ó$Mñö
ñ ô   × 1Ñ 1× 8°SÓ9ˆŒÜ˜4Ÿ<™<×.¨3Ó/ˆŒ
Ü  ×!3Ñ!3×!:°sÓ;ˆÔÜ˜DŸM™M×0¨SÓ1ˆŒØ××Ü# D×$5Ñ$5Ó6ˆBŒOØ× ×  T×%:Ñ%:¸QÓ%>Ü"'¨×(=Ñ(=Ó">ˆBÔÜ˜t×4Ñ4Ó5ˆBŒJØ(,ˆDÔ%Ü'+¨D×,=Ñ,=×,CÀÓ'DˆÔ$Ü�‰ØTÜ�—‘‹MØ�N‰NØ�O‰OØ×ÑØ×%Ñ%õ	
øô ó Ûðús   °CJÊ
J-Ê,J-c                ó   • U R                   (       a  U R                  R                  S:”  a  gUS::  a  gXR                  l        XR                  l        U R                  R
                  (       d$  [        R                  " 5       U R                  l        XR                  l        SU l         U R                  R                  U R                  5        g)z=Set day baseline once per UTC day (skip if already restored).r   NT)	rä   rÍ   rH   r=   rí   rG   rn   rë   rï   )rg   Úequitys     r-   Úpersist_day_equityÚLiveEngine.persist_day_equityÉ  s†   € à×$×$¨¯©×)DÑ)DÀqÓ)HØØ�Q‹;ØØ&,�
‰
Ô#Ø#�
‰
ÔØ�}‰}×)×)Ü)-¯ª«ˆD�M‰MÔ&Ø)/�‰Ô&Ø$(ˆÔ!Ø×Ñ× Ñ  §¡Õ/r,   c                óî  • U R                   nU R                  R                   Vs/ s H  n[        U5      PM     snUl        U R                  R                  Ul        U R                  R
                  Ul        U R                  R                  Ul        U R                  R                  Ul        U R                  R                  Ul        U R                  R                  Ul	        / nU R                  R                  (       a—  U R                  R                  U R                  * S   Vs/ s Hh  nUR                  [        UR                  S5      UR                  UR                   UR"                  UR$                  UR&                  UR(                  S.PMj     nnU(       a  X1l        O+U R,                  (       a  [/        U R,                  5      Ul        U R0                  R3                  U5        g s  snf s  snf )Né   ©r   r7   r!   r   r9   r   r5   r6   )rí   rÍ   rD   r   rM   rN   rO   rP   rH   rG   rF   ÚMAX_CLOSE_EVENTSr   rq   r7   r!   r   r9   r   r5   r6   r-  rå   rm   rë   rï   )rg   r3  ÚfÚtypedÚcs        r-   Ú_persist_sessionÚLiveEngine._persist_session×  sw  € Ø�}‰}ˆØ/3¯z©z×/?Ò/?Ó@Ò/?¨!”l 1–oÑ/?Ñ@ˆŒ
Ø ŸJ™J×3Ñ3ˆÔØ—z‘z×)Ñ)ˆŒØ!ŸZ™Z×5Ñ5ˆÔØŸ
™
×+Ñ+ˆŒØ $§
¡
× ;Ñ ;ˆÔØ ŸJ™J×3Ñ3ˆÔØˆØ�:‰:×#×#ð Ÿ™×1Ñ1°4×3HÑ3HÐ2HÐ2JÑKóò L�Að Ÿ$™$Ü$ Q§Y¡Y°Ó2Ø !§
¡
ØŸ$™$Ø"#§,¡,ØŸF™FØ#$§=¡=Ø"#§,¡,ô	ñ Lð ð ö Ø %ÕØ×)×)Ü $ T×%AÑ%AÓ BˆDÔØ×Ñ× Ñ  Õ&ùò5 Aùòs   ¥G-Ä'A/G2c                óN   • [        S U R                  R                   5       5      $ )Nc              3  óH   #   • U  H  oR                   S :X  d  M  Sv •  M     g7f)Úbuyr   Nr  ©r  r>  s     r-   r	  Ú-LiveEngine.fills_buy_count.<locals>.<genexpr>ö  s   é € ÐBÒ.˜·&±&¸E±/—1‘1Ò.ùr  ©r  rÍ   rD   rf   s    r-   Úfills_buy_countÚLiveEngine.fills_buy_countõ  s   € ÜÑB˜dŸj™j×.Ò.ÓBÓBÐBr,   c                óN   • [        S U R                  R                   5       5      $ )Nc              3  óH   #   • U  H  oR                   S :X  d  M  Sv •  M     g7f)Úsellr   Nr  rF  s     r-   r	  Ú.LiveEngine.fills_sell_count.<locals>.<genexpr>ù  s   é € ÐCÒ.˜·&±&¸FÑ2B—1‘1Ò.ùr  rH  rf   s    r-   Úfills_sell_countÚLiveEngine.fills_sell_countø  s   € ÜÑC˜dŸj™j×.Ò.ÓCÓCÐCr,   Nc                ó    • U R                   R                   Vs/ s H  n[        U5      PM     nn[        U5      nUb  US:”  a  XA* S $ U$ s  snf )z9Return fills for dashboard Trades: last ~5h, capped ~500.Nr   )rÍ   rD   r   r   )rg   Únr>  ÚrowsÚuis        r-   Úlast_fills_for_statusÚ LiveEngine.last_fills_for_statusû  sP   € à)-¯©×)9Ò)9Ó:Ò)9 A”˜Q–Ñ)9ˆÐ:Ü˜ÓˆØ‰=˜Q ›UØ�b�c�7ˆNØˆ	ùò	 ;s   ™Ac                óH   • U R                   S-   S-  U l         U R                   $ )Nr   l     EC13g )rÎ   rf   s    r-   Ú_next_client_order_indexÚ#LiveEngine._next_client_order_index  s'   € Ø"&×"8Ñ"8¸1Ñ"<Ð@YÑ!YˆÔØ×%Ñ%Ð%r,   c              ƒ  ó~   #   • U R                   R                  5       u  pU(       d  U(       d  [        SU 35      eU$ 7f)Nzauth token failed: )rÇ   Úcreate_auth_token_with_expiryÚRuntimeError)rg   ÚtokenÚerrs      r-   Ú_authÚLiveEngine._auth  s6   é € Ø—[‘[×>Ñ>Ó@‰
ˆÞ–eÜÐ!4°S°EÐ:Ó;Ð;Øˆùs   ‚;=c              ƒ  óè   #   • [        U5      (       d  g[        5       nUb  UR                  5       I Sh  v•N   g[        R	                  S5        SSKnUR                  " S5      I Sh  v•N   g N9 N7f)zAOn rare 429: short backoff via shared limiter (not a long brake).Nu,   429 without limiter installed â€” sleep 1.5sr   g      ø?)r   r   Úon_429r.  ÚwarningÚasyncioÚsleep)rg   r^  Úlimrd  s       r-   Ú_maybe_429_backoffÚLiveEngine._maybe_429_backoff  sZ   é € ä" 3×'Ñ'ØÜ‹mˆØ‰?Ø—*‘*“,×Ñä�K‰KÐFÔGÛà—-’- Ó$×$Ñ$ñ ñ
 %ùs!   ‚2A2´A.µ3A2Á(A0Á)A2Á0A2c           	   ƒ  ój  #   • [        U R                  R                  5      n UR                  S[	        U R
                  5      S9I S h  v•N nUR                  (       d  [        S5      eUR                  S   n[        UR                  5      n[        UR                  5      n[        UR                  5      nXPR                  l        X`R                  l        [        UR                   =(       d    S5      nUS:”  a  X€R                  l        OPU R                  R$                  S:”  a&  U R                  R$                  U R                  l        OX€R                  l        Sn	Sn
SnSnUR&                  =(       d    /  HŸ  n[        [)        USS5      5      U R*                  :w  a  M)  [        UR,                  5      n[        UR.                  =(       d    S5      nXï-  n	[        UR0                  5      n
[        UR2                  5      n[        UR4                  5      n  O   U R6                  (       d+  X�l        X l        S	U l        [<        R?                  S
U	U
5        OØ[A        X�R8                  -
  5      S:”  a½  X�R8                  -
  nUS:”  a  SOSn[A        U5      nU R                  RB                  =(       d    Sn[E        UU	U
U R8                  U R:                  US9n[<        R?                  SUUUU
U R:                  U5        US:”  a"  US:”  a  U RG                  UUUUS:”  a  UOU5        X�l        X l        X�R                  l$        X°R                  l        US:”  a  UOXk-   nUS::  a  US:”  a  UOU R                  RJ                  nUX�R                  RB                  =(       d    S-  -
  U R                  l&        XÀR                  l        U R                  RN                  S::  a$  U RP                  (       d  U RS                  U5        g g g  GNº! [         a   nU R                  U5      I S h  v•N    e S nAff = f7f)NÚindex)Úbyrr   zaccount not foundr   r?   rÊ   éÿÿÿÿr   Tz?boot inventory sync inv=%+.6f avg_entry=%.1f (no fill recorded)g•Ö&è.>rE  rM  )r~   r   r€   r�   r‚   rƒ   zUfill_price side=%s delta=%+.6f mid=%.1f avg_entry=%.1f prev_avg=%.1f recorded_px=%.1f)*r   rÇ   Ú
api_clientÚaccountr   rÈ   r,  rg  Úaccountsr\  ry   rY   rZ   Útotal_asset_valuerÍ   r\   Úpending_order_countr]   r`   Ú	positionsÚgetattrrÊ   ÚpositionÚsignÚavg_entry_pricer[   rA   rã   rá   râ   r.  r/  r}   rK   r†   Ú_record_fillr@   r=   r>   rH   rä   r8  )rg   ÚapiÚaccsÚeÚaÚavailÚcollÚtavÚacct_pendingr   r€   ÚupnlÚrpnlÚpr„   ru  r~   r   rƒ   r…   r7  s                        r-   Úrefresh_accountÚLiveEngine.refresh_account  su  é € Ü˜Ÿ™×/Ñ/Ó0ˆð	ØŸ™¨´s¸4×;MÑ;MÓ7N˜ÐO×OˆDð �}�}ÜÐ2Ó3Ð3Ø�M‰M˜!ÑˆÜ  ×!4Ñ!4Ó5ˆÜ §¡Ó-ˆÜ˜q×2Ñ2Ó3ˆØ',�
‰
Ô$Ø $�
‰
ÔÜ˜1×0Ñ0×5°AÓ6ˆà˜!ÓØ(4�J‰JÕ%Ø�Z‰Z×%Ñ%¨Ó)Ø(,¯
©
×(@Ñ(@ˆD�J‰JÕ%à(4�J‰JÔ%àˆØˆ	ØˆØˆØ—‘×" Ò"ˆAÜ”7˜1˜k¨2Ó.Ó/°4·>±>ÓAÙÜ# A§J¡JÓ/ˆDÜ�q—v‘v—{ Ó#ˆDØ‘+ˆCÜ(¨×):Ñ):Ó;ˆIÜ# A×$4Ñ$4Ó5ˆDÜ# A§N¡NÓ3ˆDÙñ #ð × × Ø#&Ô Ø#,Ô Ø $ˆDÔÜ�H‰HØQØØõô
 �×+Ñ+Ñ+Ó,¨tÓ3à×.Ñ.Ñ.ˆEØ! A›I‘5¨6ˆDÜ�u“:ˆDØ—*‘*×%Ñ%×,¨ˆCÜ!ØØØ#Ø×-Ñ-Ø×-Ñ-ØñˆBô �H‰Hð1àØØØØ×$Ñ$Øô	ð �A‹v˜$ ›(Ø×!Ñ! $¨¨D¸¸q»±#ÀbÔIØ#&Ô Ø#,Ô à#&�
‰
Ô Ø$(�
‰
Ô!à˜a›‘ d¡kˆØ�Q‹;Ø# a›i‘U¨T¯Z©Z×-?Ñ-?ˆFØ$ s¯j©j×.AÑ.A×.HÀSÑ'IÑIˆ�
‰
ÔØ"&�
‰
Ôà�:‰:×&Ñ&¨!Ó+°D×4M×4MØ×#Ñ# FÕ+ð 5NÐ+òi PøÜó 	Ø×)Ñ)¨!Ó,×,Ñ,Øûð	üsG   ‚ P3£&P Á	PÁ
P ÁN5P3ÐP Ð
P0ÐP+Ð$P'Ð%P+Ð+P0Ð0P3c                ó@  • U R                   nX#-  nUS:X  a+  U=R                  U-  sl        U=R                  U-  sl        O*U=R                  U-  sl        U=R                  U-  sl        [        [        R                  " 5       R                  S S [        R                  " 5       UUUSUS9nUR                  R                  U5        S n [        U SS 5      n	U	b0  [        U	SS 5      nU	R                  XS:”  a  UOUUR                  US9  S	U l        US:X  a  S
OSn
[#        SU R$                  R'                  U
S5      S-   5      U R$                  U
'   US:X  aR  UR(                  R                  [+        [        R                  " 5       R                  S S SUUUUR                  S95        OQUR(                  R                  [+        [        R                  " 5       R                  S S SUUUUR                  S95         U R,                  R/                  S5       nUR1                  [2        R4                  " UR6                  UR                  UR8                  UR:                  UR<                  [?        US5      UR@                  US.5      S-   5        S S S 5         U RC                  5         [D        RI                  SXU5        g ! [         a     GNÂf = f! , (       d  f       NH= f! [         a     NWf = f! [         a   n[D        RG                  SU5         S nANoS nAff = f)NrE  r&  r?   r'  ÚmarkoutÚlast_ofir   )ÚofiTrÂ   rÃ   r‡   r   rp   Úlong©r   r   r    r!   r1   r   Úshortr{  é   )r   r   r   r    r!   r1   r#   Úofi_at_fillÚ
zsession persist after fill: %szLIVE FILL %s %.6f BTC @ %.1f)%rÍ   rM   rN   rO   rP   r   r)  r*  r+  rn   rD   rþ   rs  Úon_fillr   r,  rß   r  rà   r(  rE   r/   ré   ÚopenÚwriteÚjsonÚdumpsr   r   r    r!   rq   r#   rA  r.  rc  r/  )rg   r   r    r„   rƒ   r2  Únotionalr>  r�  ÚmkÚlsideÚfhrz  s                r-   rw  ÚLiveEngine._record_fillt  s´  € Ø�Z‰ZˆØ‘<ˆØ�5‹=Ø�OŠO˜xÑ'�OØ�JŠJ˜$ÑŽJà×Ò Ñ(ÕØ�KŠK˜4Ñ�KÜÜ�zŠz‹|×Ñ  Ð$Ü�yŠy‹{ØØØØØñ
ˆð 	�‰�‰˜Ôð ˆð	Ü˜˜y¨$Ó/ˆBØ‰~Ü% b¨*°dÓ;�Ø—
‘
˜4¨a«¡°U¸A¿D¹DÀk�
ÑRð &*ˆÔ"à ›‘¨EˆÜ(+¨A¨t×/EÑ/E×/IÑ/IÈ%ÐQRÓ/SÐVWÑ/WÓ(Xˆ×Ñ˜uÑ%à�5‹=Ø�L‰L×ÑÜÜ—z’z“|×'Ñ'¨¨Ð,ØØØ!Ø!)Ø—t‘tñõ	ð �L‰L×ÑÜÜ—z’z“|×'Ñ'¨¨Ð,Ø ØØ!Ø!)Ø—t‘tñô	ð	Ø—‘×%Ñ% cÔ*¨bØ—‘Ü—J’Jà"#§$¡$Ø"#§$¡$Ø$%§F¡FØ%&§W¡WØ()¯
©
Ü,1°(¸AÓ,>Ø+,¯=©=Ø+6ñ	óð ñô÷ +ð$	=Ø×!Ñ!Ô#ô 	�‰Ð/°¸UÕCøôi ó 	Úð	ú÷< +Õ*ûô  ó 	Ùð	ûô ó 	=Ü�K‰KÐ8¸!×<Ñ<ûð	=ús\   ÃA K Ç=K# ÈA8KÊK# ÊK3 Ë
KËKË
K ËK# Ë K# Ë#
K0Ë/K0Ë3
LË=LÌLc                ó‚  • U R                   nUR                  =(       d    UR                  Ul        UR                  Ul        UR	                  5       (       ah  UR                  S:”  aX  [
        R
                  " 5       nUR                  R                  X1R                  S.5        U R                  UR                  U5        / $ )z6Update mid / history; fills come from account refresh.r   )r   rƒ   )	rÍ   rK   rƒ   rL   Úokrn   rV   rþ   Ú_update_candle)rg   Útopr2  Únows       r-   Úon_bookÚLiveEngine.on_bookÅ  s~   € à�Z‰ZˆØ—k‘k×, S§W¡WˆŒØ—g‘gˆŒØ�6‰6�8‰8˜Ÿ™ !›Ü—)’)“+ˆCØ×Ñ×#Ñ#¨3·w±wÑ$?Ô@Ø×Ñ §¡¨Ô-Øˆ	r,   c           	   ƒ  óè  #   •  U R                   R                  U R                   R                  SU R                  U R                  S9I S h  v•N u  pnS U l        S U l        U(       aV  [        U5      U R                  l	        [        R                  SU5        U R                  U5      I S h  v•N   S[        U5      4$ U =R                  S-  sl        [        R                  SU R                  [        USU5      5        g N´ NU! [          aa  n[        U5      U R                  l	        [        R                  S	U5        U R                  U5      I S h  v•N    S[        U5      4s S nA$ S nAff = f7f)
Nr   )Útime_in_forceÚtimestamp_msÚcancel_all_market_indexrÉ   zcancel_all error: %sFr   zcancel_all ok (#%s): %sÚcode)Tr^   zcancel_all exception: %s)rÇ   Úcancel_all_ordersÚCANCEL_ALL_TIF_IMMEDIATErÊ   rÉ   rÏ   rÐ   r   rÍ   r_   r.  rc  rg  rÜ   r/  rs  r,  )rg   r¹   Úrespr^  rz  s        r-   Ú
cancel_allÚLiveEngine.cancel_allÐ  s8  é € ð	!Ø!%§¡×!>Ñ!>Ø"Ÿk™k×BÑBØØ(,¯©Ø"×0Ñ0ð	 "?ð "÷ ‰LˆA�Sð %)ˆDÔ!Ø$(ˆDÔ!ÞÜ(+¨C«�—
‘
Ô%Ü—‘Ð2°CÔ8Ø×-Ñ-¨cÓ2×2Ð2Øœc #›h�Ð&Ø×"Ò" aÑ'Õ"Ü�H‰HØ)Ø×&Ñ&Ü˜˜f dÓ+ôð
 ñ'ñ 3øô ó 	!Ü$'¨£FˆD�J‰JÔ!Ü�K‰KÐ2°AÔ6Ø×)Ñ)¨!Ó,×,Ñ,Øœ#˜a›&�=Õ ûð		!üst   ‚E2„AD ÁD ÁA D Â,DÂ-D Â=E2Â>AD Ã?E2Ä D ÄD Ä
E/ÄAE*ÅEÅE*Å$E/Å%E2Å*E/Å/E2g{®Gázt?r;  gú~j¼t“X?)Ú
target_absÚmax_attemptsÚmax_slippagec             ƒ  ó°  #   • [        [        U R                  SS5      =(       d    S5      n[        [	        U5      5       GH§  n U R                  5       I Sh  v•N   [        [        U R                  SS5      =(       d    S5      nUn[        U5      [        U5      :  a  [        R                  SUUU5        Us  $ [        S[        U5      S-
  5      n[        X€R                  5      n	U	S::  a  Us  $ US:„  n
US:  a  [        U5      O[        [        U5      S	5      nU R                  5       n[        R                  S
US-   UU
(       a  SOSUU5         U R                   R#                  U R$                  UU	UU
SU R&                  S9I Sh  v•N u  pÞnU(       a/  [        R                  SU5        U R)                  U5      I Sh  v•N   [*        R,                  " S5      I Sh  v•N   GMª      U R                  5       I Sh  v•N   [        [        U R                  SS5      =(       d    S5      n[        R                  SU5        U$  GNî! [         a!  n[        R                  SU5         SnAGNSnAff = f Në N´! [         a:  n[        R                  SU5        U R)                  U5      I Sh  v•N     SnANñSnAff = f Nß NÃ! [         a     N¤f = f7f)z’IOC reduce-only until |inv| < target_abs. Caller should cancel_all first.

Used by day-kill path so we never leave a naked long/short after stop.
r@   r?   Nzflatten refresh_account: %sz1flatten done inv=%.6f (target < %.4f) attempts=%dg�íµ ÷Æ°>r   é   gü©ñÒMbp?z<KILL flatten attempt=%d inv=%.6f side=%s size=%.6f slip=%.4fr   ÚSELLÚBUYT)Úmarket_indexÚclient_order_indexÚbase_amountr¬  Úis_askÚreduce_onlyrÉ   zflatten order err=%szflatten exception: %sg      ð?z#flatten exhausted attempts inv=%.6f)r   rs  rÍ   Úranger\   rƒ  r,  r.  rc  r}   r/  r¥   rt   rÌ   rX  ÚerrorrÇ   Ú$create_market_order_limited_slippagerÊ   rÉ   rg  rd  re  )rg   rª  r«  r¬  Úlast_invÚattemptrz  r   r!   r³  r´  ÚslipÚcoiÚ_txÚ_respr^  s                   r-   Úflatten_reduce_onlyÚLiveEngine.flatten_reduce_onlyì  sz  é € ô œ §¡¨_¸cÓB×IÀcÓJˆÜœS Ó.×/ˆGð>Ø×*Ñ*Ó,×,Ð,ô œ §
¡
¨O¸SÓA×HÀSÓIˆCØˆHÜ�3‹xœ% 
Ó+Ó+Ü—‘ØGØØØô	ð ’
Ü˜3¤ C£¨4¡Ó0ˆHÜ(¨×3EÑ3EÓFˆKØ˜aÓØ’
Ø˜1‘WˆFØ*1°A«+”5˜Ô&¼3¼uÀ\Ó?RÐTYÓ;ZˆDØ×/Ñ/Ó1ˆCÜ�I‰IØNØ˜!‘ØÞ ‘ eØØôð1Ø(,¯©×(XÑ(XØ!%§¡Ø'*Ø +Ø!%Ø!Ø $Ø"&×"4Ñ"4ð )Yð )÷ #‘�˜Cö Ü—I‘IÐ4°cÔ:Ø×1Ñ1°#Ó6×6Ð6ô —-’- Ó$×$Ó$ñ] 0ð^	Ø×&Ñ&Ó(×(Ð(ÜœW T§Z¡Z°À#ÓF×MÈ#ÓNˆHô 	�	‰	Ð7¸ÔBØˆòg -øÜó >Ü—‘Ð9¸1×=Ò=ûð>úñ8#ñ 7øÜó 1Ü—	‘	Ð1°1Ô5Ø×-Ñ-¨aÓ0×0Ö0ûð1úñ %á(øäó 	Ùð	üsß   ‚AKÁI	ÁIÁI	ÁC7KÅ6I;ÆI7Æ8I;ÇI9ÇI;Ç	KÇ"KÇ#	KÇ-K È KÈ-K È.KÉI	É	
I4ÉI/É)KÉ/I4É4KÉ7I;É9I;É;
J?Ê*J:Ê/J2Ê0J:Ê5KÊ:J?Ê?KËK Ë
KËKËKËKc              ƒ  óŽ  #   • Uc  g  U R                   R                  U R                  UU R                  S9I S h  v•N u    p#U(       a0  [        R                  SX5        U R                  U5      I S h  v•N   g g  N? N! [         a:  n[        R                  SX5        U R                  U5      I S h  v•N     S nAg S nAff = f7f)N)r±  Úorder_indexrÉ   zcancel_order %s: %szcancel_order %s exception: %s)rÇ   Úcancel_orderrÊ   rÉ   r.  Údebugrg  r,  )rg   rÂ  r¹   r^  rz  s        r-   Ú_cancel_oneÚLiveEngine._cancel_one/  s±   é € ØÑØð	-Ø"Ÿk™k×6Ñ6Ø!Ÿ^™^Ø'Ø"×0Ñ0ð 7ð ÷ ‰IˆAˆqö
 Ü—	‘	Ð/°ÔBØ×-Ñ-¨cÓ2×2Ñ2ð ññ 3øÜó 	-Ü�I‰IÐ5°{ÔFØ×)Ñ)¨!Ó,×,Ö,ûð	-üs\   ‚Cˆ2A> ºA:»8A> Á3A<Á4A> Á8CÁ:A> Á<A> Á>
CÂ*B=Â2B5Â3B=Â8CÂ=CÃCc             ƒ  ó²  #   • [        X0R                  5      n[        X R                  5      nUS::  d  US::  a  gU R                  5       n U R                  R                  U R                  UUUUU R                  R                  U R                  R                  SU R                  R                  U R                  S9
I S h  v•N u  pxn	U	(       ab  [        U	5      U R                  l        [        R                  SU(       a  SOSU	UU5        U R!                  U	5      I S h  v•N   S [        U	5      4$ [#        USS 5      n
[        R%                  S	U(       a  S
OSUUUU
5        US4$  N¤ NG! [&         aa  n[        U5      U R                  l        [        R                  SU5        U R!                  U5      I S h  v•N    S [        U5      4s S nA$ S nAff = f7f)Nr   )Núinvalid size/priceF)
r±  r²  r³  r    r´  Ú
order_typer¡  rµ  Úorder_expiryrÉ   z&create_order %s err=%s px=%.1f sz=%.6frÃ   rÂ   r¤  z,LIVE ORDER %s px=%.1f sz=%.6f coi=%s code=%sÚASKÚBIDr^   zcreate_order exception: %s)rt   rÌ   rË   rX  rÇ   Úcreate_orderrÊ   ÚORDER_TYPE_LIMITÚORDER_TIME_IN_FORCE_POST_ONLYÚDEFAULT_28_DAY_ORDER_EXPIRYrÉ   r   rÍ   r_   r.  rc  rg  rs  r/  r,  )rg   r´  r    r!   r³  Úprice_ir¼  Útxr§  r^  r¤  rz  s               r-   Ú_place_limitÚLiveEngine._place_limit?  s£  é € ô % X×/AÑ/AÓBˆÜ  ×(;Ñ(;Ó<ˆØ˜!Ó˜w¨!›|Ø-Ø×+Ñ+Ó-ˆð'	 Ø"&§+¡+×":Ñ":Ø!Ÿ^™^Ø#&Ø'ØØØŸ;™;×7Ñ7Ø"Ÿk™k×GÑGØ!Ø!Ÿ[™[×DÑDØ"×0Ñ0ð #;ð #÷ ‰MˆB�cö Ü(+¨C«�—
‘
Ô%Ü—‘Ø<Þ#‘E¨ØØØôð ×-Ñ-¨cÓ2×2Ð2ØœS ›X�~Ð%Ü˜4 ¨Ó.ˆDÜ�H‰HØ>Þ‘ UØØØØôð ˜�7ˆNñCñ* 3øô ó 	 Ü$'¨£FˆD�J‰JÔ!Ü�K‰KÐ4°aÔ8Ø×)Ñ)¨!Ó,×,Ñ,Øœ˜Q›�<Õûð		 üsu   ‚AGÁA5E) Ã E%ÃAE) ÄE'Ä E) Ä0GÄ13E) Å$GÅ%E) Å'E) Å)
GÅ3AGÆ7F:Æ8GÇ	GÇ
GÇGÇGc              ƒ  ón  #   •  U R                  5       I Sh  v•N nU R                  R                  R                  UU R                  U R
                  SS9I Sh  v•N nSnSnSnSnSn[        USS5      =(       d    /  HH  nUS-  n [        UR                  5      n	[        UR                  5      (       a	  U	nUS-  nMA  U	nUS-  nMJ     X0l        X@l        XPR                  l        X`R                  l        XpR                  l        US::  a5  / U l        SU l        SU l        SU l        SU l        SU R                  l        gU R$                  (       a  Xg-   [1        U R$                  5      :w  a  ggg GNY GN! [         a     GM  f = f! [         a   n
[2        R5                  SU
5         Sn
A
gSn
A
ff = f7f)	z9Map active orders to bid/ask indices for targeted cancel.NÚperp)ÚauthorizationrÈ   rÊ   Úmarket_typer   Úordersr   r?   zsync_open_order_indices: %s)r_  rÇ   Ú	order_apiÚaccount_active_ordersrÈ   rÊ   rs  r\   rÂ  r,  r8   r´  rÏ   rÐ   rÍ   r`   ra   rb   r×   rÖ   rÒ   rÓ   rÑ   rJ   r  r.  rÄ  )rg   ÚauthrÙ  Úbid_idxÚask_idxrR  r  r  ÚoÚoirz  s              r-   Úsync_open_order_indicesÚ"LiveEngine.sync_open_order_indicesp  s¡  é € ð*	8ØŸ™›×%ˆDØŸ;™;×0Ñ0×FÑFØ"Ø"×0Ñ0ØŸ.™.Ø"ð	 Gð ÷ ˆFð ˆGØˆGØˆAØˆEØˆEÜ˜V X¨tÓ4×:¸Ò:�Ø�Q‘�ðÜ˜QŸ]™]Ó+�Bô ˜Ÿ™—>‘>Ø �GØ˜Q‘J’Eà �GØ˜Q‘J’Eñ ;ð %,Ô!Ø$+Ô!Ø'(�J‰JÔ$Ø%*�J‰JÔ"Ø%*�J‰JÔ"à�A‹vØ')�Ô$Ø)*�Ô&Ø%(�Ô"Ø%(�Ô"Ø$'�Ô!Ø#'�—
‘
Õ Ø×%×%¨5©=¼SÀ×AUÑAUÓ=VÓ*Vàð +WÐ%òK &òøô !ó Ûðûô0 ó 	8Ü�I‰IÐ3°Q×7Ñ7ûð	8üs‚   ‚F5„F —E0˜AF ÁE3Á,F ÂE6ÂB$F Å F5Å,F Å-F5Å0F Å3F Å6
FÆ F ÆFÆF Æ
F2ÆF-Æ(F5Æ-F2Æ2F5c             ƒ  óº  #   • [        X0R                  5      n[        X R                  5      nUS::  d  US::  a  gU R                  5       nU R                  R                  U R                  UUUUU R                  R                  U R                  R                  SU R                  R                  UU R                  S9u  p‰p«U(       a  SSS[        U5      4$ X‰US4$ 7f)z<Sign one create_order; returns (tx_type, tx_info, coi, err).r   )NNNrÈ  F)r±  r²  r³  r    r´  rÉ  r¡  rµ  rÊ  ÚnoncerÉ   N)rt   rÌ   rË   rX  rÇ   Úsign_create_orderrÊ   rÎ  rÏ  rÐ  rÉ   r   )rg   r´  r    r!   rä  r³  rÑ  r¼  Útx_typeÚtx_infoÚ_tx_hashr^  s               r-   Ú_sign_createÚLiveEngine._sign_createž  sÓ   é € ô % X×/AÑ/AÓBˆÜ  ×(;Ñ(;Ó<ˆØ˜!Ó˜w¨!›|Ø9Ø×+Ñ+Ó-ˆØ*.¯+©+×*GÑ*GØŸ™Ø"Ø#ØØØ—{‘{×3Ñ3ØŸ+™+×CÑCØØŸ™×@Ñ@ØØ×,Ñ,ð +Hð +
Ñ'ˆ˜(ö Ø˜˜t¤S¨£XÐ-Ð-Ø  dÐ*Ð*ùs   ‚CCc              ƒ  ó\  #   • U(       d  g[         (       Gaº  U Vs/ s H  o"R                  S:X  d  M  UPM     nnU Vs/ s H  o"R                  S:X  d  M  UPM     nn/ n[        [        [	        U5      [	        U5      5      5       HI  nU[	        U5      :  a  UR                  X6   5        U[	        U5      :  d  M6  UR                  XF   5        MK     Su  px[        U5       HÒ  u  pbU(       a"  [        R                  " [        5      I Sh  v•N   U R                  UR                  S:H  UR                  UR                  S9I Sh  v•N u  pšU	b!  US-  n[        R                  " 5       U l        MŽ  U
(       d  M—  U
n[        U
5      (       d  M«  SU l        ["        R%                  SU[	        U5      5          O   U[	        U5      :  a  SU l        Xx4$  U R'                  U5      I Sh  v•N nUS	:”  a3  U =R(                  S-  sl        [        R                  " 5       U l        US
4$  S	nS
nU HT  nU R                  UR                  S:H  UR                  UR                  S9I Sh  v•N u  pšU	b  US-  nMI  U
(       d  MR  U
nMV     U(       a  [        R                  " 5       U l        Xx4$ s  snf s  snf  GN¦ GNo NÐ! [*         ad  n[        U5      (       a4  ["        R%                  S5        U R-                  U5      I Sh  v•N     SnAg["        R%                  SU5         SnANýSnAff = f NÆ7f)z•Place N post-only orders via send_tx_batch (1 REST) when possible.

Falls back to sequential create_order on batch failure.
Returns (n_placed, err).
)r   r^   rÂ   rÃ   N©r´  r    r!   r   Tu0   paced place: 429 after %d/%d â€” rest next cycler   r^   uJ   send_tx_batch 429 â€” backoff, skip sequential fallback (retry next cycle))r   Ú429u1   send_tx_batch failed (%s) â€” sequential fallback)ÚSEQUENTIAL_PACED_PLACEr   r¶  r¥   r  rþ   Ú	enumeraterd  re  ÚPLACE_GAP_SrÓ  r    r!   rn   rÚ   r   rß   r.  rc  Ú_place_batch_lockedrÝ   r,  rg  )rg   rÿ   r  r  r  ÚorderÚiÚn_okÚlast_errr¼  r^  Úplacedrz  s                r-   Ú_place_batchÚLiveEngine._place_batch¸  s¿  é € ö Ø÷
 "Ó!Ù!'Ó<¢˜2¯7©7°eÑ+;—B¡ˆDÐ<Ù!'Ó<¢˜2¯7©7°eÑ+;—B¡ˆDÐ<Ø&(ˆEÜœ3œs 4›y¬#¨d«)Ó4Ö5�Ø”s˜4“y“=Ø—L‘L ¡Ô)Ø”s˜4“y•=Ø—L‘L ¡Ö)ñ	 6ð
 #‰NˆDÜ" 5Ö)‘�ÞÜ!Ÿ-š-¬Ó4×4Ð4Ø!%×!2Ñ!2ØŸG™G uÑ,°R·X±XÈÏÉð "3ð "÷ ‘�ð ‘?Ø˜A‘I�DÜ*.¯)ª)«+�DÖ'ß�SØ"�HÜ*¨3×/Ó/Ø59˜Ô2ÜŸ™Ð$VÐX\Ô^aÐbgÓ^hÔiÙñ *ð ”c˜%“jÓ Ø-1�Ô*Ø�>Ð!ð	PØ×3Ñ3°FÓ;×;ˆFØ˜‹zØ×'Ò'¨1Ñ,Õ'Ü&*§i¢i£k�Ô#Ø˜r�zÐ!ð ð ˆØˆÛˆBØ!×.Ñ.ØŸ™ 5Ñ(Ø—h‘hØŸ™ð /ð ÷ ‰HˆCð
 ‰Ø˜‘	’ß�Ø’ñ ö Ü"&§)¢)£+ˆDÔØˆ~Ðùòw =ùÚ<ò 5òñ$ <øô
 ó 	PÜ" 1×%Ñ%ô —‘ÐhÔiØ×-Ñ-¨aÓ0×0Ñ0ÜÜ�K‰KÐKÈQ×OÑOûð	Púñùs¿   ‚L,›J'²J'¸L,¾J,ÁJ,ÁAL,Â<AL,ÄJ1Ä9L,ÅJ4Å/L,Å9L,ÆAL,ÇJ9 Ç&J7Ç'<J9 È#A L,É#L*É$L,É=5L,Ê4L,Ê7J9 Ê9
L'Ë9L"Ë<K?Ë=L"ÌL,ÌL"ÌL,Ì"L'Ì'L,c              ƒ  ón  #   • U R                   R                  nU R                  nSnSn[        S[	        U5      U5       GHK  nXXd-    nUR                  U5       ISh  v•N   / n/ n	/ n
/ nU GH  nUR                  U5      I Sh  v•N u  pÞU R                  UR                  S:H  UR                  UR                  US9I Sh  v•N u  nnnnU(       d  Ub  Uc?  [        R                  SUR                  UR                  U5        UR                  U5        M«   UR                  [!        U5      5        U	R                  U5        U
R                  U5        UR                  UR                  5        GM     U(       d   SSS5      ISh  v•N   GMQ   U R                   R'                  X‰S9I Sh  v•N n[-        USS5      n[-        US	S5      =(       d    / nU(       a  [	        U5      O
[	        U5      nUU-  n[/        [1        X«5      5       Hk  u  nu  nnU[	        U5      :  a  UU   OSnU(       a  UR                  OSnU(       a  UR                  OSn[        R3                  S
US:X  a  SOSUUUU5        Mm     SSS5      ISh  v•N   GMN     U$  GN3 GN GNÕ! ["        [$        4 a    UR                  U5         GN‹f = f GN: GN! [(         aB  n UR+                  U5      I Sh  v•N    e ! [(         a    UR                  U5         e f = fSnAff = f N‘! , ISh  v•N  (       d  f       GMó  = f7f)z@Sign all levels with sequential nonces, send_tx_batch (chunked).é   r   NrÃ   )r´  r    r!   rä  zsign_create %s L%s failed: %s)Útx_typesÚtx_infosr¤  Útx_hashz2LIVE ORDER %s px=%.1f sz=%.6f coi=%s batch_code=%srË  rÌ  )rÇ   Únonce_managerrÉ   r¶  r  ÚlockÚasync_next_nonceré  r   r    r!   r.  rc  rý   Úacknowledge_failurerþ   r\   rv   rw   Úsend_tx_batchr,  Úasync_hard_refresh_noncers  rï  Úzipr/  )rg   rÿ   ÚnmÚapi_keyÚ
chunk_sizeÚtotal_placedÚoffsetÚchunkrû  rü  ÚcoinsÚsidesr  Ú_krä  ræ  rç  r¼  r^  r§  rz  r¤  ÚhashesrR  ró  r   r…   Úszs                               r-   rñ  ÚLiveEngine._place_batch_locked  sí  é € à�[‰[×&Ñ&ˆØ×$Ñ$ˆàˆ
ØˆÜ˜Aœs 6›{¨J×7ˆFØ FÑ$7Ð8ˆEØ—w‘w˜w×'Õ'Ø&(�Ø&(�Ø#%�Ø#%�Ü�BØ&(×&9Ñ&9¸'Ó&B× B‘I�BØ7;×7HÑ7HØ "§¡¨5Ñ 0Ø Ÿh™hØ!#§¡Ø#ð	 8Ið 8÷ 2Ñ.�G˜W c¨3ö ˜g™o°±ÜŸ™Ø;ØŸG™GØŸH™HØô	ð ×.Ñ.¨wÔ7Ù ð1Ø Ÿ™¬¨G«Ô5ð —O‘O GÔ,Ø—L‘L Ô%Ø—L‘L §¡×)ñ1  ö4  Ø÷A (×'Ò'ðD
Ø!%§¡×!:Ñ!:Ø!)ð ";ð "÷ �Dô ˜t V¨TÓ2�Ü   y°$Ó7×=¸2�Þ#)”C˜”K¬s°8«}�Ø Ñ!�Ü&/´°EÓ0AÖ&B‘N�A‘{˜˜TØ%&¬¨U«£^˜˜qš¸�BÞ%'˜Ÿš¨Q�BÞ(*˜Ÿš°�BÜ—H‘HØLØ!%¨£™°EØØØØöñ	 'C÷e (×'Ò'ñ 8ð@ Ðò} (ò !Cò2øô$ &¤zÐ2ó 1Ø Ÿ™¨×0ð1úò3 (òFøô !ó ð8Ø ×9Ñ9¸'ÓB×BÑBð øô %ó 8Ø×.Ñ.¨wÕ7Øð8þð	ú÷M (×'×'Ò'üs  ‚AL5ÁJÁL5Á"#LÂJ
Â<LÃJ
ÃALÄJÄ3A
LÅ=L5ÆKÆ	L5ÆKÆ-KÆ.KÆ2CLÉ:L5ÊLÊL5ÊLÊLÊ!J?	Ê;LÊ>J?	Ê?LËL5ËKË
LËK.Ë'K*
Ë(K.Ë-LË.L	Ì	LÌL	ÌLÌLÌLÌL5ÌL2	ÌL"Ì L2	Ì,	L5c              ƒ  óŒ  ^#   • SU R                   l         [        5       R                  5       n[	        UR                  S5      =(       d    S5      [	        UR                  S5      =(       d    S5      -
  nUS:  a  SU R                   l        SU l        g	 S
nSU4SU44 GHÉ  u  mnU R                  R                  TS5      nUS::  a  M+  U(       d  SU R                  T'   MC  [        U4S jUR                   5       S S9n	U	(       d  SU R                  T'   Mz  U[        U	5      ::  a  X˜* S	 OU	n
U
 GH2  nU(       a"  [        R                  " [        5      I S	h  v•N   U R                  TS:H  UR                   UR"                  S9I S	h  v•N u  pÍUc3  [$        R'                  STU5        U(       a  [)        U5      (       a      g	M•  Sn[+        SU R                  T   S-
  5      U R                  T'   [,        R,                  " 5       U l         U R0                  R3                  U R5                  U/5      5        [$        R7                  STUR                   UR"                  5        GM5     GMÌ     [9        U R                  R;                  5       5      S:X  a  S
U l        g	g	! [         a     GNf = f GNU GN(! [         a     N‰f = f7f)zBPlace exactly one replacement order per fill, one after the other.Úreplace_1for1r§   r’   r¦   r   é   Údefer_rate_1for1TNFrÂ   rÃ   c              3  óJ   >#   • U  H  oR                   T:X  d  M  Uv •  M     g 7fre   r  )r  r  r   s     €r-   r	  Ú2LiveEngine._replace_one_for_one.<locals>.<genexpr>a  s   øé € ÐJª 2¿'¹'ÀT¹/ŸB™Bªùs   ƒ#š	#c                ó   • U R                   $ re   ©rý   ©r  s    r-   rT   Ú1LiveEngine._replace_one_for_one.<locals>.<lambda>a  s   € Ð[]×[cÒ[cr,   ©Úkeyrì  u1   replace_1for1 %s failed (%s) â€” retry next cycler   z2replace_1for1 %s px=%.1f sz=%.6f (fill -> 1 order))rÍ   rc   r   Úsnapshotr\   r(  rß   r,  rà   Úsortedrÿ   r  rd  re  rð  rÓ  r    r!   r.  rc  r   r¥   rn   rÚ   r×   Úextendr  r/  r  Úvalues)rg   r  r  r  ÚsnapÚroomÚ
placed_anyÚallowedrR  ÚrungsÚtargetsr  r¼  r^  r   s                 @r-   Ú_replace_one_for_oneÚLiveEngine._replace_one_for_oneL  s{  øé € à)8ˆ�
‰
Ô&ð	Ü“=×)Ñ)Ó+ˆDÜ�t—x‘xÐ 0Ó1×7°RÓ8¼3¸t¿x¹xÈÓ?T×?YÐXYÓ;ZÑZˆDØ�a‹xØ1C�—
‘
Ô.Ø-1�Ô*Øð ð ˆ
Ø$ iÐ0°5¸)Ð2DÔE‰MˆD�'Ø×&Ñ&×*Ñ*¨4°Ó3ˆAØ�A‹vÙÞØ/0�×&Ñ& tÑ,ÙÜÔJ¨¯ªÓJÑPcÑdˆEÞØ/0�×&Ñ& tÑ,Ùà$%¬¨U«£O�e˜B˜C‘j¸ˆGÜ�ÞÜ!Ÿ-š-¬Ó4×4Ð4Ø!%×!2Ñ!2Ø  E™M°"·(±(ÀRÇ[Á[ð "3ð "÷ ‘�ð ‘;Ü—K‘KÐ SÐUYÐ[^Ô_ÞÔ2°3×7Ñ7ÚÙØ!�
Ü/2°1°d×6LÑ6LÈTÑ6RÐUVÑ6VÓ/W�×&Ñ& tÑ,Ü&*§i¢i£k�Ô#ðØ×(Ñ(×/Ñ/°×0FÑ0FÈÀtÓ0LÔMô —‘ÐMÈtÐUW×U]ÑU]Ð_a×_jÑ_j×kô% ñ Fô@ ˆt×%Ñ%×,Ñ,Ó.Ó/°1Ó4Ø).ˆDÕ&ð 5øôG ó 	Úð	úò$ 5òøô !ó Ùðüsn   ƒK–A=J ÂCKÅJ.Å/KÆ	J1Æ
BKÈ+J4È7A&KÊ
J+Ê'KÊ*J+Ê+KÊ1KÊ4
KÊ>KË KËKc                óD  • SU l         SU l        SU l        SU l        SU l        SU l        / U l        Xl        X l        SU l	        SU l
        SU R                  l        SU R                  l        SU R                  l        SU R                  l        SU R                  l        g)zIAfter cancel under rate pressure: empty working markers, force replenish.Nr?   r   T)rÏ   rÐ   rÑ   rÒ   rÓ   rÖ   r×   rÔ   rÕ   rÚ   rß   rÍ   r`   ra   rb   r]   rJ   )rg   r  r  s      r-   Ú_clear_working_for_replenishÚ'LiveEngine._clear_working_for_replenish}  s’   € à $ˆÔØ $ˆÔØˆÔØ ˆÔØ ˆÔØ!"ˆÔØ!ˆÔØ"+ÔØ"+ÔØ!ˆÔØ%)ˆÔ"Ø#$ˆ�
‰
Ô Ø!"ˆ�
‰
ÔØ!"ˆ�
‰
ÔØ$%ˆ�
‰
Ô!àˆ�
‰
Õr,   c                ó  • U(       a  U(       d  US4$  [        UR                  S5      =(       d    S5      [        UR                  S5      =(       d    S5      -
  nUS:¼  a  US4$ [	        U Vs/ s H  oDR
                  S:X  d  M  UPM     snS S	9n[	        U Vs/ s H  oDR
                  S
:X  d  M  UPM     snS S	9nUSS USS -   n[        U5      [        U5      :¼  a  US4$ US4$ ! [        [        4 a    US4s $ f = fs  snf s  snf )uí   If rate room is tight, keep only top-of-book (â‰¤2 per side).

Returns (levels_to_place_now, partial).
Batch place is 1 REST call, but sequential fallback burns the window;
shrinking the ladder under pressure avoids wipeâ†’sparse holes.
Fr§   r’   r¦   r   r  rÂ   c                ó   • U R                   $ re   r  ©Úxs    r-   rT   Ú6LiveEngine._select_levels_for_budget.<locals>.<lambda>¤  ó   € ÈqÏwÊwr,   r  rÃ   c                ó   • U R                   $ re   r  r.  s    r-   rT   r0  ¥  r1  r,   Nr®  T)r\   r(  rv   rw   r  r   r  )rg   rÿ   r!  r"  r  r  r  Útrimmeds           r-   Ú_select_levels_for_budgetÚ$LiveEngine._select_levels_for_budget‘  s	  € ö žTØ˜5�=Ð ð	!Ü�t—x‘xÐ 0Ó1×7°RÓ8¼3¸t¿x¹xÈÓ?T×?YÐXYÓ;ZÑZˆDð �1‹9Ø˜5�=Ð ä¡FÓ?¢F˜b¯g©g¸Ñ.>—r¡FÑ?ÑEVÑWˆÜ¡FÓ?¢F˜b¯g©g¸Ñ.>—r¡FÑ?ÑEVÑWˆØ�r˜�(˜T " 1˜XÑ%ˆÜˆw‹<œ3˜v›;Ó&Ø˜5�=Ð Ø˜ˆ}Ðøô œ:Ð&ó 	!Ø˜5�=Ò ð	!üò @ùÚ?s*   ”AC* Á.DÂDÂD	Â2D	Ã*DÄ Dc              ƒ  ó  #   • SSK n[        R                  " 5       [        U5      -   n[        R                  " 5       U:  a´   [	        5       nU(       a  UR                  5       OSnUc  g[        UR                  S5      =(       d    S5      [        UR                  S5      =(       d    S5      -
  nU[        U5      :¼  a  gUR                  " S5      I Sh  v•N   [        R                  " 5       U:  a  M´  g! [         a    Sn NŸf = f N27f)	zLBlock until limiter has `need` free slots (or timeout). Empty-book priority.r   NTr§   r’   r¦   g      Ð?F)
rd  rn   Ú	monotonicr   r   r  r,  r\   r(  re  )rg   ÚneedÚ	timeout_srd  Údeadlinerf  r!  r"  s           r-   Ú_wait_rate_roomÚLiveEngine._wait_rate_room¬  sÖ   é € ãÜ—>’>Ó#¤e¨IÓ&6Ñ6ˆÜ�nŠnÓ Ó)ðÜ!“m�Þ),�s—|‘|”~°$�ð ‰|ØÜ�t—x‘xÐ 0Ó1×7°RÓ8¼3¸t¿x¹xÈÓ?T×?YÐXYÓ;ZÑZˆDØ”s˜4“yÓ ØØ—-’- Ó%×%Ð%ô �nŠnÓ Õ)ð øô ó Ø’ðúñ &ùs<   ‚?D
Á#C6 Á%A0D
ÃDÃD
Ã5D
Ã6DÄD
ÄDÄD
c                óZ   • U R                   nUS::  d  US::  a  g[        X-
  5      U-  S-  $ )Nr   rŠ   rš   )rÑ   r}   )rg   rƒ   Úws      r-   Ú_mid_moved_bpsÚLiveEngine._mid_moved_bps¾  s3   € Ø×ÑˆØ�‹6�S˜A“XØÜ�3‘7‹|˜aÑ (Ñ*Ð*r,   c              ƒ  óT	  #   • SU R                   l        UR                  5       U l        [	        S UR
                  =(       d    /  5       S5      n[	        S UR
                  =(       d    /  5       S5      nUc&  [	        S UR
                  =(       d    /  5       S5      nUc&  [	        S UR
                  =(       d    /  5       S5      nS HC  n[        XS5      nUc  M   U R                  [        U5      5      I Sh  v•N   [        XS5        ME     U R                  S	S
S9I Sh  v•N n	U	(       d'  SU R                   l        [        R                  S5        gSn
U(       a}  Ubz  U R                  S[!        UR"                  5      [!        UR$                  5      S9I Sh  v•N u  p¼Ub   U
S-  n
[!        UR"                  5      U l        O[        R                  SU5        U(       a¦  Ub£  U
(       a"  [(        R*                  " [,        5      I Sh  v•N   U R                  S[!        UR"                  5      [!        UR$                  5      S9I Sh  v•N u  p¼Ub   U
S-  n
[!        UR"                  5      U l        O[        R                  SU5        UR0                  (       a  [!        UR0                  5      U l        U
S:”  GaŠ  [4        R4                  " 5       U l        [4        R4                  " 5       U l         U R;                  5       I Sh  v•N   [        U R                   R<                  =(       d    S5      [        U R                   R>                  =(       d    S5      -   S::  a�  U R                   R@                  bj  U R&                  S:”  a%  U R&                  U R                   R@                  l!        U R.                  S:”  a%  U R.                  U R                   R@                  l"        SU
 S3U R                   l        [        RG                  SX R&                  =(       d    SU R.                  =(       d    SUR0                  =(       d    S5        gSU R                   l        g GN\! [         a!  n[        R                  SXh5         SnAGN€SnAff = f GNe GNï GN„ GNH GN‘! [         a     GNœf = f7f)uù   Replace best bid/ask only â€” NEVER cancel_all.

Cancels tracked top-of-book indices (if any) then places new L0 from
the desired ladder. Deeper levels keep resting. Used for FORCE_RECENTER
band so the book never goes 0+0 for ~40s under rate limit.
zplacing(touch_recenter)c              3  ó~   #   • U  H3  oR                   S :X  d  M  [        UR                  5      S:X  d  M/  Uv •  M5     g7f)rÂ   r   N©r   r\   rý   r  s     r-   r	  Ú9LiveEngine._incremental_touch_recenter.<locals>.<genexpr>Ò  ó4   é € ÐeÒ%8˜b¿W¹WÈÑ=M“rÔRUÐVX×V^ÑV^ÓR_ÐcdÑRd—r‘rÒ%8ùó   ‚=™=´	=Nc              3  ó~   #   • U  H3  oR                   S :X  d  M  [        UR                  5      S:X  d  M/  Uv •  M5     g7f)rÃ   r   NrC  r  s     r-   r	  rD  Ó  rE  rF  c              3  óH   #   • U  H  oR                   S :X  d  M  Uv •  M     g7f©rÂ   Nr  r  s     r-   r	  rD  Õ  ó   é € ÐRÒ)< "ÇÁÈEÑAQŸ2™2Ò)<ùr  c              3  óH   #   • U  H  oR                   S :X  d  M  Uv •  M     g7f©rÃ   Nr  r  s     r-   r	  rD  ×  rJ  r  )rÏ   rÐ   ztouch_recenter cancel %s: %sr®  r‰   ©r8  r9  zdefer_rate_keep(touch_recenter)u4   touch_recenter deferred â€” keep deeper resting bookr   Frì  r   z#touch_recenter bid place failed: %sTz#touch_recenter ask place failed: %szplaced_touch_recenter(Ú)zEtouch_recenter placed=%s bid0=%.1f ask0=%.1f mid=%.1f (no cancel_all))$rÍ   rc   r  rÙ   Únextrÿ   rs  rÅ  r\   r,  r.  rÄ  Úsetattrr;  rc  rÓ  r   r    r!   rÒ   rd  re  rð  rÓ   rƒ   rÑ   rn   rÚ   Ú_last_touch_recenter_tsrá  ra   rb   rJ   r  r  r/  )rg   r  r  r  Úbid_lvÚask_lvÚidx_attrrà  rz  rš  rö  r¼  r^  s                r-   Ú_incremental_touch_recenterÚ&LiveEngine._incremental_touch_recenterÆ  s³  é € ð *Cˆ�
‰
Ô&Ø#Ÿ_™_Ó.ˆÔäÑe V§]¡]×%8°bÐ%8ÓeÐgkÓlˆÜÑe V§]¡]×%8°bÐ%8ÓeÐgkÓlˆØ‰>ÜÑR¨¯©×)<¸"Ð)<ÓRÐTXÓYˆFØ‰>ÜÑR¨¯©×)<¸"Ð)<ÓRÐTXÓYˆFó AˆHÜ˜¨Ó.ˆBØ‹~ðKØ×*Ñ*¬3¨r«7Ó3×3Ð3ô ˜¨Ö-ñ Að ×'Ñ'¨Q¸#Ð'Ð>×>ˆÞØ-NˆD�J‰JÔ*Ü�K‰KÐNÔOØàˆÞ˜Ñ+Ø!×.Ñ.Ø¤E¨&¯,©,Ó$7Ä%ÈÏÉÓBXð /ð ÷ ‰HˆCð ‰Ø˜!‘�Ü%*¨6¯<©<Ó%8�Õ"ä—‘ÐAÀ3ÔGÞ˜Ñ+ÞÜ—m’m¤KÓ0×0Ð0Ø!×.Ñ.Ø¤5¨¯©Ó#6ÄÀvÇÁÓAWð /ð ÷ ‰HˆCð ‰Ø˜!‘�Ü%*¨6¯<©<Ó%8�Õ"ä—‘ÐAÀ3ÔGà�:�:Ü % f§j¡jÓ 1ˆDÔØ�AŒ:Ü"&§)¢)£+ˆDÔÜ+/¯9ª9«;ˆDÔ(ðØ×2Ñ2Ó4×4Ð4ô �4—:‘:×)Ñ)×.¨QÓ/´#°d·j±j×6LÑ6L×6QÐPQÓ2RÑRÐVWÓWà—:‘:×#Ñ#Ñ/Ø×)Ñ)¨AÓ-Ø26×2DÑ2D˜Ÿ
™
×(Ñ(Ô/Ø×)Ñ)¨AÓ-Ø26×2DÑ2D˜Ÿ
™
×(Ñ(Ô/Ø/EÀfÀXÈQÐ-OˆD�J‰JÔ*Ü�H‰HØWØ×*Ñ*×/¨a°×1CÑ1C×1HÀqÈ&Ï*É*Ï/ÐXYõð
 .OˆD�J‰JÕ*òq 4øÜ ó KÜ—I‘IÐ<¸h×JÒJûðKúò ?òò 1òò  5øÜó Úðüs¾   ‚CR(ÃQÃ;QÃ<QÄ #R(Ä#RÄ$A8R(ÆRÆA-R(È
RÈ>R(É	RÉ
B%R(Ë0R ÌRÌR ÌER(ÑQÑ
RÑ$R Ñ:R(Ò RÒR(ÒR(ÒR(ÒR(ÒR Ò
R%Ò!R(Ò$R%Ò%R(c              ƒ  ó¤  #   • [        U5      n[        U5      n[        [        [        U R                  SS5      =(       d    S5      5      nUS::  a  SnSn[        U R                  R                  =(       d    S5      n[        U R                  R                  =(       d    S5      nX@l        XPl	        UR                  5       U l        U(       Ga  U(       Ga   [        [        5      n	Xy:¼  a1  X‰:¼  a,  SU R                  l        [        R                  " 5       U l        gU(       a  [!        SX—-
  5      OSn
U(       a  [!        SX˜-
  5      OSn[#        S UR$                  =(       d    /  5       S	 S
9n[#        S UR$                  =(       d    /  5       S S
9n/ nU
S:”  a,  U(       a%  UR'                  [)        U5      U
:¼  a  XÊ* S OU5        US:”  a,  U(       a%  UR'                  [)        U5      U:¼  a  XÛ* S OU5        U(       d,  SU R                  l        [        R                  " 5       U l        gSU R                  l        [        R                  " 5       U l        [*        R-                  SX«XxU[)        U5      5        U R/                  SSS9I Sh  v•N nU(       d  SU R                  l        gU R1                  U5      I Sh  v•N u  nnUS:”  Ga÷  UR2                  (       a  [        UR2                  5      U l        [        R                  " 5       U l         U R9                  5       I Sh  v•N   [        U R                  R                  =(       d    S5      U:  a  XpR                  l        [        U R                  R                  =(       d    S5      U:  a  X€R                  l        [        U R                  R                  =(       d    S5      [        U R                  R                  =(       d    S5      -   U R                  l        [        U R                  R<                  =(       d    S5      U l        [        U R                  R<                  =(       d    S5      U R                  l         SU S3U R                  l        [*        R-                  SUU R                  R                  U R                  R                  5        SU l!        gSU R                  l        gU(       a  U(       d  US:¼  a  US:X  d  U(       a=  U(       d6  US:¼  a0  US:X  a*  SU R                  l        [*        R-                  SXxXEU5        gUR$                  =(       d    /  Vs/ s H7  nURD                  S:X  a  U(       d  URD                  S:X  d  M,  U(       d  M5  UPM9     nnSU R                  l        [        R                  " 5       U l        [*        R-                  SXE[)        U5      5        U R>                  S:”  d-  [        [        U R                  SS5      =(       d    S5      S:”  a2  U RG                  5       I Sh  v•N   [        R                  " 5       U l$        / U l%        SU l        SU l&        SU l'        SU l        SU R                  l        SU R                  l        SU R                  l        SU R                  l         SU R                  l(        X@l        XPl	        U(       d  SU l!        SU R                  l        gU R/                  SSS9I Sh  v•N nU(       d  SU l!        SU R                  l        gU R1                  U5      I Sh  v•N u  nnUS:”  aÌ  U RS                  XáUXE5        [        R                  " 5       U l        SU S3U R                  l        U[)        U5      :  =(       do    U=(       af    U=(       a]    [        U R                  R                  =(       d    S5      S:  =(       d+    [        U R                  R                  =(       d    S5      S:  U l!        gSU l!        SU R                  l        g GNœ GNm GN! [:         a     GNf = fs  snf  GN! GNN GN7f) uË   Side change helper â€” never stick 0+x / x+0 >10s; target 8+8.

Unless |inv| > 0.5 BTC (true danger), force both sides and TOP-UP the
short side without cancel_all. Full wipe only when inv forces a cut.
r@   r?   ç      à?Tr   Úrest_side_trimNc              3  óH   #   • U  H  oR                   S :X  d  M  Uv •  M     g7frI  r  r  s     r-   r	  Ú.LiveEngine._apply_side_trim.<locals>.<genexpr>7  ó   é € ÐHÒ2˜·w±wÀ%Ñ7G—‘Ò2ùr  c                ó,   • [        U R                  5      $ re   ©r\   rý   r  s    r-   rT   Ú-LiveEngine._apply_side_trim.<locals>.<lambda>8  ó   € œs 2§8¡8œ}r,   r  c              3  óH   #   • U  H  oR                   S :X  d  M  Uv •  M     g7frL  r  r  s     r-   r	  r[  ;  r\  r  c                ó,   • [        U R                  5      $ re   r^  r  s    r-   rT   r_  <  r`  r,   zdefer_rate_place(side_trim)zplacing(side_trim_topup)zKside_trim topup need_bid=%s need_ask=%s (have b=%s a=%s inv=%.4f) levels=%sr®  ç      4@rM  zplaced_side_trim_topup(rN  z'side_trim topup placed=%s now b=%s a=%sFrŒ  uC   side_trim already one-sided b=%s a=%s allow=%s/%s inv=%.4f â€” restrÂ   rÃ   zplacing(side_trim)z3side_trim cancel+place kept bid=%s ask=%s levels=%sr`   zplaced_side_trim(r‡   )*r8   r}   r   rs  rÍ   r\   ra   rb   rÔ   rÕ   r  rÙ   ÚLADDER_TARGET_LEVELSrc   rn   rØ   r¥   r  rÿ   r  r  r.  r/  r;  r÷  rƒ   rÑ   rÚ   rá  r,  r`   rÖ   r]   rß   r   r¨  rÛ   r×   rÒ   rÓ   rJ   r  )rg   r  r  r  Úkeep_bidÚkeep_askÚinv_absÚwbÚwaÚtargetÚneed_bidÚneed_askÚbid_lvsÚask_lvsrÿ   rš  r  Ú_errr  s                      r-   Ú_apply_side_trimÚLiveEngine._apply_side_trim  s‚  é € ô ˜	“?ˆÜ˜	“?ˆÜ”eœG D§J¡J°ÀÓE×LÈÓMÓNˆà�c‹>ØˆHØˆHÜ�—‘×'Ñ'×,¨1Ó-ˆÜ�—‘×'Ñ'×,¨1Ó-ˆØ"*ÔØ"*ÔØ#Ÿ_™_Ó.ˆÔ÷ ŸÜÔ-Ó.ˆFØ‹| £Ø1A�—
‘
Ô.Ü*.¯)ª)«+�Ô'ØÞ.6”s˜1˜f™kÔ*¸AˆHÞ.6”s˜1˜f™kÔ*¸AˆHÜÙH˜vŸ}™}×2°Ð2ÓHÙ,ñˆGô ÙH˜vŸ}™}×2°Ð2ÓHÙ,ñˆGð ˆFà˜!‹|¦Ø—‘´S¸³\ÀXÓ5M˜g i jÑ1ÐSZÔ[Ø˜!‹|¦Ø—‘´S¸³\ÀXÓ5M˜g i jÑ1ÐSZÔ[Þð 2O�—
‘
Ô.Ü*.¯)ª)«+�Ô'ØØ-GˆD�J‰JÔ*Ü&*§i¢i£kˆDÔ#Ü�H‰HØ]Ø B¨G´S¸³[ôð ×+Ñ+°¸dÐ+ÐC×CˆBÞØ1N�—
‘
Ô.ØØ#'×#4Ñ#4°VÓ#<×<‰NˆH�dØ˜!Œ|Ø—:—:Ü(-¨f¯j©jÓ(9�DÔ%Ü&*§i¢i£k�Ô#ðØ×6Ñ6Ó8×8Ð8ô �t—z‘z×-Ñ-×2°Ó3°bÓ8Ø-/—J‘JÔ*Ü�t—z‘z×-Ñ-×2°Ó3°bÓ8Ø-/—J‘JÔ*Ü+.¨t¯z©z×/EÑ/E×/JÈÓ+KÌcØ—J‘J×*Ñ*×/¨aóOñ ,�—
‘
Ô(ô *-¨T¯Z©Z×-EÑ-E×-JÈÓ)K�Ô&Ü,/°·
±
×0HÑ0H×0MÈAÓ,N�—
‘
Ô)Ø3JÈ8È*ÐTUÐ1V�—
‘
Ô.Ü—‘Ø=Ø˜dŸj™j×4Ñ4°d·j±j×6LÑ6Lôð
 .3�Ô*ð ð 2O�—
‘
Ô.Øö žX¨"°«'°b¸A³gÞžX¨"°«'°b¸A³gà-=ˆD�J‰JÔ*Ü�H‰HØUØ˜¨Gôð ð —}‘}×*¨Ð*ó
â*�Ø—‘˜5Ó ¦X°2·7±7¸eÑ3Có äHP÷ Ù*ð 	ð 
ð
 *>ˆ�
‰
Ô&Ü"&§)¢)£+ˆÔÜ�‰ØAØ¤ F£ô	
ð ×!Ñ! AÓ%¬¬W°T·Z±ZÀÐRSÓ-T×-YÐXYÓ)ZÐ]^Ó)^Ø—/‘/Ó#×#Ð#Ü)-¯ª«ˆDÔ&Ø!ˆÔØ!"ˆÔØ ˆÔØ ˆÔØˆÔØ#$ˆ�
‰
Ô Ø!"ˆ�
‰
ÔØ!"ˆ�
‰
ÔØ$%ˆ�
‰
Ô!Øˆ�
‰
ÔØ"*ÔØ"*ÔÞØ)-ˆDÔ&Ø-JˆD�J‰JÔ*ØØ×'Ñ'¨Q¸$Ð'Ð?×?ˆÞØ)-ˆDÔ&Ø-JˆD�J‰JÔ*ØØ#×0Ñ0°Ó8×8‰ˆ�$Ø�a‹<Ø×%Ñ% f°hÀÔSÜ"&§)¢)£+ˆDÔØ/@ÀÀ
È!Ð-LˆD�J‰JÔ*àœ3˜v›;Ñ&÷ à÷ Ø ÷ô ˜DŸJ™J×2Ñ2×7°aÓ8¸1Ñ<÷ @Ü˜tŸz™z×5Ñ5×:¸Ó;¸aÑ?ð Õ&ð *.ˆDÔ&Ø-JˆD�J‰JÕ*òE Dò =ò 9øÜ ó ÚðüòD
ò $ò$ @ò
 9ùs§   ‚J
aÊ`(Ê1aÊ>`+Ê?AaÌ`1 Ì&`.Ì'`1 Ì+H aÕ+aÕ:aÖaÖ	BaØ&aØ'CaÛ<a
Û=8aÜ5aÜ6C3aà+aà.`1 à1
`?à;aà>`?à?	aá
aáac           	     ó6  • Uc?  U R                   S:”  d-  [        [        U R                  SS5      =(       d    S5      S:”  a  gg[        [        U R                  SS5      =(       d    S5      nUS::  d   U R                   S::  d  U R                  S::  au  U R                   S:”  d0  U R
                  S:”  d   U R                  S:”  d  U R                  S:”  a4  / U l        SU l         SU l        SU l        SU l        SU R                  l        gU R                  S:”  a"  [        R                  " 5       U R                  -
  OSnU R                  U:g  =(       d    U R                  U:g  n[        UR                  =(       d    S5      n	U	S:”  Ga|  U R
                  S:”  a  U R
                  U	:¼  d"  U R                  S:”  GaK  U R                  U	::  Ga:  [        [        U S	S5      =(       d    S5      n
U R
                  S:”  a  U R
                  U	-
  U	-  S
-  OSnU R                  S:”  a  X�R                  -
  U	-  S
-  OSn[        X¼S5      n[        [         5      nU[        ["        5      :¼  a  [        [$        5      nU
S::  d  [        R                  " 5       U
-
  U:¼  aS  U(       d  U(       aE  U R
                  U	:¼  a'  U R                  S::  d  U R                  U	:”  d  X¼:¼  a  SOSnSSU SUS S34$ U[        ["        5      :¼  a	  SSUS S34$ U R&                  (       a  gU(       a  US:¼  a  U=(       d    UnU(       a  ggU(       Ga^  U(       GaV  [)        [        [        U R                  SS5      =(       d    S5      5      nUS::  Ga  [        [        U R                  SS5      =(       d    S5      n[        [        U R                  SS5      =(       d    S5      nUU-   S::  aI  U R                  (       a8  [+        S U R                   5       5      n[+        S U R                   5       5      n[        [,        5      nUU-   S:„  nU(       a[  UU:  d  UU:  aO  [        [        U SS5      =(       d    S5      nUS::  d)  [        R                  " 5       U-
  [        [.        5      :¼  a  g[        UR                  =(       d    S5      nS=nnUS:”  aJ  U R                  S:”  a  UU R                  -
  U-  S
-  nU R
                  S:”  a  U R
                  U-
  U-  S
-  nU R1                  UR                  5      n[        [        U5      [        U5      S5      n[        [        U SS5      =(       d    S5      nUS:*  =(       d(    [        R                  " 5       U-
  [        [2        5      :¬  nU[4        :¼  a  U(       a	  SS US S34$ SS!US S34$ [7        US:„  =(       a%    U R
                  S:„  =(       a    U R
                  U:¬  5      n[7        US:„  =(       a%    U R                  S:„  =(       a    U R                  U:*  5      nU(       d  U(       aó  [        [        U S	S5      =(       d    S5      n
[        [        U5      [        U5      S5      n[        [         5      nU[        ["        5      :¼  a  [        [$        5      nU
S:*  =(       d$    [        R                  " 5       U
-
  [        U5      :¬  n U (       aD  U(       d  U(       a6  U(       a!  U(       a  [        U5      [        U5      :¼  a  SOSnSSU SUS S34$ SSUS S34$ U[8        :¼  a}  [        [        U S	S5      =(       d    S5      n
[        [$        5      n!U
S:*  =(       d$    [        R                  " 5       U
-
  [        U!5      :¬  n U (       a  U(       d  U(       a  g"SS#US S34$ U[:        :¼  d
  U[:        :¼  a(  [        U5      [        U5      :¼  a  SOSnSS$U SUS S34$ U[<        :  a	  SS%US& S'34$ U(       a  U(       d  U(       a  ggXu:  a  U R&                  (       d	  SS(US& S'34$ [        U=(       d    S5      n"U"S:”  aC  [        [        U5      [        U5      S5      n#[        [        U5      U#5      n$U$U":¼  a	  SS)U$S S34$ g*)+z?Decide whether to wipe+replace. Default = rest (no cancel_all).Nr   r`   )Tr˜   )FÚidler?   )Tr–   rŠ   rQ  rš   rÂ   rÃ   TÚadverse_cross_r¹   z.2fÚbpsFÚsoft_keep_cross_cd_)Tr—   g      @)Tr™   )TÚrisk_side_changer@   rX  ra   rb   c              3  óR   #   • U  H  oR                  S 5      S:X  d  M  Sv •  M     g7f)r   rÂ   r   N©r(  ©r  r/  s     r-   r	  Ú4LiveEngine._should_refresh_ladder.<locals>.<genexpr>  ó"   é € ÐWÒ(< 1ÇÁÀfÃÐQVÑ@VŸQ™QÒ(<ùó   ‚'ž	'c              3  óR   #   • U  H  oR                  S 5      S:X  d  M  Sv •  M     g7f)r   rÃ   r   Nry  rz  s     r-   r	  r{    r|  r}  rØ   rÛ   r›   Úsoft_keep_mid_cd_)Tr•   Úsoft_keep_force_Úsoft_keep_toxic_Úpost_place_grace_z.1frx   Ú	min_rest_Ú
soft_keep_)FÚrest)rÖ   r\   rs  rÍ   rÑ   rÒ   rÓ   r×   rJ   rÚ   rn   rÔ   rÕ   r   rƒ   r¥   ÚTOUCH_RECENTER_COOLDOWN_SÚTOUCH_RECENTER_LARGE_THRU_BPSÚTOUCH_RECENTER_LARGE_COOLDOWN_Srß   r}   r  rd  ÚSIDE_TRIM_TOPUP_COOLDOWN_Sr?  ÚFULL_REBUILD_COOLDOWN_SÚMAX_STALE_KEEP_BPSr8   ÚFORCE_RECENTER_BPSÚTOXIC_EPS_BPSÚPOST_PLACE_GRACE_S)%rg   r  r  r  r­   Ú
min_rest_sÚn_ordersÚagedÚside_changedÚ
_mid_earlyÚ
last_touchÚ
bid_thru_eÚ
ask_thru_eÚthru_aÚcross_cdÚwhichÚkeepingrg  rh  ri  rj  ÚknownÚlast_toprƒ   Úask_thruÚbid_thruÚmovedÚthruÚlast_rbÚcooldown_okÚ	cross_bidÚ	cross_askÚtouch_okÚforce_cdÚthrÚ	mild_thruÚgaps%                                        r-   Ú_should_refresh_ladderÚ!LiveEngine._should_refresh_ladder´  së  € ð ‰>Ø×%Ñ%¨Ó)¬S´¸¿¹À_ÐVWÓ1X×1]Ð\]Ó-^ÐabÓ-bØ-Ø ô ”w˜tŸz™z¨?¸AÓ>×CÀ!ÓDˆØ�q‹=˜D×2Ñ2°aÓ7¸4×;LÑ;LÐPQÓ;Qà×&Ñ&¨Ó*Ø×%Ñ%¨Ó)Ø×%Ñ%¨Ó)Ø×$Ñ$ qÓ(à')�Ô$Ø)*�Ô&Ø%(�Ô"Ø%(�Ô"Ø$'�Ô!Ø#'�—
‘
Ô Ø(ð 7;×6IÑ6IÈAÓ6M”—	’	“˜d×1Ñ1Ò1ÐSVˆà×#Ñ# yÑ0÷ 4Ø×&Ñ&¨)Ñ3ð 	ô
 ˜6Ÿ:™:×,¨Ó-ˆ
Ø˜Œ>Ø×Ñ !Ó#¨×(:Ñ(:¸jÓ(HØ×"Ñ" QÔ&¨4×+=Ñ+=ÀÔ+Käœw tÐ-FÈÓL×SÐPSÓTˆJð ×%Ñ%¨Ó)ð ×#Ñ# jÑ0°JÑ>ÀÒIàð ð ×%Ñ%¨Ó)ð ×0Ñ0Ñ0°JÑ>ÀÒIàð ô
 ˜°Ó5ˆFäÔ6Ó7ˆHØœÔ<Ó=Ó=Ü Ô!@ÓA�Ø˜cÓ!¤d§i¢i£k°JÑ&>À8Ó%KÞžYð ×)Ñ)¨ZÓ7à×*Ñ*¨aÓ/Ø×-Ñ-°
Ó:Ø%Ó3ñ ð ð ð ˜~¨e¨W°A°f¸S°\ÀÐEÐEÐEàœÔ<Ó=Ó=ØÐ 3°F¸3°<¸sÐCÐCÐCð ×%×%Ø.Þ˜D C›Kð !×- IˆGÞØ(Ø+÷ ŸÜœ%¤¨¯
©
°OÀSÓ I× PÈSÓQÓRˆGØ˜#Œ~Üœ §¡¨]¸AÓ>×CÀ!ÓD�Üœ §¡¨]¸AÓ>×CÀ!ÓD�à˜‘G “> d×&:×&:ÜÑW¨×(<Ò(<ÓWÓW�BÜÑW¨×(<Ò(<ÓWÓW�BÜÔ1Ó2�Ø˜b™ A™�Þ˜b 6›k¨R°&«[Ü$¤W¨TÐ3GÈÓ%M×%TÐQTÓU�HØ 3“ÜŸš› xÑ/´EÔ:TÓ4UÓUà0ô �F—J‘J×% #Ó&ˆØ!Ð!ˆ�8Ø�‹7Ø×!Ñ! AÓ%Ø $×"4Ñ"4Ñ4¸Ñ;¸hÑF�Ø×!Ñ! AÓ%Ø ×.Ñ.°Ñ4¸Ñ;¸hÑF�à×#Ñ# F§J¡JÓ/ˆÜ”5˜“?¤E¨(£O°SÓ9ˆÜœ Ð&=¸sÓC×JÀsÓKˆØ #‘~÷ 
Ü�YŠY‹[˜7Ñ"¤uÔ-DÓ'EÑEð 	ð Ô&Ó&ÞØ˜z¨%°¨°CÐ8Ð8Ð8ØÐ-¨e°C¨[¸Ð<Ð<Ð<ô
 ˜˜q™×Y T×%7Ñ%7¸!Ñ%;×YÀ×@RÑ@RÐVYÑ@YÓZˆ	Ü˜˜q™×Y T×%7Ñ%7¸!Ñ%;×YÀ×@RÑ@RÐVYÑ@YÓZˆ	Þž	ô œw tÐ-FÈÓL×SÐPSÓTˆJÜœ˜x›¬%°«/¸3Ó?ˆFÜÔ6Ó7ˆHØœÔ<Ó=Ó=Ü Ô!@ÓA�Ø" cÑ)÷ Ü—’“˜zÑ)¬e°H«oÑ=ð ö žY®)ö !®)´u¸X³Ì%ÐPXË/Ó7Yñ àð ð
 ˜~¨e¨W°A°f¸S°\ÀÐEÐEÐEØÐ/°°s¨|¸3Ð?Ð?Ð?ð Ô&Ó&ô œw tÐ-FÈÓL×SÐPSÓTˆJÜÔ<Ó=ˆHØ" cÑ)÷ Ü—’“˜zÑ)¬e°H«oÑ=ð ö žY®)Ø-ØÐ,¨U°3¨K°sÐ;Ð;Ð;ð ”}Ó$¨´MÓ(AÜ" 8›_´°h³Ó?‘EÀUˆEØÐ,¨U¨G°1°T¸#°J¸cÐBÐBÐBàÔ$Ó$ØÐ-¨d°3¨Z°qÐ9Ð9Ð9ÞÞžIØ(Ø+ØÓ T×%?×%?Ø˜I d¨3 Z¨qÐ1Ð1Ð1ô Ð&×-¨#Ó.ˆØ�‹9ÜœE (›O¬U°8«_¸cÓBˆIÜ”e˜E“l IÓ.ˆCØ�c‹zØ 
¨3¨s¨)°3Ð7Ð7Ð7Ør,   ç      @Tç      9@)r­   Úbatch_placer�  c             ƒ  óò   #   • U R                  XX4US9u  pxU(       Gdj  U =R                  S-  sl        Ub  UR                  5       U l        U R                  (       aÒ  U R
                  R                  c»  [        [        U R                  =(       d    S5      [        U R                  =(       d    S5      [        [        S U R                   5       S5      5      [        U R                  =(       d    S5      [        [        U R                  SS5      =(       d    S5      S9U R
                  l        [        U5      R                  S5      (       a  [        U5      U R
                  l        gS	U R                   S
3U R
                  l        g[        U5      R                  S5      (       aY  U =R                  S-  sl        SU S
3U R
                  l        Ub  UR                  5       U l        ["        R%                  SU5        gUb@  US:X  d  [        U5      R                  S5      (       a  U R'                  XU5      I Sh  v•N   gUS:X  a‹  Ubˆ  UR(                  (       aw  [+        [        U S0 5      R-                  5       5      n	U R.                  S:”  a!  U	S:”  a  U R1                  XU5      I Sh  v•N   gSU l        U R5                  XU5      I Sh  v•N   gUS:X  a  Ub  U R5                  XU5      I Sh  v•N   g SSKJn
  U
" 5       nU(       a  UR;                  5       OSnUb  [        UR>                  5      O'[        U R
                  R@                  =(       d    S5      nU RB                  S:”  a"  [D        RD                  " 5       U RB                  -
  OSn[G        [I        U=(       d    0 RK                  S5      =(       d    S5      [I        U=(       d    0 RK                  S5      =(       d    S5      [I        U R.                  5      UU[        U R                  =(       d    S5      [        U R                  =(       d    S5      [        U R                  =(       d    S5      [        U5      [        U5      S9
nUc  SnUS:X  aÊ  SU S
3U R
                  l        ["        R%                  SUU(       a  URK                  S5      OSU(       a  URK                  S5      OS5        U R.                  S:”  a2  U RM                  5       I Sh  v•N   [D        RD                  " 5       U l'        U RQ                  X#5        Ub  UR                  5       U l        S nUS :X  Ga§  S!U S
3U R
                  l        S"U l        ["        R%                  S#UU=(       d    0 RK                  S5      U=(       d    0 RK                  S5      5        U RS                  S$S%S&9I Sh  v•N nU(       d  U RS                  S$S%S&9I Sh  v•N nU(       dK  S'U S
3U R
                  l        S"U l        Ub  UR                  5       U l        ["        R%                  S(U5        g W
" 5       nU(       a  UR;                  5       OSnX€R
                  l        Ub  UR(                  (       d#  SU R
                  l        U RQ                  X#5        gUR(                   Vs/ s H7  nURT                  S):X  a  U(       d  URT                  S*:X  d  M,  U(       d  M5  UPM9     nnU(       d  U RQ                  X#5        gU RW                  UU5      u  nnU(       a  S"U l        U(       a  U RY                  U5      I Sh  v•N u  nnO€SnS+nU HU  nU R[                  URT                  S*:H  UR\                  UR^                  S,9I Sh  v•N u  nnUb  US-  nMJ  U(       d  MS  UnMW     U(       a  [D        RD                  " 5       U l!        U[a        S[c        U5      S$-  5      :  a~  Ub  UR                  5       U l        U RQ                  X#5        S-U=(       d    S.[        U5      -    3U R
                  l2        ["        R%                  S/U[c        U5      UU=(       d    S+5        gU Rg                  UUUX#5        U(       d  SU l        S+U R
                  l2        ["        Ri                  S0UU R
                  Rj                  U R
                  Rl                  UR>                  UU=(       d    S+5        gUS1:X  av  S2U S
3U R
                  l        ["        R%                  S3UU=(       d    0 RK                  S5      U=(       d    0 RK                  S5      5        Ub  UR                  5       U l        gUS:X  af  U R.                  S:”  aV  UbS  UR(                  (       aB  [+        U Rn                  R-                  5       5      S:”  a  U R1                  XU5      I Sh  v•N   gUb@  US:X  d  [        U5      R                  S5      (       a  U R'                  XU5      I Sh  v•N   gUS:X  a  Ub  U R5                  XU5      I Sh  v•N   gS4U S
3U R
                  l        SU l        SSS5.U l7        U R.                  S:„  =(       d,    [I        [        U R
                  S6S5      =(       d    S5      S:„  nU(       a³  [        U5      R                  S75      (       d  [        U5      R                  S5      (       au  U RS                  [I        [p        5      S8S&9I Sh  v•N nU(       dI  S9U S
3U R
                  l        ["        R%                  S:U[p        5        Ub  UR                  5       U l        g["        Ri                  S;UU Rr                  U R.                  5        U(       a2  U RM                  5       I Sh  v•N   [D        RD                  " 5       U l'        SU l:        SU l;        / U l        SU l        SU l	        SU l
        SU l        SU R
                  l<        SU R
                  l5        SU R
                  l6        SU R
                  l=        SU R
                  l        Ub  UR                  5       U l        Ub  UR(                  (       d   SU l        U RQ                  X#5        SU l        gUR(                   Vs/ s H7  nURT                  S):X  a  U(       d  URT                  S*:X  d  M,  U(       d  M5  UPM9     nnU(       d   SU l        U RQ                  X#5        SU l        gS!U S
3U R
                  l        U RS                  S$S<S&9I Sh  v•N nU(       d3  S"U l        S'U S
3U R
                  l        ["        R%                  S=U5        g W
" 5       nU(       a  UR;                  5       OSnS4U S
3U R
                  l        U RW                  UU5      u  nnU(       aX  S"U l        ["        Ri                  S>[c        U5      U=(       d    0 RK                  S5      U=(       d    0 RK                  S5      5        U(       a  U RY                  U5      I Sh  v•N u  nnO€SnS+nU HU  nU R[                  URT                  S*:H  UR\                  UR^                  S,9I Sh  v•N u  nnUb  US-  nMJ  U(       d  MS  UnMW     U(       a  [D        RD                  " 5       U l!        U[a        S[c        U5      S$-  5      :  a~  Ub  UR                  5       U l        U RQ                  X#5        S-U=(       d    S.[        U5      -    3U R
                  l2        ["        R%                  S?U[c        U5      UU=(       d    S+5        gU Rg                  UUUX#5        U(       d  SU l        S+U R
                  l2        ["        Ri                  S@UU R
                  Rj                  U R
                  Rl                  UR>                  UU=(       d    S+U Rr                  U R                  5	        g GNÄ GNX GN9 GN! [<         a    Sn GNýf = f GN# G
N^ G
NB! [<         a    Sn G	NÜf = fs  snf  GNù GNµ GNp GN0 GN GN? GN§s  snf  GN!! [<         a    Sn GNÓf = f GN3 GNï7f)Auå   Rest-first ladder: place once, leave resting for fills.

cancel_all ONLY when refresh is required (mid moved / risk side /
initial / drained). Health checks that call this with an unchanged
mid are no-ops â€” no cancel_all loop.
)r�  r   Nr?   c              3  óT   #   • U  H  oR                  S 5      =(       d    Sv •  M      g7f)r!   r?   Nry  rz  s     r-   r	  Ú*LiveEngine.apply_ladder.<locals>.<genexpr>—  s!   é € ÐUÒ@T¸1Ÿe™e JÓ/×6°3Ô6Ò@Tùs   ‚&(r"  )r  r  r!   rƒ   r"  )r£   Úpost_place_graceÚmin_restzrest(rN  rŸ   zdefer_toxic(uA   defer toxic wipe (%s): keep resting book (never cancel_allâ†’0+0)r•   rt  r—   rà   r   Fr™   )r   rŠ   r¦   r§   r’   )
r¦   r§   r¨   r©   rƒ   rª   r«   r¬   r­   r�   rœ   r¡   zstale_clear_rate(u`   stale_clear under rate pressure (%s): window %s/%s â€” cancel then replenish (never leave empty)Ú?r�   zwait_rate_place(TuE   empty book under rate pressure (%s): window %s/%s â€” wait then placer®  g     €K@rM  zdefer_rate_place(u=   empty-book still rate-blocked after waits (%s) â€” will retryrÂ   rÃ   r^   rì  zplace_failed:zn=z2empty-book place sparse n=%s/%s (reason=%s err=%s)zNladder placed n=%s (bid=%s ask=%s) mid=%.1f reason=%s (after rate wait) err=%srž   zdefer_rate(uI   defer ladder refresh (%s): rate window %s/%s â€” keep near-market restingzplacing(rÁ   r`   r›   r¬  zdefer_rate_keep(u=   defer rebuild (%s): keep resting book (need â‰¥%s rate slots)z@ladder refresh reason=%s cancel_all_total_before=%s working_n=%sr­  uI   post-cancel/empty wait_rate timeout (%s) â€” retry next tick (book empty)z>budget-aware place: top %s levels now (rate %s/%s), rest lateruJ   ladder place sparse n=%s/%s after cancel (reason=%s err=%s) â€” will retryz^ladder placed n=%s (bid=%s ask=%s) mid=%.1f reason=%s err=%s cancel_all_total=%s rest_skips=%s)>rª  rÞ   r  rÙ   r×   rÍ   rJ   r   r   rÒ   rÓ   rO  rÑ   rs  r   r¤   rc   r.  rc  rU  rÿ   r  r   rÖ   r'  rß   rp  Ú
rate_limitr   r  r,  rƒ   rK   rÚ   rn   r¼   r\   r(  r¨  rÛ   r*  r;  r   r4  r÷  rÓ  r    r!   r¥   r  r_   r  r/  ra   rb   rà   ÚREBUILD_RATE_NEEDrÜ   rÏ   rÐ   r`   r]   )rg   r  r  r  r­   r®  r�  r8  r©   Ún_repr   rf  r!  Úmid_nowÚ
aged_placeÚactionrš  r  rÿ   Úpartialr  r^  r¼  rz  Ú	will_wipeÚok_preÚok_rooms                              r-   Úapply_ladderÚLiveEngine.apply_laddery  s_  é € ð  ×2Ñ2Ø˜yÈð 3ð 
‰ˆ÷ Ø×!Ò! QÑ&Õ!ØÑ!Ø%+§_¡_Ó%6�Ô"à×#×#¨¯
©
×(8Ñ(8Ñ(@ä#(Ü  ×!3Ñ!3×!:°sÓ;Ü  ×!3Ñ!3×!:°sÓ;Ü"ÜÑUÀ×@TÒ@TÓUÐWZÓ[óô ˜d×/Ñ/×6°3Ó7Ü"¤7¨4×+=Ñ+=¸zÈ3Ó#O×#VÐSVÓWñ$�—
‘
Ô ô �6‹{×%Ñ%Ð&S×TÑTÜ14°V³�—
‘
Ô.ð ð 49¸×9NÑ9NÐ8OÈqÐ1Q�—
‘
Ô.Øô ˆv‹;×!Ñ! (×+Ñ+Ø×!Ò! QÑ&Õ!Ø/;¸F¸8À1Ð-EˆD�J‰JÔ*ØÑ!Ø%+§_¡_Ó%6�Ô"Ü�K‰KØSØôð ð ÑØÐ&Ó&¬#¨f«+×*@Ñ*@ÐAQ×*RÑ*Rà×2Ñ2°6ÀiÓP×PÐPØð Ð*Ó*¨vÑ/AÀfÇmÇmÜœ Ð&9¸2Ó>×EÑEÓGÓHˆEØ×%Ñ%¨Ó)¨e°a«iØ×/Ñ/°À9ÓM×MÐMØà).ˆDÔ&Ø×'Ñ'¨¸9ÓE×EÐEØð �[Ó  VÑ%7Ø×'Ñ'¨¸9ÓE×EÐEØð	Ý/Ù“-ˆCÞ%(�3—<‘<”>¨dˆDð (.Ñ'9”%˜Ÿ
™
Ô#¼uÀTÇZÁZ×EXÑEX×E_Ð\_Ó?`ˆà37×3FÑ3FÈÓ3JŒT�YŠY‹[˜4×.Ñ.Ò.ÐPSð 	ô 1Ü˜4Ÿ: 2×*Ñ*¨;Ó7×<¸1Ó=Ü §
¨×/Ñ/Ð0@ÓA×GÀRÓHÜ  ×!7Ñ!7Ó8ØØÜ˜d×/Ñ/×6°3Ó7Ü˜t×1Ñ1×8°SÓ9Ü˜t×1Ñ1×8°SÓ9Ü$Ð%7Ó8Ü % jÓ 1ñ
ˆð ‰<ØˆFà�]Ó"Ø/@ÀÀÈÐ-JˆD�J‰JÔ*Ü�K‰Kð<àÞ)-�—‘˜Ô%°3Þ.2�—‘Ð)Ô*¸ôð ×%Ñ%¨Ó)Ø—o‘oÓ'×'Ð'Ü-1¯YªY«[�Ô*Ø×-Ñ-¨iÔCØÑ!Ø%+§_¡_Ó%6�Ô"à"ˆFØ�]Ô"ð 0@À¸xÀqÐ-IˆD�J‰JÔ*Ø)-ˆDÔ&Ü�K‰KØWØØ—˜× Ñ  Ó-Ø—˜× Ñ Ð!1Ó2ô	ð ×+Ñ+°¸dÐ+ÐC×CˆBÞà×/Ñ/°QÀ$Ð/ÐG×G�ÞØ3DÀVÀHÈAÐ1N�—
‘
Ô.Ø-1�Ô*ØÑ%Ø)/¯©Ó):�DÔ&Ü—‘ØSØôð ðÙ!“m�Þ),�s—|‘|”~°$�ð .4�J‰JÔ*à‰~ V§]§]Ø#'�—
‘
Ô Ø×1Ñ1°)ÔGØð !Ÿ-š-óâ'�BØ—G‘G˜uÓ$®¸¿¹À5Ñ8Hó äMV÷ Ù'ð ð ö
 Ø×1Ñ1°)ÔGØØ"×<Ñ<¸VÀTÓJ‰OˆF�GÞØ-1�Ô*ÞØ&*×&7Ñ&7¸Ó&?× ?‘�™#à�Ø�Û �BØ#'×#4Ñ#4Ø "§¡¨5Ñ 0Ø Ÿh™hØ!#§¡ð $5ð $÷ ‘F�C˜ð
 ‘Ø  A™šß˜Øšñ !ö Ü*.¯)ª)«+�DÔ'Øœ#˜a¤ V£°Ñ!1Ó2Ó2ØÑ%Ø)/¯©Ó):�DÔ&Ø×1Ñ1°)ÔGØ*7¸×8Q¸tÄCÈÃMÑ?QÐ7RÐ(S�—
‘
Ô%Ü—‘ØHØœc &›k¨6°3·9¸"ôð Ø×%Ñ% f¨f°hÀ	ÔUÞØ-2�Ô*Ø$&ˆD�J‰JÔ!Ü�H‰HØ`ØØ—
‘
×&Ñ&Ø—
‘
×&Ñ&Ø—
‘
ØØ—	�rôð Ø�\Ó!Ø/:¸6¸(À!Ð-DˆD�J‰JÔ*Ü�K‰KØ[ØØ—˜× Ñ  Ó-Ø—˜× Ñ Ð!1Ó2ô	ð Ñ!Ø%+§_¡_Ó%6�Ô"Øð Ð+Ó+Ø×&Ñ&¨Ó*ØÑ"Ø——Ü�D×*Ñ*×1Ñ1Ó3Ó4°qÓ8à×+Ñ+¨F¸yÓI×IÐIØð ÑØÐ+Ó+¬s°6«{×/EÑ/EÐFV×/WÑ/Wà×2Ñ2°6ÀiÓP×PÐPØð �[Ó  VÑ%7Ø×'Ñ'¨¸9ÓE×EÐEØà+3°F°8¸1Ð)=ˆ�
‰
Ô&Ø%*ˆÔ"Ø)*°1Ñ!5ˆÔð ×"Ñ" QÑ&÷ EÜ”7˜4Ÿ:™: ¸Ó:×?¸aÓ@À1ÑDð 	ö Ü�‹K×"Ñ" <×0Ñ0Ü�6‹{×%Ñ%Ð&6×7Ñ7à×/Ñ/ÜÔ*Ó+°sð 0ð ÷ ˆFö Ø3CÀFÀ8È1Ð1M�—
‘
Ô.Ü—‘ØSØÜ%ôð
 Ñ%Ø)/¯©Ó):�DÔ&ØÜ�‰ØNØØ×"Ñ"Ø×"Ñ"ô		
ö Ø—/‘/Ó#×#Ð#Ü)-¯ª«ˆDÔ&Ø $ˆÔØ $ˆÔð  "ˆÔØ!"ˆÔØ ˆÔØ ˆÔØˆÔØ#$ˆ�
‰
Ô Ø!"ˆ�
‰
ÔØ!"ˆ�
‰
ÔØ$%ˆ�
‰
Ô!Øˆ�
‰
ÔØÑØ!'§¡Ó!2ˆDÔà‰> §§Ø!%ˆDÔØ×-Ñ-¨iÔCØ).ˆDÔ&Øð
 —m’mó
â#�Ø—‘˜5Ó ¦Y°B·G±G¸uÑ4Dó äIR÷ Ù#ð 	ð 
ö
 Ø!%ˆDÔØ×-Ñ-¨iÔCØ).ˆDÔ&Øð ,<¸F¸8À1Ð)Eˆ�
‰
Ô&Ø×,Ñ,°!¸tÐ,ÐD×DˆÞØ)-ˆDÔ&Ø/@ÀÀÈÐ-JˆD�J‰JÔ*Ü�K‰KØ[Øôð ð	Ù“-ˆCÞ%(�3—<‘<”>¨dˆDð ,4°F°8¸1Ð)=ˆ�
‰
Ô&ð ×8Ñ8¸ÀÓF‰ˆ�ÞØ)-ˆDÔ&Ü�H‰HØPÜ�F“Ø—˜× Ñ  Ó-Ø—˜× Ñ Ð!1Ó2ô	ö Ø"&×"3Ñ"3°FÓ";×;‰MˆH‘càˆHØˆCÛ�Ø#×0Ñ0ØŸG™G uÑ,ØŸ(™(ØŸ[™[ð  1ð  ÷ ‘��Qð
 ‘?Ø ‘M’Hß�QØ’Cñ ö Ü&*§i¢i£k�Ô#à”c˜!œS ›[¨AÑ-Ó.Ó.àÑ!Ø%+§_¡_Ó%6�Ô"Ø×-Ñ-¨iÔCØ&3°C×4M¸4ÄÀHÃÑ;MÐ3NÐ$OˆD�J‰JÔ!Ü�K‰KØ\ØÜ�F“ØØ—	�rôð Ø×!Ñ! &¨&°(¸IÔQÞØ).ˆDÔ&Ø "ˆ�
‰
ÔÜ�‰ð0àØ�J‰J×"Ñ"Ø�J‰J×"Ñ"Ø�J‰JØØ�I�2Ø×"Ñ"Ø×!Ñ!õ	
òY
 Qò Nò Fò
 Føô ó 	Ø‹Dð	úòB (ò$ Dò Høô ó Ø“ðüòò !@ò
òr Jò Qò Fò ò* $ùò6
ò Eøô ó 	Ø‹Dð	úò" <ò
ùs=  ‚H;AA7È=A@È>A.AA7Ê,A@Ê-!AA7ËA@Ë#AA7Ë2A@
Ë3AA7Ë9&A@ ÌGAA7Ó=A@ Ó>CAA7×A@#×AA7×$A@&×%AAA7Ø< A@) ÙAAA7Ú1+A@<Û A@<Û)A@<Û/AAA7ÝAAÝ	AAA7ÞAAÞAA7Þ*H-AA7çAAçAAA7èAA
è#AA7è>AAè?CAA7ìAAìBAA7î,AAî-C>AA7ò++AAóAAó#AAó)AAA7ô:AAô;>AA7õ: AA öB$AA7ø>AA1ø?AAA7úAA4úAA7ú E"AA7Á@AA7Á@AA7Á@
AA7Á@A@Á@AA7Á@A@Á@AA7Á@#AA7Á@&AA7Á@)A@9Á@5AA7Á@8A@9Á@9	AA7ÁAAA7ÁAAA7ÁA
AA7ÁAAA7ÁAAA7ÁAAA7ÁAAA7ÁAAA.ÁA*AA7ÁA-AA.ÁA.AA7ÁA4AA7c           	   ƒ  ó†  #   • Uc  U R                  SX#5      I Sh  v•N   g/ nU(       aO  UR                  S:”  a?  UR                  S:”  a/  UR                  [	        SSUR                  UR                  S95        U(       aO  UR
                  S:”  a?  UR                  S:”  a/  UR                  [	        SSUR
                  UR                  S95        [        UUR                  UR                  UR                  U(       a  UR                  OSU(       a  UR
                  OSS9nU R                  XRU5      I Sh  v•N   g GN! N7f)zABackward-compat: wrap single quote as 1+1 ladder with rest logic.Nr   rÂ   )r   rý   r    r!   rÃ   r?   )rÿ   rƒ   r"  r!   r  r  )	r¿  r  r!   rþ   r   r  r   rƒ   r"  )rg   rù   r  r  rÿ   r  s         r-   Úapply_quoteÚLiveEngine.apply_quote  sû   é € ð ‰9Ø×#Ñ# D¨)Ó?×?Ð?ØØ#%ˆÞ˜Ÿ™ A›¨!¯*©*°q«.Ø�M‰MÜ ¨Q°a·h±hÈÏÉÑTôö ˜Ÿ™ A›¨!¯*©*°q«.Ø�M‰MÜ ¨Q°a·h±hÈÏÉÑTôô ØØ—‘Ø—Z‘ZØ—Z‘ZÞ(�1—8’8¨cÞ(�1—8’8¨cñ
ˆð ×Ñ °9Ó=×=Ñ=ò' @ñ& 	>ùs"   ‚E›D<œDEÄ6D?Ä7EÄ?Ec                ó8  • Ub  UOU R                   R                  nU R                   R                  S:”  a-  U R                   R                  U R                   R                  -   $ U R                   R                  U R                   R
                  U=(       d    S-  -   $ )Nr   r?   )rÍ   rK   rZ   r[   r>   r@   )rg   rƒ   Úms      r-   r7  ÚLiveEngine.equity,  sp   € Ø‘?‰C¨¯
©
×(;Ñ(;ˆà�:‰:× Ñ  1Ó$Ø—:‘:×(Ñ(¨4¯:©:×+DÑ+DÑDÐDØ�z‰z×"Ñ" T§Z¡Z×%=Ñ%=ÀÇÀcÑ%JÑJÐJr,   c                óR   • U R                  U5      U R                  R                  -
  $ re   )r7  rÍ   rH   )rg   rƒ   s     r-   Úday_pnlÚLiveEngine.day_pnl3  s    € Ø�{‰{˜3Ó $§*¡*×"=Ñ"=Ñ=Ð=r,   c                ó¤   • U R                   R                  =(       d    U R                   R                  nUS::  a  gSU R                  U5      -  U-  $ )Nr   r?   g      Y@)rÍ   rH   r=   rÈ  )rg   rƒ   Úbases      r-   Úday_pnl_pctÚLiveEngine.day_pnl_pct6  sC   € Ø�z‰z×*Ñ*×@¨d¯j©j×.@Ñ.@ˆØ�1‹9ØØ�t—|‘| CÓ(Ñ(¨4Ñ/Ð/r,   c                ó@   • [        U R                  R                  5      $ re   )r  rÍ   rD   rf   s    r-   Úfills_todayÚLiveEngine.fills_today<  s   € Ü�4—:‘:×#Ñ#Ó$Ð$r,   c                ón   • U R                   nUR                  S::  a  g UR                  UR                  -  $ ©Nr|   )rÍ   rN   rM   ©rg   r2  s     r-   Ú
avg_buy_pxÚLiveEngine.avg_buy_px?  s-   € Ø�Z‰ZˆØ�:‰:˜ÓØØ�‰ §¡Ñ+Ð+r,   c                ón   • U R                   nUR                  S::  a  g UR                  UR                  -  $ rÒ  )rÍ   rP   rO   rÓ  s     r-   Úavg_sell_pxÚLiveEngine.avg_sell_pxE  s/   € Ø�Z‰ZˆØ�;‰;˜%ÓØØ×Ñ "§+¡+Ñ-Ð-r,   c                ó@   • [        U R                  R                  5      $ re   )rm   rÍ   rV   rf   s    r-   Úprice_history_listÚLiveEngine.price_history_listK  s   € Ü�D—J‘J×,Ñ,Ó-Ð-r,   i,  c                óœ  • [        X R                  -  5      U R                  -  nU R                  R                  nU(       a  [        US   S   5      U:w  a  UR	                  [        U5      XXS.5        O!US   nXS   :”  a  XS'   XS   :  a  XS'   XS'   [        U5      S-  n[        U SS	5      U:w  a  X`l        U R                  5         g	g	)
z95m OHLC; forming candle updates every book tick (no lag).rl  Út©rÝ  rß  ÚhÚlr@  rß  rà  r@  é   Ú_candle_save_slotN)	r\   Ú
CANDLE_SECrÍ   rX   rþ   r   rs  râ  Ú_save_candles)rg   rƒ   r   ÚbucketrX   r@  Únow_ms          r-   r›  ÚLiveEngine._update_candleP  sÀ   € ä�RŸ?™?Ñ*Ó+¨d¯o©oÑ=ˆØ—*‘*×$Ñ$ˆÞœ#˜g b™k¨#Ñ.Ó/°6Ó9Ø�N‰N¤ v£°SÈÑWÕXà˜‘ˆAØ�s‘V‹|Ø�#‘Ø�s‘V‹|Ø�#‘Øˆc‰Fä�B“˜2‘ˆÜ�4Ð,¨dÓ3°uÓ<Ø%*Ô"Ø×ÑÕ ð =r,   c                ó@   • [        U R                  R                  5      $ re   )rm   rÍ   rX   rf   s    r-   Úcandles_listÚLiveEngine.candles_listc  s   € Ü�D—J‘J×&Ñ&Ó'Ð'r,   c                óÀ  • [        U SS 5      nUb  UR                  5       (       d  g  [        R                  " UR	                  5       5      nUR                  S5      =(       d    / nUSS   H…  nU(       a  UR                  S5      c  M  U R                  R                  R                  [        US   5      [        US   5      [        US   5      [        US   5      [        US   5      S	.5        M‡     [        R                  S
[        U R                  R                  5      UR                  5        g ! [         a   n[        R                  SU5         S nAg S nAff = f)Nrê   rX   iàþÿÿrß  rÝ  rß  rà  r@  rÞ  zloaded %d candles from %szcandle load: %s)rs  Úexistsr’  ÚloadsÚ	read_textr(  rÍ   rX   rþ   r   r.  r/  r  Únamer,  rc  )rg   ÚpathÚrawrS  r@  rz  s         r-   rñ   ÚLiveEngine._load_candlesf  s  € Ü�t˜_¨dÓ3ˆØ‰<˜tŸ{™{Ÿ}™}Øð	.Ü—*’*˜TŸ^™^Ó-Ó.ˆCØ—7‘7˜9Ó%×+¨ˆDØ˜$˜%“[�Þ˜AŸE™E #›JÑ.ÙØ—
‘
×"Ñ"×)Ñ)ä" 1 S¡6›]Ü" 1 S¡6›]Ü" 1 S¡6›]Ü" 1 S¡6›]Ü" 1 S¡6›]ñöñ !ô �H‰HÐ0´#°d·j±j×6HÑ6HÓ2IÈ4Ï9É9ÕUøÜó 	.Ü�K‰KÐ)¨1×-Ñ-ûð	.ús   ¨D
D3 Ä3
EÄ=EÅEc           	     óH  • [        U SS 5      nUc  g  UR                  [        R                  " U R                  [
        R
                  " 5       [        U R                  R                  5      S.5      5        g ! [         a   n[        R                  SU5         S nAg S nAff = f)Nrê   )Ú
candle_secÚ
updated_atrX   zcandle save: %s)rs  Ú
write_textr’  r“  rã  rn   rm   rÍ   rX   r,  r.  rc  )rg   rð  rz  s      r-   rä  ÚLiveEngine._save_candles}  s€   € Ü�t˜_¨dÓ3ˆØ‰<Øð	.Ø�O‰OÜ—
’
à&*§o¡oÜ&*§i¢i£kÜ#'¨¯
©
×(:Ñ(:Ó#;ñóõøô ó 	.Ü�K‰KÐ)¨1×-Ñ-ûð	.ús   “A#A7 Á7
B!ÂBÂB!c                ól  • [        U R                  R                  5      S:  a  / $ U R                  R                  S:”  a  SOSnU R                  =(       d    U R                  R                  n[        U R                  R                  5      nSUUU[        X#-  S5      U R                  R                  S./$ )Nr|   r   r‰  r‹  ÚliverŒ  rŠ  )r}   rÍ   r@   râ   rK   rq   rG   )rg   r   r…   r  s       r-   Úopen_positionsÚLiveEngine.open_positionsŽ  sš   € Üˆt�z‰z×'Ñ'Ó(¨5Ó0ØˆIØŸ™×1Ñ1°AÓ5‰v¸7ˆØ×!Ñ!×8 T§Z¡Z×%8Ñ%8ˆÜ�—‘×)Ñ)Ó*ˆð ØØØÜ % b¡g¨qÓ 1Ø—j‘j×-Ñ-ñð	
ð 		
r,   c                óÌ  • Ub  UOU R                   nU R                  R                  (       a�  U R                  R                  U* S  nU Vs/ s Hh  nUR                  [	        UR
                  S5      UR                  UR                  UR                  UR                  UR                  UR                  S.PMj     sn$ [        U SS 5      =(       d    / n[        XA* S  5      $ s  snf )Nr;  r<  rå   )r=  rÍ   rF   r   rq   r7   r!   r   r9   r   r5   r6   rs  rm   )rg   rR  Úrecentr@  Ú	persisteds        r-   r-  ÚLiveEngine.close_eventsŸ  sË   € Ø‘‰A D×$9Ñ$9ˆØ�:‰:×#×#Ø—Z‘Z×-Ñ-¨q¨b¨cÐ2ˆFñ  óò  �Að Ÿ$™$Ü$ Q§Y¡Y°Ó2Ø !§
¡
ØŸ$™$Ø"#§,¡,ØŸF™FØ#$§=¡=Ø"#§,¡,ô	ñ  ñð ô ˜DÐ";¸TÓB×HÀbˆ	Ü�I˜b˜c�NÓ#Ð#ùòs   ÁA/C!)%rÐ   rÏ   rã   rÜ   râ  rê   rÎ   rä   ré   rà   rÛ   rÚ   rØ   rQ  rå   rÝ   râ   rá   rÙ   rß   rÞ   rí   rë   rÕ   rÔ   rÓ   rÒ   r×   rÑ   rÖ   rÈ   rÉ   rÇ   rÊ   rË   rÌ   rÍ   )rÇ   r   rÈ   r\   rÉ   r\   rÊ   r\   rË   r\   rÌ   r\   rò   r   )rù   rI   rk   rl   )rÿ   úList[QuoteLevel]rk   ú
list[dict])rÿ   r   r  r   r  r\   r  r8   r  r8   rk   rl   )rk   r  )rk   úOptional[dict]rj   )r7  r   rk   rl   )rk   r\   re   )rR  z
int | Nonerk   ú
List[dict])rk   r   )r^  Úobjectrk   rl   )
r   r   r    r   r„   r   rƒ   r   rk   rl   )rœ  r   rk   rC   )rk   úTuple[bool, str])rª  r   r«  r\   r¬  r   rk   r   )rÂ  zOptional[int]rk   rl   )r´  r8   r    r   r!   r   rk   zTuple[Optional[int], str])r´  r8   r    r   r!   r   rä  r\   )rÿ   r   rk   zTuple[int, str])rÿ   r   rk   r\   )r  r8   r  r8   rk   rl   )rÿ   r   r!  r  rk   zTuple[List[QuoteLevel], bool])r®  rc  )r8  r\   r9  r   rk   r8   )rƒ   r   rk   r   )r  z'QuoteLadder'r  r8   r  r8   rk   rl   )g      D@)r  úOptional[QuoteLadder]r  r8   r  r8   r­   r   r�  r   rk   r  )r  r  r  r8   r  r8   r­   r   r®  r8   r�  r   rk   rl   )rù   rI   r  r8   r  r8   rk   rl   )rƒ   úOptional[float]rk   r   )rk   r  )rk   r  )rƒ   r   r   r   rk   rl   )9r&   r'   r(   r)   Ú__doc__r=  rõ   rú   r  r  r  r#  rð   r8  rA  rI  rO  rU  rX  r_  rg  rƒ  rw  rž  r¨  r¿  rÅ  rÓ  rá  ré  r÷  rñ  r'  r*  r4  r;  r?  rU  rp  rª  r¿  rÂ  r7  rÈ  rÌ  rÏ  rÔ  r×  rÚ  rã  r›  ré  rñ   rä  rú  r-  r+   r$   r,   r-   r¾   r¾   "  sB  † ÙSàÐð7àð7ð ð7ð ð	7ð
 ð7ð ð7ð ð7ð ô7ôrôð,à ð,ð ð,ð ð	,ð
 ð,ð ð,ð 
ô,ôB*ô	
ô&
ôP0ô'ô<CôDöô&ôô%ôX,ôtODôb	ô!ð> "ØØ$ñAð ðAð ð	Að
 ðAð 
õAôF-ð / Øð/ Ø&+ð/ Ø7<ð/ à	"ô/ ôb,8ð\+Øð+Ø&+ð+Ø7<ð+ØEHô+ô4HôTGôT//ôb ð(Ø&ðØ.<ðà	&ôö6ô$+ðPOØ#ðPOØ04ðPOØAEðPOà	ôPOðdZKØ#ðZKØ04ðZKØAEðZKà	ôZKðD !ðCà%ðCð ðCð ð	Cð
 "ðCð ðCð 
õCðV %(Ø Ø ñV
à%ðV
ð ðV
ð ð	V
ð "ðV
ð ðV
ð ðV
ð 
õV
ðp>Ø ð>Ø-1ð>Ø>Bð>à	ô>ö6Kö>ö0ô%ô,ô.ô.ð €Jô!ô&(ô.ô..ô"
÷"$ñ $r,   r¾   )rr   r   rs   r\   rk   r\   )rx   zstr | float | int | Nonerk   r   )r~   r   r   r   r€   r   r�   r   r‚   r   rƒ   r   rz   r   rk   r   ) r¦   r\   r§   r\   r¨   r\   r©   r   rƒ   r   rª   r   r«   r   r¬   r   r­   r   r‹   r   rŒ   r   r�   r\   rŽ   r   r�   r   r�   r   rk   r   )>r  Ú
__future__r   rd  r’  Úloggingrn   r)  Úcollectionsr   Údataclassesr   r   Úpathlibr   Útypingr	   r
   r   Úlighterr   r   Úmarket_datar   Úquoterr   r   r   rµ  r   r   rî  rð  Úsession_persistr   r   r   Ú	getLoggerr.  r   r/   r3   r;   rt   ry   r†   ÚRATE_REFRESH_HEADROOMr‹  rŒ  r�  rŽ  ÚADVERSE_CROSS_MIN_BPSÚADVERSE_CROSS_GRACE_SrŠ  r¶  r†  rˆ  r‡  rd  r‰  r¼   r¾   r$   r,   r-   Ú<module>r     sT  ðÙ EÝ "Û ã Û Û Û Ý ß (Ý ß (Ñ (ç ,å  ß 2Ñ 2ß 8àÐ Ø€ß DÑ Dà×ÒÐ)Ó*€ð ÷ð ó ðð ÷ð ó ðð ÷	ð 	ó ð	ð ÷ 1ð  1ó ð 1ôF.ôð" ñ*àð*ð 
ð*ð ð	*ð
 ð*ð ð*ð 
ð*ð ð*ð õ*ð^ Ð ð Ð ð
 Ð à€ØÐ ð Ð ØÐ àÐ ØÐ à Ð à"&Ð ð !$Ð àÐ Ø!Ð ð !3Ø 2Ø.Ø(Ø!$Ø 2ñ!càðcð ðcð ð	cð
 ðcð 
ðcð ðcð ðcð ðcð ðcð ðcð ðcð ðcð ðcð ðcð  ð!cð" 	õ#c÷LO$ò O$r,   