
    }%jls                        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  \" \5      R                  R                  S-  S-  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logsEMERGENCY_STOP   )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                 |   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        SU l        / U l        SU l         SU l!        URD                  RF                  S-  U l$        URD                  RF                  S-  U l%        SU l&        [N        RP                  " 5       RS                  S	5      U l*        SU l+        URD                  S
-  U l,        URZ                  (       a  SOSn[]        SU SUR^                  Ra                  5        SURb                   S35        []        SURd                  S SURf                   SURh                  S SU R                   Rj                   S[l        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%)7r   requestsSessionsessionheadersupdate_stopr   loggerr   strategyr   executorr   
binance_wsbinanceclob_yesclob_nomarket_entered_entry_attempted_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/V16/v16/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        SU l	        U R                  R                  5         g )NFr"   r#   )r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   r5   resetr^   s    r`   _reset_window_stateBot._reset_window_state`   sa     % %#!rc   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getrj   r<   r>   floatr?   r@   rA   rB   rV   	Exception)r^   mrs   pathfreaderrowes           r`   _restore_entry_from_csvBot._restore_entry_from_csvn   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   rP   rQ   rR   rO   rV   rS   )r^   todays     r`   _check_daily_resetBot._check_daily_reset   sy    !**:6$$$"*4+;+;*< =//$/{< =$!DO$D %rc   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)	rS   rT   ru   unlinkOSErrorrO   rI   rJ   rV   rf   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)rI   r   r   rJ   rV   rO   r   rS   )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/rc   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.)tsrW   r   a
N)
jsondumpsinttimer   rW   rv   rN   writerz   )r^   r   entryr}   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)rM   ru   r   loads	read_textrx   r   r   r   win_secsr   rz   )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   rW   rM   
write_textrV   rz   )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   )rN   ru   r   stripsplitlenreversedr   r   rx   rz   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)rS   rJ   r   r   r   rP   hour)r^   gchour_utcs      r`   _should_skip_windowBot._should_skip_window   s^    "((*6$(--H,,%rc   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   rj   start_tsend_tst_leftstrikern   rq   	thresholdenteredphasewindowstrades_totalbalancedefenseN)r6   get_balancer   lowerrS   rJ   r   r   
state_jsonr   r   rj   r   r   maxr   r8   last_pxrZ   rF   rG   roundrI   r   r   rP   r   rO   rR   )r^   r{   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".."..)
 	rc   c                    [         R                  5       (       aB  [        SU R                  R                  R                  5        S35        U R                  5         g 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  U R.                  (       Gd  [        SUR0                   SUR2                  S SUS	 S
UR                  S	 SUR4                  S SUR6                   S35        SU l        U R8                  R;                  UR<                  UR4                  UR>                  SUR0                   35      u  ppU(       a  SU l        SU l         UR0                  U l!        Xl"        UR>                  U l#        [I        XR>                  -  S5      U l%        UR2                  U l&        UR<                  U l'        U =RP                  S-  sl(        U RR                  RU                  URV                  UR0                  U RD                  U RF                  U RJ                  UR2                  SSSS5
        SnU R,                  (       a  SU RB                   SU RD                  S 3nSnUS:  d  US:  a
  SUS SUS 3nU R                  RX                  nU R                  RZ                  nXs=:  =(       a    U:  Os  nU(       a  U R,                  (       d  SOSnU R,                  (       a  SnOX>:  a  SnOX?:  a  SnSnU R,                  (       de  U(       a^  U R$                  R6                  nU R                  R\                  nU R$                  R^                  nUS:  a  SU SU U(       a  US   OS 3nU R                  R`                  (       a  SOSn[b        Rd                  " 5       Rg                  S5      n[        S U S!US" S#US$ SUS% S&U U U U U 3S'S(9  [        [        R                  " 5       5      S)-  S:X  Ga  U R8                  Ri                  SS*9n[k        U R                  Rl                  0 S+[        [        R                  " 5       5      _S,URV                  _S-URn                  _S.UR                  _S/U_S0UR                  _S1U_S2[I        US3-  S5      _S4U R                  Rp                  S3-  _S5U_S6U_S7U R,                  _S8U RB                  _S9U RD                  _S:U RF                  _S;URs                  5       _S<U Rt                  _U RP                  [I        US5      U R$                  R6                  U R                  R\                  U R$                  R^                  S=.U Rv                  U Rx                  U R{                  5       [|        (       a&  [b        R~                  " 5       R                  [|        ;   OS>[I        U R                  S5      U R                  U R                  S?.S@.E5        g g )ANu3   
[!! EMERGENCY STOP] señal detectada — apagando z...r   )rn   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=tTzMOM r   r   r"   z | POS=rr   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   rj   r   r   r   r   rn   rq   r   r   ask_yesask_nor   
entry_sideentry_price
entry_sizer   r   )countneededrk   Fr   )r   r   confirmr   )DEMERGENCY_STOP_FILEru   rV   r   rW   rX   shutdownr;   r8   r   r   r   r   r   r   r9   best_askr:   r5   check_signalr   r   r<   r=   rk   rq   rn   confirm_countr6   place_taker_ordertoken_idro   rD   r>   r?   r@   r   rA   rB   rC   rG   r4   	log_traderj   signal_start_tleftsignal_stop_tleftr[   confirm_siderU   r   nowrQ   r   r   r   r   rZ   r   rF   rI   rJ   r   r   rP   r   rO   rS   rR   )r^   r{   rn   r   mover  r  sigokoid
fill_pricefill_status	entry_tagask_tagsssesignal_zonezone_tagconfirm_tagccctcspapernow_strr   s                            r`   tickBot.tick<  s.   %%''HI]I]I_H``cdeMMOKK$$A:Q3tyy{#33401 AHH,a -1MM$--((q+/<<$,,''Q mm((88kkZZ  MM ) 	
 t,,,M#((8CLL3F G!$<|AHHT? C3}S5F5F4GqJ K %)D!/3}}/N/Nciisxxj!0#,BZ %)&*#%(XX %/!%(XX %*:+@!%D %(\\ %(\\!""a'"%%FFCHHd&7&7$$d&6&6LL"aA/ 	=="4#3#3"4C --c24I Q;&1*wsm4s|<GXX((XX''((b(!,T]]:== H[H[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#- # %rc   c                    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                  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-                  [/        [0        R0                  " 5       5      UR                  XtXS-.5        U R3                  X5        U R                   R                  (       a!  U R5                  U5        U R7                  5         U R                   R                  (       a*  U R                  R9                  5       n[        S.US 35        gg)/z.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 posicionrl   Uprm   Downg      ?r   WINLOSSz -> z  z: r,   zsh @ z.4fr   r   z% [VERIFIED]z  PnL: $r    z
 (gross: $z, fee: $)r   %z  PnL gross: $z	 | fee: $z	 | net: $)r   rj   rk   outcomer   r   z  [balance] $)r   rU   r6   
cancel_allr8   r   r<   r   rV   rj   _fetch_outcomer4   
log_windowr>   r?   r@   rB   r   r   r  rA   rH   appendr   r   r   r   r   r   )r^   r{   price_finalwaitr6  nprk   r   	pnl_grossfeer   tagr   s                 r`   _settle_windowBot._settle_window  sN    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:; 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+, rc   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 r4        r   )r   fetch_outcomer0   rV   sleepr(   )r^   r{   rD  deadlineattemptr6  r   r<  s           r`   r8  Bot._fetch_outcome'  s    99;)iikH$qLGoodll3Gy
7)1EF 499;.IA~  		x':;b@1bDJJs4+, iikH$ rc   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r
  _r^   s    r`   <lambda>Bot.run.<locals>.<lambda>:      rc   c                  $   > TR                  5       $ rO  rP  rQ  s    r`   rS  rT  ;  rU  rc   Tr8   )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/traderF  r   z
-> proxima ventana en zs...r    r!   rG  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)rW  rX  r   r6  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   Nr^  r_  s     r`   ra  rb    s     7AY<   r"   z
 | streak=z | day=$r   zH========================================================================z  Ventana    : z  Strike     : $r    (r4  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Threadr8   runstartrV   r3   r   r   rI  r   r   rU   rY   rZ   r[   r\   r]   r   r   r0   closer.   r/   r1   r2   r   
fetch_datar(   rF   rg   r   r   r   rJ   r   r   r   rP   r   rO   rS   r   r9   stopr:   r   r   r	   r   rH   rx   sumr  rI   rj   r   strike_sourcerG   r   r;   r   r'  rB  rz   	traceback	print_exc)r^   wsr_   _consecutive_failsr  r   r   r<  r{   delayskipr   r   r   knownwinspnlask_yask_n
def_statusnkr   ru  s   `                      r`   rn  Bot.run9  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...r6  r[  c              3   <   #    U  H  oS    (       d  M  Sv   M     g7fr]  r^  r_  s     r`   ra  Bot.shutdown.<locals>.<genexpr>  s     4%QU8qq%rc  c              3   *   #    U  H	  oS    v   M     g7fre  r^  r_  s     r`   ra  r    s     8%QiL%rf  r   r   z2==================================================z&  RESUMEN V12 MOMENTUM TAKER + CONFIRMz  Ventanas   : z  Trades     : z  Win rate   : r   rg  r   r   rh  z  PnL total  : $r   )r3   rV   r   rU   r6   r7  r8   rr  r9   r:   rH   rx   rs  r   r   rF   rG   )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)rE   rJ   rR   rO   rT   rS   r<   r=   rA   rB   r?   r>   r@   rC   rD   rM   rN   rI   r3   rH   rG   rF   r8   r   r:   r9   r6   r4   r;   r0   r5   )NN)__name__
__module____qualname____firstlineno__r   ra   rg   r   r   r   ry   boolr   r   r   r   r   r   strr   r   r'  rB  r8  rn  r
  __static_attributes__r^  rc   r`   r   r   '   s    4OF 4Op?6	%RKE K K(T  $;"0S4Z "(XIZ\-|# #* $_Brc   r   )&__doc__r   ri  rl  r   r   pathlibr   __file__rL   r	  configr   r	   r
   r   r   r   r   r   r   r   r   r   r   feedsr   r   r;   r   r4   r   r6   r   r5   r   r.   r   r^  rc   r`   <module>r     sm    % $  8n++22V;>NN     )    & M Mrc   