
    j                         S 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  SSKJ	r	J
r
JrJrJrJrJrJrJrJrJrJrJr  SSKJrJr  SSKJr  SS	KJr  SS
KJr  SSKJ r   SSK!r! " S S5      r"g)uG  
V12 — Bot Momentum Taker con Confirmación.

Ciclo por ventana de 5min o 15min:
  1. Descubrir mercado y obtener tokens + strike
  2. Conectar CLOB websocket para best_ask real de YES y NO
  3. Monitorear precio Binance cada segundo
  4. Cuando |price/strike - 1| > MOMENTUM_THRESHOLD durante CONFIRM_TICKS
     ticks consecutivos en la misma dirección → tomar posición al ask real
  5. Al final: esperar settle oficial, calcular PnL

Cambios vs V11:
  - Confirmación de momentum: filtra spikes transitorios ("chop")
  - Aggressive bump reducido: ask+0.01 en vez de ask+0.02
    N)datetime)Path   )ConfigCLOB_WSMOMENTUM_THRESHOLDCONFIRM_TICKSAGGRESSIVE_BUMPENTRY_SIZE_USDTAKER_FEE_RATEOUTCOME_MAX_WAITLOSS_STREAK_MAXLOSS_STREAK_COOLDAILY_LOSS_LIMITBLOCKED_HOURS_UTC
write_json)BinanceFeedCLOBFeed)Market)Logger)Executor)MomentumStrategyc                       \ rS rSrS\4S jrS rS rS rS r	S\
S	\4S
 jrS	\4S jrS\4S jrS rS rS\S-  4S jrSS jrS rS rS\S\S-  4S jrS rS rSrg)Bot%   cfgc                 n   Xl         [        R                  " 5       U l        U R                  R                  R                  SS05        SU l        [        U5      U l        [        U5      U l
        [        U5      U l        [        UR                  5      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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         URB                  RD                  S-  U l#        URB                  RD                  S-  U l$        SU l%        [L        RN                  " 5       RQ                  S	5      U l)        SU l*        URB                  S
-  U l+        URX                  (       a  SOSn[[        SU SUR\                  R_                  5        SUR`                   S35        [[        SURb                  S SURd                   SURf                  S SU R                   Rh                   S[j        S 3
5        g )N
User-AgentMozilla/5.0F         r   zglobal_cooldown.jsonzglobal_trades.jsonl%Y-%m-%ddd_resetLIVEPAPERz![*] V12 Momentum Taker + Confirm z [z] minz    threshold: .4% | confirm: s | bump: +$.2f
 | size: $z | fee: z.0%)6r   requestsSessionsessionheadersupdate_stopr   loggerr   strategyr   executorr   
binance_wsbinanceclob_yesclob_nomarket_entered_entry_side_entry_price_entry_size_entry_cost_entry_move_entry_token_fill_verified_bal_before_windows_count_trades_count_trade_history_loss_streak_cooldown_leftlog_dirparent_global_cooldown_file_global_trades_file
_daily_pnlr   utcnowstrftime_daily_date_dd_stopped_dd_reset_fileliveprintassetupperwindowmomentum_thresholdconfirm_ticksaggressive_bumpentry_size_usdr   )selfr   live_tags      /var/www/html/Poly/v12/bot.py__init__Bot.__init__&   s    ((*##\=$AB
s(- #CNN3 $ !!!! #!      &)[[%7%7:P%P"%([[%7%7:O%O  "&oo/88D#!kkJ6 XX671(2ciioo>O=PPRC! 	" 6 6s; <++, -,,S1 2//08LN 	O    c                     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 R                  R                  5         g )NFr    r!   )r:   r;   r<   r=   r>   r?   r@   rA   rB   r3   resetr[   s    r]   _reset_window_stateBot._reset_window_state]   sY    !#!r`   c                    SSK nU R                  R                  nUR                  5       (       d  g [	        U5       nUR                  U5      nU H  nUR                  S5      UR                  :w  a  M$  UR                  S5      S;   d  M;  SU l        US   U l	        [        US   5      U l        [        US   5      U l        [        UR                  S	S5      5      U l        [        UR                  S
S5      5      U l        [        SUS    SUS    SUS    S35          SSS5        g   SSS5        g! , (       d  f       g= f! [          a  n[        SU 35         SnAgSnAff = f)z9Restaurar entrada de trades.csv si existe para este slug.r   Nslugside)YESNOTpricesizecostmove_pctz  [RESTORED] entry  @ z x z sh (de CSV)z%  [warn] no se pudo restaurar entry: )csvr   
trades_csvexistsopen
DictReadergetrg   r:   r;   floatr<   r=   r>   r?   rS   	Exception)r[   mrp   pathfreaderrowes           r]   _restore_entry_from_csvBot._restore_entry_from_csvj   s=   xx""{{}}	?dq*!Cwwv!&&0 wwv-7(,+.v;(,1#g,,?)+0V+=(+01C+D(+0Q1G+H( 3CK=CL> R##&v;-|= > !   	?9!=>>	?sH   E AD6BD6"E +D6-E 6
E E E 
E)E$$E)c                    [         R                  " 5       R                  S5      nXR                  :w  aL  U R                  S:  a'  [        SU R                   SU R                  S S35        Xl        SU l        SU l        g	g	)
z(Reset daily PnL counter at UTC midnight.r"   r   z
  [DAILY RESET] z
 PnL was $+.2fz, resettingr!   FN)r   rM   rN   rO   rL   rS   rP   )r[   todays     r]   _check_daily_resetBot._check_daily_reset   sy    !**:6$$$"*4+;+;*< =//$/{< =$!DO$D %r`   c                    U R                   (       d  gU R                  R                  5       (       aC   U R                  R                  5         SU l         SU l        SU l        SU l        [        S5        gg! [         a     N5f = f)z/Check if dashboard sent a manual resume signal.NFr!   r   z:
  [RESUMED] drawdown stop cleared manually from dashboard)	rP   rQ   rr   unlinkOSErrorrL   rF   rG   rS   rc   s    r]   _check_dd_resumeBot._check_dd_resume   s}    %%''##**,  %D!DO !D"#DOQ (  s   A6 6
BBpnl_netwonc                    U(       a  SU l         OTU =R                   S-  sl         U R                   [        :  a+  [        U l        [	        SU R                    S[         S35        U =R
                  U-  sl        U R
                  [        * ::  a<  U R                  (       d*  SU l        [	        SU R
                  S S	[        S
 S35        ggg)z7Update streak and daily drawdown after a trade settles.r   r   z
  [COOLDOWN] z losses in a row -> pausing z windowsTz
  [DD STOP] daily PnL $r   z hit limit -$.0fz> -> STOPPED
  Resume from dashboard or wait until next UTC dayN)rF   r   r   rG   rS   rL   r   rP   )r[   r   r   s      r]   _update_defense_after_settle Bot._update_defense_after_settle   s      !D"  O3&6#(9(9': ;$$4#5X? @ 	7"??///8H8H#D-dood-C D!!1# 6 7IJ K 9I/r`   c                 B    [         R                  " [        [        R                  " 5       5      U R                  R
                  US.5      n[        U R                  S5       nUR                  US-   5        SSS5        g! , (       d  f       g= f! [         a     gf = f)z2Append trade result to shared global_trades.jsonl.)tsrT   r   a
N)
jsondumpsinttimer   rT   rs   rK   writerw   )r[   r   entryrz   s       r]   _log_global_tradeBot._log_global_trade   sw    		JJ$))+&  E
 d..4% 544 		s0   A B "B 7B  
B
B B 
BBreturnc                     U R                   R                  5       (       d  g[        R                  " U R                   R	                  5       5      nUR                  SS5      n[        R                  " 5       U:  a=  [        U[        R                  " 5       -
  U R                  R                  -  5      S-   nU$ U R                   R                  SS9  g! [         a     gf = f)zWCheck if global cooldown is active.
Returns windows remaining, or 0 if not in cooldown.r   until_tsr   T)
missing_ok)rJ   rr   r   loads	read_textru   r   r   r   win_secsr   rw   )r[   datar   	remainings       r]   _check_global_cooldownBot._check_global_cooldown   s    	--4466::d88BBDEDxx
A.Hyy{X%DIIK!7488;L;L LMPQQ	   **11T1B 		s   C BC 8C 
CCc                    [         U R                  R                  -  n[        [        R                  " 5       5      U-   n [
        R                  " UU R                  R                  [        [        R                  " 5       5      S.5      nU R                  R                  U5        [        S[          SU S35        g! [         a  n[        SU 35         SnAgSnAff = f)z6Activate global cooldown for LOSS_STREAK_COOL windows.)r   triggered_bytriggered_atzM
  [GLOBAL COOLDOWN] 3 consecutive losses across all bots -> pausing ALL for z
 windows (zs)z!  [GLOBAL COOLDOWN] write error: N)r   r   r   r   r   r   r   rT   rJ   
write_textrS   rw   )r[   cooldown_secsr   r   r}   s        r]   _trigger_global_cooldownBot._trigger_global_cooldown   s    (488+<+<<tyy{#m3	;::$ $ #DIIK 0 D
 &&11$7 ((8'9 :#_B( )  	;5aS9::	;s    A;B< <
CCCc                     U R                   R                  5       (       d  gU R                   R                  5       R                  5       R	                  S5      n[        U5      S:  a  USS OUnSn[        U5       H7  n [        R                  " U5      nUR                  S5      (       d  US-  nM7    O   U[        :  a  U R                  5         gg! [         a       M*  f = f! [         a     gf = f)zCRead last N trades from global file and trigger cooldown if needed.Nr   
   ir   r   r   )rK   rr   r   stripsplitlenreversedr   r   ru   rw   r   r   )r[   linesrecentstreakliner   s         r]   _check_global_streakBot._check_global_streak   s    	++2244,,668>>@FFtLE$'JOU34[FF ( JJt,E 99U++! ) (--/ ) !   		s;   C% AC%  1C1 C% 
C"C% !C""C% %
C21C2Nc                     U R                   (       a  gU R                  S:  a  gU R                  5       nUS:  a  g[        (       a*  [        R
                  " 5       R                  nU[        ;   a  gg)z:Return reason to skip this window, or None if OK to trade.
DD_STOPPEDr   COOLDOWNGLOBAL_COOLDOWNBLOCKED_HOURN)rP   rG   r   r   r   rM   hour)r[   gchour_utcs      r]   _should_skip_windowBot._should_skip_window   s^    "((*6$(--H,,%r`   c                    U R                   R                  SS9nU R                  5       nU(       a  UR                  5       nO2U R                  (       a  SnOUS:  a  SnOU R
                  S:  a  SnOSn[        U R                  R                  [        [        R                  " 5       5      U(       a  UR                  OSU(       a  UR                  OSU(       a  UR                  OSU(       a5  [        SUR                  [        [        R                  " 5       5      -
  5      OSU(       a  UR                  OSU R                   R"                  SU R                  R$                  S	-  S
UU R&                  U R(                  [+        US5      U R,                  U R
                  U[.        (       a&  [0        R2                  " 5       R4                  [.        ;   OS
[+        U R6                  S5      U R                  U R8                  S.S.5        g)z>Write state.json with defense info (for dashboard visibility).T	use_cache
dd_stoppedr   global_cooldowncooldownidler    d   F   loss_streakcooldown_leftglobal_cooldown_leftblocked_hour	daily_pnlr   
daily_date)r   rg   start_tsend_tst_leftstrikerk   rn   	thresholdenteredphasewindowstrades_totalbalancedefenseN)r4   get_balancer   lowerrP   rG   r   r   
state_jsonr   r   rg   r   r   maxr   r6   last_pxrW   rC   rD   roundrF   r   r   rM   r   rL   rO   )r[   rx   skip_reasonbalgc_leftr   s         r]   _write_defense_stateBot._write_defense_state  sz   mm''$'7--/%%'E Eq[%E  1$EE488&&diik"AFFR&'

Q"#ahh=>c!QXXDIIK(889A"#ahh\\))44s:** ..S!}#00!%!4!4(/O`O` 1 6 6:K Kfk"4??A6".."..)
 	r`   c                 <   U R                   nU(       d  g U R                  R                  nUS:X  a  g [        SUR                  [        [        R                  " 5       5      -
  5      nUR                  (       a  X!R                  -
  UR                  -  OSnU R                  (       a  U R                  R                  OSnU R                  (       a  U R                  R                  OSnU R                  R                  UUR                  UUR                  UR                  UUU R                  S9nU(       Ga$  [!        SUR"                   SUR$                  S SUS SUR                  S S	UR&                  S
 SUR(                   S35        U R*                  R-                  UR.                  UR&                  UR0                  SUR"                   35      u  ppU(       Ga|  SU l        UR"                  U l        Xl        UR0                  U l        [9        XR0                  -  S5      U l        UR$                  U l        UR.                  U l        U =R@                  S-  sl         U RB                  RD                  (       GaO  [        [        R                  " 5       5      nU R*                  RG                  5       nSn[I        S5       GHK  n[        RJ                  " US:X  a  SOS5        U R*                  RM                  U RN                  UR.                  US9nU(       a  US   S:  a  U R4                  nU R6                  nUS   UR0                  S-  ::  a
  US   U l        US   S:  a
  US   U l        [9        U R4                  U R6                  -  S5      U l        [Q        URS                  S/ 5      5      n[!        SUR"                   SUS-    SU R6                  S
 SU R4                  S SUS SUS S U S!35        Sn  O[!        S"US-    S#35        GMN     Xl*        U(       d  U R*                  RW                  U	5        U =R@                  S-  sl         U R*                  RG                  5       nUU-
  n[!        S$UR"                   S%U S&35        [!        S'5        [!        S(US S)US S*US S+35        [Y        U5      S,:  a  [!        S-US
 S.35        U RT                  (       d  U RB                  RD                  (       da  U RZ                  R]                  UR^                  UR"                  U R4                  U R6                  U R:                  UR$                  S/SSS5
        O S/nU R                  (       a  S0U R2                   S1U R4                  S
 3nS/nUS:  d  US:  a
  S2US
 S3US
 3nU RB                  R`                  nU RB                  Rb                  nUUs=:  =(       a    U:  Os  nU(       a  U R                  (       d  S4OS/nU R                  (       a  S5nOUU:  a  S6nOUU:  a  S7nS/nU R                  (       de  U(       a^  U R                  R(                  nU RB                  Rd                  nU R                  Rf                  nUS:  a  S8U S9U U(       a  US   OS/ 3nU RB                  RD                  (       a  S/OS:n [h        Rj                  " 5       Rm                  S;5      n![!        S<U! S=US> S?US@ SUSA SBU U U U U  3SCSD9  [        [        R                  " 5       5      SE-  S:X  Ga  U R*                  RG                  SSF9n"[o        U RB                  Rp                  0 SG[        [        R                  " 5       5      _SHUR^                  _SIURr                  _SJUR                  _SKU_SLUR                  _SMU_SN[9        USO-  S5      _SPU RB                  Rt                  SO-  _SQU_SRU_SSU R                  _STU R2                  _SUU R4                  _SVU R6                  _SWURw                  5       _SXU Rx                  _U R@                  [9        U"S5      U R                  R(                  U RB                  Rd                  U R                  Rf                  SY.U Rz                  U R|                  U R                  5       [        (       a&  [h        R                  " 5       R                  [        ;   OS[9        U R                  S5      U R                  U R                  SZ.S[.E5        g g )\Nr   )rk   r   r   	token_yestoken_nobest_ask_yesbest_ask_noalready_enteredz
  [SIGNAL]  | move=+.4fz% | price=$,.2fz vs strike=$z | ask=r*   z | confirmed=tzMOM Tr   r   F      )order_tsrl   g      ?	avg_price	tx_hashesz  [FILL VERIFIED] z
 (attempt z): sh @ .4fz (was z.1fz) [z tx confirmed]z  [verify retry z/5] no confirmed fill yet...z  [PHANTOM] u    — CLOB dijo 'z7' pero NO hay fill confirmado on-chain tras 5 intentos.z5  [PHANTOM] Orden cancelada. Trade NO contado en PnL.z  [PHANTOM] Balance delta: $z
 (before=$z	, after=$)      ?z   [!! WARNING] Balance dropped $u1    without confirmed fill — investigate manually!r    z | POS=ro   z | aY=z aN=SCANNINGHOLDINGWARMUPCUTOFFz | cfm=/z [PAPER]z%H:%M:%S[z] t-3dzs | $z,.0fz+.4%z | )end   r   r   rg   r   r   r   r   rk   rn   r   r   ask_yesask_nor   
entry_sideentry_price
entry_sizer   r   )countneededrh   r   )r   r   confirmr   )Fr9   r6   r   r   r   r   r   r   r7   best_askr8   r3   check_signalr   r   r:   rS   rh   rn   rk   confirm_countr4   place_taker_ordertoken_idrl   r;   r<   r=   r   r>   r?   r@   rD   r   rR   r   rangesleepverify_fillr.   r   ru   rA   cancel_orderabsr2   	log_traderg   signal_start_tleftsignal_stop_tleftrX   confirm_sider   nowrN   r   r   r   rW   r   rC   rF   rG   r   r   rM   r   rL   rP   rO   )#r[   rx   rk   r   mover  r  sigokoid
fill_pricefill_statusr   
bal_beforeverifiedattemptposold_pold_ntx_count	bal_after	bal_delta	entry_tagask_tagsssesignal_zonezone_tagconfirm_tagccctcspapernow_strr   s#                                      r]   tickBot.tick8  s   KK$$A:Q3tyy{#33401 AHH,a -1MM$--((q+/<<$,,''Q mm((88kkZZ  MM ) 	
 M#((8CLL3F G!$<|AHHT? C3}S5F5F4GqJ K 04}}/N/Nciisxxj!0#,BZ  %)$'HH $.!$'HH $)*xx*?$C $'LL $'LL!""a'" 88==="499;/H!%!:!:!<J$H#(8

11!<"mm77 LL#,,%- 8 / 3v;?$($5$5E$($4$4E"6{chhn<36v; 0";/!3474D 1/4 $ 1 1D4D4D Da0ID,'*377;+C'DH!$6sxxj A..5ai[%)%5%5c$:%%)%6%6s$;$*5+U5+ F''/j#@ A (,H! 0 <9 : ;/ $,4 +3'# 2237**a/* %)MM$=$=$?	$.$:	SXXJ 7""- /EF G  !9 ; !""+D!1 2**4S)9 :((1#a9 :
 y>C/ " %&&/_ 5C#D E &&dhhmmKK))$*;*;(($*:*:b!Q3  	=="4#3#3"4C --c24I Q;&1*wsm4s|<GXX((XX''F((b(!,T]]:== Hb[Hb[H }},,B''B++BAv 't1RD"A"0EFhhmm,,.))*5yVBKuU4L 9;c(K=i	{5'+ 		
 tyy{a1$--++d+;Ctxx** #-c$))+&#-#- AJJ#- !((	#-
 &#- !((#- #- E$*a0#- TXX883>#- 7#- &#- 4==#- d..#- t00#- d..#-  )!#-" 4..##-$ !% 2 2 a= "]]88"hh44 MM66 $(#4#4%)%8%8,0,G,G,ISdSdHOO$5$:$:>O$Ojo!&t!:"&"2"2"&"2"25#- # %r`   c                 P
   U R                   R                  (       a  U R                  R                  5         U R                  R
                  nU R                  (       a  [        OSn[        SUR                   SU SU R                  (       a  SOS S35        U R                  X5      nU(       dl  [        SUR                   S	[         S
35        U R                  R                  XSU R                  U R                  U R                  U R                   SSS5
        gU R                  (       d3  U R                  R                  XUSSSSSSS5
        [        SU S35        gU R                   R                  (       a  U R"                  (       d  [        SUR                   SU 35        [        SU R                   S35        U R                  R                  XUU R                  U R                  U R                  U R                   SSS5
        gU R                  nU R                  nU R                  nUS:H  =(       a    US:H  =(       d    US:H  =(       a    US:H  nU R                   R                  (       a  U(       a  [%        SU-
  U-  S5      n	O[%        U* U-  S5      n	[%        USU-
  -  U-  [&        -  S5      n
[%        X-
  S5      nU(       a  SOSn[        SUR                   SU 35        [        SU SUS SUS  S!U R                   S" S#3	5        [        S$US% S&U S'U	S% S(U
S  S)3	5        OU(       a  [%        SU-
  U-  S5      n	O[%        U* U-  S5      n	[%        USU-
  -  U-  [&        -  S5      n
[%        X-
  S5      nU(       a  SOSn[        SUR                   SU 35        [        SU SUS* SUS S!U R                   S" S+3	5        [        S,U	S% S-U
S  S.US% S&U 35        U R                  R)                  UR                  XvXPR*                  U R                   XIX5
        U R                  R                  XUXvXPR                   XU5
        U R,                  R/                  [1        [2        R2                  " 5       5      UR                  XtXS/.5        U R5                  X5        U R                   R                  (       a!  U R7                  U5        U R9                  5         U R                   R                  (       a*  U R                  R;                  5       n[        S0US  35        gg)1z.Settle: esperar outcome oficial, calcular PnL.<   z

[settle] u$    — esperando outcome oficial (max zs, consinz posicion)...z  [!! OUTCOME DESCONOCIDO] u    — Polymarket no resolvio en sUNKNOWNr   Nr    z  [settle] u    — sin posicionz -> z  [PHANTOM SETTLE] u.    was NOT verified — skipping PnL calculationri   Uprj   Downr   r   WINLOSSz  z: r*   r   r   r   r   z% [VERIFIED]z  PnL: $r    z
 (gross: $z, fee: $r   r   %z  PnL gross: $z	 | fee: $z	 | net: $)r   rg   rh   outcomer   r   z  [balance] $)r   rR   r4   
cancel_allr6   r   r:   r   rS   rg   _fetch_outcomer2   
log_windowr;   r<   r=   r?   rA   r   r   r  r>   rE   appendr   r   r   r   r   r   )r[   rx   price_finalwaitrG  nprh   r   	pnl_grossfeer   tagr   s                 r]   _settle_windowBot._settle_window  s    88==MM$$&ll** $(==bAFF8 $V3u5AP 	Q%%a./x 833C2DAG HKK""	  $"3"3T5E5E  !Q+ }}KK""Aq!Q1& Ky(9:; 88==!4!4KxtG956'(8(8'9 :: ; <KK""  $"3"3T5E5E  !Q+  u}0D 3t|16 1 	 88==!37a-3	!1"q&!,	S1W)N:A>CIOQ/G%FCKxtG956BtfBqgU1S' 2**40> ?HWTN!C5 1'-Xc#YaA B !37a-3	!1"q&!,	S1W)N:A>CIOQ/G%FCKxtG956BtfBqgU1S' 2**403 4N9T"2 3s)9WTN!C5B C 	FFDQ 0 0g#	@ 	GQ((G	%
 	""diik"AFF$
 	 	))'788==""3'%%'88==--++-CM#c+, r`   max_waitc                    [         R                   " 5       U-   nSn[         R                   " 5       U:  a  US-  nUR                  U R                  5      nU(       a  [        SU SU S35        U$ U[         R                   " 5       -
  nUS::  a   g [         R                   " 5       X2-
  -
  S:  a  SOSn[         R                  " [        Xv5      5        [         R                   " 5       U:  a  M  g )	Nr   r   z  [OK outcome] z
 (intento r      r   r   )r   fetch_outcomer.   rS   r  r&   )r[   rx   rU  deadliner&  rG  r   rM  s           r]   rI  Bot._fetch_outcomel  s    99;)iikH$qLGoodll3Gy
7)1EF 499;.IA~  		x':;b@1bDJJs4+, iikH$ r`   c                   ^  [         R                   " [         R                  U 4S j5        [         R                   " [         R                  U 4S j5        [        R                  " T R
                  R                  SSS9R                  5         [        S5        T R                  (       d]  T R
                  R                  S:X  aC  [        R                  " S5        T R                  (       d  T R
                  R                  S:X  a  MC  T R                  R                  nT R                  R                  (       a  S	OS
n[        SU SU ST R                  R                    S35        [        ST R                  R"                  S ST R                  R$                   ST R                  R&                  S ST R                  R(                   S3	5        SnT R                  (       Gd0   [+        [        R                  " 5       5      nXDU-  -
  nXQ-   nXd-
  S:  a:  XQ-  n[-        SXT-
  S-   5      n[        SU S35        [        R                  " U5        T R.                  R1                  5         [2        R4                  " 5       T l        T R.                  R6                  R9                  SS05        [;        UT R                  5      nUR=                  T R.                  T R
                  R                  5      (       d?  US-  n[?        SSU-  5      n	[        SU SU	 S35        [        R                  " U	5        GMc  SnT =R@                  S-  sl         T RC                  5         T RE                  5         T RG                  5         T RI                  5       n
U
S:X  a  T =RJ                  S-  sl%        U[+        [        R                  " 5       5      -
  n[        S T RJ                   S!35        T RM                  US"S#9  [        R                  " [-        SU5      5        GMB  U
S$:X  as  U[+        [        R                  " 5       5      -
  nT RO                  5       n[        S%U S&35        T RM                  US'S#9  [        R                  " [-        SU5      5        GM  U
S(:X  a  U[+        [        R                  " 5       5      -
  n[        S)[P        RR                  " 5       RT                  S* S+35        T RM                  US,S#9  [        R                  " [-        SU5      5        GMB  U
S-:X  Ga   U[+        [        R                  " 5       5      -
  n[        S.T RV                  S/ S035        T R                  (       d  [+        [        R                  " 5       5      U:  a~  T RG                  5         T RX                  (       d  O\T RM                  U5        [        R                  " S5        T R                  (       d$  [+        [        R                  " 5       5      U:  a  M~  T RX                  (       a  GMI  T R[                  U5        T R\                  (       a  T R\                  R_                  5         T R`                  (       a  T R`                  R_                  5         [c        URd                  [f        5      T l.        [c        URh                  [f        5      T l0        [        R                  " T R\                  R                  SS19R                  5         [        R                  " T R`                  R                  SS19R                  5         [        R                  " S25        T Rj                   Vs/ s H  nURm                  S35      S4;  d  M  UPM     nn[o        S5 U 5       5      n[o        S6 U 5       5      nT R\                  Rp                  nT R`                  Rp                  nS7nT Rr                  S:  a  US8T Rr                   3-  nT RV                  S:w  a  US9T RV                  S/ 3-  n[        S:S; 35        [        S<URt                   35        [        S=URv                  S> S?URx                   S@35        [        SAU SB35        [        SCT R                  R"                  S ST R                  R$                   ST R                  R&                  S 35        [        SDUS SEUS 35        [        SFT R@                   SGT Rz                   U 35        U(       a+  [}        U5      n[        SHUSI SJU SKU S?UU-  SL-  SM SN3	5        [        S; 5        UT l?        T R                  (       d  [+        [        R                  " 5       5      UR                  :  ae  T R                  5         [        R                  " S5        T R                  (       d.  [+        [        R                  " 5       5      UR                  :  a  Me  T R                  (       d  T R                  U5        T R                  (       d  GM/  g g s  snf ! [         aB  nSS KDn[        SOU 35        UR                  5         [        R                  " SP5         S nANbS nAff = f)QNc                  $   > TR                  5       $ Nshutdown_r[   s    r]   <lambda>Bot.run.<locals>.<lambda>      r`   c                  $   > TR                  5       $ r]  r^  r`  s    r]   rb  rc    rd  r`   Tr6   )targetdaemonnamez&-> esperando primer tick de Binance...r   g?r$   r%   z	-> modo: z | ventana: zs (zmin)z-> threshold: r'   r(   r)   r*   r+   z/traderW  r   z
-> proxima ventana en zs...r   r   r   z([!] No se pudo cargar la ventana (fail #z), retry en r   z
  [COOLDOWN] skipping window (z more after this)r   )r   r   u=   
  [GLOBAL COOLDOWN] 3+ losses across all bots — skipping (z windows left)r   r   z
  [BLOCKED HOUR] 02du!   :00 UTC — low WR hour, skippingr   r   z
  [DD STOPPED] daily PnL $r   u'    — waiting for resume or UTC midnight)rf  rg  r  rG  r@  Nc              3   <   #    U  H  oS    (       d  M  Sv   M     g7fr   r   N .0r   s     r]   	<genexpr>Bot.run.<locals>.<genexpr>  s     8ex11e   	c              3   *   #    U  H	  oS    v   M     g7fr   Nrm  rn  s     r]   rp  rq    s     7AY<   r    z
 | streak=z | day=$r   zH========================================================================z  Ventana    : z  Strike     : $r    (r   z  Modo       : z | V12 MOMENTUM TAKER + CONFIRMz  Threshold  : z  CLOB asks  : YES=z NO=z  Stats      : windows=z trades=z  PnL acum.  : $r   z | WR=r  r   r   %)z
[!! ERROR] r   )FsignalSIGINTSIGTERM	threadingThreadr6   runstartrS   r1   r   r   r  r   r   rR   rV   rW   rX   rY   rZ   r   r   r.   closer,   r-   r/   r0   r   
fetch_datar&   rC   rd   r   r   r   rG   r   r   r   rM   r   rL   rP   r~   r7   stopr8   r   r   r   r   rE   ru   sumr  rF   rg   r   strike_sourcerD   r   r9   r   r9  rS  rw   	traceback	print_exc)r[   wsr\   _consecutive_failsr  r   r   rM  rx   delayskipr   r   r   knownwinspnlask_yask_n
def_statusnkr}   r  s   `                      r]   r}  Bot.run~  sZ   fmm&@Afnn&@A<<##Dy	

%'67**!5!5!:JJsO **!5!5!: XX!XX]]6	(<t3txx6GtLMtxx::3? @((001 211#6 7//08 	9
 ***Ityy{+r>#=<"$NHq(.1"45D4TF$?@JJt$""$'//1$$++\=,IJ8TXX.||DLL$,,2F2FGG&!+&A(:$:;E $$6#7|E7$P QJJu%%&"##q(#((* '')%%'//1:%''1,' &TYY[)9 9I "1122CE F--aZ-HJJs1i01,, &TYY[)9 9I"99;G ++2)>C D--a=N-OJJs1i01>) &TYY[)9 9I/0A0F0Fs/K L6 7 8--a^-LJJs1i01<' &TYY[)9 9I "ood3 434 5 #jjS-=-F--/#//!11!4

1 #jjS-=-F '' ,,Q/ ==MM&&(<<LL%%' (g > (W =  ==,,T;;@57  <<++D::?%'

1$($7$7 G$7qEE),4EE $7 G8e88777..--  
$$q(Jt/@/@.A"BBJ??a'HT__T,B"CCJ6(m$x01($ 8//*!- .z1PQR(C(CC'H I$$(HH$:$:#; <##'88#;#;C"@B C +E#;d5+FG/0C0C/D E  $ 2 23J<A BUB,SJ 7  $vQrd"T"WS[,=RA B" **TYY[)9AHH)DIIKJJqM **TYY[)9AHH)D
 zz''*I ***vGV   aS)*##%

2	sa   "Eh 2Ch A6h 
Bh C1h h D7h h,h2I&h "h h 
i#!8ii#c           	         U R                   (       a  g SU l         [        S5        U R                  R                  (       a  U R                  R                  5         U R                  R                  5         U R                  (       a  U R                  R                  5         U R                  (       a  U R                  R                  5         U R                   Vs/ s H  nUR                  S5      S;  d  M  UPM     nnU(       a  [        S U 5       5      n[        U5      n[        [        S U 5       5      S5      n[        SS	 35        [        S
5        [        SU R                   35        [        SU R                    35        U(       a  [        SU SU SX4-  S-  S S35        [        SUS 35        [        S	 5        g g s  snf )NTz
-> shutdown...rG  rj  c              3   <   #    U  H  oS    (       d  M  Sv   M     g7frl  rm  rn  s     r]   rp  Bot.shutdown.<locals>.<genexpr>/  s     4%QU8qq%rr  c              3   *   #    U  H	  oS    v   M     g7frt  rm  rn  s     r]   rp  r  1  s     8%QiL%ru  r   r   z2==================================================z&  RESUMEN V12 MOMENTUM TAKER + CONFIRMz  Ventanas   : z  Trades     : z  Win rate   : r  rv  r   r   rw  z  PnL total  : $r   )r1   rS   r   rR   r4   rH  r6   r  r7   r8   rE   ru   r  r   r   rC   rD   )r[   r   r  r  r  r  s         r]   r_  Bot.shutdown  so   ::
 !88==MM$$&==MM <<LL // ?/qEE)$,== / ?4%44DUB8%88!<CBvh- :<OD$7$7#89:OD$6$6#789vQrd"TWS[4ERHI$SJ/0VH ?s   G5G)rB   rG   rO   rL   rQ   rP   r:   r>   r?   r<   r;   r=   r@   rA   rJ   rK   rF   r1   rE   rD   rC   r6   r   r8   r7   r4   r2   r9   r.   r3   )NN)__name__
__module____qualname____firstlineno__r   r^   rd   r~   r   r   rv   boolr   r   r   r   r   r   strr   r   r9  rS  rI  r}  r_  __static_attributes__rm  r`   r]   r   r   %   s    3OF 3On?6	%RKE K K(T  $;"0S4Z "(XGVg-R# #* $_Br`   r   )#__doc__r   rx  r{  r   r   pathlibr   configr   r   r   r	   r
   r   r   r   r   r   r   r   r   feedsr   r   r9   r   r2   r   r4   r   r3   r   r,   r   rm  r`   r]   <module>r     sL    % $      )    & T Tr`   