+
    Z]4j                    x
   R t ^ RIt^ RIt^ RIt^ RIt^ RIHt ^ RIt^ RI	t	^ RI
t
^ RIt^ RIHtHt ^ RIt^ RIHtHtHt  ^ RIt]! 4        R tR tR tR tR	 t ]	P4                  ! ]	P6                  R
4       ]! R4      t]P=                  RR4      t]P=                  RR4      t ]P=                  RR4      t!]P=                  RR4      t"]P=                  RR4      t#]P=                  RR4      t$]%! ]P=                  RR4      4      t&]'! ]P=                  R^4      4      t(]'! ]P=                  R^4      4      t)]P=                  RR4      t*]%! ]P=                  RR4      4      t+]%! ]P=                  RR4      4      ^d,          t,]%! ]P=                  R ^
4      4      t-]%! ]P=                  R!^d4      4      t.R"t/]P=                  R#R4      t0]%! ]P=                  R$^24      4      t1]P=                  R%R4      t2]P=                  R&R4      t3]P=                  R'. 4      t4R(t5R)t6]Pn                  ! 4       t8]8Ps                  ]Pt                  4       ]8Pv                  R*,           F  t<]8P{                  ]<4       K  	  ]! ]5Rf^R+R,7      t>]>Ps                  ]Pt                  4       ]P~                  ! R-4      t@]>P                  ]@4       ]8P                  ]>4       ]P                  ! R.4      tCR/ tD]D! 4       sE]#'       d   ]!tF]"tGM]tF] tG]P                  ! R0]FR1]GR2R3R4R5R6R7R8R9\        //4      tI]#'       d-   ]IP                  R34       ]P                  ! R:4       ]L! R:4       M]P                  ! R;4       ]L! R;4       ]0'       d   ]P                  ! R<4       ]L! R<4       M]P                  ! R=4       ]L! R=4       ]P                  ! R>]/R? R@24       ]L! R>]/R? R@24       ]P                  ! RA].R? RB24       ]L! RA].R? RB24        ]IP                  4        ]P                  ! RC4       ]L! ]P                  RD,           ]P                  ,           4       RF tSRG tTRH tURI tVRJ tWRK tXRL tYRM tZRN t[RO t\RP t]RgRQ lt^RR t_RS t`RT taRU tbRV tcRW tdRX teRY tfRZ tgR[ thR\ tiRhR] ltjR^ tkR_ tlR` tmRa tnRb toRc tpRd tq]rRe8X  d
   ]q! 4        R# R#   ] d    Rt ELqi ; i  ]	P8                   d<     ]	P4                  ! ]	P6                  R4        ELs  ]	P8                   d      ELi ; ii ; i  ]P d+   tQ]P                  ! RE]Q 24       ]L! RE]Q 24        RtQAQLRtQAQii ; i)iu   
ROBÔ DE BALANCEAMENTO DE PORTFÓLIO
Permite operação simultânea em múltiplas moedas com rebalanceamento automático
Baseado na estrutura do robo_trade.py
N)RotatingFileHandler)datetime	timedelta)initForeStylec                    \        V RRR7      ;_uu_ 4       p\        P                  ! V4      uuRRR4       #   + '       g   i     R# ; i)u'   Carrega configurações do arquivo JSONrutf-8encodingN)openjsonload)filepathfiles   & robo_balanceamento.pycarregar_configuracoesr      s-    	hg	.	.$yy 
/	.	.	.s	   8A		c           	         \        V RRR7      ;_uu_ 4       p\        P                  ! W^RR7       RRR4       R#   + '       g   i     R# ; i)u"   Salva o estado atual do portfóliowr
   r   Findentensure_asciiN)r   r   dump)r   estador   s   && r   salvar_estado_portfolior   $   s2    	hg	.	.$		&qu= 
/	.	.	.s	   ;A	c                    \         P                  P                  V 4      '       dg   \        V RRR7      ;_uu_ 4       p\        P
                  ! V4      pV'       d   VuuRRR4       # \        P                  ! RV  R24        RRR4       R# R#   + '       g   i     R# ; i  \        P                   d(   p\        P                  ! RT  RT 24        Rp?R# Rp?i\         d%   p\        P                  ! R	T 24        Rp?R# Rp?ii ; i)
u)   Carrega o estado do portfólio se existirr	   r
   r   NzArquivo u    está vaziozErro ao decodificar JSON em : zErro ao carregar estado: )ospathexistsr   r   r   loggingwarningJSONDecodeErrorerror	Exception)r   r   dataes   &   r   carregar_estado_portfolior(   )   s    77>>(##hg66$yy 76
 OOhxj$EF 76  76  4XJbDE 1!56sW   $B# B#  B
B# (BB# B 	B#  B# #D8CD'D(DDc           	         \         P                  P                  V 4      '       d7   \        V RRR7      ;_uu_ 4       p\        P
                  ! V4      pRRR4       M/ pRX9  d   / VR&   V FA  pVP                  V^ 4      pV^ 8  g   WTR,          9   g   K+  \        V^4      VR,          V&   KC  	  \        P                  ! \        4      P                  4       VR&   \        V RRR7      ;_uu_ 4       p\        P                  ! WC^RR	7       RRR4       \        P                  ! R
V  24       R#   + '       g   i     L; i  + '       g   i     L>; i  \         d%   p\        P                   ! RT 24        Rp?R# Rp?ii ; i)u%  
✓ NOVO: Salva as quantidades REAIS de cada moeda no portfolio_estado.json
Isso serve como "fonte de verdade" para recuperação em caso de parada do robô

Args:
    filepath: Caminho do arquivo de estado
    moedas: Lista de moedas
    saldos: Dicionário com os saldos atuais da exchange
r	   r
   r   Nquantidade_carteira_realtimestamp_carteira_realr   Fr   u,   ✓ Quantidades reais da carteira salvas em z%Erro ao atualizar quantidades reais: )r   r   r    r   r   r   getroundr   nowtimezone	isoformatr   r!   infor%   r$   )r   moedassaldosr   r   moedasaldor'   s   &&&     r   "atualizar_quantidade_carteira_realr6   <   s8   C77>>(##hg66$4 76 F &V313F-.EJJua(EqyE,F%GG<A%O1259	  -5LL,B,L,L,N() (C'22dIIf15A 3 	CH:NO- 76& 32
  C=aSABBCsR   $E E D0?E AE 3E!E 0E 	;E E	E F!F  Fc                p   / pRV 9  d   V# V R,          pRpV F  pWd9   g   K  WF,          pVP                  V^ 4      p\        W,
          4      p	W8  g   K>  V	\        WxV4      ,          ^d,          p
V
R8  g   Ka  R\        V^4      R\        V^4      R\        V	^4      R\        V
^4      /W6&   K  	  V'       d   \        P
                  ! R4       \        P
                  ! R	4       VP                  4        F  w  rk\        P
                  ! R
V R24       \        P
                  ! RVR,           RV 24       \        P
                  ! RVR,           RV 24       \        P
                  ! RVR,           RVR,           R24       K  	  \        P
                  ! R4       \        P
                  ! R4       V# )uY  
✓ NOVO: Verifica se há discrepâncias entre as quantidades salvas e as atuais
Se houver diferenças significativas, registra em log para auditoría

Args:
    estado: Estado do portfólio carregado
    moedas: Lista de moedas
    saldos: Dicionário com saldos atuais da exchange

Returns:
    dict: Relatório de discrepâncias encontradas
r*   h㈵>皙?quantidade_salvaquantidade_atual	diferenca
percentualu,   
🚨 DISCREPÂNCIAS DETECTADAS NA CARTEIRA:z:   (Quantidades salvas vs. quantidades atuais na exchange)u      • :z     - Salva:  z     - Atual: u        - Diferença:  (%)uF   
💡 SUGESTÃO: As quantidades ATUAIS serão usadas como referência.uU      Se quiser sincronizar forçadamente, as quantidades da exchange têm precedência.)r,   absmaxr-   r!   r"   items)r   r2   r3   discrepanciasr:   limite_minimor4   	qtd_salva	qtd_atualr<   percentual_diffr1   s   &&&         r   verificar_discrepancia_carteirarJ   c   s    M!/89M$(/I

5!,II12I (#,s9/W#W[^"^"S(*E)Q,?*E)Q,?#U9a%8$eOQ&?	,M( & GHTU(..0KEOOgeWA./OOnT2D-E,FawOPOOnT2D-E,FawOPOO1${2C1DBtLGYFZZ\]^	 1 	abop    zpt_BR.UTF-8zPortuguese_Brazil.1252 configuracoes_balanceamento.jsonapi_key 
api_secretapi_key_testnetapi_secret_testnettestnetF
moeda_baseUSDTcapital_inicial  tempo_ciclotempo_refresh_tela	timeframe5mvariacao_balanceamento       @comissaor9   saldo_minimosaldo_minimo_usdtg      @comprar_imediatamentereinvestir_ganhos_percentualreset_portfolio_ao_iniciaraguardar_melhor_hora	portfoliozlog_balanceamento.logzportfolio_estado.json:NNNr
   )maxBytesbackupCountr   z%(message)szAmerica/Sao_Pauloc                     \         P                  ! 4       p V P                  4       p\        \        P                  ! 4       R,          4      pW,
          p\        V4      R8  dp   \        P                  ! R\        V4       R24       \        \        P                  RVR,          R RV^ 8  d   RMR 2,           \        P                  ,           4       V#   \         d%   p\        P                  ! R	T 24        R
p?^ # R
p?ii ; i)zHSincroniza o timestamp com o servidor da Binance para evitar erros -1021rV   u)   Desincronização de relógio detectada: msu    ⚠ AVISO: Relógio do PC está .1fzs 	adiantadoatrasadou*   Não foi possível sincronizar timestamp: N)ccxtbinance
fetch_timeinttimerB   r!   r"   printr   YELLOWr   	RESET_ALLr%   )public_exchangeserver_time
local_timetime_offsetr'   s        r   sincronizar_timestamp_binancerx      s    ,,.%002t+,
!.{d"OOGKHXGYY[\]$++"B;tCSTWBXXZjuxyjy[f  @J  [K  !L  L  OT  O^  O^  ^  _ DQCHIs   CC D C??DapiKeysecretenableRateLimitToptionsdefaultTypespot
recvWindowi N  timeDifferencez-Modo Testnet: ATIVADO (usando chaves testnet)zModo Testnet: DESATIVADOu*   Compra Imediata: ATIVADA (tolerância 10%)u,   Compra Imediata: DESATIVADA (tolerância 2%)u   Valor Mínimo de Operação: $.2fz
 (Binance)u   Proteção USDT: Mínimo $u    (não será gasto)u"   ✓ Exchange conectada com sucessou)   ✓ Mercados carregados (Exchange pronta)zFalha ao configurar exchange: c                    \         P                  ! \        4      P                  R4      pRV RV  2p\        P
                  ! V4       \        V4       R# )u   Log e print simultâneos%d/%m/%Y %H:%M:%S[z] N)r   r.   r/   strftimer!   r1   rq   mensagem	timestampmsg_completas   &  r   log_infor   $  sB    X&//0CDIykH:.LLL	,rK   c                    \         P                  ! \        4      P                  R4      pRV RV  2p\        P
                  ! V4       \        \        P                  V,           \        P                  ,           4       R# )zLog e print de error   r   z] ERRO: N)r   r.   r/   r   r!   r$   rq   r   REDr   rs   r   s   &  r   log_error   +  sT    X&//0CDIyk(4LMM,	$((\
!EOO
34rK   c                    \         P                  ! \        4      P                  R4      pRV RV  2p\        P
                  ! V4       \        \        P                  V,           \        P                  ,           4       R# )zLog e print de avisor   r   z	] AVISO: N)r   r.   r/   r   r!   r"   rq   r   rr   r   rs   r   s   &  r   	log_avisor   2  sT    X&//0CDIyk8*5LOOL!	$++
$u
67rK   c                    \         P                  ! \        4      P                  R4      pRV RV  2p\        P
                  ! V4       \        \        P                  V,           \        P                  ,           4       R# )zLog e print de sucessor   r   u   ] ✓ N)r   r.   r/   r   r!   r1   rq   r   GREENr   rs   r   s   &  r   log_sucessor   9  sT    X&//0CDIykz2LLL	$**|
#eoo
56rK   c                J   ^p\        V4       FZ  p \        P                  V 4      pVP                  R4      ;'       g    VP                  R4      pV'       d   \	        V4      u # Ru # 	  R#   \
         d   p\        T4      pRT9   g   RT9   dg   Y!^,
          8  dZ   \        RT  RT^,            RT R	24       \        4       s	\        \        P                  R
&   \        P                  ! ^4        Rp?K  Y!^,
          8X  d   \        RT  RT 24        Rp? R# Rp?ii ; i)u:   Obtém o preço atual de um símbolo com retry automáticolastcloseN-1021	TimestampzErro de timestamp ao obter  , resincronizando... (tentativa /)r   u   Erro ao obter preço de r   )rangeexchangefetch_tickerr,   floatr%   strr   rx   rw   r|   rp   sleepr   )symbolmax_tentativas	tentativatickerpricer'   erro_strs   &      r   obter_preco_atualr   @  s   N>*		**62FJJv&==&**W*=E#(5<2d2	 +
  	1vH("kX&=11 ;F8Ccdmpqdqcrrs  uC  tD  DE  F  G"?"AK9DH$$%56JJqMQ..3F82aSAB	s/   ,A.A.
A.&A..D"9A9D8DD"c                   ^p\        V4       F  p \        P                  V 4      pVP                  R4      ;'       g+    VP                  R4      ;'       g    VP                  R4      pVfi   VP                  R4      ;'       g    VP                  R4      pVP                  R4      pV'       d&   V'       d   V^ 8  d   WV,
          V,          ^d,          pVe   \	        V4      u # Ru # 	  R#   \
         d   p\        T4      pR	T9   g   R
T9   dL   Y!^,
          8  d?   \        4       s\        \        P                  R&   \        P                  ! ^4        Rp?EKP  Y!^,
          8X  d   \        RT  RT 24        Rp? R# Rp?ii ; i)uJ   Obtém a variação percentual de 24h de um símbolo com retry automático
percentagechangechangePercentNr   r   r           r   r   r   u    Erro ao obter variação 24h de r   )r   r   r   r,   r   r%   r   rx   rw   r|   rp   r   r   )	r   r   r   r   variacaoclose_price
open_pricer'   r   s	   &        r   obter_variacao_24hr   X  sD   N>*		**62F zz,/ff6::h3Gff6::VeKfH $jj0GGFJJw4G#ZZ/
:*q.!,!9Z G3NH&.&:5?CC +  	1vH("kX&=11"?"AK9DH$$%56JJqMQ..;F82aSIJ	sA   ,C/C/-C/*C/1C/9+C/'C//F:AFFFc                    ^p\        V4       FE  p \        P                  4       pVP                  R/ 4      p\	        VP                  V ^ 4      4      u # 	  R	#   \
         d   p\        T4      pRT9   g   RT9   dg   Y!^,
          8  dZ   \        RT  RT^,            RT R24       \        4       s	\        \        P                  R&   \        P                  ! ^4        R	p?K  Y!^,
          8X  d   \        R
T  RT 24        R	p? R# R	p?ii ; i)u:   Obtém saldo disponível de um ativo com retry automáticofreer   r   z$Erro de timestamp ao obter saldo de r   r   r   r   NzErro ao obter saldo de r   r   )r   r   fetch_balancer,   r   r%   r   r   rx   rw   r|   rp   r   r   )ativor   r   balancer   r'   r   s   &      r   obter_saldor   x  s   N>*		,,.G;;vr*D%+,,	 +
  	1vH("kX&=11 DUGKkluxylykzz{  }K  |L  LM  N  O"?"AK9DH$$%56JJqMQ..25'A3?@	s   A AD$A9D#DDc                b    / pV  F  p\        V4      W&   K  	  \        \        4      V\        &   V# )u.   Obtém saldos de todas as moedas do portfólio)r   
MOEDA_BASE)r2   r3   r4   s   &  r   obter_saldos_portfolior     s1    F#E* $Z0F:MrK   c                    V \         P                  9  d	   RRV  R23# \         P                  V 4      pVP                  R4      ;'       g    VP                  R4      pVP                  R4      pV'       d   V^ 8:  d   RRV  RV R23# Ve   V^ 8X  d	   RRV  R
23# RRV  RVR RVR 23#   \         d   pRRT  R\        T4       23u R	p?# R	p?ii ; i)u   
Verifica se um par de trading está disponível e funcionando no testnet

Returns:
    tuple: (está_disponível, info_diagnóstica)
FzPar u9    não está na lista de símbolos disponíveis no testnetr   r   
baseVolumeu#    não tem preço válido (último: r   Nz* tem volume zero - sem liquidez no testnetTu    OK - Preço: .8fz
, Volume: zErro ao verificar par r   )r   symbolsr   r,   r%   r   )r   r   
last_pricevolumer'   s   &    r   verificar_par_disponivelr     s   B)))D(abbb &&v.ZZ'>>6::g+>
L)Z1_D(KJ<WXYYY>Vq[D(RSSStF8>*S1AFSV<XXX B.vhbQAAABs:   B+ ,B+ *B+ 7B+ 	B+ B+ +C6CCCc                    VP                  \        ^ 4      pV  FI  pVP                  V^ 4      pVP                  V^ 4      pV^ 8  g   K0  V'       g   K:  W5V,          ,          pKK  	  V# )u+   Calcula o valor total do portfólio em USDT)r,   r   )r2   r3   precosvalor_totalr4   
quantidadeprecos   &&&    r   obter_valor_portfolior     s\    **Z+KZZq)


5!$>ee--K	 
 rK   c                   ^ pV'       dV   RV9   dO   VR,           FA  pVR,          R9   d   WER,          ,          pK"  VR,          R9   g   K2  WER,          ,          pKC  	  ^ pV  FQ  pVR8w  g   K  VP                  V^ 4      pVP                  V^ 4      p	V^ 8  g   K9  V	^ 8  g   KB  WhV	,          ,          pKS  	  Wd,
          p
V
# )u  
✓ NOVO: Calcula o ganho REAL do portfólio baseado no histórico de trades

Ganho Real = (Valor atual das moedas em USDT) - (Capital investido em moedas)
NÃO inclui USDT congelado/residual

Args:
    moedas: Lista de moedas do portfólio
    saldos: Dicionário com saldos atuais
    precos: Dicionário com preços atuais
    estado: Estado do portfólio com histórico_trades

Returns:
    float: Ganho/Perda real em USDT (apenas das moedas compradas)
historico_tradestipovalorrT   )compra_inicialcompra_balanceamento)venda_balanceamentor,   )r2   r3   r   r   capital_investido_moedastradevalor_moedas_atualr4   r   r   
ganho_reals   &&&&       r   calcular_ganho_realr     s    "  !$..//EV} JJ('N:(v"99('N:(	 0 F?E1-JJJua(EA~%!)"5&88"  $>JrK   c           	        V'       d&   V'       d   V'       d   V'       d   \        WW44      pM\        ^ V \        ,
          4      p\        ^ 8:  d   \        p^ pR\        R R2pMXV\        ^d,          ,          p\        V,           pV^ 8  d    WW,
          p	RVR RVR R\        R RV	R 2pMV^ 8  d	   R	VR R
2pMRpWeWx3# )u  
Calcula o limite de portfólio considerando reinvestimento parcial de ganhos

Args:
    valor_portfolio_real: Valor total real do portfólio em USDT
    moedas: Lista de moedas (opcional, para cálculo de ganho real)
    saldos: Dicionário de saldos (opcional, para cálculo de ganho real)
    precos: Dicionário de preços (opcional, para cálculo de ganho real)
    estado: Estado do portfólio (opcional, para cálculo de ganho real com histórico)

Returns:
    tuple: (valor_limite, ganho_total, ganho_reinvestido, status_msg)
    - valor_limite: Valor a usar para cálculos de compra/venda
    - ganho_total: Ganho total acumulado (REAL, baseado em trades)
    - ganho_reinvestido: Valor do ganho sendo reinvestido
    - status_msg: Mensagem de status para log
z"Modo PROTETOR: Usando EXATAMENTE $r   z (ganhos congelados)zGanho Total: $z | Reinvestindo: $r@   .0fz%) | Congelado: $zPerda Atual: $u    (portfólio em recuperação)u<   Sem ganhos/perdas ainda (portfólio em fase de acumulação))r   rC   CAPITAL_INICIALREINVESTIR_GANHOS_PERCENTUAL)
valor_portfolio_realr2   r3   r   r   ganho_totalvalor_limiteganho_reinvestido
status_msgganho_congelados
   &&&&&     r   calcular_limite_reinvestimentor     s    & &V)&&I !1OCD $q(&9/#9NNbc
'+G#+MN&)::?)=O*;s*; <++<S*AD`adCe f((7'<>J 1_)+c)::XYJWJ&7CCrK   c                    / pV^ 8:  d   V  F  p^ WE&   K	  	  V# V  FU  pVP                  V^ 4      pVP                  V^ 4      pV^ 8  d$   V'       d   Wg,          pW,          ^d,          WE&   KQ  ^ WE&   KW  	  V# )u9   Calcula os percentuais atuais de cada moeda no portfólior   )	r2   r3   r   r   percentuaisr4   r   r   valor_moedas	   &&&&     r   calcular_percentuais_atuaisr     s    KaE!"K ZZq)


5!$>e$,K"-";s!BK!"K  rK   c                   \        V 4      ^8  d   V . 3# \        V 4      p\        V4      pV^,          p^V,          ^,          pW,          pW,          pWe,
          pVRV,          ,
          pVRV,          ,           p	. p
. p\        V 4       F:  w  rYu;8:  d   V	8:  d   M MV
P                  V4       K)  VP                  V4       K<  	  W3# )u   
Remove outliers usando o método Interquartile Range (IQR)

Args:
    precos: lista de preços

Returns:
    tuple: (preços filtrados sem outliers, índices dos outliers)
g      ?)lensorted	enumerateappend)r   sorted_precosnq1_idxq3_idxq1q3iqrlimite_inferiorlimite_superiorprecos_filtradosindices_outliersidxr   s   &             r   remover_outliers_iqrr   &  s     6{Qrz 6NMMA!VFUaZF		B		B
'C 39nO39nO '
66##E*##C(	 ( --rK   c                    \        V 4      # )ut   
DESCONTINUADO: Use obter_melhores_precos_30dias() em vez disso.
Mantido para compatibilidade com versões antigas.
)obter_melhores_precos_30dias)r2   s   &r   obter_melhores_precos_5diasr   M  s    
 (//rK   c                >  a. / p RpV  EF  p V R\          2p\        P                  WB^R7      pV'       d   \        V4      ^8  d   \	        RV R\        V4       R24       K\  \        V4      ^8  d   VR?R MTp\        V4      pV Uu. uF  qw^,          NK  	  ppV Uu. uF  qw^,          NK  	  p	p\        V4      w  r\        V	4      w  r\        V4      \        V4      ,          p\        V4      pWo,
          pV^ 8  d   W,          ^d,          M^ p/ p\        V4       F  w  ppVV9  g   K  V^ ,          p\        P                  ! VR,          \        R	7      pVP                  R
4      pVV9  d   . VV&   VV,          P                  RVP                  RV^,          RV^,          /4       K  	  \        V4      p^ 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. //o.VP                  4        EF  w  ppV'       g   K  \        ^4       Uu/ uF  pV. bK  	  ppV F4  pVR,          ^,          pV^8  d   ^pVV,          P                  V4       K6  	  / p/ pVP                  4        F^  w  ppV'       g   K  \!        R V 4       4      \        V4      ,          p\!        R V 4       4      \        V4      ,          p VVV&   V VV&   K`  	  V'       dj   \#        VVP$                  R7      p!S.V!,          R;;,          ^,          uu&   VV!,           F)  pS.V!,          R,          P                  VR,          4       K+  	  V'       g   EKX  \'        VVP$                  R7      p"S.V",          R;;,          ^,          uu&   VV",           F)  pS.V",          R,          P                  VR,          4       K+  	  EK  	  V^ 8X  d   \	        V R24       EK  \'        S.V.3R lR7      p#\'        S.V.3R lR7      p$S.V#,          R,          p%S.V$,          R,          p&V^ 8  d   V%V,          ^d,          M^ p'V^ 8  d   V&V,          ^d,          M^ p(R p)V)! S.V#,          R,          4      p*V)! S.V$,          R,          4      p+R RS.V#,          R,          R!V*R"\)        V'^4      R#V%/R$RS.V$,          R,          R!V+R"\)        V(^4      R#V&/R%R&VR'VR(VR)\)        V^4      R*V/R+\        P*                  ! \        R	7      P-                  4       /p,V,W&   \/        R,V R-24       \/        R.V R/V R0^dV,
          R1 R224       \/        R3V R4VR1 R224       \/        R5V,R ,          R,           R6V* R7V'R1 R8V% R9V R:24       \/        R;V,R$,          R,           R6V+ R7V(R1 R8V& R9V R:24       EK  	  V# u upi u upi u upi   \0         d   p-\	        R<T R=T- 24        Rp-?-EK  Rp-?-ii ; i  \0         d   p-\3        R>T- 24       / u Rp-?-# Rp-?-ii ; i)@uw  
Busca os melhores preços (máxima e mínima) dos últimos 30 dias (ou máximo disponível) para cada moeda
usando dados OHLCV (Open, High, Low, Close, Volume) da exchange
Remove outliers para análise de padrões de horário mais confiáveis

Retorna análise consolidada sem detalhe dia a dia para maior confiabilidade.
Com ~250+ candles (≈10-11 dias), a confiança dos padrões é muito boa.

Returns:
    dict: {
        'moeda': {
            'melhor_hora_compra': { hora, confianca%, ocorrencias },
            'melhor_hora_venda': { hora, confianca%, ocorrencias },
            'analise': {
                'total_registros': int (candles coletados),
                'registros_validos': int (após remover outliers),
                'total_outliers': int,
                'percentual_outliers': float (%)
            },
            'timestamp': str (ISO 8601)
        }
    }
1hr   )limitzCandles insuficientes para z (precisa 200, tem r   NrV   tzz%Y-%m-%dhoralowhighlabelz00:00-03:59dias_vencedor_compradias_vencedor_vendahoras_comprahoras_vendaz04:00-07:59z08:00-11:59z12:00-15:59z16:00-19:59z20:00-23:59c              3   2   "   T F  qR ,          x  K  	  R# 5i)r   N .0cs   & r   	<genexpr>/obter_melhores_precos_30dias.<locals>.<genexpr>  s     1RMqE((M   c              3   2   "   T F  qR ,          x  K  	  R# 5i)r   Nr  r  s   & r   r
  r    s     2TmV99mr  )keyu   : Nenhum dia com dados válidosc                 $   < SV ,          R ,          # )r  r  xgrupos_horass   &r   <lambda>.obter_melhores_precos_30dias.<locals>.<lambda>  s    lSToVlFmrK   c                 $   < SV ,          R ,          # )r  r  r  s   &r   r  r    s    \RS_UjEkrK   c                    V '       g   R# \        R V  4       4      pV\        V 4      ,          p\        V^<,          4      p\        V^<,          4      pVR RVR 2# )u&   Calcula a hora média em formato HH:MMN/Ac              3   2   "   T F  q^<,          x  K  	  R# 5i)<   Nr  )r  hs   & r   r
  Lobter_melhores_precos_30dias.<locals>.calcular_hora_media.<locals>.<genexpr>  s     'C
1B
r  02dr>   )sumr   ro   )
horas_listtotal_minutosmedia_minutoshorasminutoss   &    r   calcular_hora_media9obter_melhores_precos_30dias.<locals>.calcular_hora_media  s[    %$ %('C
'C$CM$1C
O$CM 34E!-""45G#C['#77rK   melhor_hora_compra
hora_media	confiancaocorrenciasmelhor_hora_vendaanalisetotal_registrosregistros_validostotal_outlierspercentual_outliers
total_diasr     r>   u       📊 Registros: z coletados | u    válidos (ri   rA   u       ⚠️  Outliers: z removidos (u       ✓ Faixa COMPRA:  u    | Hora Média: u    | Confiança: z% | Melhor em  de z diasu       ✓ Faixa VENDA:   zErro ao buscar dados de r   u    Erro ao obter melhores preços: i)r   r   fetch_ohlcvr   r   r   setr   r   fromtimestampr/   r   r   hourrD   r   r  minr,   rC   r-   r.   r0   r   r%   r   )/r2   melhores_precosrY   r4   r   candlesr+  candlehighslowshighs_filtradosoutliers_highlows_filtradosoutliers_lowr   r-  r,  r.  candles_por_datar   r   dtdata_strr/  candles_diai
grupos_dia	grupo_idxprecos_medios_compraprecos_medios_vendacandles_grupopreco_medio_lowpreco_medio_highmelhor_compra_diamelhor_venda_diamelhor_grupo_compramelhor_grupo_vendar  r  confianca_compraconfianca_vendar#  hora_media_comprahora_media_vendadados_moedar'   r  s/   &                                             @r   r   r   T  s   0 Os 	Eg!7!J<0 #..v.L#g,"4 ;E7BUVYZaVbUccdef -0LC,?'$%.W"%g, 299v9078fq		8 2Fe1L./CD/I, $'}#5L8I#I !$%5!6$3$D!RadeRe~'G#'Mkl# $& #,W#5KC"22$*1I	%33I4DR#%;;z#:#+;;9;,X6(299"BGG!6!9"F1I;  $6 !!12
 0FK`bcesuw  zG  IK  L0FK`bcesuw  zG  IK  L0FK`bcesuw  zG  IK  L0FK`bcesuw  zG  IK  L0FK`bcesuw  zG  IK  L0FK`bcesuw  zG  IK  L  .>-C-C-E)Hk&  27q!:A!R%J!:"-$*6Na$7	$>()I"9-44V<	 #. ,.(*,'4>4D4D4F0	=(=.11RM1R.RUXYfUg.gO/22Tm2T/TWZ[hWi/i,>M0;=M/	: 5G ,,/0DJ^JbJb,c)$%678NOSTTO&01B&C&CF():;NKRRSYZ`Sab 'D +*+./BH[H_H_+`($%567LMQRRM&01A&B&BF()9:=IPPQWX^Q_` 'CK .FP ?'FGH '*,<m&n#%(;k%l" (44G'HI_'`$&23E&FG\&]#PZ]^P^$8:$E$Kde NX[\n#6#Cc#Ibc
8 %8EX8YZh8i$j!#6|DV7WXe7f#g  )-@ A' J$&7#U+;Q%?%';	+ (-? @ I$&6#U?A%>%':	* )?+->(.-u5H!/L$j   !:!D!D!F). *5& 2eWA'//@N_M``klo  qD  mD  EH  lI  IK  L  M1.1ANabeMffhij2;?S3TU[3\2]]mn  nA  AP  Qa  be  Pf  ft  uI  tJ  JN  OY  NZ  Z_  `  a2;?R3STZ3[2\\lm}l~  N  O^  _b  Nc  cq  rE  qF  FJ  KU  JV  V[  \  ]I T s :8b ";F  4UG2aSAB  3A378	s   W7 AW#W7 %&WV=W"W3A9W1DW7WAW#AW=A.W1BW4W7 7F?W6W7 =WW4W/(W7 /W44W7 7XXXXc                     \        R4       \        V4      pV'       d-   W R&   \        \        V 4       \        R\	        V4       R24       V #   \
         d   p\        RT 24       T u Rp?# Rp?ii ; i)u   
Atualiza o arquivo de estado do portfólio com os melhores preços dos últimos 30 dias (ou máximo disponível)
Incluindo análise de padrões de horário e detecção de outliers
uP   Atualizando dados de melhores preços (até 30 dias com análise consolidada)...best_prices_30daysu9   ✓ Dados de melhores preços (30 dias) atualizados para z moedasu$   Erro ao atualizar melhores preços: N)r   r   r   PORTFOLIO_STATE_FILEr   r%   r   )r   r2   r7  r'   s   &&  r   #atualizar_melhores_precos_portfoliorX  #  sv    
cd6v>+:'(#$8&APQTUdQePffmno 7s;<s   AA A3A.(A3.A3c                    \        V 4      pV'       d   V^ 8:  d   \        RV  R24       R# VR8X  d   VR,          pM	VR,          p\        RV RV RV  24       \        R	VR
 24       \        RVR
 24        \        P	                  V VVVRR/4      p\
        P                  ! \        4      P                  R4      pVP                  RR4      pVP                  RR4      pVP                  R^ 4      p	VP                  R^ 4      p
\        RV RV RV	R
 RV
R
 24       VR8X  dL   \        RV R24       \        R4       \        RV  R24       \        RVR
 R 24       \        R!VR
 R"24       R# VR#8X  d   \        R$V R24       R# VR%8X  d   \        R&VR
 RV  R'V 24       V# \        R(VR
 RV  R'V 24       V#   \         Edm   p\        T4      p\        R)T 24       \        R*4        \        P                  YT4      p\
        P                  ! \        4      P                  R4      pTP                  RR4      pTP                  RR4      pTP                  R^ 4      p	TP                  R^ 4      p
\        RT RT RT	R
 RT
R
 24       TR8X  d!   \        R+T R24       \        R,4        Rp?R# TR%8X  d   \        R-TR
 RT  R'T 24       M\        R.TR
 RT  R'T 24       Tu Rp?#   \         d5   p\        R/T  24       \        R0\        T4       24        Rp? Rp?R# Rp?ii ; iRp?ii ; i  \         dE   p\        R1T R2T  R3TR
 R4T 24       \        R5\        P                   ! 4        24        Rp?R# Rp?ii ; i)6ut   
Executa uma ordem de compra ou venda (limit order)
Limit orders são mais confiáveis no testnet que market orders
u   Falha ao obter preço para u)   . Não será possível criar limit order.NbuygRQ?g\(\?z  Criando limit order: r?          Preço Atual: r   u       Preço Limite: timeInForceGTCr   idr  statusdesconhecidofilledamountz  ID: z | Status: z | Preenchida: r   expiredu1     ⚠️ AVISO: Ordem expirou imediatamente (ID: r   u        Possíveis causas:z     1. Par u"    pode não ter liquidez no testnetz     2. Quantidade u    pode ser inválidau        3. Preço z fora do spreadcanceledu6     ⚠️ AVISO: Ordem foi cancelada pela Binance (ID: sellu   ✓ Ordem de VENDA executada: z em u   ✓ Ordem de COMPRA executada: z  Limit order falhou: z(  Tentando market order como fallback...u+     ⚠️ Market order também expirou (ID: z7     Problema aparentemente com par/liquidez no testnetu'   ✓ Ordem de VENDA (market) executada: u(   ✓ Ordem de COMPRA (market) executada: z+  Ambas market e limit order falharam para z  Market error: zFalha ao executar ordem z para r@   z): z  Rastreamento: )r   r   r   r   create_limit_orderr   r.   r/   r   r,   r   r%   r   r   create_market_order	traceback
format_exc)r   sider   preco_atualpreco_limiteordemr   order_idr_  ra  rb  e_limitr   e_marketr'   s   &&&            r   executar_ordemrq  8  s   
^'/kQ.26(:cde 5=&-L&-L*4&*QvhGH%k#%678&|C&89:F	//!5E !X.778KLI yyu-HYYx8FYYx+FYYx+FvhZ{6(/&QTUVW]^aVbcd "LXJVWXY24<x/QRS.z#.>>QRS?<*<OLM:%QRZQ[[\]^v~<Z<LAfXUYZcYdef L =j=MQvhVZ[dZefgL 	7|H.xj9:@B 44V:N$LL2;;<OP	 99T518^<8Q/8Q/6(;vhofUX\YZ[abeZfghY&J8*TUVWVX6>"I*UXIYYZ[aZbbfgpfq rs"J:VYJZZ[\b[ccghqgr st FvhOP+CM?;<t9	B  +D6xr*SAQQTUVTWXY#I$8$8$:#;<=s   )L9 AL9 :C5F> 1F> 	F> 'F> >L6
$L1/CK/0L9 63K/)L6*L9 /L.:%L)L1#L9 )L..L11L66L9 9N9NNc                *    V ^\         ,
          ,          # )u   Aplica comissão à quantidade)COMISSAO)r   s   &r   aplicar_comissaort    s    X&&rK   c           	     f    V \         8  d   RV RV RV R R\         R R2	pRV3# RRV RV R	V R 23# )
u   
Valida se o valor da operação atende ao mínimo da Binance ($5 USD/USDT)

Args:
    valor_operacao: Valor da operação em USDT
    moeda: Símbolo da moeda (ex: BTC)
    tipo_operacao: 'compra' ou 'venda'

Returns:
    tuple: (é_válido, mensagem)
u   Operação de r1  z BLOQUEADA: Valor $r   u    é inferior ao mínimo de $z exigido pela BinanceFTz validada: $)VALOR_MINIMO_OPERACAO)valor_operacaor4   tipo_operacaor   s   &&& r   validar_valor_operacaory    sm     --$]O4w ?*3/ 0+C00EG h>-UG<WZG[\\\rK   c                    RV 9  g   WR,          9  d   R
# V R,          V,          pRV9  d   R
# VR,          R,          pVR,          R,          pVP                  R4      p\        V4      ^8X  dU   \        V^ ,          P                  R4      ^ ,          4      p\        V^,          P                  R4      ^ ,          4      pWgV3# R
#   \         d   p\	        RT R	T 24       R
u Rp?# Rp?ii ; i)u  
Extrai a melhor hora de compra do estado do portfólio

Args:
    estado: Estado atual do portfólio
    moeda: Símbolo da moeda

Returns:
    tuple: (hora_inicio, hora_fim, confianca) ou (None, None, 0) se não encontrar
    Exemplo: (8, 11, 60.5) para o período 08:00-11:59
rV  Nr%  r   r'  -r>   u(   Erro ao extrair horário de compra para r   )NN    )splitr   ro   r%   r   )	r   r4   rT  melhor_horar'  parteshora_iniciohora_fimr'   s	   &&       r   extrair_horario_comprar    s    v-EY>Z1Z  1259{2  !"67? 45kB	 ""3'v;!fQiooc2156K6!9??3/23H)33 <UG2aSIJs.   C C BC C C0C+%C0+C0c                J   \        W4      w  r#pVf   RV  R23# \        P                  ! \        R7      P                  pW#8:  d   Y%u;8*  ;'       d    V8*  Mu pMWR8  ;'       g    WS8*  pVR RVR R2pV'       d   V  RV RVR	 R
2pRV3# VR R2p	V  RV RVR	 RV	 2pRV3# )u   
Verifica se a hora atual está dentro do melhor período de compra para a moeda

Args:
    moeda: Símbolo da moeda
    estado: Estado atual do portfólio com best_prices_30days

Returns:
    tuple: (está_no_horário_ideal, mensagem_info)
Fu@   : Dados de melhor hora não disponíveis (análise em progresso)r   r  :00-:59u!   : ✓ HORÁRIO IDEAL de compra! (   , confiança: ri   rA   Tz:00u(   : ⏰ Aguardando melhor hora de compra (u   %). Próxima às )r  r   r.   r/   r5  )
r4   r   r  r  r'  
hora_atualesta_dentroperiodo_strr   proxima_hora_compras
   &&        r   eh_horario_compra_idealr    s     (>f'L$K9_```*//J !;;8; !/II:3I %T(3s;KW=k].YbcfXggijX~!,S 15WD[MQ_`ijm_nn  AT  @U  VhrK   c                B   \        W4      w  r#pVf   ^ # \        P                  ! \        R7      pVP                  pVP
                  pY&u;8:  d
   V8:  d    ^ #  Wb8  d   W&,
          ^<,          V,
          pM^V,
          V,           ^<,          V,
          p\        ^ V4      # )u   
Calcula quantos minutos faltam até a melhor hora de compra

Args:
    moeda: Símbolo da moeda
    estado: Estado atual do portfólio

Returns:
    int: Minutos até a melhor hora (ou 0 se já está na melhor hora)
r   )r  r   r.   r/   r5  minuterC   )	r4   r   r  r  _agorar  minuto_atual	tempo_ates	   &&       r   calcular_tempo_ate_melhor_horar    s      6fDK1LLH%EJ<<L,H, -  -3lB	 *_{2b8<G	q)rK   c           
        Vf   ^p\        W4      w  r4pVf   \        V  R24       R^ V  R23# \        P                  ! 4       p^ p^
p^ p	  \        W4      w  rV
'       d/   \	        V^<,          ^4      pV  RV RVR R	2p\        V4       RW3# \        P                  ! 4       V,
          pV^<,          pW8  d   \        V  R
V R24       RW R23# W8  d-   \        W4      p\        V  RVR RV RV R24       V^,           p	\        P                  ! V4       K    \         d$   p\        RT  RT 24       R^ T  R23u Rp?# Rp?ii ; i)u  
Aguarda até a melhor hora de compra para a moeda

Args:
    moeda: Símbolo da moeda
    estado: Estado atual do portfólio
    tempo_maximo_minutos: Tempo máximo de espera em minutos (None = 5 min como padrão)

Returns:
    tuple: (aguardou, tempo_esperado_minutos, mensagem)
NuM   : Análise de melhor hora não disponível - prosseguindo com compra imediataFu*   : Análise de melhor hora não disponívelTu.   : ✓ Horário ideal de compra atingido após u    min de espera (confiança: ri   rA   u   : Tempo máximo de espera (z( min) atingido. Prosseguindo com compra.z: Timeout de espera atingidoz: Aguardando melhor hora... (r   z min, u    min até a janela ideal)z"Erro ao aguardar melhor hora para r   z*: Erro na espera - prosseguindo com compra)r  r   rp   r  r-   r   r  r   r   r%   r   )r4   r   tempo_maximo_minutosr  r  r'  tempo_inicialtempo_decorrido_segundosintervalo_verificacaoproximo_log
esta_idealmsgtempo_esperado_minmensagem_sucessotempo_decorrido_minutos
   tempo_atér'   s   &&&              r   aguardar_melhor_hora_comprar    s    # '=f'L$K9UGhijaE7"LMMMIIKM KN5eDOJ%*+Cb+H!%L"&+W,Z[mZn  oK  LU  VY  KZ  Z\  $] ,-/AA'+yy{]'B$&>&C# '>UG#>?S>TT|}~5@\7]]] '5;EJ
E7"?@WX[?\\]^r]ssy  {E  zF  F_  `  a59 JJ,- N5eWBqcBCaE7"LMMMNs-   AD AD A
D E
'E?E
E
c            	         Rp \        V RRR7      ;_uu_ 4       p\        P                  ! V4      pRRR4       XP                  R4      R8X  d   RVR&   \        V R	RR7      ;_uu_ 4       p\        P                  ! W!^RR
7       RRR4        \
        P                  P                  \        4      '       d.   \
        P                  ! \        4       \        R\         R24       \        R4       R#  R#   + '       g   i     L; i  + '       g   i     L; i  \         d    p\        R\         RT 24        Rp?L[Rp?ii ; i  \         d   p\        RT 24        Rp?R# Rp?ii ; i)u  
✓ NOVO: Desativa automaticamente o reset após ser executado com sucesso
Evita rodar limpeza desnecessária no próximo ciclo
- Desativa flag reset_portfolio_ao_iniciar na configuração
- Deleta portfolio_estado.json para forçar recriação com valores corretos
rL   r	   r
   r   Nrb   TFr   r   u   ✓ Arquivo u    deletado para recriaçãou   ⚠ Não foi possível deletar r   u8   ✓ Reset desativado automaticamente nas configuraçõesu2   ⚠ Não foi possível desativar reset na config: )r   r   r   r,   r   r   r   r    rW  remover   r%   r   )config_filefconfigr'   s       r   desativar_reset_apos_limpezar  Z  s4   L8+sW55YYq\F 6 ::23t;38F/0k399Q		&AEB :Y77>>"677II23,/C.DD^ _` RS <& - 65 :9  Y;<P;QQSTUSVWXXY
  LFqcJKKLsu   E C39E *DE (D 6-D #E 3D	>E D	E E$D>9E >EE E*E%%E*c           	     "   \         '       g   ^ # \        R&4       \        R4       \        R%4       \        R\        R R24       V  Uu/ uF  q\	        V R\
         24      bK  	  pp\        V 4      p^ p^ pV  EF  pVP                  V^ 4      pVP                  V^ 4      pVR8  g   K1  V^ 8  g   K:  Wx,          p	\        RV R24       \        R	VR
 RV 24       \        RVR
 24       \        RV	R 24       V R\
         2p
 VR,          p\        P                  V
RVVRR/4      pV'       db   \        P                  ! ^4       \        V4      pVR8  d$   \        RV R24       WI,          pV^,          pEK  \        RV RVR
 R24       EK  EK  	  \        \
        4      p\!        ^ V\        ,
          4      p\        R&4       \        RV R24       \        RVR 24       \        RVR 24       \        R\        R 24       V^28  d1   \        RVR R 24       \        R!4       \        R"\        R R#24       M\        R$4       \        R'4       \#        4        V# u upi   \         d   p\        RT RT 24        Rp?EK  Rp?ii ; i)(u   
✓ NOVO: Vende todas as moedas residuais para limpar o portfólio
Útil quando "reset_portfolio_ao_iniciar" está ativado

Args:
    moedas: Lista de moedas do portfólio

Returns:
    float: Saldo USDT total após limpar tudo (deve ser ~2000)
u;   🧹 MODO RESET ATIVADO - LIMPANDO PORTFÓLIO COMPLETAMENTEu1   
📋 Objetivo: Resetar para capital inicial de $r   z USDTr   r8   u   
🔄 Vendendo z
 residual:z
   Saldo: r   r?   u      Preço: $z   Valor: $gGz?re  r\  IOCu      ✓ z vendido com sucesso!u      ⚠ Venda parcial de z	 (restam r   u      ✗ Erro ao vender r   Nu   ✓ RESET CONCLUÍDO: z moedas vendidasz  Valor recuperado: $z  Saldo USDT final: $z  Capital Inicial: $u   
  ⚠️ AVISO: Há $z em USDT residual!u3     Este valor NÃO foi reinvestido na fase anterior.u     O robô usará exatamente $z + reinvestimentos.u#     ✓ Portfólio limpo com sucesso!<============================================================z=
============================================================z=============================================================
)RESET_PORTFOLIO_AO_INICIARr   r   r   r   r   r   r,   r   rf  rp   r   r   r   r%   r   rC   r  )r2   mr   r3   total_usdt_recuperadomoedas_vendidasr4   r5   r   valor_vendar   rl  rm  saldo_depoisr'   saldo_usdt_finalsaldo_usdt_residuals   &                r   limpar_moedas_residuaisr  {  s    &%mKLfA/RUAVV[\]AGHA"aS*#677FH#F+FO

5!$

5!$ 7?uqy-K(z:;z%AeW56|E#;/0{;s"345wa
|,F@$t| 33 "E* JJqM#.u#5L#g-#geW4I$JK-<-'1,!$<UG9\Z]L^^_"`a 7 R #:. a!1O!CD]((99IJK$%:3$?@A$%5c$:;<#OC#89:R+,?+DDVWXGI00EEXYZ9;] !"M IV  @1%1#>??@s%   I!A4I&<I&&J1J		Jc                 Z	   \          U u. uF%  q P                  RR4      '       g   K  V R,          NK'  	  pp \          U u/ uF-  q P                  RR4      '       g   K  V R,          V R,          bK/  	  pp \          U u/ uF-  q P                  RR4      '       g   K  V R,          V R,          bK/  	  pp \        '       d1   \        V4      p\	        RVR 24       \
        P                  ! ^4       \        \        4      pV'       Ed   \	        R4       \        V4      p\        WQV4      pV'       dC   \        R	4       \        R
4       \        R4       \        R4       \        R4       \	        R4       VP                  RVP                  R^ 4      4      p\        V^d,           8  d   \        V,
          p	\        R4       \        RVR 24       \        R\        R 24       \        RV	R 24       \        R4       \        VR&   \        VR&   RVR&   \        P                  ! \        4      P!                  4       VR&   \#        \        V4       \	        R4       MA\        VR&   VP                  RR4      '       d!   \%        R4       RVR&   \#        \        V4       RV9  g   VR,          '       g   \        R4       \'        WQ4      p\        V4      p\)        \        W4       WQ3# \        V4      p
V U u. uF  q
P                  V ^ 4      R8  g   K  V NK  	  pp V'       d   \        R\+        V4       RR P-                  V4       24       R!R"R#\        P                  ! \        4      P!                  4       R\        R\        RRR$VP/                  4       R%. R&VR'VR(. /
p\	        R)4       \        V4      p\)        \        W4       W3# R!R*R#\        P                  ! \        4      P!                  4       R\        R\        RRR$. R%VP/                  4       R&VR'VR(. /
p\	        R+4       \	        R,\         R-\0         24       \	        R.R P-                  V4       24       \	        R/V 24       \	        R0V 24       \	        R14       \        V4      p\)        \        W4       W3# u up i u up i u up i u up i )2u!   Inicializa o estado do portfólioativaTr4   r=   preco_comprau$   Após reset: Capital disponível = $r   u+   Carregando estado anterior do portfólio...uP   
⚠️ O robô detectou discrepâncias entre as quantidades salvas e as atuais.z   Isso pode ocorrer se:u&      • O robô foi parado abruptamenteu>      • Houve transações manuais na exchange durante a paradau;      • Problemas de sincronização com cálculos de ganhosuA   
   → Usando as quantidades ATUAIS da exchange como referênciacapital_rastreadorU   u&   
💰 INCREMENTO DE CAPITAL DETECTADO!u      • Capital Anterior: $u      • Capital Atual: $u      • Incremento: $uE      ⏰ Aguardando melhor hora de compra para investir novo capital...em_incremento_capitaldata_incremento_capitalu3   ✓ Estado com incremento de capital SALVO no discoFuI   ✓ Incremento de capital concluído! Voltando ao rebalanceamento normal.rV  z>Atualizando dados de melhor hora de compra antes de iniciar...r8   u$   Portfólio detectado no testnet com z	 moedas: z, fasebalanceamentodata_iniciomoedas_compradasmoedas_pendentespercentuais_alvoprecos_comprar   u9   ✓ Fase de Balanceamento iniciada (portfólio existente)
construcaouD   ===================== NOVO PORTFÓLIO INICIADO =====================Capital Inicial: r?   u   Moedas no Portfólio: zPercentuais Alvo: u   Preços de Compra (entrada): r  )PORTFOLIO_CONFIGr,   r  r  r   rp   r   r(   rW  r   rJ   r   r   r   r.   r/   r0   r   r   rX  r6   r   joincopyr   )r  r2   r  r  saldo_finalestado_existentesaldos_atuaisrE   r  
incrementosaldos_reaismoedas_com_saldor   s                r   inicializar_portfolior    sw   "2K"2QeeGT6Jjajj"2FK=Mf=MQVQVW^`dQe3'
AlO3=Mf<Le<LqPUPUV]_cPd2QwZ>!22<LMe "!-f57C7HIJ

101EF>? /v678HR_`ij01>?VWSTYZ -001DFVFZFZ[lnoFpq.44(+<<J?A23DS2IJK//DEF,Z,<=>]_2A./4C018<45:B,,x:P:Z:Z:\67 $$8:JKJK 5D01##$;UCCgh<A !89'(<>NO  '77?OPd?e?eVWBCS\ /v6*+?W'' *&1L#)N6a-=-=a-Cg-M6N8=M9N8OyY]YbYbcsYtXuvw O8<<1;;=#U 0]
 	LM /v6*+?W~ 	x||H-779?_BFKKM,BF ST  1:,?@%dii&7%89:!"2!345,]O<=X +62M&';VS>u LfeJ Os-   RRRR;R#R#0R(R(c                6   \        R4       RV 9  g   V R,          '       g   \        R4       \        W4      p \        V4      pV Uu/ uF  q3\	        V R\
         24      bK  	  ppVP                  \
        ^ 4      pTpV FI  pVP                  V^ 4      pVP                  V^ 4      p	V^ 8  g   K0  V	'       g   K:  WhV	,          ,          pKK  	  \        RVR 24       V^ 8X  d   \        ^ 8  d   \        R\        R 24       \        RVR R	\
         24       \        WaW$V 4      w  rr\        p\        ^ 8:  dM   V^ 8  dF   \        ^ WZ,
          4      pV^28  d-   \        V,           p\        R
VR R24       \        RVR 24       V^ 8  d   TM\        pV P                  R. 4      p. pV R,          pV R,          pV EFS  pVP                  V^ 4      pVP                  V^ 4      pVP                  V^ 4      pVR8  d-   \        V RVR R24       VV9  d   VP                  V4       Km  VV9  Ed   VP                  V4       \        '       d(   V^ 8  d   VV,
          V,          ^d,          pV^28*  pM>RpM;\        Wp4      w  ppTpV'       g$   V^ 8  d   VV,
          V,          ^d,          pV^8  pV'       Ed   V'       Ed   VP                  V^ 4      ^d,          pV
V,          pVV,          ^\        ,
          ,          pRpV\         8  d:   Tp\         pVV,          ^\        ,
          ,          pRp\        RVR RVR R24       V^ 8  d   TM\        p \#        VVR4      w  p!p"\        ^ V V,
          4      p#V!'       Ed   V\         8  Ed   V#V8  Ed   \        RV R24       \        RVR 24       \        RVR 24       \        RVR R	\
         24       \        RVR 24       V R\
         2p$\%        V$4      w  p%p&V%'       g0   \'        R V$ R!24       \'        R"V& 24       \        R#V R$24       EKz  \        R%V& 24       \(        ;'       g    V P                  R&R4      p'V''       dC   \        R'4       \+        Wp^R(7      w  p(p)p*V('       d   \-        R)V* 24       M\        R)V* 24       M\        R*4       \/        V4      p+\1        V$R+V4      p,V,'       Ed:   \2        P4                  ! ^4       \/        V4      p-V-V+8X  d-   \        R,4       \2        P4                  ! ^4       \/        V4      p-V-V+,
          p.V.^ 8  d{   \-        R-V.R R	V 24       VV9  d   VP                  V4       VV R&   V R.,          P                  R/\6        P8                  ! \:        4      P=                  4       R0VR1R2R3VR4VR5V/4       MB\'        R6V R724       \'        R8V+R R	V R9V-R R	V 24       \'        R:4       \'        R;V$ R<24       \2        P4                  ! ^4       EKW  EKZ  V!'       g   \        V"4       EKp  \        R=V R>VR R?V R R@24       EK  \        '       d/   V^ 8  d"   VV,
          V,          ^d,          p/V RAV/RB RC2p0MlV RD2p0Mf\?        W4      w  p1p2p3V1eO   \6        P8                  ! \:        RE7      P@                  p4\C        Wp4      p5V1RF RGV2RF RH2p6V RIV6 RJV3RB RKV5RL RMVR 2	p0MV RN2p0\        V04       EK8  VV9  g   EKB  VP                  V4       EKV  	  VV RO&   VV R&   \E        V4      ^ 8X  d<   \-        RP4       RQV RR&   \6        P8                  ! \:        4      P=                  4       V RS&   \        V4      p7\G        \H        VV74       \K        \H        V 4       V # u upi )TuM   
Fase 1: Completa o portfólio comprando as moedas até os preços definidos
u9   
========== FASE DE CONSTRUÇÃO DO PORTFÓLIO ==========rV  QAtualizando dados de melhor hora de compra para respeitar AGUARDAR_MELHOR_HORA...r   zSaldo USDT atual: r   u;   Testnet sem USDT. Usando capital inicial como referência: "   Valor Total do Portfólio (REAL): r?   !   
🔒 MODO PROTETOR: Congelando $ em USDT residual+      Saldo mínimo protegido ajustado para: $r  r  r  r8   u   : Já possui r   z em carteiraTF       ⚡ Valor ajustado de $ para $    (mínimo da Binance)compra
>>> Comprando  <<<r[  u       Preço Alvo:     Valor:     Quantidade:      ⚠️ Par #    não está disponível no testnet!       Pulando compra de     - par indisponível     ✓ r  u@     ⏰ Buscando melhor momento de compra para maximizar lucros...r  r0  u9     → Compra imediata (aguardar_melhor_hora desabilitado)rZ  C     Saldo não mudou na primeira verificação, aguardando mais 2s...&   ✓ Compra verificada: Saldo aumentou r   r   r4   r   r   r   r   r      ✗ FALHA: Compra de &    não confirmada! Saldo não aumentou.	  Antes:  | Depois: uA     ⚠ AVISO: A Binance aceitou a ordem mas não creditou o saldo!u#     Possível causa: Problema no par z no testnetz Saldo insuficiente para comprar z
 (precisa z, tem r   u*   : Preço muito alto para compra imediata (ri   z% acima). Esperando melhora...u-   : Preço alvo não definido na configuraçãor   r  r  r  z$: Aguardando melhor hora de compra (r  z%). Faltam r   u    min. Preço: u0   : Análise de melhor hora não disponível aindar  u7   PORTFÓLIO COMPLETO! Iniciando fase de balanceamento...r  r  data_balanceamento_inicio)&r   r   rX  r   r   r   r,   r   r   SALDO_MINIMO_USDTr   rC   r   COMPRAR_IMEDIATAMENTEr  rs  rv  ry  r   r   AGUARDAR_MELHOR_HORAr  r   r   rq  rp   r   r   r.   r/   r0   r  r5  r  r   r6   rW  r   )8r   r2   r3   r  r   
saldo_usdtvalor_portfolior4   r   r   valor_portfolio_limiter   ganho_reinv	msg_ganhosaldo_usdt_minimo_protegidousdt_residualsaldo_para_comprar  r  r  r  rk  
preco_alvor;   diferenca_percentualcondicao_compraesta_no_melhor_horariomsg_horariopercentual_alvovalor_compravalor_ajustadovalor_compra_originalsaldo_disponivel	eh_validomsg_validacaosaldo_livrer   par_disponivelinfo_pardeve_aguardaraguardoutempo_esperado	msg_temposaldo_antesrm  r  diferenca_saldodiferenca_pctr   r  r  r'  r  r  r  r  s8   &&                                                      r   fase_construcao_portfolior  V  sc    IJ 6)8L1M1Mef4VD#F+FAGHA"aS*#677FH J*J OZZq)


5!$>eeE11O	  !*S!123Q?Q.OP_`cOdef1/#1Fa
|TU Caap  {A  KQ  CR? #4#q(Z!^AzBC2*;m*K':=:MM^_`CD_`cCdef '11n
/zz"4b901?+Mjj*"&&ua0
!::eQ/ g%wm,<S+ANO,, ''.((##E* %$>-8:-E,SVY,Y(&:b&@O&*O 7Ne6\3&"8 ':>-7+-E,SVY,Y(&:a&?O{"2"6"6ua"@3"F5G)K71x<H
 "'"77,8)#8L!-!;q8|!LJ%)N ;<QRU;VV]^jkn]o  pE  F  G 2<a:_  ,B,PUW_+`(	= "!%58S%ST91F!F;ZfKf 0t<=1+c1BCD0C0@AB{<*<Aj\JK/
3/?@A !&wa
|4F/G/O,NH) =8[!\] 5
!34!$8?S"TU vhZ01 %9$f$fFJJG^`e<fM$ #ce>YZ_~  ?A;.)#'"YK(89$r)%56 #\^ #.e"4K*65*EEu

1 (35'9 (;6%(km JJqM+6u+=L +7*D*Q.'*PQ`adPeefglfm(no$,<< 0 7 7 >9IF#56"#56== +X\\(-C-M-M-O ' &(8 ' ,j '?  %'<UGCi%jk$yS0A5'UabeTffghmgn%op$'hj$'J6(R]%^_

1G H #m, @zR^_bQccijz{~i  @A  B  C )(!A~*5
*Bj)PSV)V&+W,VWdehVi  jH  $I&+W,Y#Z 8Nf7\4K9".%-\\X%>%C%C
$B5$Q	)4S(9hs^3&O&+W,PQ\P]]kluvykz  {F  GP  QT  FU  Uc  do  ps  ct  $u&+W,\#]",, ''.G J "2F!1F !MN(v.6ll8.D.N.N.P*+ +62M&';V]S0&9Mw Is   ^c                $   \        R4       RV 9  g   V R,          '       g   \        R4       \        W4      p \        V4      pV Uu/ uF  q3\	        V R\
         24      bK  	  pp\        WV4      pVP                  \
        ^ 4      p\        RVR R\
         24       \        WQW$V 4      w  rxr\        RVR R\
         24       \        R	V
 24       \        p\        ^ 8:  dM   V^ 8  dF   \        ^ Wg,
          4      pV^28  d-   \        V,           p\        R
VR R24       \        RVR 24       \        RVR R24       \        WWG4      pV R,          p\        R4       . p. pV F  pVP                  V^ 4      pVP                  V^ 4      pVV,
          p\        V RVR RVR RVR R24       V\        8  d;   VP                  RVRVRVRVP                  V^ 4      /4       \        RV R24       K  V\        ) 8  g   K  VP                  RVR\        V4      RVRVP                  V^ 4      /4       \        RV R24       K  	  VP                  \
        ^ 4      p\!        VR RR7       EFw  pVR,          pVR,          pVR,          pVP                  V^ 4      pV^ 8  g   K:  V^ 8  g   KC  V^d,          V,          pVV,          ^\"        ,
          ,          pR pV\$        8  dA   V^ 8  d:   Tp\$        pVV,          ^\"        ,
          ,          pRp\        R!VR R"VR R#24       \'        VVR$4      w  ppV'       Ed   V^ 8  Ed   VV8:  Ed~   \        R%V R&24       \        R'VR( 24       \        R)VR( 24       \        R*VR R\
         24       \)        V4      pV R\
         2p \+        V R+V4      p!V!'       Ed   \,        P.                  ! ^4       \)        V4      p"V"V8X  d-   \        R,4       \,        P.                  ! ^4       \)        V4      p"VV",
          p#V#^ 8  dg   \1        R-V#R( RV 24       VV,          pV R.,          P                  R/\2        P4                  ! \6        4      P9                  4       RVR0R1RVR2VR3V/4       M(\;        R4V R524       \;        R6VR( RV R7V"R( RV 24       \,        P.                  ! ^4       EK^  EKa  V'       d   EKl  \        V4       EKz  	  \        V4      pVP                  \
        ^ 4      p\        R84       \        R9VR 24       \        R:\=        V4       R;V Uu. uF  q3R,          NK  	  up 24       \        R<\=        V4       R;V Uu. uF  q3R,          NK  	  up 24       . p$^ p%V FY  p&V&R,          pV&R,          pV&R,          pV^ 8  g   K'  V^d,          V,          p'V$P                  RVRVRVR=V'/4       V%V',          p%K[  	  \!        V$R> RR7      p$R?p(V%V8  d   V%^ 8  d   \        ^ Wk,
          V%,          4      M^ p(\        R@4       \        RAVR 24       \        RBVR 24       \        RC\        ^ Wk,
          4      R 24       \        RDV%R 24       \        REV(^d,          RF R24       V(^ 8  d   \        RGV(^d,          RF R24       Mb\        RH4       \        RAVR 24       \        RBVR 24       \        RC\        ^ Wk,
          4      R 24       \        RDV%R 24       \        RI4       V$ EF  p)V)R,          pV)R,          pV)R=,          p*V*V(,          p'R pV'\$        8  d   T'p+\$        p'Rp\        R!V+R R"V'R R#24       V^ 8  g   K\  V\        8  g   Ki  V'V,          ^\"        ,
          ,          p,\'        V'VRJ4      w  ppV'       Ed]   V'\$        8  EdQ   VV'\        ,           8  Ed>   \        RKV R&24       \        R'VR( 24       \        R)V,R( 24       \        R*V'R R\
         RLV*R RM24       V R\
         2p \?        V 4      w  p-p.V-'       g0   \;        RNV  RO24       \;        RPV. 24       \        RQV RR24       EKT  \        RSV. 24       V P                  RTR 4      p/V/'       dD   \        RU4       \A        VV ^RV7      w  p0p1p2V0'       d   \1        RWV2 24       M\        RWV2 24       M\        RX4       \)        V4      p\+        V RYV,4      p!V!'       Ed   \,        P.                  ! ^4       \)        V4      p"V"V8X  d-   \        R,4       \,        P.                  ! ^4       \)        V4      p"V"V,
          p#V#^ 8  dg   \1        RZV#R( RV 24       VV',          pV R.,          P                  R/\2        P4                  ! \6        4      P9                  4       RVR0R[RVR2V,R3V'/4       M(\;        R\V R]24       \;        R6VR( RV R7V"R( RV 24       \,        P.                  ! ^4       EK  EK  V'       g   \        V4       EK  V\        8:  d   \        RWV R^VR R_\        R RM24       EK8  VV'\        ,           8  d=   \        RWV R`V'\        ,           R RaVR RM24       \        RbV'R Rc\        R 24       EK  \        RWV Rd24       EK  	  \        Re4       \        V4      pV Uu/ uF  q3\	        V R\
         24      bK  	  pp\        WV4      p3\        V3WW@4      w  p4p5 p6\        WVV44      p7V F=  pV7P                  V^ 4      p8VP                  V^ 4      p9\        V RV8R RfV9R( RM24       K?  	  \        RgV3R R\
         24       \        RhV4R R\
         24       \        RiV5R R\
         24       V P                  RTR 4      '       d   V Uu. uF<  p\        V7P                  V^ 4      V R,          P                  V^ 4      ,
          4      NK>  	  p:pV:'       d   \        V:4      M^ p;V;Rj8  d-   \1        Rk4       \1        RlV;R R24       \1        Rm4       R V RT&   M\        Rn4       \        RlV;R Ro24       \C        \D        W4       \G        \D        V 4       V # u upi u upi u upi u upi u upi )puz   
Fase 2: Balanceia o portfólio mantendo os percentuais definidos
Vende moedas acima do percentual e compra moedas abaixo
u:   
========== FASE DE BALANCEAMENTO DO PORTFÓLIO ==========rV  r  r   r  r   r?   u9   ⚠️  Valor Total para CÁLCULOS (COM REINVESTIMENTO): u   📊 r  r  r  u   🔒 PROTEÇÃO USDT: Mínimo $u    não será gastor  u    
--- Análise de Percentuais ---r   	% (Alvo: u   %) - Diferença: +.2f%r4   r<   percentual_atualr   u     → z acima do alvo (venda)z abaixo do alvo (compra)c                     V R ,          # r<   r  r  s   &r   r  .fase_balanceamento_portfolio.<locals>.<lambda>  s    ;rK   T)r  reverseFr  r  r  vendaz
>>> Vendendo r  r[  r   r  r  re  r  u%   ✓ Venda verificada: Saldo diminuiu r   r   r   r   r   r   u   ✗ FALHA: Venda de u&    não confirmada! Saldo não diminuiu.r  r  u!   
🔍 ESTADO ATUAL DO PORTFÓLIO:u      • USDT em Caixa: $u      • Moedas a Comprar: u    → u      • Moedas a Vender: valor_idealc                     V R ,          # r  r  r  s   &r   r  r    s    !K.rK   g      ?u/   
💰 CÁLCULO DE COMPRAS (SALDO INSUFICIENTE):u      • USDT Disponível: $u      • Proteção USDT: $u"      • USDT Livre (pode gastar): $u      • Total Necessário: $u      • Fator de Redução: ri   uV   ⚠ Saldo insuficiente para completar todas as compras. Reduzindo proporcionalmente a u-   
💰 CÁLCULO DE COMPRAS (SALDO SUFICIENTE):u*      • Fator de Redução: 100% (saldo ok)r  r  z	 (Ideal: r   r  r  r  r  r  r  r  uE     ⏰ Buscando melhor momento de compra para investir novo capital...r  r0  u.     → Compra imediata (rebalanceamento normal)rZ  r  r   r  r  u&   : ⛔ Compra bloqueada - Saldo USDT ($u   ) ≤ Proteção ($u6   : ⛔ Compra bloqueada - Saldo insuficiente (precisa $z, tem $u!          └─ USDT Necessário: $u    + Proteção: $u1   : Compra rejeitada por outro motivo (validação)z 
--- Resumo do Balanceamento ---z
% (Saldo: zValor Total (REAL): u   Valor Total (CÁLCULOS): z Ganho REAL (baseado em trades): r\   u&   
✅ INCREMENTO DE CAPITAL CONCLUÍDO!u"      Desvio máximo de percentuais: zC   Voltando ao rebalanceamento normal (sem aguardar melhor hora)...u*   
⏳ Incremento de capital em progresso...z% (alvo: < 2.0%))$r   r   rX  r   r   r   r   r,   r   r  r   rC   r   VARIACAO_BALANCEAMENTOr   rB   r   rs  rv  ry  r   rq  rp   r   r   r   r.   r/   r0   r   r   r   r  r6   rW  r   )<r   r2   r3   r  r   r  saldo_usdt_atualr  r   r  r  r  r  percentuais_atuaisr  moedas_vendamoedas_comprar4   	pct_atualpct_alvor<   saldo_usdt_antes
item_vendar   r;   valor_excessoquantidade_vendar  valor_excesso_originalr  r  r  r   rm  r  r  compras_planejadastotal_usdt_necessarioitem_comprar  fator_reducaor  r  r  quantidade_comprar  r   r  r  r  r  valor_portfolio_finalvalor_portfolio_limite_finalganho_finalr  percentuais_finais	pct_finalsaldo_moedadesviosdesvio_maximos<   &&                                                          r   fase_balanceamento_portfolior/  ?  sN   
 JK 6)8L1M1Mef4VD#F+FAGHA"aS*#677FH+FFCOzz*a0 1/#1Fa
|TU Caap  {A  KQ  CR?HI_`cHddefpeqrsuYK ! #4#q(-=-AA/HI2*;m*K':=:MM^_`CD_`cCdef./J3.OO`ab 5VVd0101LM&**5!4	#''q1(	E7"YsO9XcNBST]^bSccdef--Y"IE1-	!  ug%;<=000  S^"IE1-	"  ug%=>?- 2 zz*a0\/GQUVV
7#7#{+	!::eQ/aEAI '_0FFM,u4HE #N449IA9M)6& 5#05#8AL#I !%78Ns7SSZ[hilZm  nC  D  E (>mUT['\$I}y-16FJZ6ZOE7$78-eC[9:+,<S+ABC;}S&9:,GH *%0!7!J<0&vv7GH5JJqM $/u#5L ${2!$gi

1'25'9 '2L&@O&*#&KO\_K``abgah$ij(M9(1299'h)?)I)I)K#U"$9#U(*:#];  !#7w>d!ef 9[,=Qug[Q]^aPbbcdicj!klJJqM? @ Y-(K WP $F+Fzz*a013&'7&<=>(]);(<EWdBeWdRSW::WdBeAfgh'L(9':%Ua@bUaPQ7Ua@b?cde $G$G$,	19%O/EEL%%Y|	'  "\1! %"   28PZ^_ M// mB  EF  mFA 0 NRggh  LMDF./?.DEF-.I#-NOP6s1>N>l7mnq6rst/0Ec/JKL/c0A#/FaHI1no|  ~A  pA  BE  oF  FG  H  I 	AC-.>s-CDE,-H,MNO5c!=M=k6lmp5qrs./DS.IJK=? %ww]+ #]2 //$0!0L!N34I#3NgVbcfUgg|}~19),== ,u 4H E (>lES['\$I}y\-BBGW\hk|\|G},UG489-eC[9:+,=c+BCD;|C&8*Y{[^N__`ab "7!J<0+CF+K(%}VH4WXYuXJ/0 4UG;OPQ6(,-
 !'

+BE J df:UV[]cz{:|7Hni#b$45 2i[!12MO *%0&vu6GH5JJqM $/u#5L ${2!$gi

1'25'9 '3[&@O&*#&L_]`Laabchbi$jk(L8(1299'h)?)I)I)K#U"$:#U(*;#\;  !#8?e!fg 9[,=Qug[Q]^aPbbcdicj!klJJqM? @ -(#'885')OP`adOeex  zK  LO  yP  PQ  R  S%8I)IJ5')_`l  pA  aA  BE  `F  FM  N^  _b  Mc  cd  e  f A,sASScduvycz{|5')Z[\K %N 01 $F+FAGHA"aS*#677FH1&&I 7UUjlr  }C  7L3 +q!4VVMij &**5!4	jj*E7"YsO:k#5FaHI  #$9##>a
|LM()Ec(J!J<XY/D/A:,OP zz)511eklek`a3)--a3f=O6P6T6TUVXY6ZZ[ekl(/GQ 3AB<]3<OqQR]^.3F*+BD9-9LL\]^ '';VL0&9M[
 IV Cf@bt I, ms   q99q>)rr0Arc                 f    \        \        4      p V '       d   \        V \        4      '       g   \	        R4       R# \
         Uu. uF%  qP                  RR4      '       g   K  VR,          NK'  	  pp\        V4      pV Uu/ uF  q\        V R\         24      bK  	  pp\        W#V4      p\        W#WE4      pV Uu/ uF  q\        V R\         24      bK  	  pp\        W4      p W@R&   \        P                  ! \         4      P#                  4       V R&   WpR	&   \%        \        W#4       \'        \        V 4       \)        R%4       \)        R
4       \)        R$4       \)        RV P                  RR4      P+                  4        24       \)        RV P                  RR4       24       \)        RV P                  R^ 4       R\         24       \)        RVR R\         24       V P                  R^ 4      pV^ 8  dA   \)        RWX,
          R R\         24       \)        RWX,          ^,
          ^d,          R R24       \)        R&4       V F  p	VP                  V	^ 4      p
VP                  V	^ 4      pV'       d	   W,          M^ pVP                  V	^ 4      pV P                  R/ 4      P                  V	^ 4      p\)        V	 RV
R R2RVR RVR  R!VR R"2,           4       K  	  \)        R'4       V # u upi u upi u upi   \,         d/   p\/        R#T 24       \0        P2                  ! 4         Rp?R# Rp?ii ; i)(u(   Exibe relatório detalhado do portfóliou*   Portfólio não inicializado ou corrompidoNr  Tr4   r   precos_atuaistimestamp_precosvariacoes_24hu   RELATÓRIO DO PORTFÓLIOzFase: r  desconhecidau   Data de Início: r  r  r  rU   r?   zValor Atual: r   zGanho/Perda: r  z	Ganho %: r  r  z: Saldo=z15.8fz | zValor: z12.2fz6.2fr
  rA   u   Erro ao exibir relatório: F======================================================================G
======================================================================zF----------------------------------------------------------------------zG======================================================================
)r(   rW  
isinstancedictr   r  r,   r   r   r   r   r   r   rX  r   r.   r/   r0   r6   r   r   upperr%   r   rh  	print_exc)r   r  r2   r3   r   r  r   r3  capitalr4   r5   r   r   pctr  r'   s                   r   relatorio_portfolior=    s   ?*+?@Z55BC&6O&6%%:N*!G**&6O'/EKLV&!Aj\':;;VL/G1&&Z NTTV.!Aj\/BCCVT 5VD #)%-\\(%;%E%E%G!" #0 	++?P 	  4f=!+,6&**V^<BBDEFG$VZZu%E$FGH$VZZ0A1%E$Fa
|TU= 5QzlCD**.2Q;}_%>t$DAj\RSy?#<"AS!H NaPQEJJua(EJJua(E%*EME//%+Czz"4b9==eQGHwhuUm37%c#d9XcN"MN O  	! k PL
 U^  .qc23sM   8K7 K7 K("K(/K7  K-K7 ;K2HK7 (K7 7L0#L++L0c                    \        R4       \        R4       \        R4       \        4       w  r^ p^ p  \        '       d   \        P                  ! 4       '       d   \        P                  ! 4       p\        R4       \        R4       V'       d;   \        RVP                  R4       24       \        RVP                  R4       24       \        R4       \        R4       \        P                  ! 4        R# V^,          pV^,          p V R,          R	8X  d   \        W4      p MV R,          R
8X  d   \        W4      p V\        8  d   \        4       pV'       d   Tp ^ p\        R\         R24       \        P                  ! \        4       EKY    \         dM   p\        RT RT 24       \         P"                  ! 4        \        P                  ! \        4        Rp?EK  Rp?ii ; i  \$         d    \        R4       \        4         R# \         d/   p\        RT 24       \         P"                  ! 4         Rp?R# Rp?ii ; i)u   Função principalu/   ROBÔ DE BALANCEAMENTO DE PORTFÓLIO - INICIADOu    ⏹️  SINAL DE PARADA RECEBIDOzSolicitado por: 
pedido_porzTimestamp: r   u   Encerrando robô gracefully...r  r  r  u   
Próximo ciclo em z segundos...zErro no ciclo r   Nu!   
Robô interrompido pelo usuáriozErro fatal: r5  r6  )r   r  controlador_stop
deve_pararobter_info_paradar,   limpar_stopr  r/  TEMPO_REFRESHr=  TEMPO_CICLOrp   r   r%   r   rh  r:  KeyboardInterrupt)r   r2   contador_ciclocontador_relatorior1   estado_atualizador'   s          r   mainrJ    s   _>?X*,NFN+$4$?$?$A$A'99;);</0F/GHI{488K+@*ABC9:" ,,.aN!#(&>\16vFFF^69&IF%6(;(=%(!2)*&/}LIJ

;' (>.)9A3?@##%

;''(
  56 <s#$sb   G&  G& BG& 5G& BF 	G& G#A GG& G##G& & I	II#H<<I__main__i  @)NNNN)N)s__doc__rl   pandaspdrp   r!   logging.handlersr   r   localer   rh  r   r   pytzcoloramar   r   r   r@  ImportErrorr   r   r(   r6   rJ   	setlocaleLC_ALLErrorr  r,   API_KEY
API_SECRETAPI_KEY_TESTNETAPI_SECRET_TESTNETTESTNETr   r   r   ro   rE  rD  	TIMEFRAMEr  rs  SALDO_MINIMOr  rv  r  r   r  r  r  LOG_FILENAMErW  	getLoggerloggersetLevelINFOhandlershandlerremoveHandlerrotating_handler	Formatter	formattersetFormatter
addHandlerr/   rx   rw   	chave_apichave_secretarm   r   set_sandbox_moder1   rq   load_marketsr   rs   r%   r'   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX  rq  rt  ry  r  r  r  r  r  r  r  r  r/  r=  rJ  __name__r  rK   r   <module>rp     s       0   	  (  & & 
>
&%CN5p
V]]M2 
  B	C **Y
#ZZb)
**.3ZZ 4b9 
**Y
&ZZf-


#4d;<&**]A./FJJ3Q78JJ{D)	vzz*BCHI J,-3VZZ34&**%8#>?  

#:EB $VZZ0NPR%ST #ZZ(DeL zz"8%@ ::k2.  '.  
			   q!!G
! " '	    ',, ' m,	   i (   " #==,-& ,- I&MIM <<imtve+		 	 d#LL@A	
9:LL+,	
$%LL=>	
67LL?@	
89 -.CC-H
S T &'<S&AL M )*;C)@@ST U "#4S"99LM N0LL56	$**B
BU__
TU5870@0B8%N,D\&%.N0M^*cJ']*!F"HB8NxBYz||gR[z
AJ5n zF A@  J || (@A<< B  0MM21#67	*1#
.//0sU    R) R9 *AT )	R65R69TS++T<T TTT9 T44T9