
    Aib                    j   U d Z ddlZddlZddlZddlZddlZddlmZmZm	Z	 ddl
mZ ddlmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZmZ dd	lmZmZ d
 ZddlmZm Z m!Z!  ejD                  e#      Z$ddl%Z&i Z'ee(ef   e)d<   dde(de*fdZ+de(defdZ,	 ddl-m.Z. e.Z/ G d d      Z1y# e0$ r dZ/Y w xY w)zE
HTTP Routes Handler
Separation of HTTP handling from business logic
    N)DictAnyOptional)urlparsedatetime	timedeltatimezone   )TradingConfigOptimizationRequestSettingsUpdateForceCloseRequestWatchlistRequestAPIResponse)ConfigServiceTradingService
BotService)AuthMiddlewareSecurityValidatorc                     | sy	 ddl m}  |t        |             }|j                  rt	        j
                  |j                        nt	        j
                         }||k  S # t        $ r Y yw xY w)uM   Retourne True seulement si blocked_until est défini ET encore dans le futur.Fr   )parse)dateutil.parserr   strtzinfor   now	Exception)blocked_until_str_dtparsebt	now_awares       -/home/ubuntu/crypto_trading_bot/api/routes.py_is_blocked_until_activer#      s\    5c+,-/1yyHLL+hlln	2~ s   AA   	A,+A,)load_json_filesave_json_fileasync_to_sync_SERVER_CACHEkeyttlc                 v    t         j                  |       }|r"t        j                         |d   z
  |k  r|d   S y)z:Retourner la valeur du cache si encore valide, sinon None.tsdataN)r'   get_timetime)r(   r)   entrys      r"   
_cache_getr1   +   s8    c"E%**,t,3V}    r,   c                    |t        j                         dt        | <   t        t              dkD  rUt        j                         }t        j	                         D cg c]  \  }}||d   z
  dkD  s| }}}|D ]	  }t        |=  yyc c}}w )z0Stocker une valeur dans le cache avec timestamp.)r,   r+   d   r+   <   N)r.   r/   r'   lenitems)r(   r,   r   kvexpireds         r"   
_cache_setr;   2   s}    "&ejjl;M#
=Cjjl!.!4!4!6MA#$-":L1MM 	!Aa 	!  Ms   B0Bget_surveillance_servicec            
          e Zd ZdZdededededef
dZ	dRd
Z
dRdZdRdZdRdZdRdZdRdZdRdZdRdZdRdZdeeef   dd	fdZdRdZdedd	fdZdRdZdRdZdedd	fdZdedd	fdZdRdZdRdZdRdZdRdZdRdZ dRd Z!deeef   dd	fd!Z"deeef   dd	fd"Z#deeef   dd	fd#Z$deeef   dd	fd$Z%deeef   dd	fd%Z&deeef   dd	fd&Z'dRd'Z(deeef   dd	fd(Z)deeef   dd	fd)Z*dRd*Z+dRd+Z,dSd,edd	fd-Z-dRd.Z.dRd/Z/dSd,edd	fd0Z0dRd1Z1d,edd	fd2Z2d,edd	fd3Z3deeef   dd	fd4Z4d5e5deeef   fd6Z6d5e5deeef   fd7Z7deee8f   fd8Z9dSd,edd	fd9Z:dSd,edd	fd:Z;dSd,edd	fd;Z<dRd<Z=dRd=Z>e?d>        Z@e?d?        ZAdRd@ZBdRdAZCdRdBZDdRdCZEdSdedd	fdDZFdRdEZGdRdFZHdRdGZIdRdHZJdRdIZKdJZLdRdKZMdRdLZNdRdMZOdRdNZPdRdOZQdSdedd	fdPZRdSdedd	fdQZSy	)TRouteHandleru#   Gestionnaire centralisé des routes
script_dirconfig_servicetrading_servicebot_serviceauth_middlewarec                 h    || _         || _        || _        || _        || _        t               | _        y N)r@   rA   rB   rC   rD   r   	validator)selfr@   rA   rB   rC   rD   s         r"   __init__zRouteHandler.__init__G   s5     %,.&.*,r2   returnNc                    	 |j                  dt        j                         j                         dd       y# t        $ r@}t
        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)	z'GET /api/health - Health check endpointokdashboard_api_server)status	timestampservicezError in health check: errorrN   rQ     N)send_json_responser   r   	isoformatr   loggerrQ   r   )rH   request_handleres      r"   handle_healthzRouteHandler.handle_healthV   s    	..%\\^55710 
  	LL21#67..!Q0  	s   58 	B6A<<Bc           
      	   	 ddl }ddddd}g }d}t        j                  j                  | j                  d      }t        j                  j                  |      rd	 t        |d      5 }t        j                  |      }t        |t              rt        |      nd|d<   ddd       |j                  d|d    d	       n|j                  d       t        j                  j                  | j                  d      }	t        j                  j                  |	      rd	 t        |	d      5 }t        j                  |      }
t        |
t              rt        |
      nd|d<   ddd       |j                  d|d    d       n|j                  d       |j                  t        j                  j                  | j                  d            }d}|D ](  }	 |t        j                  j                  |      dz  z  }* t        |d      |d<   |j                  d|d    d       	 ddl}|j#                  g dddd      }|j$                  j'                         j)                         r#t+        |j$                  j'                               nd|d<   |j                  d|d           t        j                  j                  | j                  d       }t        j                  j                  |      r|j                  d!       n|j                  d"       d#}t        j                  j                  | j                  d$      }t        j                  j                  |      r\	 t        |d      5 }t        j                  |      }t        |j-                  d%g             }ddd       |j                  d& d'       n|j                  d)       |j/                  ||d*j                  |      t1        j2                         j5                         d+       y# 1 sw Y   nxY w#  |j                  d
       d}Y _xY w# 1 sw Y   xY w#  |j                  d       d}Y xY w#  Y xY w#  |j                  d       Y xY w# 1 sw Y   xY w#  |j                  d(       Y xY w# t6        $ rS}t8        j;                  d,|        |j/                  d#t=        |      dddddd-t=        |       d.d/       Y d}~yd}~ww xY w)0z;GET /api/maintenance/health - Full maintenance health checkr   N)	positionstradeslogs_kb	processesrL   positions.jsonrr[   u   ✅ positions.json: 
 positionsu(   ⚠️ positions.json: Erreur de lecturewarningu"   ℹ️ positions.json: Non trouvétrade_history.jsonr\   u   ✅ trade_history.json: z tradesu,   ⚠️ trade_history.json: Erreur de lectureu&   ℹ️ trade_history.json: Non trouvéz*.logi   r   r]   u   📄 Logs: z KB)
powershellz-CommandzI(Get-Process python -ErrorAction SilentlyContinue | Measure-Object).CountT   )capture_outputtexttimeoutr^   u   🐍 Processus Python: u)   ⚠️ Processus: Impossible de vérifier	config.pyu   ✅ config.py: OKu   ❌ config.py: MANQUANTrQ   watchlist.jsonsymbolsu   ✅ watchlist.json: z	 symbolesu(   ⚠️ watchlist.json: Erreur de lectureu"   ⚠️ watchlist.json: Non trouvé
)rN   metricsoutputrO   zError in maintenance health: Erreur: )rN   rQ   rm   rn   rS   )globospathjoinr@   existsopenjsonload
isinstancedictr6   appendlistgetsizeround
subprocessrunstdoutstripisdigitintr-   rT   r   r   rU   r   rV   rQ   r   )rH   rW   rp   rm   output_linesrN   positions_filefr[   history_filehistory	log_filestotal_log_kblog_filer~   resultconfig_filewatchlist_file	watchlistsymbols_countrX   s                        r"   handle_maintenance_healthz&RouteHandler.handle_maintenance_healthe   s   d	 	G LF  WW\\$//;KLNww~~n-'nc2 da$(IIaL	AKIW[A\s9~bc,d !''*>w{?S>TT^(_`
 ##$HI 77<<9MNLww~~l+'lC0 ]A"&))A,<FwPT<UCL[\)] !''*B78CTBUU\(]^
 ##$LM 		"'',,t"HIIL%  BGGOOH$=$DDL
 "'|Q!7GI+gi.@-A EF	Q!#{#'dA (  FL]]EXEXEZEbEbEds6==+>+>+@'Ajk$##&=gk>R=S$TU
 '',,tDKww~~k*##$78##$=>   WW\\$//;KLNww~~n-Tnc2 Ja$(IIaL	(+IMM)R,H(IJ !''*>}oY(WX ##$HI.. "))L1%\\^557	0 Id d' ''(RS&F] ]' ''(VW&FQ##$OPJ JT ''(RS  	LL8<=..!Q)*aATUV$SVH-	0
  	s   AR P '6P	 P =AR P> %6P1 P> ;AR %Q3)R BQ! B7R R #1Q:R 1AR 	PP P.+R 1P;6P> >QR QR !Q74R :R?R RR 	S:'A	S55S:c                    	 g }t         j                  j                  | j                  d      }i }t         j                  j	                  |      r+	 t        |d      5 }t        j                  |      }ddd       t        |t              rt        |      nd}|j                  d|        d}d}	 ddlm}	 ddlm}
 ddl}t#        |d	d      xs t#        |d
d      }t#        |dd      xs t#        |dd      }t#        |dd      }|r|s|j                  d       d}n |	|||ddi      }	 |j%                         }|d   t'        t(        j)                         dz        z
  |_        t-        |j*                        dkD  r#t.        j1                  d|j*                   d       	 |j7                         }|D cg c]#  }t9        |j;                  dd            dk7  s"|% }}t        |      }d}|j                  d|        |d&k(  r|dk(  r.|dkD  r)d}|j                  d;| d<       |j                  d=       n|dkD  r|dk(  r|}|j                  d>| d?       nnd}|j                  d;| d@| dA       |j                  dB       nB|dk(  r;t-        ||z
        }|dkD  r|j                  d>| dC       n|j                  dD       nd}|jG                  |dk(  rdEndF||||dGj                  |      tI        jJ                         jM                         dH       y# 1 sw Y   xY w#  Y xY w# t2        $ r#}t.        j5                  d|        Y d}~d}~ww xY wc c}w # |
$ r}|j<                  dk(  rT	 |j?                         }|j;                  dg       }g d}g }|D ]o  }|d    }t9        |j;                  d!d            t9        |j;                  d"d            z   }||v s|d#k  rI|r|d$kD  st'        |      d%k(  r_|j                  |       q t        |      }d&}|j                  d'|        |dkD  rG|j                  d(d)j                  |dd* D cg c]  }|d    	 nc c}w c}       |d*kD  rd+nd, d-       |j                  d.       nh# t2        $ r,}|j                  d/tA        |      dd0         d1}Y d}~n8d}~ww xY w|j                  d2|j<                   d3|jB                  dd0         d1}Y d}~d}~wt2        $ rP}	 |j?                         }|j;                  dg       }g d}g }|D ]o  }|d    }t9        |j;                  d!d            t9        |j;                  d"d            z   }||v s|d#k  rI|r|d$kD  st'        |      d%k(  r_|j                  |       q t        |      }d&}|j                  d'|        |dkD  rG|j                  d4d)j                  |dd* D cg c]  }|d    	 nc c}w c}       |d*kD  rd+nd, d-       |j                  d5       n)#  |j                  d6tA        |      dd0         d1}Y nxY wY d}~Yd}~ww xY w# tD        $ r |j                  d7       d}Y 
$ rm}|j<                  dk(  r#|j                  d8       |j                  d9       n.|j                  d2|j<                   d3|jB                  dd0         d1}Y d}~d}~wt2        $ r-}|j                  d:tA        |      dd0         d1}Y d}~ d}~ww xY w# t2        $ rM}t.        jO                  dI|        |jG                  dJtA        |      dKtA        |       dLd       Y d}~yd}~ww xY w)Mz=GET /api/maintenance/binance-sync - Check Binance sync statusr_   r`   Nr   u   📁 Positions locales: UNKNOWNClientBinanceAPIExceptionBINANCE_API_KEYAPI_KEYBINANCE_API_SECRET
API_SECRETTESTNET_MODETu)   ⚠️ Clés API Binance non configuréesNO_APIrh      testnetrequests_params
serverTime  rS   u   ⏰ Binance sync: offset=msu   ⚠️ Time sync failed: positionAmtFUTURESu    🔗 Positions Binance FUTURES: i!balances)USDTBUSDUSDCDAIUSDEURBRLARSTRYPLNRONCZKMXNCOPJPYZARUAHIDR456   这是测试币assetfreelockedMbP?i'  iH  SPOTu#   🔗 Balances SPOT significatives: z   (Restes de trades: z, re   ... )u3   💡 Mode: SPOT (permissions FUTURES désactivées)u   ❌ Erreur API SPOT: P   ERRORu   ⚠️ Erreur Binance (): z   (Restes: u(   💡 Mode: SPOT (FUTURES non disponible)   ⚠️ Erreur API: u#   ⚠️ Module binance non installéu7   ⚠️ Clés API invalides ou permissions insuffisantesu&   💡 Vérifie tes clés dans config.pyu   ⚠️ Erreur connexion: u   ℹ️ u6    crypto(s) en wallet sont des restes de trades passésu5   ✅ Aucune position active - Synchronisation correcteu   ⚠️ u2    position(s) trackée(s) mais absente(s) du walletu    position(s) trackée(s), z crypto(s) en walletuB   💡 Vérification détaillée nécessaire pour comparaison exacteu$    désynchronisation(s) détectée(s)u   ✅ Synchronisation parfaiterL   rb   rl   )rN   local_countbinance_countissuesmodern   rO   zError in binance sync: rQ   ro   rN   rQ   rn   )(rq   rr   rs   r@   rt   ru   rv   rw   rx   ry   r6   rz   binance.clientr   binance.exceptionsr   configgetattrget_server_timer   r/   timestamp_offsetabsrV   infor   rb   futures_position_informationfloatr-   codeget_accountr   messageImportErrorrT   r   r   rU   rQ   ) rH   rW   r   r   local_positionsr   r   r   r   r   r   r   api_key
api_secrettestnet_modeclientsttefutures_positionspactive_futuresbeaccountr   ignored_assetsactive_spotbr   totalspot_erX   r   s                                    r"   handle_binance_syncz RouteHandler.handle_binance_sync   s4   B	L  WW\\$//;KLN Oww~~n-nc2 7a*.))A,7
 3=_d2S#o.YZK":;- HI MD~1B "&*;TBfgfV_aeFf$V-A4HoGTZ\hjnLo
&v~tDj ''(ST#D#GZ`ikm_noFI#33524\2BSW[I[E\2\/v667#="KK*CFD[D[C\\^(_`
V+,2,O,O,Q)5F)n%PQPUPUVcefPgJhlmJm!)n)n(+N(;($++.N}o,^_H v~ !#(9F '''-@v(wx ''(_` 1_!);(F '''&9k(lm F '''+>XYfXgg{(|} ''(lm"[=89A: '''&9](^_ ''(FG .."(A+$9*!. ))L1%\\^5570 U7 7> % I)B2$'GHHI *o / ,+77e+$/*0*<*<*>+2;;z2+F2" /1)1 !:A,-gJE,1!%%2B,CeAEERZ\]L^F_,_E (-'>%%-(0 (4#e*X]J](0$/$6$6q$9!: 14K0@'- , 3 36YZgYh4i j#01#4$0$7$7:PQUQZQZp{|~}~p  \Akl\]^e\f  \A  \A  RB  QC  MZ  ]^  M^  DI  df  Cg  gh  9i  %j , 3 36i k#, / , 3 36KCPVKX[Y[L\K]4^ _'./
 )//2I"''RUVXV`V`adbdVeUf0gh#*D$ #+!+&,&8&8&:G'.{{:r'BH.N +-K%- 
6()'
(-aeeFA.>(?%hXYHZB[([#(N#:eem$,#/UU]c%jTYFY$, + 2 21 5
6 -0,<M#)D(//2UVcUd0ef,q0 , 3 3l499bmnpopbqMr]^aPWjMrMrCsBt  L  OP  Puz  VX  uY  YZ  5[  !\(//2Z\+(//2Ec!fSbk]0ST#*DG#+J   ##$IJ& 77e# ''*ac ''*PR ''*A"''#bjjY\Z\oM^(_` ##&?As}$MNX  	LL21#67..!Q$SVH-0 	 	s]  A\* L' L2L' :5\* 0A;Y# ,A6L/ #M# 7#MM#M# D\* L$L' 'L,)\* /	M8MY# MY# M# #Y )T:C RQ'&.RT	S
"S TS

3T=Y# Y C X,1W>=.X,+Y,$YYY# Y  Y# #\'?\* \'A"[.(\* .\':"\"\* "\''\* *	^ 3A];;^ c           	      d   	 g }|j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d	       |j                  d
       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  ddj                  |      t        j                         j                         d       y# t        $ rM}t        j                  d|        |j                  dt        |      dt        |       dd       Y d}~yd}~ww xY w)z=POST /api/maintenance/explain-sync - Explain sync differencesu   📋 ANALYSE DE SYNCHRONISATION(========================================r   u7   💡 Mode actuel: SPOT (permissions FUTURES manquantes)u3   • Vérifier: Compare positions locales vs BinanceuM   • Expliquer: Détaille pourquoi il y a des différences (tokens test, etc.)u:   • Corriger: Synchronise les positions réelles si besoinu   ℹ️ Différences possibles:z"  - Tokens de test (non tradables)u/     - Positions fermées manuellement sur Binanceu*     - Fichier positions.json désynchroniséu   🔧 Pour corriger:z4  1. Cliquez sur 'Corriger' pour synchro automatiqueu+     2. Ou éditez positions.json manuellementrL   rl   rN   rn   rO   zError in explain sync: rQ   ro   r   rS   N)
rz   rT   rs   r   r   rU   r   rV   rQ   r   )rH   rW   r   rX   s       r"   handle_explain_syncz RouteHandler.handle_explain_sync  s   	L AB)# YZ UV op \]# @A DE QR LM# 56 VW MN..))L1%\\^5570   	LL21#67..!Q$SVH-0 	 	s   EE 	F/"AF**F/c           	         	 g }|j                  d       |j                  d       t        j                  j                  | j                  d      }	 ddlm} ddl}t        |dd      xs t        |dd      }t        |d	d      xs t        |d
d      }|r|s|j                  d       nt        |dd      } ||||ddi      }		 |	j                         }
|
d   t        t        j                         dz        z
  |	_        	 |	j                         }|D cg c]&  }t        |j!                  dd            dk7  s"|d   ( }}|j                  dt#        |       d       t        j                  j%                  |      r9ddl}|j)                  dd      }|j+                  ||       |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j/                  d!d"j                  |      t1        j2                         j5                         d#       y# t        $ r Y Mw xY wc c}w #  |j                  d       g }Y xY w# t        $ r*}|j                  dt-        |      dd          Y d}~d}~ww xY w# t        $ rM}t6        j9                  d$|        |j/                  d%t-        |      d&t-        |       d'd(       Y d}~yd}~ww xY w))z0POST /api/maintenance/fix-sync - Fix sync issuesu"   🔧 CORRECTION DE SYNCHRONISATIONr   r_   r   r   Nr   r   r   r   u9   ⚠️ Clés API non configurées - correction impossibler   Trh   r   r   r   r   r   symbol   ✅ u&    positions FUTURES actives détectéesu&   ⚠️ Mode SPOT - Correction limitée.jsonz_backup.jsonu)   📦 Backup créé: positions_backup.jsonr   u   ✅ Vérification terminéeu@   💡 Aucune correction automatique appliquée en mode sécuriséu5      Éditez positions.json manuellement si nécessairer   2   rL   rl   r   zError in fix sync: rQ   ro   r   rS   )rz   rq   rr   rs   r@   r   r   r   r   r   r   r/   r   r   r   r   r-   r6   rt   shutilreplacecopyr   rT   r   r   rU   rV   rQ   )rH   rW   r   r   r   r   r   r   r   r   r   r   r   active_symbolsr   backup_filerX   s                    r"   handle_fix_synczRouteHandler.handle_fix_sync  s   @	L DE)  WW\\$//;KLN*I1 "&*;TBfgfV_aeFf$V-A4HoGTZ\hjnLo
j ''(cd#*6>4#HL#GZ`ikm_noF#33524\2BSW[I[E\2\/
,,2,O,O,Q)?P)x!TYZ[Z_Z_`mopZqTrvwTw!H+)x)x$++d3~3F2GGm,no ww~~n5%&4&<&<Wn&UNK@$++.WY##B'##$AB##$fg##$[\
 ..))L1%\\^5570 7 %  *y,$++,TU)+  I##&9#a&"+$GHHI  	LL.qc23..!Q$SVH-0 	 	s   AJ( A4I2 ;I I #I:I I !BI2 =AJ( 	II2 II2 I I/,I2 2	J%; J J(  J%%J( (	K>1AK99K>c           	      @   	 ddl }ddlm} ddlm} ddl}t        |dd      xs t        |dd      }t        |dd      xs t        |dd      }t        |d	d
      }|r|s|j                  dddddd       y ||||ddi      }		 |	j                         }
|
d   t         |j                          dz        z
  |	_
        |	j                         }|j                  dg       }d}d}|D ]V  }|d   dk(  st        t        |j                  dd            d      }t        t        |j                  dd            d      } n |j                  d
||t        ||z   d      |t!        j"                         j%                         d       y# t        $ r Y w xY w# $ r;}|j                  dd|j&                   d|j(                   dddd       Y d}~yd}~wt        $ rB}t*        j-                  d|        |j                  dt/        |      dddd       Y d}~yd}~ww xY w)u   GET /api/binance-balance - Solde USDT réel depuis Binance (léger, rapide)
        
        🔧 FIX 28/02: Endpoint léger pour récupérer le vrai solde USDT.
        Utilisé par le dashboard pour afficher le Solde Total réel.
        r   Nr   r   r   r   r   r   r   TFu   Clés API non configurées)successrQ   	usdt_freeusdt_locked
usdt_totalrh   
   r   r   r   r   r   r   r      r   )r   r   r   r   r   rO   zBinance API (r   zError in binance-balance: )r/   r   r   r   r   r   r   rT   r   r   r   r   r   r-   r}   r   r   r   rU   r   r   rV   rQ   r   )rH   rW   r.   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rX   s                     r"   handle_binance_balancez#RouteHandler.handle_binance_balance  sD   ;	 ->f&7>b'&R[]aBbG )=tDkPVXdfjHkJ"6>4@L*22$9!"#$"#4  GZXaceWfgF++-*,\*:SPTAT=U*U' ((*G{{:r2HIK W:' %eAEE&!,<&=q AI"'aeeHa.@(A1"EK	 ..&*#I$;Q?'%\\^5570   . # 	.. (	RZZLAq0  
  	LL5aS9:.. Qq0  	sU   A4F 7F 8F >3F 2BF 	FF FF H1GH8HHc                 r   	 ddl }dg g g g g g dddddd}t        j                  j                  | j                  d      }i }t        j                  j                  |      r-	 t        |dd	
      5 }t        j                  |      }ddd       i }|j                         D ]  \  }}	|	j                  dd      }
|	j                  dd      }|
|z  }|||
t        |d      dddd|	j                  dd      |	j                  dd      |	j                  dd      |	j                  dd      d||<    t        |j                               |d<   	 ddlm} ddlm} ddl}t)        |dd      xs t)        |dd      }t)        |dd      xs t)        |dd      }t)        |dd      }||d<   |r|sd|d<   d|d<   |j+                  |       y ||||d d!i"      }	 |j-                         }|d#   t/         |j                          d$z        z
  |_        |j3                         }|j                  d%g       }h d&}|D ]P  }|d'   d(k(  st        t5        |j                  d)d            t5        |j                  d*d            z   d      |d+<    n 	 |j7                         D ci c]  }|d,   t5        |d-          }}t9               }t        j                  j                  | j                  d.      }	 t        j                  j                  |      rGt        |dd	
      5 }t        j                  |      }t9        |j                  d/g             }ddd       g }g }|D ]  }|d'   } t5        |j                  d)d            t5        |j                  d*d            z   }!| |v s|!d0k  rJ| d(k(  rP| d(z   }"|j                  |"d      }#t        |!|#z  d      }$|$d1k  r|#dkD  r|"| t        |!d2      t        |#d2      |$t        t5        |j                  d)d            d2      t        t5        |j                  d*d            d2      d3}%|"|v s|"|v r|j;                  |%       |j;                  |%        |j=                  d4 d5       |j=                  d6 d5       ||d7<   ||d8<   t?        |      |d9<   t        tA        d: |D              d      |d;<   t        tA        d< |D              d      |d=<   d>|d?<   |d   D ]y  }&|&d,   }|j                  |d      }#t        |#d2      |&d@<   t        |&d   |#z  d      |&dA<   |&d   dkD  sGt        |&dA   |&dB   z
  d      |&dC<   t        |#|&d   z  dDz
  dEz  d      |&dF<   { t        tA        dG |d   D              d      |dH<   |D 'ch c]  }'|'d,   	 }(}'t9        |jC                               })dI}*|D 'cg c]  }'|'d,   |)vs|' }+}'|+D 'cg c]  }'|'dJ   |*k\  s|' c}'|dK<   |+D 'cg c]  }'|'dJ   |*k  s|' c}'|dL<   |d   D &cg c]  }&|&d,   |(vs|& c}&|dM<   |d   D &cg c]  }&|&d,   |(v s|&d,    c}&|dN<   tM        jN                         jQ                         |dR<   |j+                  |       y# 1 sw Y   xY w# t        $ r Y w xY w# t        $ r Y w xY wc c}w # t        $ r i }Y w xY w# 1 sw Y   xY w# t        $ r Y w xY wc c}'w c c}'w c c}'w c c}'w c c}&w c c}&w # $ r.},d|d<   dO|,jD                   dP|,jF                   |d<   Y d},~,d},~,wtH        $ r d|d<   dQ|d<   Y t        $ r}-d|d<   tK        |-      |d<   Y d}-~-d}-~-ww xY w# t        $ r@}-tR        jU                  dS|-        |j+                  dtK        |-      dTdU       Y d}-~-yd}-~-ww xY w)VuP  GET /api/maintenance/binance-account - Détail complet du compte Binance
        
        🔧 FIX 28/02: Endpoint dédié pour vérifier la synchronisation bot/Binance
        Retourne: balance USDT, toutes les positions Binance avec montants et valeurs,
                  positions locales du bot, et comparaison détaillée.
        r   Nr   TrL   )usdt_balancebinance_positionsr   orphans_binancedust_orphansorphans_localsyncedtotal_binance_valuetotal_local_valuer   r   rN   r_   r`   utf-8encodingentry_pricequantityr  pattern?
entry_timestop_loss_pcttake_profit_pct)r   r  r  entry_valuecurrent_pricecurrent_valuepnlpnl_pctr  r  	stop_losstake_profitr   r   r   r   r   r   r   r   r   rQ   rN   "   Clés API Binance non configuréesrh   r   r   r   r   r   >   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   TUSDr   FDUSDr   r   r   r   r   r  r   pricerj   rk   -C6?      ?   )r   r   r  r!  
value_usdtr   r   c                     | d   S Nr%   xs    r"   <lambda>z<RouteHandler.handle_binance_account_detail.<locals>.<lambda>  s
    Q|_ r2   r(   reversec                     | d   S r'  r(  r)  s    r"   r+  z<RouteHandler.handle_binance_account_detail.<locals>.<lambda>  s
    < r2   r  binance_otherbinance_other_countc              3   &   K   | ]	  }|d      ywr%  Nr(  .0r   s     r"   	<genexpr>z=RouteHandler.handle_binance_account_detail.<locals>.<genexpr>  s     9aa!L/9a   binance_other_valuec              3   &   K   | ]	  }|d      ywr2  r(  r3  s     r"   r5  z=RouteHandler.handle_binance_account_detail.<locals>.<genexpr>  s     9ea!L/9er6  r  r   r   r  r  r  r  r   r4   r  c              3   &   K   | ]	  }|d      yw)r  Nr(  )r4  lps     r"   r5  z=RouteHandler.handle_binance_account_detail.<locals>.<genexpr>  s     7pPR?8K7pr6  r        @r%  r  r  r	  r
  zErreur Binance (r   u   Module binance non installérO   z!Error in binance-account-detail: rR   rS   )+r/   rq   rr   rs   r@   rt   ru   rv   rw   r   r7   r-   r}   r{   valuesr   r   r   r   r   r   rT   r   r   r   r   r   get_all_tickerssetrz   sortr6   sumkeysr   r   r   r   r   r   rU   rV   rQ   ).rH   rW   r.   r   r   r   r   local_symbolssymposr  r  r  r   r   r   r   r   r   r   r   r   r   IGNORED_ASSETSr   tall_tickerswatchlist_symbolsr   wlr  r/  r   r   r   r!  valuer0   r:  r   binance_syms
local_symsDUST_THRESHOLD_USDT_raw_orphansr   rX   s.                                                 r"   handle_binance_account_detailz*RouteHandler.handle_binance_account_detail=  sY   C	  !%'#%#% "!#'(%&!F   WW\\$//;KLN Oww~~n-ncGD 7*.))A,7
 M+113 S!ggmQ777:q1)H4! (#.#(a#8%&%& "wwy#6"%'',"<!$!!<#&77+<a#@&c"	$ )-]-A-A-C(DF$%H)1B!&*;TBfgfV_aeFf$V-A4HoGTZ\hjnLo
&v~tD$0y!j'.F8$&JF7O#66v>\\egi[jk//1B.0.>ZUZZ\TXEXAY.YF+
 !,,.";;z26" " AzV+16uQUU61=M7NQVWXW\W\]eghWiQj7jlm1n~.%KQKaKaKc"da1X;aj0A#A"dK"d
 %(E!!#doo?O!Pww~~n5!.#H KA!%1B03BFF9b4I0J-K %'! "! 4AgJE!!%%"23eAEE(A<N6OOE.%&.  "V^F'OOFA6E!%%-3E s{uqy  #)!&$)%O!&ua&+ %eAEE&!,<&=q A"'aeeHa.@(A1"EE !22f6M)007%,,U3?4D "&&+Dd&S""'@$"O.?*+*7'03M0B,-05c9aS`9a6acd0e,-05c9eSd9e6egh0i,-!'v !!23 XBX,C'OOC3E*/q/B'*/:0F*JB'-(1,$)"_*==@Q*QST$U5	(-ur-7H/H1/LPS.SUV(W9X /4C7pV\]nVo7p4prs.t*+ 6GG(GG !3!3!56
 '*#+<^a(S]@]^^8D,o1,[nHnQ,o()8D,n1,ZmHmQ,n~&8>?P8Q*v"UWX`UaiuUu2*v';ABS;T#uRXZ[cXdhtXtBxL#ux  #+,,.":":"<F;..v6M7 7  \ ! , #e  %"$K%K K ! z  H
  _,o,n*v#u& N#*x $4RWWIS"Mw A#*x "@w )#*x "%a&w)  	LL<QC@A..!Q0  	s  A]- !Z /Y?Z B;]- 	A9[> [> 8Z 
3[> >A[> Z1 Z,1Z1 34[> (-[ 1[[ G'[> 6A[> [ ![> >[%[%[> [*#[*'
[> 1[/?[/[> [4[4![> .[9;[9[> 6]- ?Z	Z 	Z]- Z]- 	Z)%[> (Z))[> ,Z1 1[ <[> ?[  [> [[ 	[[> [![> >]*$\,']- ,]*]- ]*]%]- %]**]- -	^666^11^6c                    	 ddl }ddlm} ddlm} ddl}g g g g g ddd}|j                  dd      }t        |d	d      xs t        |d
d      }	t        |dd      xs t        |dd      }
t        |dd      }|	r|
s|j                  dddd       y ||	|
|ddi      }	 |j                         }|d   t         |j                          dz        z
  |_        t        j                  j                  | j                   d      }i }t        j                  j#                  |      r-	 t%        |dd      5 }t'        j(                  |      }ddd       t+        |j-                               }t        j                  j                  | j                   d      }i }t+               }	 t        j                  j#                  |      rGt%        |dd      5 }t'        j(                  |      }t+        |j                  dg             }ddd       |j/                         }|j                  dg       }i }	 |j1                         D ci c]  }|d   t3        |d           }}h d!}g }|D ]  }|d"   }t3        |j                  d#d            t3        |j                  d$d            z   }||v s|d%k  rI|d&z   }|j                  |d      }t5        ||z  d'      } | d(k  r|dkD  rz||v s||v s|j7                  ||||| t3        |j                  d#d            d)        |D !ch c]  }!|!d   	 }"}!|d*v r|D !cg c]  }!|!d   |vs|! }#}!|#D ]  }$|$d   }|$d#   }%|%dk  r|d+   j7                  |d,d-       +	 |j9                  |      }&|&s|d+   j7                  |d.d-       Wd}'d}(d})|&d/   D ]Z  }*|*d0   d1k(  rt3        |*d2         }'t3        |*d3         }((|*d0   d4v s0t3        |*j                  d5|*j                  d6d7                  })\ |'rVd8t;        |'      v r5t=        t;        |'      j?                  d9      jA                  d8      d:         nd}+t5        |%|%|'z  z
  |+      }%|(r%|%|(k  r |d+   j7                  |d;|% d<|( d=d-       >|%|$j                  d d      z  },|)r|)nd7}-|,|-k  r,|d>   j7                  |t5        |,d'      d?|,d@dA|- dBdC       |jC                  ||%D      }.|.j                  dEg       }/tE        dF |/D              }0|dG   j7                  ||%t5        |0d'      dH       |dIxx   |0z  cc<    |dLv r|D 3cg c]	  }3|3|"vs|3 }4}3|4rddl%}5|jM                  dMdN      }6t        j                  j#                  |      r|5jO                  ||6       |4D ]  }3|3|v s||3= |dO   j7                  |3         t%        |dPd      5 }t'        jP                  ||d'dQR       ddd       |dSv rddl)}7|j                  dg       }8g }9|8D ]:  }3|7jU                  dT|3      s|dU   j7                  |3       *|9j7                  |3       < |dU   r5|9|d<   t%        |dPd      5 }t'        jP                  ||d'dQR       ddd       t5        |dI   d'      |dI<   tW        jX                         j[                         |dV<   t\        j_                  dWt=        |dG          dXt=        |dO          dYt=        |dU                 |j                  |       y# t        $ r Y Aw xY w# 1 sw Y   xY w# t        $ r Y w xY w# 1 sw Y   >xY w# t        $ r Y Mw xY wc c}w # t        $ r Y w xY wc c}!w c c}!w # |$ r<}1|d+   j7                  |dJ|1jF                   dK|1jH                   d-       Y d}1~1ld}1~1wt        $ r+}2|d+   j7                  |t;        |2      d-       Y d}2~2d}2~2ww xY wc c}3w # 1 sw Y   xY w# 1 sw Y   xY w# t        $ rT}2t\        ja                  dZ|2        ddl1}:|:je                          |j                  dt;        |2      dd[       Y d}2~2yd}2~2ww xY w)\u4  POST /api/maintenance/binance-cleanup - Corriger les orphelins
        
        🔧 FIX 28/02: Vend les positions orphelines sur Binance (non trackées par le bot),
        supprime les positions locales absentes de Binance, et nettoie la watchlist
        des symboles invalides (non-ASCII, etc.).
        r   Nr   r   rL   )soldsell_errorsdust_skippedlocal_removedwatchlist_cleanedtotal_recoveredrN   actionallr   r   r   r   r   TrQ   r  rR     rh   r   r   r   r   r_   r`   r  r  rj   rk   r   r   r!  >   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   r   r   r   r"  r   r  r#  )r   r   r  r!  r%  r   )rX  sell_orphansrR  u#   Quantité libre = 0 (tokens locked))r   rQ   zSymbole invalide sur Binancefilters
filterTypeLOT_SIZEstepSizeminQty)MIN_NOTIONALNOTIONALminNotionalminValr;  .0u   Quantité trop faible (z < r   rS  zValeur z.2fz$ < minimum z$ (dust))r   r%  reason)r   r  fillsc              3   V   K   | ]!  }t        |d          t        |d         z   # yw)r!  qtyNr   )r4  r   s     r"   r5  z6RouteHandler.handle_binance_cleanup.<locals>.<genexpr>  s'     )]RS%'
*;eAeHo*M)]s   ')rQ  )r   r  r%  rV  zAPI : )rX  clean_localr   z_pre_cleanup.jsonrT  wF)indentensure_ascii)rX  clean_watchlistz^[A-Z0-9]+$rU  rO   zBinance cleanup: sold=z, local_removed=z, watchlist_cleaned=zError in binance-cleanup: rS   )3r/   r   r   r   r   r   r-   r   rT   r   r   r   r   rq   rr   rs   r@   rt   ru   rv   rw   r>  rA  r   r=  r   r}   rz   get_symbol_infor   r6   rstripsplitorder_market_sellr@  r   r   r   r   r   dumprematchr   r   rU   rV   r   rQ   	traceback	print_exc);rH   rW   r,   r.   r   r   r   resultsrW  r   r   r   r   r   r   r   r   rL  r   watchlist_datarH  r   r   rG  rF  rE  r  r   r   r   r   r!  rJ  r   rK  r  orphanr  symbol_info	step_sizemin_qtymin_notionalflt	precisionorder_valueeffective_min_notionalorderrh  total_valuer   rX   rC  r	  r   backuprw  symbols_listclean_symbolsry  s;                                                              r"   handle_binance_cleanupz#RouteHandler.handle_binance_cleanup	  sh	   c	 -> ! "!#%'#$G XXh.F f&7>b'&R[]aBbG )=tDkPVXdfjHkJ"6>4@L*22%A4  GZXaceWfgF++-*,\*:SPTAT=U*U'
  WW\\$//;KLN Oww~~n-ncGD 7*.))A,7 _1134J  WW\\$//;KLNN #77>>.1ncGD S)-1,/0B0B9b0Q,R)S ((*G{{:r2HKGMG]G]G_`!q{E!G*,==``N !# '
aeeFA./%h8J2KKN*efn#2eemQ/3;519..&J2F%,,"(!&$)!&&+ %aeeFA&6 7. ( 2CCAAhKCLC 00.?"a1X;V`C`1"a"a- IF#H-F%f~H1}.55&,%J7  !>&,&<&<V&D*#M299*0)G;  %$(	"&'+#.y#9 eC"<0J>,1#j/,B	*/H*>!$\!26R!R/4SWW]CGGT\^aLb5c/de %Z]adenaoZoC	N,A,A#,F,L,LS,QRT,U(VuvI',XI9M-NPY'ZH"x''9#M299*0+B8*CPWyXY)Z;  % '/GQ1G&GAMSV.&)??#N3::*0.3K.C,3K3DLQgPhhp*q< 
 % & 8 8QY 8 Z %		'2 6&))]W\)]&]..&,(0*/Q*?0 
   12kA2}IX //0: Vc>U V V !+33G=PQFww~~n5NF;, A/1 / 4#O4;;C@A
 ncGD T		/1QUST 33-11)R@ "' .C88NC8 34;;C@ !((-. ./0=N9-ncGD S		.!AERS */w7H/I1)MG%&#+<<>#;#;#=GK KK0WV_1E0FFVWZ[bcr[sWtVu  vJ  KN  OV  Wj  Ok  Kl  Jm  n  o..w7q  7 7  S S   a > D #bD / .55&,'+BGG9Brzzl%C7   % .55&,%(V7   !WT T"S S  	LL5aS9:!..!Q0  		s  B` `  8\ A` $\* 2\\* A`  -] 1\:>] $` +] =]] B
` #7` ],&` 1]1>]1/` 2*]6` :]6B*]6` A
]6` A&]66` 	_,_,A` $'` _1%A;`  _>:B` 	\` \` \'"\* *	\73` 6\77` :]?] 	]` ]` ] 	])%` (]))` 6_);1^2,` 2_)> _$` $_))` 1_;6` >`` 	a(A
a##a(c                 *   	 | j                   j                         }||j                  dddd       y|j                  d|d       y# t        $ r@}t        j                  d|        |j                  dt        |      dd	       Y d}~yd}~ww xY w)
u2   GET /api/get-config - Récupérer la configurationNFConfig file not foundr   rQ     T)r   r   zError in get_config: rS   )rA   read_configrT   r   rV   rQ   r   )rH   rW   r   rX   s       r"   handle_get_configzRouteHandler.handle_get_config  s    	((446F~22$44  .. 0 
  	LL045.. Q0  	s   1A	 A	 		B6BBr,   c                    	 t        di |}| j                  j                  |      }|r|j                  ddd       y
|j                  dddd       y
# t        $ r+}|j                  ddt        |       dd	       Y d
}~y
d
}~wt        $ r@}t        j                  d|        |j                  dt        |      dd       Y d
}~y
d
}~ww xY w)z4POST /api/apply-config - Appliquer une configurationTzConfiguration updatedr   r   FzFailed to update configurationr  rS   Validation error: rY  NzError in apply_config: r(  )	r   rA   apply_configrT   
ValueErrorr   r   rV   rQ   )rH   rW   r,   r   r   rX   s         r"   handle_apply_configz RouteHandler.handle_apply_config  s    	"*T*F ))66v>G22#64 
  22$=4 
  	.. -c!fX60    	LL21#67.. Q0  	s(   <A A 	C!BC6CCc           
         	 | j                    d}t        j                  j                  |      r!t	        |i       }|j                  d|d       y|j                  ddddddd	d
dddddddddd       y# t        $ r@}t        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)u7   GET /api/get-ia-criteria - Récupérer les critères IA/ia_criteria.jsonT)r   criteria      @gg?-   A   )bb_squeeze_maxema_diff_minmomentum_minrsi_max	score_ming      g333333ÿ      K   g       @)r  death_crossmomentum_sellrsi_sellprofit_secure      ?C)volatility_ideal	min_grade)buysellcompatibilityzError in get_ia_criteria: Fr  rS   N)
r@   rq   rr   rt   r$   rT   r   rV   rQ   r   )rH   rW   criteria_pathr  rX   s        r"   handle_get_ia_criteriaz#RouteHandler.handle_get_ia_criteria.  s    '	#//@AMww~~m,)-<22# (4   22# /2,1,0'))+  *.+0-1(*-0! 14),*!4 .  	LL5aS9:.. Q0  	s   AA9 'A9 9	C6B==Cc                 v   	 | j                    d}t        j                         j                         |d<   t	        ||       t
        j                  d|        |j                  ddd       y# t        $ r@}t
        j                  d|        |j                  dt        |      d	d
       Y d}~yd}~ww xY w)u9   POST /api/save-ia-criteria - Sauvegarder les critères IAr  last_updateu   ✅ Critères IA sauvegardés: Tu   Critères IA sauvegardésr  zError in save_ia_criteria: Fr  rS   N)r@   r   r   rU   r%   rV   r   rT   r   rQ   r   )rH   rW   r,   r  rX   s        r"   handle_save_ia_criteriaz$RouteHandler.handle_save_ia_criteriaY  s    	#//@AM #+,,.":":"<D =$/KK9-IJ..60   	LL6qc:;.. Q0  	s   A,A/ /	B886B33B8c           
         	 | j                    d}t        |g       }g }i }	 ddlm}  |       }|j	                         }|j                  di       }	 ddlm}	  |	       }
|
j                         }|j                  dg       }|j                  d|dd	 |d
d ||j                  dd      dd       y#  Y dxY w#  Y ;xY w# t        $ r@}t        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)uF   GET /api/rotation-status - Statut du système de rotation intelligentez/rotation_history.jsonr   get_smart_rotationr   r<   rotation_opportunitiesTNr  enabled)opportunitiesr   r   r  )r   rotationzError in get_rotation_status: Fr  rS   )r@   r$   smart_rotationr  
get_statusr-   ai_predictorr=   get_surveillance_statusrT   r   rV   rQ   r   )rH   rW   rotation_history_pathrotation_historyr  rotation_configr  rotation_mgrrN   r=   rP   	ai_statusrX   s                r"   handle_get_rotation_statusz'RouteHandler.handle_get_rotation_statusq  s7   (	'+&77M$N!-.CRH &(" O=13%002"(**Xr":
A24#;;=	)27OQS)T& ..%;CR%@/5-.229dC	0   	LL9!=>.. Q0  	s@   B? /B1 /B8 /B? 1B53B? 8B<:B? ?	D6DDc                    	 	 t         r
t               nd}|rt        |j                        nd}|rt        |dd      nd}t	        j
                         }d}|rt|rr||z
  j                         }t        ||z        dz   }||z  }	||	z
  }
t        |	|z  dz        }|dk  rd}d	}n|d
k  rd}d}nd}d}| d| dt        |
       d}d| d}nd}d}d}d}d}d}|j                  d||| d|rdnd|||ddd       y#  d}d}Y xY w# t        $ rT}t        j                  d |        ddl}|j                          |j                  dt        |      d!d"       Y d}~yd}~ww xY w)#uD   GET /api/cycle-status - Statut simple et compréhensible du cycle IANFlast_cycle_timere   r   r4   !      🟢u
   🟢⚪⚪B      🟡u   🟢🟡⚪   🔴u   🟢🟡🔴z Cycle #u    • szCycle #z	 en coursu	   ⚪⚪⚪u   🔵u!   🔵 En attente du prochain cyclezSurveillance en coursr   T%ActifInactif)
visual_barprogressrN   cycleemojir   )simpledetailed)r   r  zError in cycle_status: r  rS   )_surveillance_service_getterbool
is_runningr   r   r   total_secondsr   rT   r   rV   rQ   ry  rz  r   )rH   rW   rP   r  r  r   cycle_durationelapsedcycle_numbertime_in_cycletime_to_nextprogress_pctr  visualsimple_displayr   rX   ry  s                     r"   handle_cycle_statusz RouteHandler.handle_cycle_status  s   A	'<X68^b9@T'"4"45e
OV''3Dd"K\` ,,.CN:0??A"7^#;<q@ '. 8-="MN$Bc#IJ  "$"E)F!B&"E*F"E+F$)7(<.c,FWEXXY!Z#L>;$!D1  ..,&,'3nA$6-7'Y!-!&#*!
0 K'"
"&d  	LL21#67!.. Q0  		s*   <C= B=D =DD 	E%A
E  E%c                    	 |j                  d      }|j                  d      }|r|s|j                  dddd       y||t        j                         j	                         dd	}| j
                   d
}t        ||       |j                  dd| d| dd       y# t        $ r@}t        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)u@   POST /api/execute-rotation - Exécuter une rotation manuellementsell_symbol
buy_symbolFz sell_symbol et buy_symbol requisr  rY  NT)r  r  rO   manualz/rotation_trigger.json	Rotation     → u    programméer  zError in execute_rotation: rS   )r-   rT   r   r   rU   r@   r%   r   rV   rQ   r   )rH   rW   r,   r  r  rotation_triggertrigger_pathrX   s           r"   handle_execute_rotationz$RouteHandler.handle_execute_rotation  s   !	((=1K,/Jj22$?4  
  +(%\\^557	  #oo..DEL<)9:..&{m5LQ0 
  	LL6qc:;.. Q0  	s   ;B AB 	C%%6C  C%c                 |   	 |j                  dd      }	 ddlm}  |       }||j                  d<   |j	                  d|d|rdnd d       y# t
        $ r |j	                  d	d
dd       Y yw xY w# t        $ r@}t        j                  d|        |j	                  d	t        |      dd       Y d}~yd}~ww xY w)u;   POST /api/toggle-rotation - Activer/Désactiver la rotationr  Tr   r  r  u   activéeu   désactivée)r   r  r   Fz$Module Smart Rotation non disponibler  rS   zError in toggle_rotation: N)
r-   r  r  r   rT   r   r   rV   rQ   r   )rH   rW   r,   r  r  r  rX   s          r"   handle_toggle_rotationz#RouteHandler.handle_toggle_rotation  s    	hhy$/G=1318##I.22#&!*:n*UV4 
  22$C4   	LL5aS9:.. Q0  	s4   A2 8A A/,A2 .A//A2 2	B;;6B66B;c                     	 | j                    d}t        |dg i      }|j                  d|j                  dg       d       y	# t        $ r@}t
        j                  d|        |j                  dt        |      dd       Y d	}~y	d	}~ww xY w)
u:   GET /api/get-profiles - Récupérer les profils de tradingz/trading_profiles.jsonprofilesT)r   r  zError in get_profiles: Fr  rS   N)r@   r$   rT   r-   r   rV   rQ   r   )rH   rW   profiles_pathprofiles_datarX   s        r"   handle_get_profilesz RouteHandler.handle_get_profiles#  s    	#//EFM*=:r:JKM..)--j"=0 
  	LL21#67.. Q0  	s   AA 	B6BBc                    	 t        dd      }||j                  |       y| j                   d}t        |d      }|N|j                  dt	        j
                         j                         dddddddd	ddd
g g g dddddddd       y	 t	        j                  |j                  dd            }t	        j
                         |z
  j                         }|dk  }d||d}t        d|       |j                  |       y#  d}Y *xY w# t        $ r@}	t        j                  d|	        |j                  dt        |	      dd       Y d}	~	yd}	~	ww xY w)u@   GET /api/bot-analysis - Données d'analyse en temps réel du botbot_analysis      $@r)   Nz/bot_analysis.jsonTr   r  )r[   maxPositionswinRater  totalTradeswinslosses)r  r  Fr     )	autoTradestopLoss
takeProfitr   )rO   statssignalsr[   cryptoslogssettings)r   r,   
botRunningrO   r   x   zError in bot_analysis: r  rS   )r1   rT   r@   r$   r   r   rU   fromisoformatr-   r  r;   r   rV   rQ   r   )
rH   rW   cachedanalysis_pathanalysis_datarO   age_secondsbot_runningr   rX   s
             r"   handle_bot_analysisz RouteHandler.handle_bot_analysis5  s   8	D9F!226:#//ABM*=$?M$22#%-\\^%=%=%?)*,.'(#$+,$%&'" ,-a#8%'#% "27QVWdh$i" #('4 0( ( 6 6}7H7HVX7Y ZI#+<<>I#="L"L"NK"-"3K
  $)"-
 >62226:("'K  	LL21#67.. Q0  	s6    D A*D AD #D DD 	E6EEc                    	 ddl m}  |d      }|j                         }|r|j                  d      s%t	        j
                  |j                  d            }|j                  d||j                         t        |j                  di             d       y# t        $ r |j                  dd	d
d       Y yt        $ r@}t        j                  d|        |j                  dt        |      d
d       Y d}~yd}~ww xY w)u1   GET /api/crypto-data - Données crypto complètesr   get_fetcherFuse_testnetrk   Tforce)r   r,   cache_validcountCrypto fetcher not availabler    zError in crypto_data: rS   N)crypto_data_fetcherr  get_cached_datar-   asyncior   fetch_all_datarT   is_cache_validr6   r   r   rV   rQ   r   )rH   rW   r  fetcherr,   rX   s         r"   handle_crypto_datazRouteHandler.handle_crypto_dataq  s    	7 "e4G**,Dtxx	2{{7#9#9#9#EF..&557TXXi45	0   	.. 70   	LL1!56.. Q0  	s   BB C?7C??6C::C?c                     	 ddl m}  |d      }|j                  j                  d      se|j                  sY	 t        j                         }t        j                  |       |j                  |j                                |j                          |j                         }	 i }|j                  j                  di       }|j                         D ]  \  }	}
|
j                  dd      }|
j                  d	i       j                  d
d      }|
j                  d	i       j                  dd      }|
j                  dd      }|
j                  dd      }t!        |
j                  d      t"              r"|
j                  di       j                  dd      nd}|	|rt%        |d      nd||rt%        |d      nd|rt%        |d      nd||dd||	<    t&        j(                  j+                  | j,                  d      t&        j(                  j+                  | j,                  dddd      g}i }|D ]'  }t&        j(                  j/                  |      }t&        j(                  j1                  |      sCt3        |dd      5 }t5        j6                  |      }ddd       j                         D ]  \  }	}|	|vr|||	<   ||	   }|j                  dd      |j                  dd      z   |d<   |j                  dd      |j                  dd      z   |d<   |j                  dd      |j                  dd      z   |d<   |j                  d      s|d   |d<    * |j                         D ]  \  }	}|	|v rd ||	   d!<   |j                  dd      ||	   d"<   |j                  dd      ||	   d#<   |j                  dd      dkD  rt%        |d   |d   z  d$z  d      nd||	   d%<   t9        |j                  d            ||	   d&<   |	ddddd'd'd(|j                  dd      |j                  dd      |j                  dd      dkD  rt%        |d   |d   z  d$z  d      ndt9        |j                  d            d)||	<    t&        j(                  j/                  t&        j(                  j+                  | j,                  ddd*            }t&        j(                  j1                  |      rrt3        |dd      5 }t5        j6                  |      j                  dg       }ddd       D ]1  }	|	|v r||	   d!   dk(  r	d ||	   d!<   |	|vs |	ddddd'd'd(ddddd)||	<   3 |j                         D 	cg c]l  \  }	}|j                  dd      dk(  rR|	j;                         rB|	j=                         r2|	j?                  d+      s|	j?                  d,      rtA        |	      d-k\  r|	n }}	}|ri	 ddl!m"} ddl#m$} d$}tK        dtA        |      |      D ]?  }||||z    } t5        jL                  | d./      }!d0|jO                  |!       }"|jQ                  |"d1d2i3      }#|jS                  |#d45      5 }$t5        jT                  |$jW                         jY                               }%ddd       %D ]  }&|&j                  d6d7      }	t[        |&j                  d8d            }|	|v s5|dkD  s;t%        |d4      ||	   d<   t%        t[        |&j                  dd            d      ||	   d9<   t%        t[        |&j                  dd            d      ||	   d:<    B 	 t]        |j_                         d< d=>      }(|(|d?<   tA        |(      |d@<   ta        dA |(D              |dB<   ta        dC |(D              |dD<   ta        dE |(D              |dF<   ta        dG |(D              |dH<   |jc                  d=|dJ       y# t        $ r#}t        j                  d|        Y d}~rd}~ww xY w# 1 sw Y   ~xY w# 1 sw Y   xY wc c}}	w # 1 sw Y   xY w# t        $ r#}'t        j                  d;|'        Y d}'~'d}'~'ww xY w# t        $ r"}t        j                  dI|        Y d}~d}~ww xY w# td        $ r |jc                  ddKdLdM       Y yt        $ r@}t        jg                  dN|        |jc                  dti        |      dLdO       Y d}~yd}~ww xY w)PuN   GET /api/crypto-summary - Résumé des données crypto + valeurs tradables spyr   r  Fr  rk   zCould not refresh cache: NpriceChangePercentr  
rsi_signalneutraltrendr!  quoteVolume
indicatorsrsir  r   bot)r   
change_24hr!  
volume_24hr)  r$  r&  sourcespy_coin_scores.jsonz..crypto_trading_prodr,   r`   r  r  r\   r  total_pnl_usdtblocked_untilbothr-  
spy_tradesspy_pnlr4   spy_winratespy_blockedunknownspy)r   r+  r!  r,  r)  r$  r&  r-  r3  r4  r5  r6  rj   r   r   re   ),:)
separatorsz3https://api.binance.com/api/v3/ticker/24hr?symbols=
User-AgentMozilla/5.0headers   rh   r   r   	lastPricer+  r,  z)Could not enrich spy coins from Binance: c                 &    | j                  dd      S )Nr+  r   r-   r)  s    r"   r+  z4RouteHandler.handle_crypto_summary.<locals>.<lambda>  s    aeeT`bcNd r2   Tr,  all_tradabletradable_countc              3   0   K   | ]  }|d    dv sd  yw)r-  )r*  r2  r   Nr(  r4  r9   s     r"   r5  z5RouteHandler.handle_crypto_summary.<locals>.<genexpr>"       *h8XgIg1*h   	bot_countc              3   0   K   | ]  }|d    dv sd  yw)r-  )r8  r2  r   Nr(  rH  s     r"   r5  z5RouteHandler.handle_crypto_summary.<locals>.<genexpr>#  rI  rJ  	spy_countc              3   2   K   | ]  }|d    dk(  sd  yw)r-  r2  r   Nr(  rH  s     r"   r5  z5RouteHandler.handle_crypto_summary.<locals>.<genexpr>$  s     +`!!H+Y_J_A+`   
both_countc              3   D   K   | ]  }|j                  d       sd  yw)r6  r   NrD  rH  s     r"   r5  z5RouteHandler.handle_crypto_summary.<locals>.<genexpr>%  s     2fQRQVQVWdQe12fs     spy_blocked_countz Could not load tradable values: )r   summaryr  r  r  zError in crypto_summary: rS   )5r  r  cacher-   is_updatingr  new_event_loopset_event_looprun_until_completer  closer   rV   rb   get_summaryr7   rx   ry   r}   rq   rr   rs   r@   normpathrt   ru   rv   rw   r#   isasciiisalnumendswithr6   urllib.requestrequesturllib.parser   rangedumpsquoteRequesturlopenloadsreaddecoder   sortedr<  r@  rT   r   rQ   r   ))rH   rW   r  r   looprX   rS  rE  cache_symbolsrC  sdatar+  rsi_sigr&  r!  r,  rsi_valspy_scores_pathsmerged_spy_scoresspy_scores_pathr   partialscexistingprod_wl_pathprod_wl_symsr9   missing_syms_ureq_uparse
chunk_sizeichunk	syms_jsonurlreqresptickersrF  	e_binancesorted_tradables)                                            r"   handle_crypto_summaryz"RouteHandler.handle_crypto_summary  s	   d	7 "e4G
 ==$$Y/8K8KD"113D**40++G,B,B,DEJJL ))+G~G! ' 1 1)R @ #0"5"5"7 JC!&+?!CJ#ii	26::<SG!IIi488)LE!IIgq1E!&=!!<JKUV[V_V_`lVmosKteiib9==eQGz{G"%>HeJ&:a!&>HeJ&:a4;uWa0&-!&"'	)L%* GGLL2HIGGLL$8MvWmn$  %'!'7 TO&(gg&6&6&GOww~~o6!/3I 3Q&*iilG3'.}} 
TGC"*;;9; 1# 6 ,=S+A5=\\(A5NQSQWQWX`bcQd5d 23;<<3JRVVTZ\]M^3^ 0=E\\JZ\]=^acagaghxz{a|=|)9 :#%66/#:@B?@SH_$=
TT"  1668 GCl*6<S)(3:<&&1:MS),779vv>NPQ7RS))4hjhnhnowyzh{~h5FbQYlAZ]`A`bc;d  FGS)-8;STVTZTZ[jTk;lS)-8 '**+%&*+#$*3%.&+*,&&1*=')vv.>'BXZX^X^_gijXknoXo5Fbl1JS1PRS+Tuv+CBFF?D[+\-S)0  "ww//T__dTik{0|}77>>,/lC'B Ga'+yy|'7'7	2'FG+ 	,.<3DX3NRW3W:@L-h7 4*-Q./)2e./Aa`e	1L-		 '3&8&8&: "CuuWa(A-#++-f-f1ECA	      `OO%(
!&q#l*;Z!H oA$01z>$BE(,

5Z(PI$WX_XeXefoXpWq"rC"'--lM=Z-"[C!&sA!> K$*.**TYY[5G5G5I*JK%, o&'eeHb&9(-aeeK.C(D#&,#6519AFuaL$5g$>FKERSRWRWXlnoRpLqstFuL$5l$CFKERSRWRWXeghRiLjlmFnL$5l$Coo$ #))<)<)>Ddnr"s*9',/,@()'**ho*h'h$'**ho*h'h$(++`+`(`%/22fo2f/f+, .."0 M ! DNN%>qc#BCCDN3 3PG G "K K % `)RS\R]'^__`  G!A!EFFG  	.. 70   	LL4QC89.. Q0  	s  6b A_ b "Ga' +a' 9`B6a' F&a' ,&`)a' <'a' #A1`%a' B`8 2`+>`8 `8 A-`8 Ba' b 	`%`=b `b `	a' `"a' +`5	0`8 8	a$aa' a$$a' '	b0bb bb c=5c==6c88c=c           
      *   	 ddl m}  |d      }t        j                         }t        j                  |       |j                  |j                  d            }|j                          |j                  ddt        |j                  di             |j                  d	      d
       y# t        $ r |j                  dddd       Y yt        $ r@}t        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)u5   GET /api/crypto-refresh - Rafraîchir le cache cryptor   r  Fr  Tr  zCache refreshedrk   
updated_at)r   r   r  r  r  r  r  zError in crypto_refresh: rS   N)r  r  r  rV  rW  rX  r  rY  rT   r6   r-   r   r   rV   rQ   r   )rH   rW   r  r   rk  r,   rX   s          r"   handle_crypto_refreshz"RouteHandler.handle_crypto_refresh:  s   	7 "e4G ))+D""4(**7+A+A+A+MNDJJL..,TXXi45"hh|4	0   	.. 70   	LL4QC89.. Q0  	s   B'B* *D
D6DDc                 $   	 ddl m}  |d      }|j                  ddi|       y# t        $ r |j                  dddd	       Y yt        $ r@}t
        j                  d
|        |j                  dt        |      dd       Y d}~yd}~ww xY w)u1   GET /api/opportunities - Opportunités de tradingr   )get_opportunitiesFr  r   Tr  r  r  zError in opportunities: rS   N)r  r  rT   r   r   rV   rQ   r   )rH   rW   r  r  rX   s        r"   handle_opportunitiesz!RouteHandler.handle_opportunities[  s    	= .%@M..400 
  	.. 70   	LL3A378.. Q0  	s   $' BB6B

Bc                    	 t        di |}| j                   d}t        |i       }|j                  d      j	                         D ]
  \  }}|||<    t        ||      r|j                  d|d       y|j                  dddd       y# t        $ r+}|j                  dd	t        |       dd
       Y d}~yd}~wt        $ r@}t        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)u:   POST /api/update-settings - Mettre à jour les paramètresz/bot_settings.jsonT)exclude_none)r   savedFzFailed to save settingsr  rS   r  rY  NzError in update_settings: r(  )r   r@   r$   ry   r7   r%   rT   r  r   r   rV   rQ   )	rH   rW   r,   r  settings_fileru  r(   rJ  rX   s	            r"   handle_update_settingsz#RouteHandler.handle_update_settingst  s1   !	%--H  $//ABM%mR8H 'mmm>DDF &
U %& mX622#%4 
  22$64 
  	.. -c!fX60    	LL5aS9:.. Q0  	s*   A3B 6B 	D!B;;D6DDc                 ,   	 t        di |}| j                  j                  |j                        s|j	                  dddd       yt        j                  | j                  j                               }|j                  |vr#|j	                  dd|j                   dd       y||j                     }| j                  j                  |j                  |d	      }|r#|j	                  d
d|j                   dd       y|j	                  dddd       y# t        $ r+}|j	                  ddt        |       dd       Y d}~yd}~wt        $ r@}t        j                  d|        |j	                  dt        |      dd       Y d}~yd}~ww xY w)z+POST /api/force-close - Fermer une positionFzInvalid symbolr  rY  NzPrice not found for r  manual_close)rg  Tz	Position z closedr  zFailed to close positionrS   r  zError in force_close: r(  )r   rG   is_safe_symbolr   rT   r  r   rB   get_current_pricesclose_positionr  r   r   rV   rQ   )rH   rW   r,   r`  prices
exit_pricer   rX   s           r"   handle_force_closezRouteHandler.handle_force_close  s   4	'/$/G >>00@22$-4   [[!5!5!H!H!JKF~~V+22$3GNN3CD4  /J **99% : G 22#!*7>>*:'B4 
  22$74 
  	.. -c!fX60    	LL1!56.. Q0  	s8   AD AD &AD D 	F!!EF6FFc                 ,   	 |j                  d      }|j                  d      }|||j                  dddd       yt        |      }t        |      }| j                  j	                  ||      }|j                  d      rd	nd
}|j                  ||       y# t
        $ r+}|j                  ddt        |       dd       Y d}~yd}~wt        $ r@}t        j                  d|        |j                  dt        |      dd
       Y d}~yd}~ww xY w)uM   POST /api/update-positions-sltp - Mettre à jour SL/TP des positions en coursr  r  NFz'stop_loss_pct et take_profit_pct requisr  rY  r      rS   zValeur invalide: z Error in update_positions_sltp: )
r-   rT   r   rB   update_positions_sltpr  r   r   rV   rQ   )rH   rW   r,   r  r  r   rN   rX   s           r"   handle_update_positions_sltpz)RouteHandler.handle_update_positions_sltp  s(   	 HH_5M"hh'89O$(?22$F4   "-0M#O4O ))??_F"JJy1SsF..vv> 	.. ,SVH50    	LL;A3?@.. Q0  	s)   ;B AB 	D!!CD6DDc                 6	   t         j                  d       t         j                  d|        	 t         j                  d       t        j                  | j                  j                               \  }}}t         j                  d| d| dt        |              |dkD  r| d}|r|d	t        |       d
z  }d}n|rt         j                  dt        |       d       t        t        j                  j                  | j                  d      i       }|rt        j                  j                  | j                  d      }	t        |	dt        j                         j!                         t#        |j%                               dd       t         j                  dt        |       d       dt        |       d}d}nd}d}t        j                  j                  | j                  d      }
	 t        j                         t'        d      z   }|j)                         }t+        |
dd      5 }t-        j.                  |d t        j                         j!                         d!|       d"d"d"       t         j                  d#|j1                  d$       d%|d&d'       |j5                  |dkD  xs | |t7        |d)      |||d*       y"# 1 sw Y   `xY w# t2        $ r"}t         j                  d(|        Y d"}~]d"}~ww xY w# t2        $ r}t         j9                  d+|        	 t        t        j                  j                  | j                  d      i       }|rt        j                  j                  | j                  d      }	t        |	dt        j                         j!                         t#        |j%                               d,d       t         j                  d-t        |       d.       |j5                  d/ddt;        |      gdt        |       ddd*       n|j5                  d0t;        |      dd1d2       nQ# t2        $ r@}t         j9                  d3|        |j5                  d0t;        |      d4d2       Y d"}~nd"}~ww xY wY d"}~y"Y d"}~y"d"}~ww xY w)5u?   POST /api/sell-all - Vendre toutes les positions IMMÉDIATEMENTu   🔴 SELL ALL REQUEST RECEIVED!z	   Data: z#   Calling close_all_positions()...z   Result: sold=z, pnl=z	, failed=r   u!    position(s) vendues avec succès (u    échec(s))	completedu$   ⚠️ 0 ventes directes réussies, u    échecs → signal pour le botr_   zsell_all_signal.jsonSELL_ALLmanual_dashboard_fallback)rW  rO   rk   rg  u!   📤 Signal sell_all créé pour z positions (fallback bot)u   Signal envoyé au bot pour z position(s)pendingu   Aucune position à vendreemptyztrading_pause.jsonre   )minutesrn  r  r  zSELL_ALL executed)paused_untilrg  rO   Nu   ⏸️ Pause créée jusqu'à %H:%M:%Sz (ts=.0fr   u   Erreur création pause: r  )r   rQ  	total_pnlfailedr   rN   u   ❌ Error in sell_all: manual_dashboard_error_fallbacku+   📤 Signal sell_all d'urgence créé pour ra   TF)r   rQ   r   rS   u   ❌ Double error in sell_all: r  )rV   r   r  r   rB   close_all_positionsr6   rb   r$   rq   rr   rs   r@   r%   r   r   rU   r{   rA  r	   rO   ru   rv   rv  strftimer   rT   r}   rQ   r   )rH   rW   r,   
sold_countr  r  r   rN   r[   signal_file
pause_filepause_untilpause_tsr   rX   e2s                   r"   handle_sell_allzRouteHandler.handle_sell_all  s!   56iv&'[	KK=>,3KK$$88:-)J	6 KK*:,fYKyQTU[Q\P]^_A~'L(IJCK=<<G$!Ec&k]Rqrs*277<<IY+Z\^_	"$'',,t@V"WK";",%-\\^%=%=%?#'	(8#9"=	1  KK"CC	NCSSl mn7I7G|T"5  doo7KLJ?&llny/CC&002*cG< II(0"5%-\\^%=%=%? 	 <[=Q=QR\=]<^^cdlmpcqqrst ..%>7Z""9a0 " 0    ?!9!=>>?  !	LL21#67*277<<IY+Z\^_	"$'',,t@V"WK";",%-\\^%=%=%?#'	(8#9"C	1  KK"McR[nM]]g hi#66#' !%&#&q6(%@Y@PP\#]"+8  $66#(!$Q#>8 	
  =bTBC22$ V4  =!	s   F=L  -?K ,;K'4K *L  KK 	K=K83L  8K==L   
R
R#DP=<R=	R6R<RRRRc           	      J	   	 g }g }i di dg dg dg dddddg d	i d
i di di di di di dg di }t         j                  j                  | j                  dd      }t	        j
                         j                  d      }t         j                  j                  |d|       }	 t        j                  |d       t        j                  d|        |j                         D ]  \  }
}t         j                  j                  | j                  |
      }	 |rrt         j                  j                  |      rSddl}t         j                  j                  |t         j                  j                  |
            }|j!                  ||       t#        |dd      5 }|dk(  rnt%        j&                  ||d        ddd       |j)                  |
       t        j                  d!|
 d"        d%D ]  }t         j                  j                  | j                  |      }	 |rSt         j                  j                  |      r4ddl}|j!                  |t         j                  j                  ||             t#        |dd      5 }|j/                  d&| d'       ddd       |j)                  |        t         j                  j                  | j                  d(      }	 t#        |dd      5 }t%        j&                  d)t	        j
                         j1                         |d*|       ddd       |r(|j3                  d|||r|ndt5        |       d,d-       y|j3                  d.|d/d0d1       y# t        $ r%}	t        j                  d|	        d}Y d}	~	d}	~	ww xY w# 1 sw Y   xY w# t        $ rE}	|j)                  |
 d#t+        |	              t        j-                  d$|
 d#|	        Y d}	~	d}	~	ww xY w# 1 sw Y   ixY w# t        $ r Y 'w xY w# 1 sw Y   xY w# t        $ r#}	t        j                  d+|	        Y d}	~	 d}	~	ww xY w# t        $ r@}	t        j-                  d2|	        |j3                  d.t+        |	      d3d1       Y d}	~	yd}	~	ww xY w)4u   POST /api/reset-dashboard - Réinitialiser TOUS les compteurs et historiques
        
        🔧 FIX 28/02: Reset complet de tous les fichiers de compteurs/stats,
        avec archivage préalable dans trade_logs/archives_reset/
        r_   rc   espion_history.jsonzrotation_history.jsonztrade_logs/trades_log.jsonl__EMPTY_FILE__ztrade_logs/signals_log.jsonlzai_opportunities.jsonzai_training_stats.jsonzai_self_optimizer_results.jsonbot_analysis.jsonzperformance_stats.jsonia_surveillance_cache.jsonauto_updater_status.jsonespion_trades.jsonespion_opportunities.jsonspy_status.json
trade_logsarchives_resetz%Y%m%d_%H%M%Sdashboard_reset_T)exist_oku   📦 Archive créée: u    Impossible de créer l'archive: Nr   rn  r  r  r  )ro  r   u    réinitialisérl  u   ❌ Erreur réinitialisation )trading_bot.logzbot_output.txtzbot_error.txtzbot_debug.txtz--- Reset compteurs z ---
zreset_signal.jsonRESET_DASHBOARD)rW  rO   files_clearedu   Signal reset non créé: u    fichier(s) réinitialisé(s))r   clearederrorsarchiver   Fu   Aucun fichier réinitialisé)r   r  r   rS   zError in reset_dashboard: r  )rq   rr   rs   r@   r   r   r  makedirsrV   r   r   rb   r7   rt   r   basenamecopy2ru   rv   rv  rz   r   rQ   writerU   rT   r6   )rH   rW   r,   r  r  files_to_cleararchive_dirrO   archive_pathrX   filenameempty_content	file_pathr   archive_filer   r   log_pathr  s                      r"   handle_reset_dashboardz#RouteHandler.handle_reset_dashboardU  s   o	MF " %b	
 &r ( ./? /0@ ( )" 1" $R )"  -b!$ +B%( %b)* ,R+, "2-N4 '',,tFVWK //@I77<<7G	{5STL$L484\NCD
 ,:+?+?+A R'-GGLL(C	R#y(A%')ww||L"''BRBRS[B\']Y= iw? B1(,<<  IImQqA	B
 "((2KK$xj @A!R, d 
77<<B#x(@%Xrww||L(/SThg> J!"6yk HIJ!((2
 '',,t8KLK@+sW= II"3%-\\^%=%=%?)6 	 22#,$/;|"%m"4!55RS4   22$$=4 	w  $!A!EF#$B B ! RMMXJbQ"9:LL#@
"QC!PQQRJ J !    @!:1#>??@$  	LL5aS9:.. Q0  	s  B'Q */M2 AQ BN0N#<2N0.2Q !A#PPP3,Q  P* .;P)P* 1)Q Q 2	N ;NQ N  Q #N-	(N00	O>9:O93Q 9O>>Q P	P	PQ PQ P'#P* *	Q3QQ QQ 	R""6RR"c                 ,   	 | j                   j                         }|r|j                  d|dd       y	|j                  dddd       y	# t        $ r@}t        j                  d|        |j                  dt        |      dd       Y d	}~y	d	}~ww xY w)
u*   POST /api/restart-bot - Redémarrer le botTzBot restarted successfully)r   pidr   FzFailed to restart botr  rS   zError in restart_bot: N)rC   restart_botrT   r   rV   rQ   r   )rH   rW   r,   r  rX   s        r"   handle_restart_botzRouteHandler.handle_restart_bot  s    	""..0C22#;4   22$44 
  	LL1!56.. Q0  	s   1A
 A
 
	B6BBc                 b   	 t         j                  j                  | j                  d      }t         j                  j	                  |      }|j                  d||rdndd       y
# t        $ r@}t        j                  d|        |j                  dt        |      dd	       Y d
}~y
d
}~ww xY w)uN   GET /api/bot-disabled-status - Retourne si le bot est désactivé manuellementbot.disabledTu   Bot désactivé manuellementu   Bot activér   disabledr   zError in bot_disabled_status: Fr  rS   N)
rq   rr   rs   r@   rt   rT   r   rV   rQ   r   )rH   rW   flagr  rX   s        r"   handle_bot_disabled_statusz'RouteHandler.handle_bot_disabled_status  s    
	Y77<<@Dww~~d+H..$=E9=0 
  	YLL9!=>..53q6/RTWXX	Ys   A"A% %	B..6B))B.c                 j   	 t         j                  j                  | j                  d      }|j	                  dd      }|dk(  rt        |d      5 }|j                  dt        j                         j                          d       ddd       d	dl
}d	dl}g }|j                  g d
      D ]  }		 dj                  |	j                  j	                  d      xs g       }
d|
v sd|
v rS|	j                         |j                  k7  r6|	j!                  |j"                         |j%                  |	j&                          |j-                  dd|d| dd       y|dk(  rJt         j                  j/                  |      rt        j0                  |       |j-                  dddd       y|j-                  dddd       y# 1 sw Y   6xY w# |j(                  |j*                  f$ r Y :w xY w# t2        $ r@}t4        j7                  d|        |j-                  dt9        |      dd       Y d}~yd}~ww xY w)uA   POST /api/bot-toggle - Activer ou désactiver le bot manuellementr  rW  r   disablern  zDisabled manually at rl   Nr   )r  namecmdline r  ztrading_bot.pybot_watchdog.pyTu#   Bot désactivé et arrêté (PIDs: r   )r   r  killed_pidsr   enableFu@   Bot activé — relancez le watchdog manuellement si nécessairer  u'   action doit être "enable" ou "disable"r  rY  zError in bot_toggle: rS   )rq   rr   rs   r@   r-   ru   r  r   r   rU   signalpsutilprocess_iterr   rN   STATUS_ZOMBIEsend_signalSIGTERMrz   r  NoSuchProcessAccessDeniedrT   rt   remover   rV   rQ   r   )rH   rW   r,   r  rW  r   sig_modr  killedprocr  rX   s               r"   handle_bot_togglezRouteHandler.handle_bot_toggle  s   )	Y77<<@DXXh+F"$_ TGG3HLLN4L4L4N3OrRST )"//0JK D"%((499==+C+Ir"J+w6:Kw:V#{{}0D0DD $ 0 0 A &dhh 7  22# $#)!DVHAN	4  8#77>>$'IIdO22# %a4   22uOx3y{~?T T #00&2E2EF (  	YLL045..53q6/RTWXX	Ysb   AG) 6F:(G) /B	G8G) AG) $G) :G?G) G&"G) %G&&G) )	H226H--H2c                    	 t        d,i |}h d}|j                  D cg c]H  }|j                         r6|j                  d      s|j                  d      rt	        |      dk\  r||vr|J }}t	        |j                        t	        |      z
  }|dkD  rt
        j                  d| d       | j                   d}i }	d}
	 t        |d	d
      5 }t        j                  |      }	ddd       t	        |	j                  dg             }
|
dk\  r\t	        |      |
dz  k  rKt
        j                  dt	        |       d|
 d       |j                  ddt	        |       d|
 ddd       y|t        j                          j#                         t	        |      |	j                  di       |	j                  di       d}t%        ||      r 	 ddlm}  |       }|rt+        |d      rt-        t.        j1                  |t-        |	j                  di       j3                               z   t-        |	j                  di       j3                               z               }|j5                  |       t
        j                  dt	        |       dt	        |       d t	        |      t	        |      z
   d!       t	        |       d#}|dkD  r	|d$| d%z  }|j                  d&t	        |      |d'       y|j                  dd(dd)       yc c}w # 1 sw Y   xY w# t        $ r Y w xY w# t        $ r"}t
        j                  d"|        Y d}~d}~ww xY w# t6        $ r+}|j                  dd*t9        |       dd       Y d}~yd}~wt        $ r@}t
        j;                  d+|        |j                  dt9        |      dd)       Y d}~yd}~ww xY w)-z3POST /api/save-watchlist - Sauvegarder la watchlist>!   AUDUSDTBRLUSDTDAIUSDTEURUSDTGBPUSDTTRYUSDTUAHUSDTAEURUSDTBETHUSDTBIDRUSDTBKRWUSDTBUSDUSDTFRAXUSDTGUSDUSDTJPYCUSDTLUSDUSDTPAXGUSDTRETHUSDTTUSDUSDTUSD1USDTUSDCUSDTUSDPUSDTUSDTUSDTUSTCUSDTWBNBUSDTWBTCUSDTWETHUSDTXAUTUSDT	CBETHUSDT	FDUSDUSDT	PYUSDUSDT	STETHUSDT	WBETHUSDTr   r   re   r   z[WATCHLIST] u)    symbole(s) non exploitable(s) filtré(s)z/watchlist.jsonr`   r  r  Nrk      r  z[WATCHLIST] Refus sauvegarde: z
 < 50% de u    (sécurité)FzSafety guard: saving z symbols would drop from z2 (>50% reduction). Use explicit reset to override.r  rY  
auto_addedspy_injected)rk   r  r  r  r  r<   set_symbolsu+   [WATCHLIST] Surveillance IA synchronisée: z symboles (z manuels + z auto)u/   [WATCHLIST] Surveillance IA non synchronisée: z symbols savedr  u    non-exploitable(s) filtré(s))T)r   r  r   zFailed to save watchlistrS   r  zError in save_watchlist: r(  )r   rk   r\  r^  r6   rV   r   r@   ru   rv   rw   r-   r   rb   rT   r   r   rU   r%   r  r=   hasattrr{   ry   fromkeysrA  r  r  r   rQ   )rH   rW   r,   r`  NON_EXPLOITABLEr  filtered_symbolsremoved_countr   existing_dataexisting_countr   r|  r=   surveillanceall_syms_emsgrX   s                      r"   handle_save_watchlistz"RouteHandler.handle_save_watchlist  sB   ]	&..G	O #?? 99;AJJv$6!**V:LRUVWRX\]R]bckzbz      037G3HHMq l=/9bcd !%0@NMN.#@ 1A$(IIaLM1!$]%6%6y"%E!F
 #,<(=RS@S(S!?DT@U?VV`ao`pp}~22$4S9I5J4KKdesdt  ug  h4   ,&lln668-.+//bA - 1 1." EN nn=[E#;#=L#m(L#',"=#4#4\2#F#K#K#MNO"=#4#4^R#H#M#M#OPQ) $
 %00:&QRUV^R_Q``klo  qA  mB  lC  CN  OR  S[  O\  ]`  aq  ]r  Or  Ns  sy  %z  { -./~> 1$R.MNNC22# !12"4   22$74  1 1  F ! [NN%TUWTX#YZZ["  	.. -c!fX60    	LL4QC89.. Q0  	s   M AK=,AM L L%#L A M )AM C$L ,:M 'M =M LL 	LM LM 	M
(M M M

M 	O!M<<O6OOc                 
   	 d}ddl }ddl}|j                  j                  |j                  j	                  |j                  j	                  t
                    d      }t        d      D ]  }|j                  j                  |      r	 t        |dd      5 }t        j                  |      }ddd       |rL|j                  dd      dkD  r7|j                  d	t        j                         j                               |d	<    n9t        j!                  d
|dz    d       d}	 |dk  s |j$                  d        |s	 ddlm}	m}
  |	       } |
       }|j-                         }|D cg c]  }|d   dk(  s| }}|D cg c]  }|d   dk(  s| }}g d}|D cg c].  }|j                  d      dk(  s|j                  dd      |v s-|0 }}|D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      dv s| }}|D cg c]  }|j                  d      dk(  s| }}|D cg c]  }|j                  d      dk(  s| }}|rt/        |j0                        nd}g }d}g }d}d}	 |j3                         }|j                  d g       }|j                  d!      }|j                  d"g       }|j                  d#      }|j                  d$      }||n|}|r|nat7        t9        |            t7        t9        |            t7        t9        |            t7        t9        |            t7        t9        |            d&} |r|n|dd' |dd( |dd) |dd' d*}!|d+|rt7        |j:                        nd'dd|r*t=        |d,      rt7        t9        |j>                              nd|r*t=        |d,      rt7        t9        |j>                              nt7        t9        |            t7        t9        |            t7        t9        |            |dd( ||dd' || |!d-}|jC                  d|t        j                         j                         d1       y# 1 sw Y   xY w# t"        $ r+}t        j!                  d|dz    d|        d}Y d}~}d}~ww xY wc c}w c c}w c c}w c c}w c c}w c c}w c c}w # t"        $ r#}t        j5                  d%|        Y d}~d}~ww xY w# t@        $ r.}t        j!                  d.|        dd/dddddg g d0	}Y d}~d}~ww xY w# t"        $ r@}t        jE                  d2|        |jC                  dtG        |      d3d4       Y d}~yd}~ww xY w)5zKGET /api/ai-surveillance - Statut de la surveillance IA avec Smart CriteriaNr   r     r`   r  r  analyzedrO   z#Cache IA vide ou invalide (attempt r   r   z!Erreur lecture cache IA (attempt r   r  皙?)get_ai_predictorr=   rN   readywatching)CREUX_REBOUNDPULLBACKSQUEEZE_BREAKOUTEARLY_BREAKOUTCONSOLIDATION_BREAKOUTEMA_BULLISHCROSSOVER_IMMINENTVOLUME_REVERSALRSI_REVERSALSTRONG_UPTRENDHIGH_SCORE_OVERRIDEsmart_signalACHATr  r   POSSIBLE)VENTEEN_POSITION
ABANDONNEEsmart_eligibleTFr  rotation_statusready_signalssmart_summary	by_statuszError getting rotation data: )achatpossiblevente
abandonneeeligiblere   r     )rB  en_surveillancerD  rE  smart_criteria_v3symbols_to_watch)r  r   update_intervalai_availablesmart_criteria_availabletotal_symbolsr'  ready_to_buyr+  top_opportunitiesr?  r  r>  r@  rA  zAI module not available: none)	r  r   rL  rN  r'  rO  r+  rP  r?  r   r,   rO   zError in ai_surveillance: r  rS   )$rq   r/   rr   rs   dirname__file__rb  rt   ru   rv   rw   r-   r   r   rU   rV   rb   r   sleepr  r)  r=   get_watchlistr  r  r  debugr   r6   rK  r  rJ  r   rT   rQ   r   )"rH   rW   rN   rq   r.   
cache_fileattemptr   rX   r)  r=   	predictorr   r   rn  r*  r+  BUYABLE_PATTERNSsmart_achatsmart_possiblesmart_ventesmart_abandonneeeligible_valuesr  r  r>  validated_readyvalidated_summaryvalidated_by_statussurveillance_status	rot_errorfinal_achatfinal_summaryfinal_by_statuss"                                     r"   handle_ai_surveillancez#RouteHandler.handle_ai_surveillance  s   J	F  bggoobggooh6O&PRnoJ !8 %77>>*-&!*cGD 2%)YYq\F2 "fjjQ&?!&C28**[(,,.JbJbJd2eF;/!"NN-PQXYZQZP[[\+]^%)F Q;EKK$!%& `W 0 2I#;#=L ) 7 7 9I(1L1Qx[G5KQLEL+4Ra(z8QRHR
($
 /8  #J155;PT[;[`a`e`efoqs`t  yI  aI1  #JK  #J1:%bAaeeN>SWa>aa%bN%b.7"m155;PTl;l1"mK"m3<'fan@UYe@e'f$'f 3<&_QquuEU?VZ^?^q&_O&_ COl&=&=!>TYJ .0*&*O&(O(,%*.'	R.:.R.R.T+1D1H1HIace1f.*=*A*ABS*T*=*A*A/SU*V,?,C,CO,T).A.E.Ek.R+
 6E5P/VaK9J$5!$S%5!6$'N(;$<!$S%5!6&)#.>*?&@$'O(<$=QM >Q&9!,Ra+9#2+>!,Sb!1&6r&:	WO '1 3P\3|/K/K+Lbc(,48T`elmy  |N  fOS1N1N-O)P  UVO[`ght  wI  aJCL,I,I(J$K  PS  TW  Xa  Tb  Pc(+C,<(=$'N(;$<-<Sb-A)42H!2L+:)6%4'FH ..%\\^5570 g2 2 % &)J7ST9+UXYZX['\]!%& MR #J%b"m'f '`& % R'DYK%PQQRR # NN%>qc#BC&+ &(-)*$%()$%-/)+
F(  	LL5aS9:.. Q0  	sM  BT2 Q/Q",AQ/ T2 Q/ T2 'T2 ?*S8 )R&7R&;S8 R+R+
S8 R07R0R0S8 R50R54S8 :R:R:S8 R?7R?;S8 SS%S8 A'S	 ,E S8 ,5T2 "Q,	'Q//	R#8 RT2 R##T2 &#S8 		S5S0*S8 0S55S8 8	T/$T*%T2 *T//T2 2	U;;6U66U;c                    	 t        dd      }|r|j                  |       yddddd	d
di i dd
}	 ddlm}m} ddl}d } |       j                  }d|r|j                  d      r	 |d   }	d|	v s|	j                  d      rDt        j                  |	j                  dd            }
|
j                  r(|
j                  d      }
nt        j                  |	      }
t        j                         |
z
  j                         dz  }|dkD  nd	 ddl}ddddfd}|j!                  |      }d|_        |j%                          |j'                  d       |j)                         rFt*        j-                  d       j.                  xs d}j0                  xs |j                  di       }nd   rt3        d         d   }d    }j                  }	 dd!lm}m} |}|}|j                  d$d%      }|d&v rd'}d(}n|dk(  rd'}d"}n|}|}|dkD  rt?        ||z  d)      nd%}i d*|d+dd,|d,   d-|d-   d.|d.   d/|d0|d0   d1|j                  d1d      d2|d3|d4|d5d6d7|j                  d7i       d8|j                  d8i       d9|j                  d      d:j@                  d;d }d|t        j                         jE                         d>}tG        d|       |j                  |       y#  dY xY w# t4        $ rI t*        j-                  d       j.                  xs d}j0                  xs |j                  di       }Y w xY w# t<        $ r d"}d#}Y |w xY w# t<        $ r"}t*        j-                  d<|        Y d}~d}~wt2        $ r#}t*        jC                  d=|        Y d}~d}~ww xY w# t2        $ r@}t*        jC                  d?|        |j                  dtI        |      d@dA       Y d}~yd}~ww xY w)Bu<   GET /api/market-regime - Statut du régime de marché globalmarket_regime      N@r  NNEUTRALFr  r  r4   u   Régime non disponibler   )
regime	availablemax_positions	min_scoreposition_size_pctdescriptionglobal_scorebtcaltcoinsr  r   )get_market_regime_detectorREGIME_CONFIGc                     t        d      )NzMarket regime detection timeout)TimeoutError)signumframes     r"   timeout_handlerz:RouteHandler.handle_market_regime.<locals>.timeout_handler)	  s    &'HIIr2   rO   +Z+00:00r   r5   re   T)regime_nameregime_configrQ   c                      	 j                        \  } }| d<   |d<   y # t        $ r}t        |      d<   Y d }~y d }~ww xY w)Nforce_updater  r  rQ   )detect_regimer   r   )r_namer_configrX   detectorneeds_fresh_dataresult_holders      r"   detect_with_timeoutz>RouteHandler.handle_market_regime.<locals>.detect_with_timeoutM	  sS    </7/E/ESc/E/d,FH;AM-8=EM/:( <58VM'2<s   # 	A?A)targetrG  rA  z3Market regime detection timeout - using cached datarQ   r  r  )STOP_LOSS_PERCENTTAKE_PROFIT_PERCENT      @g      @take_profit_multiplierr#  )BEAR
CORRECTIONr  r  r   rn  ro  rp  rq  rr  tp_multiplierrs  rt  
dynamic_sl
dynamic_tp
dynamic_rr	sltp_mode	ADAPTATIFru  rv  r  r   z$Market Regime module not available: zError getting market regime: rR  zError in market_regime: r  rS   )%r1   rT   rk  rw  rx  r  market_datar-   r^  r   r	  r   r   r   r  	threadingThreaddaemonstartrs   is_aliverV   rb   current_regimer  r   rz  r   r  r  r   r}   regime_historyrQ   rU   r;   r   )rH   rW   r
  regime_datarw  rx  r  r}  r  timestamp_strr  age_minutesr  r  detection_threadr  r  r  r  	actual_sl	actual_tptp_multeffective_sleffective_tpeffective_rrrX   r   r  r  r  s                              @@@r"   handle_market_regimez!RouteHandler.handle_market_regime	  s   Y	T:F226: $"!#%(7 "#KvBSJ 67 '22#( ;??;#?0(3K(@-/=3I3I#3N*2*@*@AVAVWZ\dAe*fK*11.9.A.A.A.N*2*@*@*OK'/||~'C&R&R&TWY&Y+6?( (,$ _$484Z^$_M< (1'7'7?R'7'S$.2$+$**,$))")5'002'\]&.&=&=&J(0(>(>(b-BSBST]_aBb&w/'g(>??&3M&B(5o(F '22$M 1I 3I (++,DcJ"88#&L#&L I-#&L#&L#,L#,LHTWXHXu\L%@!D^ak $]?%C  {!;	
 (7J)K $W "=#? #KOONB$G !, !, !,   ;??5"5 
B ? ";??;#?  x66rs;!2  #%\\^557F
 /..v6A0+/(D $ _NN#XY"*"9"9"FYK$,$:$:$^m>O>OPY[]>^M_ # $ #I #I$L  K!EaSIJJ B<QC@AAB  	LL3A378.. Q0  	s    O  O  7M( ,B K5 M( B?K? M( M (C	M( 1AO  5K<9M( ?AMM( MM( M%!M( $M%%M( (	N=1N	O  N=N82O  8N==O   	P		6PP	query_paramsc           	      f   	 d}d}|r,|j                  ddg      d   }|j                  ddg      d   }g d}|r||vrd}	 ddlm}  |       }|r|r|j                  'dt        d	t        d
t
        fd}|j                  |       |j                  ||      }	|	r:|j                  dd||	gdt        j                         j                         d       y|j                         }
d|sdnd| d|
t        |
      t        j                         j                         d}|j                  |       y# t        $ r- g }
ddg dt        j                         j                         d}Y Gw xY w# t        $ r@}t         j#                  d|        |j                  dt	        |      dd       Y d}~yd}~ww xY w)u   GET /api/ai-watchlist - Liste des cryptos sous surveillance IA
        
        Query params:
            - interval: Intervalle Binance (1m, 5m, 15m, 1h, 4h, 1d) - optionnel
            - symbol: Symbole spécifique à analyser - optionnel
        Nintervalr   r   )1m5m15m1h4h1dr  r)  rC  intvlimitc                     	 d|  d| d| }t        j                  |d      }|j                  dk(  r|j                         S 	 y	# t        $ r%}t
        j                  d|  d|        Y d	}~y	d	}~ww xY w)
u1   Récupérer les klines directement depuis Binancez-https://api.binance.com/api/v3/klines?symbol=z
&interval=z&limit=r  rA  r  zErreur fetch klines rl  N)requestsr-   status_coderv   r   rV   rb   )rC  r  r  r  r  rX   s         r"   fetch_klines_from_binancezCRouteHandler.handle_ai_watchlist.<locals>.fetch_klines_from_binance	  s    R(UVYUZZdeidjjqrwqx&y'/||C'D#'#3#3s#:+/99;$6 $; $( $- R &1EcU"QC/P Q Q#'Rs   A A 	A3A..A3Trealtime_analysisr   )r   r   r  r   r  rO   	cached_5m
requested_)r   r   base_intervalr   r  rO   unavailable)r   r   r   r  rO   zError in ai_watchlist: Fr  rS   )r-   r  r)  klines_fetcherr   r   set_klines_fetcheranalyze_symbol_for_intervalrT   r   r   rU   rV  r6   r   r   rV   rQ   )rH   rW   r  r  r   valid_intervalsr)  rZ  r  analysisr   response_datarX   s                r"   handle_ai_watchlistz RouteHandler.handle_ai_watchlist	  s   M	HF'++J?B%))(TF;A> DOHO;69,.	  //7	(3 	(c 	(RU 	( "445NO  )DDVXVH'::'+$7(0*2%&)1)A)A)C<   &335	  $/7Kz(=T%)!* ^!)!9!9!;!& ..}=  	#)!#!)!9!9!;!  	LL21#67.. Q0  	sC   >E' BD. A	D. E' .3E$!E' #E$$E' '	F006F++F0c                    	 	 ddl m}  |       }|j                         }|j                  d	|t        j                         j                         d
       y# t        $ r%}ddddddddddddddt	        |      d}Y d}~_d}~ww xY w# t        $ r@}t        j                  d|        |j                  dt	        |      dd       Y d}~yd}~ww xY w)uJ   GET /api/ai-training-info - Informations sur l'entraînement du modèle IAr   r  r  u   ❌ Module IA non disponibleNN/AF)levelrN   status_labelsamples_countepochsaccuracylossvalidation_accuracypredictions_madecorrect_predictionslast_traininggpu_namegpu_availablemodel_loadedrQ   TrR  zError in ai_training_info: r  rS   )r  r)  get_training_infor   r   rT   r   r   rU   r   rV   rQ   )rH   rW   r)  rZ  training_inforX   s         r"   handle_ai_training_infoz$RouteHandler.handle_ai_training_info
  s    #	9,.	 ) ; ; =( ..%%\\^5570 '  +$B%& !+,()+,%) %%*$) V!2  	LL6qc:;.. Q0  	s:   A 5B 	BA?:B ?BB 	C6CCc                    	 t         j                  j                  | j                  d      }t         j                  j                  | j                  d      }dt         j                  j	                  |      rR	 t        |d      5 }t        |j                         j                               }ddd       ddl	}|j                        i }t         j                  j	                  |      r+	 t        |d      5 }t        j                  |      }ddd       ddlm dd	d
d}fd}	d }
|j                  d      |j                  d       |
|j                  d            |j                  d       |
|j                  d            |j                  d       |
|j                  d             |	|j                  d      |d          |	|j                  d      |d          |	|j                  d      |d         |j                  dd      |j                  dd      |j                  dg       dd d}|j!                  d|t        j"                         j%                         d       y# 1 sw Y   xY w#  dY xY w# 1 sw Y   vxY w#  Y ~xY w# t&        $ r@}t(        j+                  d|        |j!                  dt-        |      dd       Y d}~yd}~ww xY w)uL   GET /api/auto-updater-status - Statut du service de mise à jour automatiquer  zauto_updater.pidFr`   Nr   r	   i`T  Q   )historical_dataai_training
quick_syncc                 D   | ssyy	 t        j                  |       }| 	|      z   }t        j                         }sy||k  ry||z
  }t        |j	                         dz        }t        |j	                         dz  dz        }|dkD  r	d| d| d	S d| d	S #  Y y
xY w)Nu   Service arrêtéu	   Immédiat)secondsr  r5   r   u   Prévu dans ~hmInconnur   r	  r   r   r  )
last_update_strinterval_secondslast_dtnext_dtr   	remaininghoursr  r  r	   s
           r"   calculate_next_runzCRouteHandler.handle_auto_updater_status.<locals>.calculate_next_runK
  s    &%1&%&44_EG%	:J(KKG",,.C &1#~* '#I	 7 7 9T ABE!9#:#:#<t#C"JKGqy!.ugQwiqAA!.wiq99%$s   7B B AB B Bc                 N   | sy	 t        j                  |       }t        j                         }||z
  }t        |j	                         dz        }t        |j	                         dz  dz        }|dkD  r|dz  }d| d|dz   dS |dkD  r	d| d	| d
S |dkD  rd| d
S y#  | cY S xY w)NJamaisr  r5      Il y a zj r  r   h minu   À l'instantr  )r  r  r   diffr  r  dayss          r"   format_last_updatezCRouteHandler.handle_auto_updater_status.<locals>.format_last_updateg
  s    &#+&44_EG",,.C=D 2 2 4 <=E!4#5#5#7$#>2"EFGrz${!(bA>>!(r'#>> 1!(	55-+**s   A>B B 
B B$
started_atlast_historical_updatelast_ai_traininglast_quick_syncr  r  r  total_updatestotal_trainingsr  r  )r  r  r   last_historical_update_formattedr  last_ai_training_formattedr  last_quick_sync_formattednext_historical_updatenext_ai_trainingnext_quick_syncr  r  r  TrR  zError in auto_updater_status: r  rS   )rq   rr   rs   r@   rt   ru   r   rh  r   r  
pid_existsrv   rw   r   r	   r-   rT   r   rU   r   rV   rQ   r   )rH   rW   status_filepid_filer   r  r  status_data	intervalsr  r  r  rX   r  r	   s                @@r"   handle_auto_updater_statusz'RouteHandler.handle_auto_updater_status(
  s   p	'',,t8RSKww||DOO5GHH Jww~~h''h, 4!!&&(.."234 "!'!2!23!7J
 Kww~~k*k3/ 31&*iil3 +#+(&I%8+0 ))ool;*5//:R*S4F{WoGp4q$/OO4F$G.@QcAd.e#.??3D#E-?Pa@b-c*<[__Me=fhq  sD  iE  +F$6{GY7Z\efs\t$u#5kooFW6XZcdpZq#r!,!!D#.??3Da#H%//(B7<M" ..%%\\^5570 {4 4
'!&J3 3h  	LL9!=>.. Q0  	sy   A5J :I9 (I,.I9 !J -J 9JJ EJ ,I61I9 9J =J JJ JJ 	K!!6KK!c                    	 d}|rd|v r	 t        |d   d         }ddl}t        j                  j	                  | j
                  d      }t        j                  j                  |      s|j                  dddd	       yddl}|j                  j                  d
|      }|j                  j                  |      }|j                  j                  |       |j                  t        j                  j	                  | j
                  d            }	|	j                  |      }
t!        j"                         j%                         |
d<   ||
d<   	 t!        j"                         t'        |      z
  }| j)                  |      }||
d<   | j+                  |      }||
d<   |j                  d|
d       y#  d}Y xY w# t,        $ r,}t.        j1                  d|        d|
d<   d|
d<   Y d}~Od}~ww xY w# t,        $ rT}t.        j3                  d|        ddl}|j7                          |j                  dt9        |      dd       Y d}~yd}~ww xY w)z<GET /api/trade-analysis - Analyse des trades avec logs + spyr  r  r   Nzanalyze_trade_logs.pyFzAnalyze module not foundr  r  analyzerr  )log_dirgenerated_atperiod_hours)r  r8  r*  z!Could not compute spy/bot stats: Tr   r,   zError in trade_analysis: rS   )r   sysrq   rr   rs   r@   rt   rT   importlib.utilutilspec_from_file_locationmodule_from_specloaderexec_moduleTradeAnalyzergenerate_reportr   r   rU   r	   _compute_spy_stats_compute_bot_statsr   rV   rb   rQ   ry  rz  r   )rH   rW   r  r  r  analyzer_path	importlibspecanalyzer_moduler  reportcutoff	spy_stats	bot_statsrX   ry  s                   r"   handle_trade_analysisz"RouteHandler.handle_trade_analysis
  s(   <	E< 7W 5a 89E
 GGLL:QRM77>>-022$74   ">>99*mTD'nn==dCOKK##O4 '44RWW\\$//[g=h4iH--e4F &.\\^%=%=%?F>"%*F>"%!)%*@@ 33F;	 )u !33F;	 )u ..0 UEH  %!B1#FG $u $u%  	LL4QC89!.. Q0  		sa   G/ F- A"G/ ?CG/ AF7 G/ -F41G/ 7	G, "G'"G/ 'G,,G/ /	I8A
IIc           	      "   	 | j                   j                         }||j                  dddd       y|j                  dd      }|j                  dd	      }	 | j	                         }|j                  d||t        ||z  d      d|d       y# t
        $ r)}t        j                  d
|        ddddd}Y d}~Td}~ww xY w# t
        $ r@}t        j                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)u=   GET /api/get-sltp-config - Récupérer la configuration SL/TPNFr  r  r  r  r  r  r  z!Could not calculate SL/TP stats: r   r   
ia_dynamicconfig_fallbackhybridTr  r  r  risk_reward_ratio)r   r   r  zError in get_sltp_config: rS   )rA   r  rT   r-   _calculate_sltp_usage_statsr   rV   rb   r}   rQ   r   )rH   rW   r   r  r  r  rX   s          r"   handle_get_sltp_configz#RouteHandler.handle_get_sltp_config
  s6   )	((446F~22$44   

#6<I **%:C@K	88: ..!*#.).{Y/F)J
 0   !B1#FG"#'(	&  	LL5aS9:.. Q0  	sF   1C $C B )&C 	CB=8C =CC 	D6D		Dc                 T   	 t        dd      }|r|j                  |       yddl}ddlm} t
        j                  j                  | j                  d      }g }t
        j                  j                  |      r	 t        |dd	d
      5 } ||d      }	ddd       	D ]  }d|v s|j                  d|      }|s|j                  d      }|j                  d      j                         }d}d}|j                  d|      }|r|j                  d      }d|v sd|v sd|v sd|v rd}n/d|v sd|v rd}n$d|v sd|v rd }nd!|v sd|v rd"}nd#|v sd$|v sd%|v rd&}|j!                  ||||d'        |d(d }d)|t#        |      d*}t%        d|       |j                  |       y# 1 sw Y   xY w# t        $ r}
t        d|
        g }	Y d}
~
0d}
~
ww xY w# t        $ rK}
t        d+|
        ddl}|j)                          |j                  d,t+        |
      g d-d.       Y d}
~
yd}
~
ww xY w)/uC   GET /api/analysis-logs - Récupérer les logs récents d'analyse IAanalysis_logsg      .@r  Nr   dequezdashboard_log.txtr`   r  ignorer  r  r  maxlenz"Warning: Erreur lecture log file: z[INFO] AIPredictor:z((\d{2}:\d{2}:\d{2}).*AIPredictor:\s+(.+)r   r  r   r   z([A-Z]{3,10}USDT)u   ⭐zTOP 20	WHITELISTBONUSbonusu   ⛔u   BLOQUÉpenaltyu   🎯zScore finalfinal   ⚠️rb   u   🚨CRASHALERTEalert)rO   r   typer   T)r   r  r  zError in analysis_logs: F)r   rQ   r  rS   )r1   rT   rw  collectionsr2  rq   rr   rs   r@   rt   ru   r   printsearchgroupr   rz   r6   r;   ry  rz  r   )rH   rW   r  r
  rw  r2  r   r  r   linesrX   linerx  time_strcontentlog_typer   symbol_matchr   ry  s                       r"   handle_analysis_logsz!RouteHandler.handle_analysis_logs	  st   Q	T:F226: ) ww||DOO5HIHDww~~h'hghO 5ST %a 45 " #D,4 "		*UW[ \ ',{{1~H&+kk!n&:&:&<G (.H%'F ,.995I7+SL+)5););A)>  %/8w3F+Y`J`dkovdv+2!&'!1Y'5I+4!'7!2mw6N+2!)W!4	W8L+4!'7!2g6HHX_L_+2 KK-5*0(0+2	) =#L :D  TF
 /..v6k5 5  >qcBCEj  	,QC01!.. Q0 	 		sm    G AG 9F, FF, 	G %G :C$G F)$F, ,	G5GG GG 	H'AH""H'c                    	 t         j                  j                  | j                  d      }t         j                  j                  | j                  d      }i }t         j                  j	                  |      r,t        |dd      5 }t        j                  |      }ddd       t         j                  j	                  |      rn	 t        |dd      5 }t        j                  |      }ddd       j                         D ]-  \  }}	||vst        |	t              sd|	v s!|	||<   d	||   d
<   / 	 |s|j                  di dd       y	 t        |j!                               }t        j"                  |      j%                  dd      }d| }t'        j(                  |d      }|j*                  dk(  r|j                         }|D ci c]  }|d   t-        |d          }}|j                         D ]X  \  }}|j)                  |d      }|dkD  s||d<   |j)                  d|j)                  dd            }|dkD  sK||z
  |z  dz  |d<   Z n"t        j                  d|j*                          t/        |      }| d|dkD  rd nd }|j                  d|||d!       y# 1 sw Y   xY w# 1 sw Y   xY w# t        $ r#}
t        j                  d|
        Y d}
~
d}
~
ww xY wc c}w # t        $ r"}
t        j                  d|
        Y d}
~
d}
~
ww xY w# t        $ rC}
t        j1                  d"|
 d#       |j                  d$t3        |
      i d%d&       Y d}
~
yd}
~
ww xY w)'uL   GET /api/positions-live - Récupérer les positions avec prix en temps réelr_   r  r`   	utf-8-sigr  Nr  r  
MARKET_SPYr-  z!positions_live: spy merge error: TzAucune position)r   r[   rS  r  r   4https://api.binance.com/api/v3/ticker/price?symbols=re   rA  r  r   r!  r   r  	buy_pricer4   pnl_percentzpositions_live: Binance API z,positions_live: prix Binance indisponibles: z	 positionr   r  )r   r[   rS  r  zError in positions_live: exc_infoF)r   rQ   r[   rS   )rq   rr   rs   r@   rt   ru   rv   rw   r7   rx   ry   r   rV   rb   rT   r{   rA  rc  r   r  r-   r  r   r6   rQ   r   )rH   rW   r  r   spy_trades_filer[   r   r3  r   traderX   rk   symbols_paramr  r  prices_datar   
prices_maprD  r  r  r  rS  s                          r"   handle_positions_livez"RouteHandler.handle_positions_live^  sV   O	WW\\$//;KLN ggll4??<PQOI ww~~n-.#D - $		!I- ww~~o.LosWE 2%)YYq\
2)3)9)9); G!2z%7NS`diSi05If-:FIf-h7	G 22#!#04 
 Sy~~/0 $

7 3 ; ;C DL]O\||C3##s*"&))+KJU!VQ!H+uQwZ/@"@!VJ!V'0'8 i(2vq(A(1,3@C0*-''-VWAX*YK*Q7D{7RVa6aeh5hM 2i NN%A$BRBRAS#TU 	NEy	r(BCG..&"	0 u- -2 2 ! LNN%Fqc#JKKL( "W  S!MaSQRRS  	LL4QC84LH.. Q0 	 	s   BL J'L J9 J,'"J9 
J9 J9  J9 /L 	A=K- K(/K- ,K- <3K- //L J)$L ,J61J9 9	K%K L  K%%L (K- -	L6LL LL 	M'$9M""M'c           
         	 |j                  d      }|j                  d      }|||j                  dddd       yt        |      }t        |      }d|cxk  rd	k  sn |j                  dd
dd       yd|cxk  rdk  sn |j                  dddd       y| j                  j	                         }||j                  dddd       y||d<   ||d<   t
        j                  j                  | j                  d      }t        ||      }|rJt        j                  d| d| d       |j                  dd| d| d||t        ||z  d      dd       y|j                  dddd       y# t        $ r+}|j                  ddt        |       dd       Y d}~yd}~wt        $ r@}t        j!                  d|        |j                  dt        |      dd       Y d}~yd}~ww xY w)uD   POST /api/update-sltp-config - Mettre à jour la configuration SL/TPr  r  NFz Missing stop_loss or take_profitr  rY        ?r  z$stop_loss must be between 0.5 and 10r  z&take_profit must be between 0.5 and 20r  r  r  r  bot_settings.jsonu   ✅ SL/TP config updated: SL=z%, TP=r  TzConfiguration updated: SL=r  r+  )r   r   r   zFailed to save configurationrS   zInvalid values: zError in update_sltp_config: )r-   rT   r   rA   r  rq   rr   rs   r@   r%   rV   r   r}   r  r   r   rQ   )	rH   rW   r,   r  r  r   config_pathr   rX   s	            r"   handle_update_sltp_configz&RouteHandler.handle_update_sltp_config  sN   J	-I((=1K K$722$?4   i(I,K9**22$C4  ;,",22$E4   ((446F~22$44   +4F&',7F() '',,t8KLK$[&9G;I;f[MYZ[\22#!;I;f[MYZ[%.'2-2;3JA-N4   22$;4 
  	.. +CF840    	LL8<=.. Q0  	sA   ;E. 8E. 7"E. 1E. BE. E. .	G)7!FG))6G$$G)r"  c                    t         j                  j                  | j                  d      }t         j                  j	                  |      sddiS t        |dd      5 }t        j                  |      }ddd       g }D ]d  }|j                  dd	      }|s	 t        j                  |j                  d
d      j                  dd	            }||k\  sT|j                  |       f |sdddddddg g d	S |D cg c]  }|j                  dd      xs ddkD  s|  }	}|D cg c]  }|j                  dd      xs ddk  s|  }
}t        d |D              }t        d |D              t        |      z  }t        d |D              t        |      z  }ddlm}  |t$              }|D ]  }||d      j                  |        g }|j'                         D ]  \  }}t        d |D              }t        d |D              }t        d |D              }|j                  |t        |      t)        |t        |      z  dz  d      t)        |d      t)        |d      d        |j+                  d d        |t$              }|D ](  }|j                  dd       }||   j                  |       * g }|j'                         D ]w  \  }}t        d! |D              }t        d" |D              t        |      z  }|j                  |t        |      t)        |t        |      z  dz  d      t)        |d      d#       y |j+                  d$ d       t        |      t        |	      t        |
      t)        t        |	      t        |      z  dz  d      t)        |d      t)        |d      t)        |d      |dd% |d	S # 1 sw Y   GxY w#  	 t        j                  |dd d      }n	#  Y Y ixY wY !xY wc c}w c c}w )&z6Compute spy performance stats from espion_history.jsonr  total_tradesr   r`   r  r  N	exit_timer   r  r     %Y-%m-%dT%H:%M:%S	ra  r  r  win_rater0  avg_pnl_pctavg_duration_mintop_cryptostop_patternspnl_usdtc              3   H   K   | ]  }|j                  d d      xs d  ywrk  r   NrD  r4  rF  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>  s#     Baj!,11B    "c              3   H   K   | ]  }|j                  d d      xs d  ywr  r   NrD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>  #     Cq!%%	1-22Cro  c              3   H   K   | ]  }|j                  d d      xs d  ywhold_minutesr   NrD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>  s#     DaeeNA.3!3Dro  defaultdictr   c              3   T   K   | ]   }|j                  d d      xs ddkD  sd " ywrk  r   r   NrD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>(  '     J!155Q+?+D1*IAJ   ((c              3   H   K   | ]  }|j                  d d      xs d  ywrm  rD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>)  s#     AAaeeJ*/a/Aro  c              3   H   K   | ]  }|j                  d d      xs d  ywrq  rD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>*  #     Dq!%%	1-22Dro  r4   r   r  r   r  rf  r0  total_pnl_pctc                     | d   S Nr0  r(  r)  s    r"   r+  z1RouteHandler._compute_spy_stats.<locals>.<lambda>2      *:(; r2   Tr,  
surge_typer   c              3   T   K   | ]   }|j                  d d      xs ddkD  sd " ywry  rD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr>;  rz  r{  c              3   H   K   | ]  }|j                  d d      xs d  ywrq  rD  rn  s     r"   r5  z2RouteHandler._compute_spy_stats.<locals>.<genexpr><  #     BQi+0q0Bro  r  r  rf  avg_profit_pctc                     | d   S Nr  r(  r)  s    r"   r+  z1RouteHandler._compute_spy_stats.<locals>.<lambda>C      +;)< r2   re   )rq   rr   rs   r@   rt   ru   rv   rw   r-   r   r	  r   strptimerz   r@  r6   rB  rw  r{   r7   r}   r?  )rH   r"  spy_filer   
all_tradesr\   rF  exit_time_strexit_dtr  r  r  rg  avg_durrw  	by_symbolcrypto_statsrC  stradesrn  r  r  
by_patternpatpattern_statsptradesavg_ps                              r"   r  zRouteHandler._compute_spy_stats  s   77<<1FGww~~h'"A&&(C'2 	&a1J	&  	!AEE+r2M "001F1FsH1U1]1]^fhj1kl & a 	! $%qA1`ars  JK  \^  pr  s  s!EaaeeJ&:&?a1%DEE#Hj!(<(Aa'G!HHB6BB	CFCCc&kQDVDDs6{R 	,%	 	-Aak"))!,	-%OO- 
	LCJwJJAAAACDGDDGW!!c'l"2S"8!<"'Q-!&w!2! 	
	 	;TJ !&
 	&A%%i0CsO""1%	& &,,. 	LCJwJJAB'BBS\QE  W!!c'l"2S"8!<"'q/	" 	 	<dK  KI&kc$i#f+5;Q?#Iq1 a0 %gq 1'+)

 
	
A	& 	&&//cr0BDWXG  FHsN   N75O7O0O0 O5?O57OO-O! O-!O'#O-'O-c                 	   t         j                  j                  | j                  d      }t         j                  j	                  |      sddiS t        |dd      5 }t        j                  |      }ddd       g }D ]d  }|j                  dd	      }|s	 t        j                  |j                  d
d      j                  dd	            }||k\  sT|j                  |       f |sdddddddg g d	S |D cg c]  }|j                  dd      xs ddkD  s|  }	}|D cg c]  }|j                  dd      xs ddk  s|  }
}t        d |D              }t        d |D              t        |      z  }d}d}|D ]  }	 t        j                  |d   j                  d
d      j                  dd	            }t        j                  |d   j                  d
d      j                  dd	            }|||z
  j!                         dz  z  }|dz  } |dkD  r||z  nd}ddlm}  |t&              }|D ]  }||d      j                  |        g }|j)                         D ]  \  }}t        d |D              }t        d |D              }t        d |D              }|j                  |t        |      t+        |t        |      z  dz  d      t+        |d      t+        |d      d        |j-                  d d        |t&              }|D ](  }|j                  d d!      }||   j                  |       * g }|j)                         D ]w  \  }}t        d" |D              }t        d# |D              t        |      z  }|j                  |t        |      t+        |t        |      z  dz  d      t+        |d      d$       y |j-                  d% d       t        |      t        |	      t        |
      t+        t        |	      t        |      z  dz  d      t+        |d      t+        |d      t+        |d      |dd& |d	S # 1 sw Y   xY w#  	 t        j                  |dd d      }n	#  Y Y xY wY xY wc c}w c c}w #  Y xY w)'z5Compute bot performance stats from trade_history.jsonrc   ra  r   r`   r  r  Nrb  r   r  r  rc  rd  re  r  c              3   H   K   | ]  }|j                  d d      xs d  ywr  r   NrD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>n  s"     =eQ,1,=ro  c              3   H   K   | ]  }|j                  d d      xs d  ywrq  rD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>o  rr  ro  r  r5   r   rv  r   c              3   T   K   | ]   }|j                  d d      xs ddkD  sd " ywr  r   r   NrD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>  &     E!155?+?a1*DAEr{  c              3   H   K   | ]  }|j                  d d      xs d  ywr  rD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>  s"     <qaeeE1o**<ro  c              3   H   K   | ]  }|j                  d d      xs d  ywrq  rD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>  r~  ro  r4   r  r  c                     | d   S r  r(  r)  s    r"   r+  z1RouteHandler._compute_bot_stats.<locals>.<lambda>  r  r2   Tr,  r  r   c              3   T   K   | ]   }|j                  d d      xs ddkD  sd " ywr  rD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>  r  r{  c              3   H   K   | ]  }|j                  d d      xs d  ywrq  rD  rn  s     r"   r5  z2RouteHandler._compute_bot_stats.<locals>.<genexpr>  r  ro  r  c                     | d   S r  r(  r)  s    r"   r+  z1RouteHandler._compute_bot_stats.<locals>.<lambda>  r  r2   re   )rq   rr   rs   r@   rt   ru   rv   rw   r-   r   r	  r   r  rz   r@  r6   r  rB  rw  r{   r7   r}   r?  )rH   r"  bot_filer   r  r\   rF  r  r  r  r  r  rg  	total_dur	dur_countr0   exit_r  rw  r  r  rC  r  rn  r  r  r  r  r  r  r  s                                  r"   r  zRouteHandler._compute_bot_statsQ  s   77<<1EFww~~h'"A&&(C'2 	&a1J	&  	!AEE+r2M "001F1FsH1U1]1]^fhj1kl & a 	! $%qA1`ars  JK  \^  pr  s  s!@aaeeE1o&:a%?@@#CeQ(<1'B!CC=f==	CFCCc&kQ 		 	A ..q/F/FsH/U/]/]^fhj/kl ..q~/E/Ec8/T/\/\]egi/jkeem::<rAA	Q		 ,5q=)i'a 	,%	 	-Aak"))!,	-%OO- 
	LCEwEEA<G<<CDGDDGW!!c'l"2S"8!<"'Q-!&w!2! 	
	 	;TJ !&
 	&A%%	9-CsO""1%	& &,,. 	LCEwEEAB'BBS\QE  W!!c'l"2S"8!<"'q/	" 	 	<dK  KI&kc$i#f+5;Q?#Iq1 a0 %gq 1'+)

 
	
W	& 	&&//cr0BDWXG  ACs[   P?5Q7Q8Q8 Q=?Q=?BR?Q	Q5Q)(Q5)Q/+Q5/Q5Rc                 D   	 t         j                  j                  | j                  dd      }t         j                  j	                  |      sdddddS t        j                         t        d      z
  }d}d}d}d}t        |dd	      5 }|D ]  }	 t        j                  |j                               }	t        j                  |	j                  d
d            }
|
|k  rR|dz  }|	j                  dd      }|	j                  dd      }|r|r|dz  }n|s|s|dz  }n|dz  } 	 ddd       ||||dS # t        $ r"}t        j!                  d|        Y d}~d}~ww xY w# 1 sw Y   >xY w# t        $ r)}t        j#                  d|        dddddcY d}~S d}~ww xY w)z@Calculer les statistiques d'utilisation SL/TP (7 derniers jours)r  trades_log.jsonlr   r'     r  r`   r  r  rO   z
2000-01-01r   has_ia_stop_lossFhas_ia_take_profitzError parsing trade: NzError calculating SL/TP stats: )rq   rr   rs   r@   rt   r   r   r	   ru   rv   rg  r   r	  r-   r   rV   rb   rQ   )rH   trades_log_pathcutoff_timer   r(  r)  r*  r   rG  rV  
trade_time	has_ia_sl	has_ia_tprX   s                 r"   r-  z(RouteHandler._calculate_sltp_usage_stats  s   ;	 ggll4??LJ\]O77>>/2"#'(	  #,,.9!+<<KEJOFosW= ! !D! $

4::< 8%-%;%;EIIkS_<`%a
%3$
 %*II.@%$H	$)II.BE$J	$&!OJ!*9+q0O"aKF'!!6 (#2 	 	 % !)>qc'BC !-! !B  	LL:1#>?#$	 	st   AE- 7E- 
E!AD3E!AD3!E!$E- 3	E<EE!EE!!E*&E- -	F6FFFc                 V   	 ddl m} |rt        |j                  ddg      d         nd}|r|j                  ddg      d   nd}t        j                  d| d|         ||	      }|d
k(  rn|j                         }|j                  d       |j                  dd       |j                          |j                  j                  |j                  d             n$|j                         }|j                  d|d       t        j                  d       y# t        $ r@}	t        j!                  d|	        |j                  dt#        |	      dd       Y d}	~	yd}	~	wt$        $ rB}	t        j!                  d|	 d       |j                  dt#        |	      dd       Y d}	~	yd}	~	ww xY w)z9GET /api/ai-self-optimizer - Analyse auto-optimisation IAr   )AISelfOptimizerr  r  formatrv   u    🧠 AI Self-Optimizer request: z
h, format=)lookback_hoursrg   r  zContent-typeztext/plain; charset=utf-8r  Tr  u(   ✅ AI Self-Optimizer analysis completedz$AI Self-Optimizer module not found: z&AI Self-Optimizer module not available)rQ   detailsrS   NzError in AI Self-Optimizer: rS  zFailed to analyze performance)ai_self_optimizerr  r   r-   rV   r   r  send_responsesend_headerend_headerswfiler  encodeanalyze_performancerT   r   rQ   r   r   )
rH   rW   r  r  r  format_type	optimizerr!  r{  rX   s
             r"   handle_ai_self_optimizerz%RouteHandler.handle_ai_self_optimizer  s   (	9 IUS!1!1'B4!@!CDZ\NEQ,**8fX>qAW]KKK:>:J*U`Tabc (~FIf$"224--c2++N<WX++-%%++FMM',BC $77922##4 
 KKBD 	LL?sCD..Aq60    	LL7s;dLK..8q60  	s$   DD 	F(6EF(&8F##F(c                    	 ddl m} |rd|v r|j                  ddg      d   nd}|s|j                  dddd       y	t        j                  d
|         |       }|j                  |      }|d   r-|j                  d|d       t        j                  d|        y	|j                  |j                  dd      ddd       y	# t        $ rA}t        j                  d|        |j                  dt        |      ddd       Y d	}~y	d	}~wt        $ rC}t        j                  d| d       |j                  dt        |      ddd       Y d	}~y	d	}~ww xY w)z<GET /api/technical-analysis - Analyse technique d'une cryptor   )TechnicalAnalyzerr   r   z Symbole requis (?symbol=BTCUSDT)F)rQ   r   rY  Nu!   📊 Technical Analysis request: r   Tr  u%   ✅ Technical Analysis completed for rQ   zErreur inconnuez%Technical Analyzer module not found: z'Technical Analyzer module not available)rQ   r  r   rS   zError in Technical Analysis: rS  zFailed to analyze symbol)technical_analyzerr  r-   rT   rV   r   analyze_symbolr   rQ   r   r   )rH   rW   r  r  r   r  r   rX   s           r"   handle_technical_analysisz&RouteHandler.handle_technical_analysis  s   .	< =IXYeMe\%%h5a8kmF22?$4  KK;F8DE )*H ,,V4Fi 22#"4  CF8LM22#ZZ1BC$4 
  	LL@DE..Bq6 0 	 
  	LL8<tLL..3q6 0 	 	s/   ;C A!C  %C 	E7DE9EEc                    	 ddl }ddlm}m} d |j                         j	                         i i g i i d}t
        j                  j                  | j                  d      }i }t
        j                  j                  |      r*t        |d      5 }	t        j                  |	      }ddd       	 |j                  dd	
      }
|
j                         D ci c]  }|d   t        |d          }}d}d}g }|j                         D ]P  \  }}|j                  dd      }|j                  dd      }|j                  ||      }|dkD  r||z
  |z  dz  nd}||z
  |z  }||z  }||z  }||z  }d}|j                  d      }|r	 d|v r7 |j                   |j#                  d      d   j#                  d      d         }n |j$                  |d      } |j                         }||z
  }t'        |j)                         dz        }|dz  }|dz  }|dkD  r	| d| d}n| d}|j/                  ||||t1        |d      t1        |d      t1        |d      |d       S |j3                  d d       |t1        |d      t1        |d      t1        |dkD  r||z  dz  ndd      t5        |      d |d!<   t
        j                  j                  | j                  d"d#      }!g }"t
        j                  j                  |!      rkt        |!dd$%      5 }	|	D ]N  }#|#j7                         s	 t        j8                  |#      }$|$j                  d&      d'k(  r|"j/                  |$       P 	 ddd       |"d(d }%|%D &cg c]  }&|&j                  d)d      dkD  s|& }'}&|%D &cg c]  }&|&j                  d)d      dk  s|& }(}&t5        |%D &cg c]  }&|&j                  d*      d+k(  s|& c}&      })t5        |%D &cg c]  }&|&j                  d*      d,k(  s|& c}&      }*t5        |%D &cg c]  }&|&j                  d*      d-k(  s|& c}&      }+t;        d. |%D              },|%r|,t5        |%      z  nd}-t5        |%      t5        |'      t5        |(      |%r$t1        t5        |'      t5        |%      z  dz  d/      ndt1        |,d      t1        |-d      |)|*|+d0	|d1<   t
        j                  j                  | j                  d"d2      }.g }/t
        j                  j                  |.      r|t        |.dd$%      5 }	|	D ]_  }#|#j7                         s	 t        j8                  |#      }0|0j                  d3      s%d4|0j                  d5d6      v r|/j/                  |0       a 	 ddd       g }1t=               }2t?        |/d7d       D ]  }0|0j                  dd6      }3|3|2v r|2jA                  |3       |0j                  d8i       j                  d9d      }4|j                  |3|4      }5|4dkD  se|5|4z
  |4z  dz  }6|1j/                  |3|4|5t1        |6d      |0j                  d:d;      |0j                  d<d      |6dkD  d=        |1dd> |d?<   	 |j                  d@d	
      j                         }7|7D &cg c]+  }&|&d   jC                  dA      st        |&dB         dCkD  s*|&- }8}&tE        |8dD d      ddE }9tE        |8dF G      ddE }:|8rt;        dH |8D              t5        |8      z  nd};t5        |8D &cg c]  }&t        |&dI         dkD  s|& c}&      }<t5        |8      |<z
  }=t1        |;d      |<|=|;d/kD  rdJn|;dKk  rdLndM|9D &cg c]   }&|&d   t1        t        |&dI         d      dN" c}&|:D &cg c]   }&|&d   t1        t        |&dI         d      dN" c}&dO|dP<   t5        |1D >cg c]
  }>|>dR   s	|> c}>      }?t5        |1      |?z
  }@g }A|dP   j                  dSdM      }B|BdLk(  rAj/                  dTdUdVdW       nBdJk(  rAj/                  dXdYdZdW       |d1   j                  d[d      }C|Cd\k  rAj/                  dTd]d^C d_dW       nCd`kD  rAj/                  dXdad^C dbdW       |%r|*t5        |%      z  dz  nd}D|DdkD  rAj/                  dcddDdedfdW       @|?kD  r3t5        |1      dgkD  r%Aj/                  dXdh@ dit5        |1       djdW       n7|?@kD  r2t5        |1      dgkD  r$Aj/                  dTdk|? dit5        |1       dldW       A|dm<   |jI                  |       tJ        jM                  dn       y# 1 sw Y   xY wc c}w #  i }Y wxY w# t*        $ r} t-        d| d|         d}Y d} ~ md} ~ ww xY w#  Y xY w# 1 sw Y   BxY wc c}&w c c}&w c c}&w c c}&w c c}&w #  Y xY w# 1 sw Y   GxY wc c}&w c c}&w c c}&w c c}&w # t*        $ r} dQtG        |       i|dP<   Y d} ~ Ud} ~ ww xY wc c}>w # t*        $ rB} tJ        jO                  do|  dp       |jI                  dqtG        |       drds       Y d} ~ yd} ~ ww xY w)tuM   GET /api/market-analysis - Analyse complète du marché et efficacité du botr   N)r   r	   T)r   rO   r[   performancemissed_opportunitiesmarket_overviewperspectivesr_   r`   +https://api.binance.com/api/v3/ticker/pricer  rA  r   r!  r  r  r4   z--rO   Tr~  r  %Y-%m-%d %H:%M:%Sr5   r  r  u#   Warning: Erreur calcul durée pour rl  r  r  )r   r0   currentr  r  pnl_usdinvesteddurationc                     | d   S )Nr  r(  r)  s    r"   r+  z5RouteHandler.handle_market_analysis.<locals>.<lambda>  s
    a	l r2   r,  )r{   total_investedtotal_pnl_usdr  r  r[   r  r  r  r  r@  TRADE_CLOSErA  r  rg  ztake-profitz
quick-exitz	stop-lossc              3   @   K   | ]  }|j                  d d        ywrq  rD  rn  s     r"   r5  z6RouteHandler.handle_market_analysis.<locals>.<genexpr>  s     !M!!%%	1"5!M   r   )	ra  r  r  rf  r  rg  r  
quick_exitr  r  zsignals_log.jsonlexecutedMAX_POSITIONSrejection_reasonr   featuresprice_currentr  r  ai_score)r   signal_pricer  variation_pctr  scorewould_profitr   r  *https://api.binance.com/api/v3/ticker/24hrr   r'  i c                     t        | d         S Nr#  rk  r)  s    r"   r+  z5RouteHandler.handle_market_analysis.<locals>.<lambda>  s    5CWAX;Y r2   re   c                     t        | d         S r  rk  r)  s    r"   r+  z5RouteHandler.handle_market_analysis.<locals>.<lambda>  s    %BV@W:X r2   r(   c              3   8   K   | ]  }t        |d            yw)r#  Nrk  rn  s     r"   r5  z6RouteHandler.handle_market_analysis.<locals>.<genexpr>  s      TAq)='>!? Ts   r#  BULLISHrf  BEARISHrm  r   change)avg_change_24hpositive_countnegative_countr&  top_gainers
top_losersr  rQ   r  r&  rb   u   Marché BaissieruV   Le marché global est en baisse. Privilégiez la prudence et surveillez vos stop-loss.)r@  titler   r   u   Marché Haussierz?Conditions favorables pour les achats. Le momentum est positif.rf  r  u   Taux de réussite faiblezWin rate de zC%. Envisagez d'augmenter le score minimum pour filtrer les signaux.7   u   Bonne efficacitéu!   %. La stratégie fonctionne bien.r   zBeaucoup de Quick-Exitsr  u?   % de sorties rapides. Le système pourrait être trop agressif.r&  u   Signaux bien filtrés/u<    signaux rejetés auraient été perdants. Bonne sélection.u   Opportunités manquéesuC    signaux rejetés auraient été gagnants. Augmentez max_positions?r  u   ✅ Market Analysis completedzError in Market Analysis: rS  Fr  rS   )(r  r   r	   r   rU   rq   rr   rs   r@   rt   ru   rv   rw   r-   r   r7   r	  rt  r  r   r  r   rC  rz   r}   r?  r6   r   rg  r@  r>  reversedaddr^  rj  r   rT   rV   r   rQ   )ErH   rW   r  r  r   r	   r   r   r[   r   prices_respr   rY  r  r  positions_datar   rD  r0   rj  r  r  r  r  duration_strrO   r  r   r  total_minutesr  r  rX   trades_fileclosed_tradesrG  rV  recent_tradesrF  r  r  tp_countqe_countsl_counttotal_trade_pnlavg_pnlsignals_filemissedsigmissed_analysischecked_symbolsrC  r  r  	variationr  
usdt_pairsgainerslosers
avg_changer  r  r  missed_would_profitmissed_would_loser  market_trendrf  qe_ratesE                                                                        r"   handle_market_analysisz#RouteHandler.handle_market_analysisK  s   C	"4  )X\\^557!(*#% "F  WW\\$//;KLNIww~~n-.#. -! $		!I- !gg&S]_g`FQFVFVFXYak57+<<Y
Y NIN(0 -q1ggj!,$..7?DqyGeOu4s:a"U?c1 3;(*W$	  $GGK0	,)+)?)?)?	PS@TUV@W@]@]^a@bcd@e)fJ):):):9FY)ZJ*hlln"Z/(+D,>,>,@B,F(G - 3"/""4 19.3WBwis+CL.5Yc?L
 %%$"& #$Wa0$Wa0 %h 2 ,	' 	I-` $:DI '"'":!&y!!4!&^^_M_	N(BS(Hefhi!j^,#F; '',,tFXYKMww~~k*+sW= % ! %::<%(,

4(8#(99V#4#E$1$8$8$?%% *#$/M,H!i0Ca0GAHDH!.JA!%%	12E2IaJFJ}Y!h=8XAYZH}X!h<8WAXYH}W!h;8VAWXH!!M}!MMO>KoM(::QRG !$M 2D	f+N[E#d)c-.@"@3"FJab!&!:$Wa0'&%
%F=! 77<<GZ[LFww~~l+,g> %! ! %::<%&*jj&6'*wwz':RURYRYZlnpRq?q$*MM#$6%% !O!eOst- ggh+/)##C("wwz26::?AN *sL A!#"/,">,!NRU UI#**"%(4)6).y!)<#&779c#:!$Q!7(1A, * .=Sb-AF)*>''"NXZ'[``b)0xAAhK4H4H4PUZ[\]j[kUlowUwax
x 1Ycghikjkl
0XYZ\[\]jtS T TTWZ[eWffz{
!$%bAuQG[E\?]`a?aa%b!c!$Z>!A ',J&:&4&4*4q.YJY[Oyaj zA  $Btuq{eERSThRiLjlmFn$o  $Bx~"stakU5QRSgQhKiklEm#n"-() #&/&WQQ~EVq&W"X #O 47J JL ""3488)LLy(##%/w% 
 *##%/`%  m,00Q?H"}##%7!-hZ7{|% 
 B##%0!-hZ7XY%  @Mx#m"44s:RSG|##"6")#.mn%  !#663;ORS;S##%4"3!4Ac/6J5K  LH   I% 
 %'88S=QTU=U##%6"5!6aO8L7M  NQ   R%  &2F>"..v6KK78U- - Z 
L % , CF82aSQR'+,J% $% % IJYXW8% $% %N y &c $B" >-4c!f,=()> 'X~  	LL5aS9DLI.. Q0  	s  B
h e	"h +%e e)e +Bh =Be%C(h f:ffh (f$f$h f)(f),h 7f.f.h %f3?f3h f8-f81C)h g2Af==g Bh Ah #%g& g"g4g8Ag& gg#5g& %g=g& %g!(g& 0	h 9
hhF h 	eh e e"h %	f.fh fh fff!!h =g?gg
h g& &	h
/h?h h

h 	i8iic           	      d
   	 t        dd      }|r|j                  |       yddl}ddlm} dddddddi d} || j
                        d	z  }|j                         r3	 t        |d
      5 }|j                  dd       |j                         }|dkD  r|j                  t        d|dz
               |j                         j                  dd      }	|	j                         j                  d      }
|
r|
d   j                         nd}|rd|v r{|j                  d      d   j                  dd      }	 t!        j"                  |d      }|j%                         |d<   t!        j&                         |z
  j)                         }|dk  |d<   ddd       dddd}|j1                  g d      D ]G  }	 dj3                  |j4                  d   xs g       }|D ]  }||   	||v s|j4                  ||<    n I |d   }|rUt!        j:                  |d         }t!        j&                         |z
  j)                         }d |d<   t=        |      |d!<   d |d"<    || j
                        d#z  }|j                         r	 t        |d$      5 }t=        |j                         j                               }||d%<   |j?                  |      r|jA                  |      }d&|jC                         jE                         v r[t!        j:                  |jG                               }t!        j&                         |z
  j)                         }d |d'<   t=        |      |d(<   ddd       d*d+d,}|jI                         D ]x  \  }}|jK                  |      }|rVt!        j:                  |d         }t!        j&                         |z
  j)                         }d t=        |      |d-   d.|d/   |<   od0di|d/   |<   z |d'   rd1nd2|d3<   |d'   r|d   sd2|d3<   d4|d5<   n|d'   sd6|d3<   d7|d8<   n|d   r
|d'   rd9|d:<   tM        d|       |j                  |       y#  Y xY w# 1 sw Y   xY w# t*        $ r#}t,        j/                  d|        Y d}~d}~ww xY w# |j6                  |j8                  f$ r Y w xY w# 1 sw Y   ^xY w# t*        $ r#}t,        j/                  d)|        Y d}~d}~ww xY w# t*        $ rB}t,        jO                  d;| d <       |j                  dtQ        |      d=d>       Y d}~yd}~ww xY w)?zDGET /api/watchdog-status - Statut du watchdog et surveillance du botwatchdog_statusg      >@r  Nr   )PathF)watchdog_activewatchdog_uptime
last_check
bot_active
bot_uptimebot_pidauto_restart_enabledserviceszwatchdog.logrbr  i   r  r3  )r  rl   rf  r   []r  r  r  r  zErreur lecture watchdog.log: )r  dashboard_api_server.pyauto_updater_service.py)r  r  r  create_timer  r  r  r(  Tr  r!  zbot.pidr`   r   pythonr  r  u   Erreur vérification bot: r&  r'  )dashboard_apiauto_updaterr  )activeuptimer  r"  r,  rL   rb   overall_statusuK   ⚠️ Bot actif mais SANS surveillance! Risque d'arrêt sans redémarrage.warning_messagerQ   u   ❌ Bot de trading NON ACTIF!error_messageu    ✅ Bot actif et surveillé 24/7success_messagezError in watchdog status: rS  r  rS   ))r1   rT   r  pathlibr  r@   rt   ru   seektellmaxrh  ri  r   rt  r   r   r  rU   r   r  r   rV   rb   r  rs   r   r  r  fromtimestampr   r  Processr  lowerr(  r7   r-   r;   rQ   r   )rH   rW   r
  r  r  rN   watchdog_logr   fsizer}  rF  	last_liner  r  	time_diffrX   scripts_to_findr  r  script_namewdinfor(  r-  bot_pid_filer  services_to_checkservice_namesvc_infos                               r"   handle_watchdog_statusz#RouteHandler.handle_watchdog_statusR  sn   A	 1t<F226:$ $)#'"#"(-	F  0>AL""$HlD1 )Qq! ! 19FF3q%#+#67$%FFHOOGHO$ME$)KKM$7$7$=E=Bb	(9I(SI-=090DQ0G0O0OPSUW0X!)191B1B=Re1fJ;E;O;O;QF<$819*1L0[0[0]I@ICF+<$=). $(+/+/O
 ++,UV !hhtyy';'ArBG'6 "*;7?KSZDZ;?99OK8!" %%67F&44VM5JK",,.;6EEG,0(),/K()15-.  09<L""$ElC0 CA!!&&(.."23,/y) ",,S1#)>>##6D'499;+<+<+>>.6.D.DTEUEUEW.X*2,,.;*F)U)U)W7;| 47:6{| 4C" "; 9!
 .?-D-D-F I)k*..{;"*"8"8-9P"QK&lln{:IIKF"&"%f+'8F:&|4 9A%7HF:&|4I 06l/CtF#$l#F3D,E+4'(,z()L)+2'(*I')*vl/C,N()(&1..v6a!)$(#) )$ ! HNN%B1##FGGH  ,,f.A.AB  C C ! ENN%?s#CDDEH  	LL5aS9DLI.. Q0  	s    S$ ;S$ Q +CQ
3AQ	Q S$ .,RR R2BS$ 6R5 C
R(R5 C-S$ QQ

QQ 	R Q>8S$ >RS$ R%!S$ $R%%S$ (R2-R5 5	S!>SS$ S!!S$ $	T/-8T**T/c                    	 i }d|j                   v rS|j                   j                  d      d   }|j                  d      D ]!  }d|v s|j                  dd      \  }}|||<   # t        |j                  dd            }t        j                   j                  | j                  d      }t        j                   j                  |      s|j                  dg d	d
       yg }		 ddl	m	}
 ddl
}ddlm} t        |ddd      5 } |||      }|D ]  }|j                         }|s|j                  d|      }|rs|j!                  d      } |
j"                         j%                         } |
j&                  |d      j)                         } |
j*                  ||      j-                         }n |
j"                         j-                         }d}d|v sd|v sd|v rd}n7d|v sd|v sd|v rd}n(d|v sd |v sd!|v rd"}nd#|v sd$|v sd%|v rd&}n
d'|v sd(|v rd)}|	j/                  |||d*        	 ddd       t9        |	      t9        |	D cg c]  }|d0   dk(  s| c}      t9        |	D cg c]  }|d0   dk(  s| c}      t9        |	D cg c]  }|d0   d"k(  s| c}      t9        |	D cg c]  }|d0   d&k(  s| c}      d1}|j                  d|	|t        j                   j;                  |       |
j<                  t        j                   j?                  |            j-                         d2       y# 1 sw Y   xY w# t0        $ rC}t2        j5                  d+|        |j                  d,d-t7        |       d.d/       Y d}~yd}~ww xY wc c}w c c}w c c}w c c}w # t0        $ rB}t2        j5                  d3| d4       |j                  d,t7        |      d.d/       Y d}~yd}~ww xY w)5uB   GET /api/bot-logs - Récupère les derniers logs du bot de tradingr  r   &=rF  r   r  Tu   Fichier de logs non trouvé)r   r  r   Nr   r   r1  r`   r  r3  r4  r5  ^(\d{2}:\d{2}:\d{2})r  r   z[ERROR]u   ❌zERROR:rQ   z	[WARNING]r<  zWARNING:rb   z	[SUCCESS]   ✅u   💰r   zScore=zPattern=@r  u   🚫REJETreject)rO   r@  r   zError reading log file: FzErreur de lecture du fichier: r  rS   r@  )r   r  warningsr   r  )r   r  r  	file_sizelast_modifiedzError in bot logs: rS  ) rr   rt  r   r-   rq   rs   r@   rt   rT   r   rw  rB  r2  ru   r   rx  rE  r   dater  r/   combinerU   rz   r   rV   rQ   r   r6   r|   r6  getmtime)rH   rW   paramsquery_stringparamr(   rJ  	max_linesr   r  r   rw  r2  r   recent_linesrG  timestamp_matchr  todaytime_objrO   rJ  rX   lr  s                            r"   handle_bot_logszRouteHandler.handle_bot_logs  s   c	Fo***.3399#>qA)//4 ,Ee|%*[[a%8
U&+s,
 FJJw34I ww||DOO5FGH77>>(+22#<4 
  D2--(C'(K %q#(9#=L , !#zz|#$ +-((3JD*Q*,;,A,A!,DM$0HLLN$7$7$9E'8x'8'8
'S'X'X'ZH(8(8(8(I(S(S(UI(4(@(@(BI $*$,TAQ'.H(D0H4D
VZHZ'0H(D0ETMVt^'0H%-t1Csd{'1H#t^w$'/H)2$,'+% ;!	%b T$GQ!F)w2FqGHD KqAfI4J KL4Ja1V9	3IJKD LqAfI4K LME ..WW__X6!7!7!78H8H8R!S!]!]!_0 q% %N  7s;<22$=c!fXF4   H KJ L  	LL.qc2TLB.. Q0  	s   AN% 	BN% N% "M D*L5,M 4N% N
N
N% (N6N:N% 	NNN% *N 8N <A8N% 5L?:M 	N9N	N% 	NN% %	O0.8O++O0c                 8   	 t         j                  j                  t         j                  j                  t         j                  j                  t                          }t         j                  j                  |d      }t         j                  j                  |d      }t         j                  j                  |      rBt        |dd      5 }t        j                  |      }ddd       t        t              sddd	}ndd
d	}g }t         j                  j                  |      rH	 t        |dd      5 }|j                         }|dd D cg c]  }|j                          }}ddd       ||d<   t         j                  j                  |      |d<   | j                  d|d       y# 1 sw Y   xY wc c}w # 1 sw Y   VxY w#  Y ]xY w# t        $ rB}	t         j#                  d|	 d       | j                  dt%        |	      dd       Y d}	~	yd}	~	ww xY w)zEEndpoint: /api/monitor-status - Statut de la surveillance silencieusezmonitor_status.jsonzsilent_monitor.logr`   r  r  NFzFichier statut corrompu)all_okr   u   Silent monitor non démarrérecent_logsmonitor_activeT)r   rN   zError in monitor status: rS  r  rS   )rq   rr   rS  abspathrT  rs   rt   ru   rv   rw   rx   ry   	readlinesr   rT   r   rV   rQ   r   )
rW   r@   r  r   r   rN   ra  rF  rG  rX   s
             r"   handle_monitor_statusz"RouteHandler.handle_monitor_status>  s   (	9R)STJ'',,z3HIKww||J0DEH ww~~k*+sW= *!YYq\F*!&$/(-:STF $= Kww~~h'hg> M! !@Ecd&Ltzz|&L&LM %0F=!')ww~~k'BF#$.. 0 /* *  'MM M  	LL4QC84LH.. Q0  	ss   C
G F*"AG 'G 5F;F6$F;&G .;G *F3/G 6F;;G G G	G 	H8HHc                    	 t         j                  j                  t         j                  j                  t         j                  j                  t                          }t         j                  j                  |d      }g d}t         j                  j                  |      r-t        |dd      5 }t        j                  |      }ddd       ng }ddl
m}  |d	       }D ]N  }	|	j                  d
d      xs d}
|
dk(  rd}
|	j                  dd      }||
   }|dxx   dz  cc<   |dxx   |z  cc<   |dkD  r|dxx   dz  cc<   n|dxx   dz  cc<   |d   ||d   d   kD  r)|	j                  dd      ||	j                  dd      d|d<   |d   ||d   d   k  r)|	j                  dd      ||	j                  dd      d|d<   d|	v sd|	v s	 t        j                  |	d         }t        j                  |	d         }||z
  j                         dz  }|dxx   |z  cc<   |dxx   dz  cc<   Q g }|j!                         D ]  \  }
}|d   dkD  r|d   |d   z  dz  nd}|d   dkD  r|d   |d   z  nd}|d   dkD  r|d   |d   z  nd}|dk\  rd}d }d!}n*|d"k\  rd#}d$}d!}n|d%k\  rd&}d'}d(}n|d)k\  rd*}d+}d,}nd-}d.}d/}g }|d"k  r_|d0kD  r|j#                  d1       |dk  r|j#                  d2       |d   d"kD  r|j#                  d3       n|d   d4k  r|j#                  d5       |d   }|d   }|rU|rS|d   |d   k(  rHt%        |d   |d   z
        d6k  r1|j                  d      |j                  d      k(  r|d   dk\  rd}nd}n|r
|d   dk  rd}|j#                  |
|d   |d   |d   t'        |d      t'        |d   d7      t'        |d8      |dkD  rt'        |dz  d      nd||||||d9        t)        d: |D              }|D ])  }||vs|j#                  |dddd;d;d;d;ddd<d=d>d?d@gd9       + |j+                  dA dBC       t-        |      }t/        dD |D              }|dkD  r||z  dz  nd}t/        dE |D              }|dkD  r||z  nd}t/        dF |D              t/        dG |D              t/        dH |D              t/        dI |D              t/        dJ |D              t/        dK |D              dL} | j1                  dB||t-        |      t'        |d      t'        |d7      t'        |d8      | dMt        j2                         j5                         dN       y# 1 sw Y   xY w#  Y xY w# t6        $ rB}!t8        j;                  dO|! dBP       | j1                  dQt=        |!      dRdS       Y d}!~!yd}!~!ww xY w)TuM   Endpoint: /api/patterns-performance - Stats détaillées de tous les patternsrc   )MANUAL_CLOSESTABLECOIN_REJECTEDDEAD_CAT_BOUNCEPROLONGED_DOWNTRENDEND_OF_CYCLEr,  r5  r/  r0  r1  r2  r.  r3  r4  ACTIVE_CRASHRSI_TRAPSTRONG_DOWNTRENDr6  r8  HOLDr9  r`   rN  r  Nr   rv  c            	          ddddd d dddS )Nr           )r  r  r  r  
best_tradeworst_tradetotal_duration_minutestrades_with_durationr(  r(  r2   r"   r+  z:RouteHandler.handle_patterns_performance.<locals>.<lambda>  s!     "#*+()	1 r2   r  r   r   rg  r  r  r   r  r  r  rr  r   r  rb  )r   r  rb  rs  r  r5   rt  ru  r4   	excellentz"Maintenir - Performance excellentekeepr   goodzBon - Continuer la surveillance(   mediumu!   Moyen - Optimisation recommandéeoptimize   weaku,   Faible - Renforcer conditions ou désactiverreviewcriticalu&   Critique - Désactivation recommandéer  r  u(   Réduire timeout - Sorties trop tardivesz&Renforcer confirmations - Faux signauxu*   Critères trop permissifs - Trop de tradesre   u,   Critères trop stricts - Pas assez de tradesr   r  r&  )r  r  r  r  rf  r  r  avg_duration_hoursrr  rs  rN   recommendationrW  optimizationsc              3   &   K   | ]	  }|d      yw)r  Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>  s     #HQAiL#Hr6  rq  inactiveu(   Aucune donnée - Pattern jamais utilisémonitoru*   Pattern disponible mais jamais déclenchéu&   Vérifier les conditions de détectionc                     | d   S )Nr  r(  r)  s    r"   r+  z:RouteHandler.handle_patterns_performance.<locals>.<lambda>%  s
    QwZ r2   Tr,  c              3   L   K   | ]  }|j                  d d      dkD  sd  ywr  r   r   NrD  rn  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>)  s"     J1!%%	12E2IQJ   $$c              3   @   K   | ]  }|j                  d d        ywrq  rD  rn  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>+  s     @AAEE)Q/@r  c              3   2   K   | ]  }|d    dk(  sd  yw)rN   rv  r   Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>0  s      XqQx[K=W XrO  c              3   2   K   | ]  }|d    dk(  sd  yw)rN   rx  r   Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>1       N!(v8MANrO  c              3   2   K   | ]  }|d    dk(  sd  yw)rN   rz  r   Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>2  s     RA!H+:QaRrO  c              3   2   K   | ]  }|d    dk(  sd  yw)rN   r}  r   Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>3  r  rO  c              3   2   K   | ]  }|d    dk(  sd  yw)rN   r  r   Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>4       VaAhK:<UVrO  c              3   2   K   | ]  }|d    dk(  sd  yw)rN   r  r   Nr(  r3  s     r"   r5  z;RouteHandler.handle_patterns_performance.<locals>.<genexpr>5  r  rO  )rv  rx  rz  r}  r  r  )ra  total_patternsglobal_win_rater  r  status_counts)r   patternsglobal_statsrO   zError in patterns performance: rS  Fr  rS   )rq   rr   rS  rc  rT  rs   rt   ru   rv   rw   rB  rw  r-   r   r	  r  r7   rz   r   r}   r>  r?  r6   r@  rT   r   rU   r   rV   rQ   r   )"rW   r  r@   trade_history_fileALL_AVAILABLE_PATTERNSr   r\   rw  r  rV  r  r  r  r0   exitr  patterns_datarf  r  avg_durationrN   r  rW  r  rr  rs  existing_patternspattern_namera  
total_winsr  r  r  rX   s"                                     r"   handle_patterns_performancez(RouteHandler.handle_patterns_performancek  s   ]	9R)STJ!#j:N!O&" ww~~01,cKH *A!YYq\F* *  0' 	) 	M   ())Ir2?ii',G))Iq1%g.g!#k"g-"Q;&MQ&M(Oq(O &.'E,<OPY<Z2Z"'))He"<#*%*YY{E%B+E,' '/7U==QR[=\3\"'))He"<#*%*YY{E%B,E-(  5([E-A ( 6 6u\7J K'55eK6HI$(5L#?#?#AB#F678C745:5M(V M"/"5"5"7 QEJ7^VWEWE&ME'N:cA]^AFwRSAS%,uW~=YZbgh~b  CD  cDu%=>G]A^^  JK r>(F%IN#F^#F%FN#F^%F%HN'F^#F%SN%F'F%MN&F !#b=#c)%,,-WX{%,,-UVW~*%,,-YZw!+%,,-[\ #<0
#M2 ;x(K,AA
9-I0FFG%ONN;/;??;3OO!),1&* &*

 "j&;q&@%)

 $$&"7^!&M#Ho %h 2!&u['91!=$Wa0IUXYIY%r0A1*E_`",#.$&4$%2& EQh !$#H-#H H 6 '88!((#/!" !"#$'%(#&.1&*'+",*T"+*V  YA  *B* ( #7F v;LJJJJCORSCSzL8C?YZO@@@I2>2Bi,.G ! XM XXN}NNRRRN}NNV=VVV=VVM ..)$0&)-&8',_a'@!&y!!4$Wa0%2! &\\^5570 w* *t\  	LL:1#>LN.. Q0  	sX   B.U: 0U%DU: U: A U21G#U: EU: %U/*U: 2U74U: :	W8W  Wc           	      h   	 t        dd      }||j                  |       yddl}ddl}|j                  j                  | j                  d      }|j                  j                  |      s|j                  ddd	d
d       yt        |dd      5 }t        j                  |      }ddd       j                  d      }d}	|rG	 |j                  |      }
dj                  |
j                               }|
j                         xr d|v }	|j                  dd      }d}|rO	 ddlm}  |j$                  |      } |j&                         |z
  j)                         }|dkD  }t+        |d      |d<   |	r|r
d|d<   d|d<   d|d<   |	|d<   t/        d|       |j                  |       y# 1 sw Y   xY w# |j                  |j                   f$ r d}	Y w xY w# t,        $ r Y qw xY w# t,        $ rC}t0        j3                  d| d       |j                  dddt5        |      d        Y d}~yd}~ww xY w)!u>   Retourne le statut temps réel du Market Spy (spy_status.json)
spy_status       @r  Nr   r  TFNOT_STARTEDu   Market Spy non démarrér   runningphaser   r`   r  r  r  r  
market_spyrO   r   rH  r5   r   status_age_secondsr  OFFLINEr  r   process_alivezError in spy status: rS  r   r   r  r  rQ   )r1   rT   rq   r  rr   rs   r@   rt   ru   rv   rw   r-   r7  r  r  r  r  r   r	  r   r  r}   r   r;   rV   rQ   r   )rH   rW   r
  rq   r  r  r   rN   r  r  r  r  r+   staler   r  agerX   s                     r"   handle_spy_statuszRouteHandler.handle_spy_statusQ  s<   ?	#6F!226:'',,t8IJK77>>+.22#$*9	4  k39 &Q1& **U#C!M*!>>#.D!hht||~6G$(OO$5$Q,':QM
 K,BE1"8("8"8"<K'8<<>K7FFHC"HE38a=F/0 !E$)y!"+w $F9&3F?#|V,..v6E& & ,,f.A.AB *$)M* !   	LL04tLD..  Q	0  	s    G% AG% G% F&'G% AF3 G% "AG 05G% &F0+G% 3GG% GG% 	G"G% !G""G% %	H1.9H,,H1c           	         	 ddl }|j                  j                  | j                  d      }|j                  j	                  |      s|j                  ddddd       yt        |d	d
      5 }t        j                  |      }ddd       j                  dd      }|rY	 ddl
m
}  |j                  |      } |j                         |z
  j                         }	t        |	d      |d<   |	dkD  r
d|d<   d|d<   	 |j                  j                  | j                  d      }
|j                  j	                  |
      rt        |
d	d
      5 }t        j                  |      }ddd       j                  dg       dd D cg c]8  }|j                  dd      |j                  dd      |j                  dd      d: c}|d<   d|d<   |j                  |       y# 1 sw Y   VxY w# t        $ r Y w xY w# 1 sw Y   xY wc c}w # t        $ r Y Ow xY w# t        $ rC}t         j#                  d| d       |j                  ddd t%        |      d!       Y d}~yd}~ww xY w)"uE   Retourne le statut temps réel de la surveillance IA (ia_status.json)r   Nia_status.jsonTFr  u   Service IA non démarrér  r`   r  r  rO   r   rH  r   r  ,  r  r  r  r  r?  r$  r   r  r  r   r  r  ready_signals_detailr   zError in IA status: rS  r   r  )rq   rr   rs   r@   rt   rT   ru   rv   rw   r-   r   r	  r   r  r}   r   rV   rQ   r   )rH   rW   rq   r  r   rN   r+   r   r  r  rX  rT  r  rX   s                 r"   handle_ia_statuszRouteHandler.handle_ia_status  sS   7	'',,t8HIK77>>+.22#$*A	4  k39 &Q1& K,B1"8("8"8"<K'8<<>K7FFHC38a=F/0 Sy,1y)*3w

WW\\$//;WX
77>>*-j#@ -A $		!- "'?B!?!C6 $%552#6wPQAR_`_d_denpr_st6F12 !%F9..v6C& &  ! - -6    	LL/s3dLC..  Q	0  	s   AH H ,GH AG# 8AH G2H <=G>9H ?H G H #	G/,H .G//H 2G;7H 	HH HH 	I9IIc                    ddl }ddl}ddlmc m} ddlmm |j                         }t        | dd      }|r-||j                  dd      z
  dk  r|j                  |d          ydd	d
ddd
g}d }fd}	g }
|D ]  }	 |j                  j                  |d   ddi      }|j                  j                  |d      5 }|j                         }ddd       |j                        }ddi}|j                  d      }|dd D ]  }|j!                  d      xs dj#                         }|j!                  d      xs dj#                         }|j!                  d      xs d}d|v r1|j                  d| d      j%                         j'                         n|}t)        |      dkD  r|dd j#                         d z   n|}|j!                  d!      xs d}|s|
j+                  ||||d"    |	|       ||      d#         d&|
t)        |
      d'}||d(| _        |j                  |       y# 1 sw Y   _xY w# t,        $ r)}t.        j1                  d$|d"    d%|        Y d}~d}~ww xY w))u  Proxy RSS → JSON côté serveur pour éviter CORS et erreurs rss2json.
        Lit les flux RSS crypto FR directement, parse le XML, retourne JSON.
        Fallback automatique si un flux est indisponible.
        Cache 5 minutes pour limiter les appels externes.
        r   N)r   r
   _news_cacher+   r  r,   zhttps://journalducoin.com/feed/zJournal du Coin)r  r  zhttps://cryptoast.fr/feed/	Cryptoastc                     | j                         g d}g d}t        fd|D              ryt        fd|D              ryy)N)	haussebullishmonterecordadoptionpositif
croissancerebondrally)	baissechutecrashplongereculeffondrebearishpaniqueliquidationc              3   &   K   | ]  }|v  
 y wrF   r(  r4  rn  rF  s     r"   r5  zERouteHandler.handle_crypto_news.<locals>.sentiment.<locals>.<genexpr>       'a16'   positivec              3   &   K   | ]  }|v  
 y wrF   r(  r  s     r"   r5  zERouteHandler.handle_crypto_news.<locals>.sentiment.<locals>.<genexpr>  r  r  negativer%  )r8  any)r  rD  negrF  s      @r"   	sentimentz2RouteHandler.handle_crypto_news.<locals>.sentiment  s;    ArCrC'3''
'3''
r2   c                     	 ddl m}  ||       }t         j                  j                        |z
  j                         dz        }|dk  rd| dS |dk  r	d|dz   dS d|dz   dS # t        $ r Y y	w xY w)
Nr   )parsedate_to_datetimer5   r  z mini  r  ju   Récent)email.utilsr  r   r   utcr  r   )pub_strr  dtminsr   r
   s       r"   time_agoz1RouteHandler.handle_crypto_news.<locals>.time_ago  s    !=*73LHLL6;JJLrQR"9wtfD%99$;r
!'< < tA.. ! !s   AA, A, #A, ,	A87A8r  r<  zMozilla/5.0 CryptoBot/1.0r>  r@  rA  atomzhttp://www.w3.org/2005/Atomz.//itemr  r   linkrs  <z<x>z</x>r  r   pubDater  )r  rS  r  r-  r/   r  zRSS fetch error rl  T)r   newsr  )r+   r,   )r/   r_  xml.etree.ElementTreeetreeElementTreer   r
   r   r-   rT   r`  re  rf  rh  
fromstringfindallfindtextr   itertext__next__r6   rz   r   rV   rW  r  )rH   rW   r/   urllibETr   rT  feedsr  r  r  feedr  r  rawrootnsr7   itemr  r  descpubrX   r   r   r
   s                            @@r"   handle_crypto_newszRouteHandler.handle_crypto_news  s    	**/iikmT2S599T1--3..uV}= 6?PQ0+F

			!  	EDEnn,,T%[)+FG - I^^++C+; &t))+C&}}S);<Y/!"1I D!]]739r@@BE MM&17R>>@D MM-8>BDTW[_T_2==3tfD)9:CCENNPeiD9<TS4:++-5dD--	28bC%*'+#'&*6l$,SM)25)9% 	E8 "4#d)D"%v6**625& &*  E/V~RsCDDEs7   ?H>H1DH>)H>1H;	6H>>	I0I++I0c                 0   	 t        dd      }|r|j                  |       yddl}|j                  j	                  | j
                  d      }|j                  j	                  | j
                  d      }|j                  j	                  | j
                  d      }|j                  j	                  | j
                  d	      }|j                  j	                  | j
                  d
      }i }	|j                  j                  |      r-	 t        |dd      5 }
t        j                  |
      }	ddd       g }|j                  j                  |      r-	 t        |dd      5 }
t        j                  |
      }ddd       g }|j                  j                  |      r-	 t        |dd      5 }
t        j                  |
      }ddd       g }|j                  j                  |      rY	 t        |dd      5 }
|
j                         }|dd D cg c]#  }|j                         s|j                         % }}ddd       i }|j                  j                  |      rd	 t        |dd      5 }
t        j                  |
      }|j                         D ci c]  \  }}t        |t              rd|v r|| }}}ddd       i }|	rx	 ddl}t#        |	j%                               }|D ]T  }	 |j'                  dd|id      }|j(                  dk(  r,t+        |j                         j'                  dd            ||<   V 	 g }|	j                         D ]_  \  }}|j'                  dd      }|j'                  |d      }|dk  r||v r||   j'                  dd      }|dk  r|j'                  d|      }|dkD  r||z
  |z  dz  nd}|j-                  |||j'                  dd      |t/        |d      |j'                  dd      |j'                  dd      |j'                  d|j'                  dd            |j'                  d       r%|j'                  d |j'                  d!d            d"z  n|j'                  d!d      |j'                  d#d$      |j'                  d%d      |j'                  d&i       d'       b |D cg c]  }|j'                  d(      s| } }t1        |      }!t1        |       }"i }#|D ],  }|j'                  dd      }$|#j'                  |$d      d)z   |#|$<   . |r|d*d ng }%|%j3                          i }&|rt5        d+ |D              }'t5        d, |D              }(t5        d- |D              t1        |      z  })t5        d. |D              t1        |      z  }*t1        |      |'t1        |      |'z
  |rt/        |'t1        |      z  dz  d)      ndt/        |(d/      t/        |)d      t/        |*d)      d0}&|r|d1d ng }+|+d2d },|,j3                          d3|t1        |	      t1        |      t1        |	      t1        |      z   |%|!|"|#|,|&|t7        j8                         j;                         d4}-t=        d|-       |j                  |-       y# 1 sw Y   ZxY w# t        $ r i }	Y kw xY w# 1 sw Y   /xY w# t        $ r g }Y @w xY w# 1 sw Y   xY w# t        $ r g }Y w xY wc c}w # 1 sw Y   xY w# t        $ r g }Y w xY wc c}}w # 1 sw Y   VxY w# t        $ r i }Y gw xY w# t        $ r Y Sw xY w# t        $ r Y w xY wc c}w # t        $ rB}.t>        jA                  d5|. d36       |j                  d7tC        |.      d8d9       Y d}.~.yd}.~.ww xY w):u>   Récupère toutes les données du Market Spy pour le dashboardspy_datar;  r  Nr   r  r  r  market_spy.logr_   r`   r  r  r  r  r   r&  rT  rh   r  r!  r  	max_pricer4   r  r  r  r  r  r  r   surge_strengthr  r  rO   r   max_pnlr(  )r   r  r  r  r  r  r  r  r  rO   r  r(  r  r   r  c              3   L   K   | ]  }|j                  d d      dkD  sd  ywr  rD  rn  s     r"   r5  z/RouteHandler.handle_spy_data.<locals>.<genexpr>  "     MQUU9a5H15L1Mr  c              3   @   K   | ]  }|j                  d d        ywrm  rD  rn  s     r"   r5  z/RouteHandler.handle_spy_data.<locals>.<genexpr>       Jj! 4Jr  c              3   @   K   | ]  }|j                  d d        ywrq  rD  rn  s     r"   r5  z/RouteHandler.handle_spy_data.<locals>.<genexpr>       GaaeeIq1Gr  c              3   @   K   | ]  }|j                  d d        ywrt  rD  rn  s     r"   r5  z/RouteHandler.handle_spy_data.<locals>.<genexpr>       MAquu^Q7Mr  r  )ra  r  r  rf  r0  rg  avg_hold_min8r  T)r   spy_positionsspy_positions_countbot_positions_counttotal_positionsrecent_opportunitiestotal_opportunitiestotal_executedpatterns_distributionspy_historyhistory_stats	log_linesrO   zError in spy data: rS  Fr  rS   )"r1   rT   rq   rr   rs   r@   rt   ru   rv   rw   r   rd  r   r7   rx   ry   r  r{   rA  r-   r  r   rz   r}   r6   r-  r@  r   r   rU   r;   rV   rQ   r   )/rH   rW   r
  rq   rU  spy_opportunities_filespy_history_filespy_log_filer   r3  r   r  r  r  	all_linesr\  bot_positionsr  r8   r9   spy_current_pricesr  spy_symbolsrC  r`   spy_positions_enrichedr   rV  r0   r  r  oexecuted_opps
total_oppsr  patterns_countr   recent_oppsr  r  r  r  avg_holddisplay_historyrecent_historyr   rX   s/                                                  r"   handle_spy_datazRouteHandler.handle_spy_data  sy   c	
4F226: ggll4??<PQO%'WW\\$//C^%_"!ww||DOO=RS77<<9IJLWW\\$//;KLN Jww~~o.$osWE 2%)YYq\
2 Mww~~45'4cGL 5PQ(,		!5 Kww~~./%.gF 3!&*iil3 Iww~~l+#lC'B Va$%KKM	8A#$$U11779QWWY$U	$UV Mww~~n-'ncGD V"iil:=))+ )V$!Q*4Q*=-STBT *+A )V )VV "$*"&z'8"9K* !! #*U/7oq !( !JA }}3:?WVW@X:Y 23 7! &("!+!1!1!3 		-3 2 6 6vq A A%&M*A$1&$9$=$=oq$QM A%$)IIk5$AMEJQYME1U:S@TU&--$#( %		*a 8%2$Wa0!&;!:#(99]A#>$yyuyyI7VWX]XaXabrXsUYY'77A9NORTTy~  zC  zC  DK  MN  zO!&;!;$yyA6"'))L""=/ 2 )6K1z9JQKMK]+J /NN" AEE)Y/$2$6$6q!$<q$@q!A
 2?--BK! MMkMMJkJJ	G;GG#kJZZMMMPST_P``$'$4 !+.5KVdS-=&=&CQ G\]&+Iq&9#(!#4$)(A$6! 5@k$%0RO,ST2N""$  !7'*:'*='9#&z?S5G#G(3'1"0)7-!.&%\\^557F z6*..v6U2 2  $!#J$5 5  '$&M'3 3  %"$K% %VV V ! # "I#)VV V ! '$&M'   ) ! !  : Lh  	LL.qc2TLB.. Q0  	s   ]
 C]
 Z Y?'Z /]
 Z+ Z1Z+ 9]
 [
 %Z=;[
 ]
 ![. /[![[/[!1[. 9]
 \ %)\!\ /\2\ :]
 ?"\5 "A\%3\5 5E:]
 /]]
F4]
 ?Z	Z Z]
 Z]
 Z(#Z+ +Z:6]
 9Z::]
 =[[
 
[]
 []
 [!![+&[. .[=9]
 <[==]
  \\\ \"]
 !\""]
 %	\2.\5 1\22\5 5	]>]
 ]]
 
	^8^^c           	         	 ddl }ddl}t        j                  j	                  | j
                  ddd      }t        j                  j                  |      s|j                  }t        j                  j	                  | j
                  d      }t        j                  j                  |      s|j                  ddd	d
       y|j                  ||dgddd| j
                        }|j                  |j                  z   }d}	d}
|j                  d      D ]  }d|v r>	 t        |j                  d      d   j                  d      d   j                               }	d|v sJ	 t        |j                  d      d   j                  d      d   j                               }
 |j                  d|	|
|j                  |r|dd ndd       y#  Y rxY w#  Y xY w# j                   $ r |j                  ddd	d       Y yt"        $ rB}t$        j'                  d| d       |j                  dt)        |      d	d       Y d}~yd}~ww xY w)z%Lance un scan spy depuis le dashboardr   N.venvScriptsz
python.exemarket_spy.pyFzmarket_spy.py introuvabler  r  z--onceTr  )rf   rg   rh   cwdrl   u   Candidats analysés:r   |zTrades ce cycle:ir   )r   candidates_analyzedtrades_executed	exit_codeoutput_previewzTimeout du scan (>120s)rS   zError in spy scan: rS  )r~   r  rq   rr   rs   r@   rt   
executablerT   r   r   stderrrt  r   r   
returncodeTimeoutExpiredr   rV   rQ   r   )rH   rW   r,   r~   r  
python_exe
spy_scriptr   rn   
candidatesr\   rG  rX   s                r"   handle_spy_scanzRouteHandler.handle_spy_scan  s<   <	 doow	<XJ77>>*- ^^
dooGJ77>>*-22$84    ^^Z2#OO $ F ]]V]]2FJFT* 
)T1%(4J)KA)N)T)TUX)YZ[)\)b)b)d%e
 &-!$TZZ0B%CA%F%L%LS%QRS%T%Z%Z%\!]
 ..'1#)#..39&-r0  (( 	.. 20   	LL.qc2TLB.. Q0  	sU   B=G  AG =GG =G*G GG GG $I8I 8H==Ic                 "   	 t        dd      }||j                  |       yddlm} t        j                  j                  | j                  d      }t        |i       }|r|ni }|j                  di       }d	}|j                  d
d      }	|	r8	  |j                          |j                  |	      z
  j                         }
|
dk  }g }	 t        j                  j                  | j                  d      }t        j                  j                  |      ryt        |dd      5 }t        j                   |      }ddd       t#        t$              r|}n:t#        |t&              r*|r(|j)                         D cg c]  \  }}i |d|i }}}|j                  di       }d	}d}d}d}g }d}d}	 t        j                  j                  | j                  d      }t        j                  j                  |      rt        |dd      5 }t        j                   |      }ddd       j                  d
d      }d}|r3	  |j                          |j                  |      z
  j                         }|j                  dd	      xr |dk  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }t        j                  j                  | j                  d      }t        j                  j                  |      rt        |dd      5 }t        j                   |      }ddd       j                  dg       dd D  cg c]8  } | j                  dd      | j                  dd      | j                  dd      d : }} d!}!d"}"d#}#	 dd$lm}$  |$       }%	 |%j/                  d	%      \  }&}'|&xs d!}!|%j2                  xs i }(|(j                  d&d"      })|(j                  d'i       j                  d(d"      }*|(j                  d)i       j                  d*d"      }+t5        |)d+z  t7        d,t9        d|*            d-z  z   |+d.z  z         }"|"d/k  rd0}#n|"d1k  rd2}#n|"d3k  rd#}#n
|"d4k  rd5}#nd6}#d7},g }-d8}.d8}/d}0d}1d}2g }3	 t        j                  j                  | j                  d9      }4t        j                  j                  |4      rt        |4dd      5 }t        j                   |      }5ddd       t;        5d: ;      }6t=        d< |6D              }/|6D 7cg c]  }7|7j                  d=d      dd> |,k\  s|7 }8}7|8D ]-  }7|7j                  d?d      xs d}9|.|9z  }.|9dkD  r|0d@z  }0)|1d@z  }1/ t?        |8      }2g }:d8};d8}<d}=d}>d}?i }@ddAdBd#dCdD}A	 t        j                  j                  | j                  dE      }Bt        j                  j                  |B      rt        Bdd      5 }t        j                   |      }Cddd       t;        CdF ;      }Dt=        dG |DD              }<|DD 7cg c]  }7|7j                  d=d      dd> |,k\  s|7 }E}7d8}F|ED ]_  }7|7j                  dHd      }9F|9z  }F|;|9z  };|9dkD  r|=d@z  }=n|>d@z  }>|:jA                  |7j                  d=d      ddI t5        FdJ      dK       a t?        E      }?|EdLd D ]x  }7|7j                  dHd      }9|7j                  d=d      ddM }G|3jA                  |7j                  dd      t5        |9dJ      t5        |7j                  dNd      xs ddJ      dOGdP       z t;        |3dQ ;      dLd }3ddRlm!}H  |j                         jE                  dS      }I |j                          |HdTU      z
  jE                  dS      }JDD 7cg c]  }7|7j                  d=d      dd> Ik(  s|7 }K}7DD 7cg c]  }7|7j                  d=d      dd> Jk\  s|7 }L}7DrDdV   ni }Mt?        K      t5        t=        dW |KD              dJ      t?        L      t5        t=        dX |LD              dJ      |Mj                  dd      |Mj                  d=d      ddI dY}@	 t        dZd[      }N|NroNj                  d\      r^Nd\   }O|Oj                  d]d      |Oj                  d^dA      |Oj                  d_dB      |Oj                  d`d#      |Oj                  dad      dD}Anddl#}PLD 7cg c]&  }7|7j                  dN      |7j                  dNd      ( }Q}7t?        |Q      dk\  r{PjI                  Q      }R|PjK                  |Q      }S|SdbkD  rt5        RSz  dc      nd}T|Td+kD  rdd\  }U}V}W}Xn.TdekD  rdf\  }U}V}W}Xn!TdgkD  rdh\  }U}V}W}XnTdikD  rdj\  }U}V}W}Xndk\  }U}V}W}XTUVWXdD}Ai }Y	 t        j                  j                  | j                  dldm      }Zt        j                  j                  |Z      rt        Zdd      5 }t        j                   |      }[ddd       [j                  dni       }\|\j)                         D  cg c]N  \  } }t#        |j                  do      tL        tN        f      r$| jQ                  dpd      |j                  dod      fP }]} }|]rt;        ]dq ;      }^|^ddc D  cg c]  \  } }|dk  s| t5        |dJ      dr }_} }tS        ^dsd       D  cg c]  \  } }|dkD  s| t5        |dJ      dr }`} }t=        dt ]D              }at=        du |]D              }bt5        t=        dv |]D              t?        |]      z  dJ      }c|at?        |]      z  d,z  }d|dd3k\  rdw}en
ddxk\  rdA}endy}eet5        dd@      cab`_dz}Yd8}f|D 9cg c]&  }9|9j                  d      s|9j                  dd      ( }g}9i }h|gr~	 t        jT                  g      jQ                  d{d      }id||i }jtW        j                  |jd}      }k|kjX                  d~k(  r-kj                         D 9ci c]  }9|9d   tO        |9d          }h}9|D ]  }l|lj                  dd      }m|lj                  d      xs lj                  dd      }nlj                  dd      }ohj                  |o|lj                  d      xs lj                  dd            }pndkD  rmdkD  rfpnz
  mz  z  }fohv sho   ld<   ndkD  st5        ho   nz
  |nz  d,z  dJ      ld<    t5        |;|.z   fz   dJ      }qd}r	 ddl-m.}s |sj_                  ddc}      }tt        j`                  |tjc                               j                  d      }u|urt5        d@tO        u      z  d      }ri ddd|d|d|!d|"|#ddqdrrt5        qrz  dJ      nddrdt5        fdJ      d|.|2dkD  rt5        |0|2z  d,z  d@      n|j                  dd      |2xs |j                  dd      |0xs |j                  dd      |1xs |j                  dd      |j                  dd      |j                  dd>      ddOt5        |;dJ      |=|>|?|?dkD  rt5        |=|?z  d,z  d@      nddd|-d|:d|3d|D 9cg c]  }9|9j                  dd      |9j                  d      xs |9j                  dd      |9j                  d      xs |9j                  dd      |9j                  d      xs |9j                  dNd      |9j                  dd      d c}9d|j                  dd      |j                  dd      ddY||||||d@A |j                         je                         d}vtg        d|v       |j                  |v       y# t        $ r Y w xY w# 1 sw Y   xY wc c}}w # t        $ r Y Vw xY w# 1 sw Y   xY w# t        $ r Y w xY w# 1 sw Y   xY wc c} w # t        $ r Y xw xY w# t        $ r |%j0                  xs d!}!Y hw xY w# t        $ r Y w xY w# 1 sw Y   JxY wc c}7w # t        $ r Y 
w xY w# 1 sw Y   
ZxY wc c}7w c c}7w c c}7w c c}7w # t        $ r Y w xY w# t        $ r Y w xY w# 1 sw Y   xY wc c}} w c c}} w c c}} w # t        $ r Y 5w xY wc c}9w c c}9w # t        $ r Y w xY w# t        $ r Y hw xY wc c}9w # t        $ rB}wth        jk                  dw d       |j                  d	tm        |w      dd       Y d}w~wyd}w~www xY w)uU   GET /api/mobile-summary - Données agrégées pour le dashboard mobile (1 seul appel)mobile_summaryg      (@r  Nr   rH  r  r  FrO   r   r  r_   r`   r  r  r   marketAnalysisr    r  cycle_countsignals_achatsignals_venteeligible_countsignals_possibler  r?  re   r  r  r  rm  r   Neutre)rw  r  rt  ru  r)  rv  bullish_pctr\  r4   333333?r(  r  u   Peur extrêmery  Peurr5   r   u   Aviditéu   Avidité extrêmez
2026-04-01rq  rc   c                 &    | j                  dd      S Nrb  r   rD  r)  s    r"   r+  z4RouteHandler.handle_mobile_summary.<locals>.<lambda>  s    {TVAW r2   r  c              3   H   K   | ]  }|j                  d d      xs d  ywr  rD  rn  s     r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s"     *WA155?+?a+?*Wro  rb  r  r  r   NEUTRE#f59e0bu   Prudence recommandée)ratiozone
zone_colorlabelr  r  c                 &    | j                  dd      S rE  rD  r)  s    r"   r+  z4RouteHandler.handle_mobile_summary.<locals>.<lambda>  s    {\^I_ r2   c              3   @   K   | ]  }|j                  d d        ywrm  rD  rn  s     r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s     *[A155Q+?*[r  rk     r  )rF  r9   r`  rc  r  r8  )r   r  r  r-  rb  c                 ,    | j                  dd      d d S )Nrb  r   rc  rD  r)  s    r"   r+  z4RouteHandler.handle_mobile_summary.<locals>.<lambda>  s    AEE+WYDZ[^\^D_ r2   r  %Y-%m-%dr  r  rf  c              3   @   K   | ]  }|j                  d d        ywrm  rD  rn  s     r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s     3aQAEE*a4H3ar  c              3   @   K   | ]  }|j                  d d        ywrm  rD  rn  s     r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s     2]A155Q3G2]r  )today_tradestoday_pnl_usdtweek_tradesweek_pnl_usdtlast_symbollast_exit_timetrend_risk_ratio     r@r  rI  rJ  rK  
zone_labelr  r   r&  )FORT_POSITIF#10b981Fort Positif   Positions normales ✅皙?)POSITIFr^  Positifr`  皙)rG  rH  r@  u   Réduire positions -30%r  )NEGATIF#ef4444   Négatifu   Réduire positions -50%)FORT_NEGATIF#7f1d1d   Fort NégatifzPAUSE tradingcrypto_cachezcrypto_data.jsonrk   r#  r   c                     | d   S Nr   r(  r)  s    r"   r+  z4RouteHandler.handle_mobile_summary.<locals>.<lambda>  s
    qt r2   r  c              3   2   K   | ]  \  }}|d kD  sd  ywr   r   Nr(  r4  _r9   s      r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s     'GdaQ'GrO  c              3   2   K   | ]  \  }}|d k  sd  ywrp  r(  rq  s      r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s     'Hdaa'HrO  c              3   &   K   | ]	  \  }}|  y wrF   r(  rq  s      r"   r5  z5RouteHandler.handle_mobile_summary.<locals>.<genexpr>  s     '>da'>r6  HAUSSIERr  BAISSIER)r  pct_positiver  r  r  r  r  r  rP  rA  r  r!  r  
entryPricer  currentPricer  pnlPct:https://api.binance.com/api/v3/ticker/price?symbol=EURUSDTr$  r   Tr  
ia_runningrn  
fear_greed)r  rL  	pnl_totalpnl_total_eureur_ratepnl_unrealizedr  r  r  r  r[   r  )r  rf  ra  r  r  r[   rp  )r  r  r  ra  rf  	bot_curve	spy_curvelast_trades)r   r0   r  r  rj  marketbearishCountbullishCount)r  r  r  )r  signals_buysignals_sellrF  r   r*  )iaspy_activitytr_ratiorO   zError in mobile_summary: rS  r  rS   )7r1   rT   r   rq   rr   rs   r@   r$   r-   r   r	  r  r   rt   ru   rv   rw   rx   r{   ry   r7   rk  rw  r  r  r  r}   r  r5  rj  r@  r6   rz   r	   r  
statisticsmeanstdevr   r   r   r  rc  r  r  r_  r`  rf  rg  rh  rU   r;   rV   rQ   r   )xrH   rW   r
  r   r  r  r,   r  r  r+   r  r[   pos_file_f_pos_rawr8   r9   r  r|  ia_cycleia_signals_buyia_signals_sellia_readyia_eligibleia_surveillancer  r   	ia_statusts_iaia_agerX  rT  r  rn  fear_greed_scorefear_greed_labelrw  r  _rname_rcfgmd_global_score_btc_rsi	_bull_pctSTATS_CUTOFFr  pnl_bot_realizedpnl_bot_all_timebot_wins
bot_lossesbot_total_tradesr  	hist_filer\   trades_sortedrF  trades_recentr   r  spy_pnl_totalspy_pnl_all_timespy_wins
spy_lossesspy_total_tradesr  r  r  r3  spy_trades_sorted
spy_recentcumetr	   	today_strweek_cutoffspy_today_listspy_7d_listlast_spy
_tr_cached_cur
_stats_modspy_7d_pctsmean_pstd_prI  rJ  colorrL  recr  
cache_pathcdatasymschangeschanges_sortedr  r  	pos_count	neg_countavgpct_bullsentr  pos_symbolslive_pricesrW  r  r  pos_itemrj  r0   rC  r  r~  r  ry  _r_priceresponserX   sx                                                                                                                           r"   handle_mobile_summaryz"RouteHandler.handle_mobile_summary   s   d	Y 0d;F!226:) GGLL:MNM%mR8H'8RDHHWb)EK+r*B'8<<>,BH,B,B2,FFUUWC"%)K I77<<9IJ77>>(+hg> 1"#'99R=1!(D1$,	#Hd3DLNNDT$UDAq%7%78Q%7$U	$U XX.3F JHNOHKO ggll4??<LM77>>+.k3A 1Q$(IIaL	1%MM+r:E F!&2hlln7Mx7M7Me7T&T%c%c%eF "+y%!@!QVc\J(}}]A>H%.]]?A%FN&/mmOQ&GO"+--0@!"DK&/mm4F&JOWW\\$//;WX
77>>*-j#@ -A $		!- "'?B!?!C  $%552#6wPQAR_`_d_denpr_st H   F!'D57B$,$:$:$:$NMFE#0yF ))/R "~r :66%,00;FF:r266}bI	#()<s3AxHX?Y\_?_)_bknqbq)q#r #r)'6$%+'-$%+'/$%+'1$':$
 (LI""HJ KGGLL:NO	77>>),iw? .1!%1.$*67W$XM'**W*W'W$0=$m1{TVAWX[Y[A\`lAlQ$mM$m* .EE%O0q(A-(q5(a-((Aoj	.
 (+='9$
 IM"HJ L!"HIX`  uL  MHE77<<9NO77>>(+hg> 2!%)YYq\
2(.z?_(`%'**[IZ*['[$->!n!%%UWBXY\Z\B]amBm!!nJ!nC' aEE*a0q%*q5$MH&!OJ!((quu["/Ecr/JQVWZ\]Q^)_`a (+:$'- qEE*a0UU;3CR8#**aeeHb6IRWXY[\R]jopqpupuv  BC  qD  qI  HI  KL  kM  Y^  mo  ,p  qq #):_"`adae"fK2 , 7 7
 CI#/8<<>I14E#E"O"OPZ"[K1B%oAaeeKY[F\]`^`FaenFna%oN%o.?"n155VXCYZ][]C^bmCm1"nK"n8I04rH(+N(;*/3aR`3a0acd*e'*;'7).s2]Q\2]/]_`)a'/||Hb'A*2,,{B*G*L$L%/0B%N
%*..*C#-i#8D26((7A2F26((682L26((<2S26((<2R26((;KR2P(H <HS*t1WXW\W\]fWgWs155A+>*tK*t";/14)3)E(2(8(8(EDIEMfuna(@WX#(3;  OR4KD%%*S[  OH4KD%%*T\  OG4KD%%*T\  OJ4KD% OJ4KD%5:DX]hm  BE  ,F !O WW\\$//>K]^
77>>*-j#@ -A $		!- 99Y3D %)JJL Aq%aee,@&AC<P 62.6JA0NOG 
 )/^)LTbcedeTf"pDAqjknojoa5A;#G"p"pT\]klnlo]pTq"{DAquvyzuza5A;#G"{"{$''Gg'G$G	$''Hg'H$H	#C'>g'>$>W$MqQ#,s7|#;c#A#r>JT%^HT4>T)-,1(A,>.1.7.7'.&,+ !N8AU1QUU8_1552.UKUK$(JJ{$;$C$CC$LMPQ^P_`C#<<Q7D''3.OSyy{&[!q{E!G*4E'E&[&[ & bll:q1 \2Thll=RS6Tll8R0%//#x||N/K/ox||\kmnOop19q"w#&==N+%/:3/?H^,qy-2[5E5MQV4VZ]3]_`-a*b m.>>OQRSI H.]]#_ij]kBGGI.227;$Qv%6:H747{7 j7 &	7
 (8CST7 Y7  8y8';Q!?QU7 H7 !%":7 +O_bcOch1A&AC&G Kinirirs|~  jA$4$S		-QR8S$<		&!(<(BEIIh,B!&;!:%*YY~r%B7&  2$($4O_bcOch1A&AC&G Kij'74 Y576 Y778 {97:  '	  #$%%""5!"|!4!OmQ8O#$55#8#UAEE/ST<U#$55?#IaeeIq6I uuZ3	;7N %zz.!<%zz.!<O7V "?W7Z &#1$3 +$3% !-$)X\\^557m7Hp '2..x8W
 ! 1 1 %V 1 1  ) ! !- -    ! B%44A	FB"   . . %n  2 2 "o* &p"n4 +u %  - - #q"{"   V '\  6  @	<  	YLL4QC84LH..53q6/RTWXX	Ys   AD A*AD 7~1 AD A 5A  5 
 AD +AA@ $A@ 721 )C
A@ 3A@	A@ (=A@%A@ 'AD .AA <A@# B6AA AD AAA% 5AA,AA% 7AA AA ?AA% AD /AAB& AA5,AB& 	AB'AB+EAB& AB!AB%AB& +AB	ABA=AB& BAB AB(AB<BAB AD 
AAC #AB69-AC &AAC9AC AC	"AC	3AC ACAC&BAC ,AD 2AC%	AC%AD $A"AC/ AC*AC/ !BAD >AD 1AD >A%AC? #D AD #BAD;A5AD 1	~>:AD =~>>AD  	!AD  !!AD $.)A@ 1	>:A@ =>>A@ @A@@A@ @	A@ @AD @A@ @ AD @#AA @<AA @?AA A AA A	AAAAD AAAAAD AAAAAA% A%	AA2A.AD A1AA2A2AD A5AA?A:AB& BAB B	AB#BAB& B"AB#B#AB& B&	AB3B/AD B2AB3B3AD B6AC B;AC C	AC"CAD C!AC"C"AD C*AC/ C/	AC<C8AD C;AC<C<AD C?	ADDAD DADDAD D	AED8AEEAEc                   ?@ 	 t        dd      }|r|j                  |       yt        j                  j	                  | j
                  d      }t        j                  j                  |      s|j                  dddd	       yt        |d
d      5 }t        j                  |      }ddd       t        ddd      }g }D ]j  }|j                  dd      }	|	s	 t        j                  |	j                  dd      j                  dd            }
|
|k\  sT|j!                  i |d|
i       l |s|j                  dddd       yt        j"                         }t%        d |D              }t'        ||z
  j)                         dz  d      }t+        d |D              }t-        |      }t+        d |D              }|rt/        ||z  dz  d      nd }d!}d"}||z  |z  }||z
  }||z  }d#}	 d dlm} |j5                  d$d%&      }t        j6                  |j9                               j                  d'      }|rdt;        |      z  }t/        ||z  d(      }t/        ||z  d(      }t/        ||z  d(      }t/        ||z  d(      @d)?	 t        j                  j	                  | j
                  d*      }t        j                  j                  |      r<t        |d
      5 }t        j                  |      } | j                  d+d)      ?ddd       ?|z   }!?@fd,}"d-}#i }$d.D ]*  \  }%}&t;        |!      }'d/}(d/})g }*t=        d|&dz         D ]  }+ |"|'      },d }-t=        d0      D ]  }.|'|,z  }/|-|/z  }-|'|/z  }' |+d%k  rd }0d1}1n|+d2k  r|-d3z  }0d4}1n|-dz  }0d5}1|'|#kD  r
|0|'|#z
  z  }0|#}'|'|0z  }'|+d2k  r|(|0z  }(n|(|0d6z  z  }(|)|0d7z  z  })|(d8z  }(|)d9z  })|*j!                  |+|1t/        |-d(      t/        |'d(      t/        |(d(      t/        |)d(      t/        |'|(z   |)z   d(      d:        |*d;   }2|&|*|2d<   t/        |2d<   |!z
  d(      |2d=   |2d>   |2d?   d@|$|%<   - dd1dAdBdCdDd(d4dEdFdGdDd%d5dHdIdJdDddKdLdMdNdDg}3d}4|dOkD  r|!dPkD  rd(}4|dQkD  rd%}4|dRkD  rd}4d dSlm }5  |5t:              }6 |5tB              }7|D ]D  }|d   jE                  dT      }8|6|8xx   |j                  dUd       xs d z  cc<   |7|8xx   dz  cc<   F g }9tG        |6jI                               D ]Q  }:|7|:   |z  |z  };|6|:   |;z
  }<|9j!                  |:t/        |6|:   |z  d(      t/        |6|:   |;z
  |z  d(      |7|:   dV       S dt/        |d      ||||||@|9dW	?t/        |!d(      t/        |!?z
  ?z  dz  d(      dX|$|3|4|#||dYdZ|jK                         d[}=tM        d|=       |j                  |=       y# 1 sw Y   #xY w# t        $ r0 	 t        j                  |	dd d      }
n# t        $ r Y Y Fw xY wY w xY w# t        $ r Y w xY w# 1 sw Y   #xY w# t        $ r Y 2w xY w# t        $ rB}>tN        jQ                  d\|> d]       |j                  dtS        |>      dd^       Y d}>~>yd}>~>ww xY w)_zOCompute real-time projections based on actual spy performance since 01/04/2026.gestion_projectionsrl  r  Nr  F   Pas de données spyr  r  r`   r  r  i  r  r   rb  r   r  r  rc  rd  _exit_dtTz$Pas encore de trades depuis le 01/04)r   r   projectionsc              3   &   K   | ]	  }|d      yw)r  Nr(  rn  s     r"   r5  z:RouteHandler.handle_gestion_projections.<locals>.<genexpr>  s      ?1: ?r6  r  r\  c              3   H   K   | ]  }|j                  d d      xs d  ywrm  rD  rn  s     r"   r5  z:RouteHandler.handle_gestion_projections.<locals>.<genexpr>  s#      Kqz1!5!:!: Kro  c              3   T   K   | ]   }|j                  d d      xs ddkD  sd " ywry  rD  rn  s     r"   r5  z:RouteHandler.handle_gestion_projections.<locals>.<genexpr>  s'     LQQUU:q-A-FQ!,KqLr{  r4   r   g{Gzd?i  g)\(?r{  r&  rA  r!  r  i>  r]  capital_initialc                     | dk  rt        d      z  S | dk  rt        d      z  dz  S | dk  rt        d      z  dz  S | dk  rt        d      z  dz  S t        d      z  d	z  S )
Ni N  r   P  gffffff?i gGz?i gq=
ףp?gQ?)r5  )capr  daily_pnl_nets    r"   get_roi_dailyz>RouteHandler.handle_gestion_projections.<locals>.get_roi_daily  s    %<OQ8O(O!OE\=3PQ;R+RVZ*Z#ZF]MCQR<S,SW[+[$[F]MCQR<S,SW[+[$[+c/1.EEMMr2   i8 ))1_moisr   )3_moisr&  )6_moisr$  rq  r|  ACCUMULATION   rB  u   SÉCURISATIONDIVERSIFICATIONg?333333?g%X?g贁N?)monthr  gaintradingsecuriseetfr   rf  r   r  r  r  )monthsdetailtotal_final
gain_totalr  r  r  zMois 1-3u   Réinvestir 100% des gainsu#   Atteindre 50K€ de capital trading)r  nomperioderW  objectifz	Mois 4-12u.   Retirer 30% → épargne sécurisée (3.5%/an)u   Matelas de sécurité 30-50K€u
   Année 2-3u&   Retirer 50% → 60% ETF + 40% épargnez(Patrimoine hors crypto > capital tradingRENTEu
   Année 4-5u&   Retirer 60% → 70% ETF + 30% épargnezRevenus passifs autonomesZ   r  im  iG  rv  rQ  rk  )rQ  pnl_brutpnl_netr\   )	days_activera  r  rf  total_pnl_brut
total_feestotal_pnl_netr  daily_series)initialactuelgain_pctu   20% mensuel → PAUSE)cap_tradingfee_rateposition_sizedrawdown_max)r   performancescapitalr  plan_strategiquephase_actuelleregles_securiterO   zError in gestion_projections: rS  rS   )*r1   rT   rq   rr   rs   r@   rt   ru   rv   rw   r   r-   r	  r   r   r  rz   r   r  r5  r  r@  r6   r}   r_  r`  rf  rg  rh  r   rb  rB  rw  r   r  rj  rA  rU   r;   rV   rQ   r   )ArH   rW   r
  r  r   r  r"  r\   rF  r  r  r   first_trade_dtr  r  ra  r  rf  r  r  total_fees_usdttotal_pnl_net_usdtdaily_pnl_net_usdtr  ry  r  r  total_pnl_brut_eurtotal_fees_eurtotal_pnl_net_eurr  sfr  capital_actuelr  CAP_TRADINGr  rL  r  r  cap_securisecap_etfmonthly_detailr  roi_d
month_gain_dday_gainretraitr  r;  plancurrent_phaserw  	daily_pnldaily_countday_keyr  dayfee_daynetr   rX   r  r  sA                                                                  @@r"   handle_gestion_projectionsz'RouteHandler.handle_gestion_projectionsl  s   h	Y 54@F226:ww||DOO5JKH77>>(+22uOd3egjkhg6 *!!YYq\
* dAq)FF > !k2 6$!&44]5J5J3PX5Y5a5abjln5opG f$MM"<Q"<
G"<=> 22#E#'4 
  ,,.C  ? ??Ns^3BBDuLcRK  KF KKNv;LL&LLD>JuTL036:PQH HM*]:XEO!//!A!3k!A H.]]#_ij]kBGGI.227; 5=0H "'~'@!!D"?X#=qAN %&88&CQ G!"4x"?CM $O "T__>Q R77>>-0mS1 QR#'99R=*2,,7H%*PQ -/@@NN  K K!N :v#N3"!#q&1*- )A)+6E!"J#Bi 0#.#6"h.
#x/0
 Av"# .b",t"3 /",t"3 1"[0;#<<&17*KBw$/$$67T>1 ^4L.G"))!"!& %j! 4#(a#8$),$:$Wa0!&{\'AG'KQ!O+ C)V 'r*$,#(>"'g(G"K$Y/ %j 1 <&E"e:| Nz7EjlOK>@ $5,CGI GC8:D MRNU$: !S  !W$ ! 0#E*I%c*K *J-00<'"quuZ';'@qA"G$)$*
 Linn./ ~%c*]:XEnw.##SeIcNU]D]_`>a05y~7OS[6[]^0_kvwzk{%} ~~  #(a#8$0  (&8"0%6%2$0
!  /#NA6 %~'G?&Z]`&`bc d
  +$("/#. (%2$;	$ !]]_7F< ,f5..v6s* * ! !!"*"3"3M#24FH["\$ ! !  !R  Q Q  l  	YLL9!=LM..53q6/RTWXX	Ys    X? AX? X? W	(1X? 5WX? 0X? B#X? *AX >X? AX/ (X"X/ 	J?X? 	WX? 	X W:9X:	XXX? XXX? XX? 	XX? XX? "X,'X/ /	X<8X? ;X<<X? ?	Z
8ZZ
c                    	 t        dd      }|r|j                  |       yt        j                  j	                  | j
                  d      }t        j                  j                  |      s|j                  dddd	       yt        |d
d      5 }t        j                  |      }ddd       j                  di       }|j                  di       }|j                  di       }|j                  di       }	|j                  di       }
|j                  di       }g }t        |j                  di       j                               dd D ]P  \  }}t        |j                  dd            dk\  s%|j                  ||d   |d   |j                  dd      d       R g }|j                  di       j                         D ]$  \  }}|j                  ||d   |d   |d   d       & |j                  d i       }i }|j                         D ]  \  }}t        |t               si ||<   |j                         D ]\  \  }}t        |t               sd!|v s|d!   |j                  d"      |j                  d#      |j                  d$g       dd% d&||   |<   ^  |j                  d'i       }|j                  d(i       }|j                  d)i       }|j                  d*i       }|j                  d+g       }t#        |      d,kD  rt#        |      d,z  }|dd|   }|j                  d-i       }|j                  d.i       }d/|	j                  d0d1      |	j                  d2d      |	j                  d3d      |	j                  d4d      |	j                  d5i       |	j                  d6d      d7|
j                  d8d      |
j                  d9d:      |
j                  d;g       |
j                  d<g       d=||||||||||||j                  d>i       d?}t%        d|       |j                  |       y# 1 sw Y   xY w# t&        $ rB}t(        j+                  d@| d/A       |j                  dt-        |      ddB       Y d}~yd}~ww xY w)Cz3Serve deep spy/market correlation analysis results.deep_spy_analysisg      @r  Nz%deep_spy_market_analysis_results.jsonFz:Analyse non disponible. Lancez deep_spy_market_analysis.pyr  r  r`   r  r  statistical_analysisml_analysisadvanced_analysismetadataconclusionsdata_summarycorrelationsr|  	pearson_rr   rB  	pearson_psignificant_1pct)pairr`   r   significantgranger_causalitymin_p_valuebest_lagr2  )r1  p_valuelagr2  regime_analysisr2_scoremaeprediction_direction_accuracyfeature_importance_top10re   )r2r:  direction_accuracytop_featuresbinary_classificationbtc_trend_conditionshourly_analysissurge_type_analysisrolling_correlation_btc_vs_pnlr5   day_of_weekspy_quality_scoreTanalysis_dater   symbols_analyzedtotal_surges_simulated	data_days
date_rangecomputation_time_seconds)rG  rH  total_surgesrJ  rK  computation_timehypothesis_validatedconfidence_levelLOWexploitable_signalsrecommendations)	validated
confidencer  rS  surge_stats)r   r*  r+  top_correlationsr3  r8  ml_performancer@  btc_conditionsrB  surge_typesrolling_correlationrE  quality_scorerV  zError in deep_spy_analysis: rS  rS   )r1   rT   rq   rr   rs   r@   rt   ru   rv   rw   r-   r{   r7   r   rz   rx   ry   r6   r;   r   rV   rQ   r   ) rH   rW   r
  analysis_filer   r  statmladvmetar+  rS  	top_corrsr8   r9   grangerregimesml_perfr  models
model_namerm   
binary_clsrY  hourlyrZ  rollingstepdowr\  r   rX   s                                    r"   handle_deep_spy_analysisz%RouteHandler.handle_deep_spy_analysis\  s   |	Y 3@F226:GGLL:abM77>>-022$Y4  mS7; #qiil# 77126D+B''-r2C77:r*D''-4Kggnb1G ITXXnb9??AB3BG 1quu[!,-4$$ !{^{^'(uu-?'G	&  G!4b9??A 1 /Z=#$]#3	   hh0"5G G"$((* !&$/"$+1<<> 'J!'40Z75J")*"5#*;;u#529++>]2^,3KK8RTV,WXZYZ,[	7
3	  7<J !WW%;R@N WW.3F ''"7<K hh?DG7|b 7|r)!&D&/ ((="-C  GG$7<M  %)XXor%B(,1CQ(G$(HH-Eq$I!%+q!9"&((<"<(,1KQ(O "-1G!O"-//2De"L*/DbI'27H"'M	  %.%,#*"))3"0#)*'."!.&{{="=7F< *F3..v6U# #X  	YLL7s;dLK..53q6/RTWXX	YsP    P0 AP0 P0 P#&CP0 -CP0 P0 GP0 #P-(P0 0	Q;98Q66Q;c                 "   	 t        dd      }|r|j                  |       yddl}t        j                  j                  | j                  d      }t        j                  j                  |      s|j                  ddd	d
       yt        |dd      5 }t        j                  |      }ddd       i }i }D ]  }	|	j                  dd      }
|
s	 t        j                  |
j                  dd      j                  dd            }|j#                  d      }||vrg ||<   ||   j%                  |	       |	j                  dd      }|j                  |d      dz   ||<    t'        |      dk  r|j                  dddd       yt)        |j+                               }g }g }g }|D ]  }||   }t-        d |D              }|j/                  |D 	cg c]  }	|	j                  dd      xs d c}	      }|j%                  |       |j%                  t'        |             |j%                  |        |j1                  |      }|j1                  |      }i }	 ddlm} ddl} ||j8                  |j:                        }t        j                   |d   d      }|j=                  ddt?        |tA        d       z
  jC                         d!z        t'        |      d"z   #      }i }|D ]=  }t        jD                  |d   d!z        j#                  d      }tG        |d$         ||<   ? t)        |j+                               } tI        dt'        |             D ]&  }!| |!   }"| |!dz
     }#||"   ||#   z
  ||#   z  d%z  ||"<   ( 	 tO        d't'        |            }%g }&g }'g }(tI        |%dz
  t'        |            D ]  }!||!|%z
  dz   |!dz    })tG        |j/                  |)            }*tG        |jQ                  |)            }+|&j%                  |*       |'j%                  |+       |(j%                  |+d(kD  r|*|+z  nd        |(r|(d)   nd},|(rtG        |j/                  |(            nd}-|,d*kD  rd+}.d,}/d-}0d.}1d/}2n:|,d0kD  rd1}.d2}/d-}0d3}1d4}2n*|,d5kD  rd6}.d7}/d8}0d9}1d:}2n|,d;kD  rd<}.d=}/d>}0d?}1d@}2n
dA}.dB}/dC}0dD}1dE}2d}3g }4|rg }5g }6tS        |      D ]S  \  }!}||v s|5j%                  ||!          |6j%                  ||          |4j%                  |tU        ||   d      dF       U t'        |5      d"k\  r(tU        tG        |jW                  |5|6      dG         d$      }3t)        |jY                         dH dI      ddJ }7g }8|7D ]  \  }}9|D 	cg c]  }	|	j                  d      |k(  s|	 }:}	t-        dK |:D              }t-        dL |:D              };|9rtU        |;|9z  d%z  d      nd}<|8j%                  ||9tU        |dM      |<dN        g }=tI        t'        |(            D ]\  }!|%dz
  |!z   }>|=j%                  ||>   tU        |(|!   d$      tU        |&|!   d      tU        |'|!   d      tU        ||>   dM      ||>   dO       ^ i ddPdQdRd-dSdTdUdVdRd-dSdWdXdYdRd-dSdZdUd[dRd-dSd\d]d^d_d`dSd$dadbd_d`dSd"dcddd_d`dSdedfdgd_d`dSd'dhdid_d`dSdjdkdld_d`dSdmdndod7d8dSdpdfdqd7d8dSdrdsdtd_d`dSdudvdwd7d8dSddxdyd7d8dSdzdkd{d7d8dSd|dxd}d7d8dSdkd~d7d8dSdddd>dSdddd>dSdddd>dSdxdd_d`dSddyd7d8dSdfdd7d8dSd}?t        jZ                         j\                  }@|?j                  |@ddd7d8dS      }A|@|@dMz   dz  |Ad   |Ad   |Ad   |Ad   d}B|dd }C|CD "cg c]   }"t'        t_        d ||"   D                    " }D}"|Dr$tU        tG        |j/                  D            d      nd}Et        jZ                         j#                  d      }Ft'        t_        d |j                  |Fg       D                    }G|Edk\  rd\  }H}I}JnEdZk\  rd\  }H}I}Jnd\  }H}I}JEGHJId}Kd}L|r+|j                  t)        |j+                               d)         }LLddddd}MnmLdk\  rtU        LdM      dd8dd}MnVLdlk\  rtU        LdM      dd`dd}Mn?LdkD  rtU        LdM      dd-dd}Mn(LdkD  rtU        LdM      dd8dd}MntU        LdM      dd>dd}MAd   dk(  r|,d*kD  rd@ddAd    d}2nAd   dRk(  r|,d0kD  r|2dAd    dz   }2dtU        |,d$      |.|/|0|1|2dtU        |-d$      t'        |      t'        |      tU        tG        |dkD  j/                               d%z  d      |3dd*d0d5d;d|=|4dd |8BKMt        j`                         jc                         d}Nte        d|N       |j                  |N       y# 1 sw Y   	xY w# t        $ r0 	 t        j                   |
dd d      }n# t        $ r Y Y 	Bw xY wY w xY wc c}	w # t        $ r#}$tJ        jM                  d&|$        Y d}$~$d}$~$ww xY wc c}	w c c}"w # t        $ rB}$tJ        jg                  d|$ d       |j                  dti        |$      d	d       Y d}$~$yd}$~$ww xY w)z>Compute live trend/risk ratio from spy trades + BTC benchmark.rZ  r[  r  Nr   r  Fr  r  r  r`   r  r  rb  r   r  r  rc  rd  rQ  r   r   r&  Tu!   Pas assez de données (< 3 jours))r   r   rI  c              3   H   K   | ]  }|j                  d d      xs d  ywrm  rD  rn  s     r"   r5  z7RouteHandler.handle_trend_risk_ratio.<locals>.<genexpr>  #     H!%%
A.3!3Hro  r  r   BTCUSDTr  r  r   re   )r   r  	startTimer  r  r4   z"Could not fetch BTC data for T/R: r  r   rf  r\  r]  r_  r^  u   🟢🟢u.   Positions normales — marché très favorablera  rb  rc  r  u)   Positions normales — tendance favorablerd  rG  r@  rH  r  u&   Prudence — réduire positions de 30%r  re  rg  rf  r  u,   Risque élevé — réduire positions de 50%rh  rj  ri  u   🔴🔴u"   DANGER — envisager PAUSE trading)rQ  
btc_return)r   r   c                     | d   S rm  r(  r)  s    r"   r+  z6RouteHandler.handle_trend_risk_ratio.<locals>.<lambda>z  s
    ad r2   r,  r  c              3   H   K   | ]  }|j                  d d      xs d  ywrm  rD  rn  s     r"   r5  z7RouteHandler.handle_trend_risk_ratio.<locals>.<genexpr>~  rp  ro  c              3   T   K   | ]   }|j                  d d      xs ddkD  sd " ywry  rD  rn  s     r"   r5  z7RouteHandler.handle_trend_risk_ratio.<locals>.<genexpr>  s(     TQUU:q5I5NQRS4S1Tr{  r  )r   r\   r  rf  )rQ  rI  mean_pnl_pct
volatilityspy_pnl_usdtr\   Q   r  	Excellent)wrr  rL  r  	   G   g\(\@   r  g(\?r   gffffff @   r5   g333333?	Favorablez#34d399;   gQ?=   gGz?r$  8   gQ?6   gzG?r@  >   r#     r   gQ?rO  g
ףp=
?   ?   g(\?   5   g(\?9   r  r  g\(\?   gGz?rB  &   gHzG?Creux*   g
ףp=
?,   gffffff?g      ?/   gGz?)   r     r  r   r   r  r  r  r|  r  rL  r  )hour_utc
hour_pariswr_pctrg  rL  r  ic              3   @   K   | ]  }|j                  d d        ywr   r   NrD  rn  s     r"   r5  z7RouteHandler.handle_trend_risk_ratio.<locals>.<genexpr>  s     MqquuXr2Mr  c              3   @   K   | ]  }|j                  d d        ywr  rD  rn  s     r"   r5  z7RouteHandler.handle_trend_risk_ratio.<locals>.<genexpr>  s     'gh(;'gr  rG  )u   élevéer^  u   Marché distribué)u	   modéréerH  u   Activité modérée)faiblerf  u   Marché concentré)avg_7drZ  r  rL  r  r  z#6b7280u   —)r  rL  r  spy_hintr  u   Fort ▲u   ⚠ Alts corrélésu   Modéré ▲zRotation probableg      u   Plat ↔u   ↑ Alts indépendantsg      u	   Recul ▼u   Rotation sélectiveu   Chute ▼▼u   ⚠ Risk-offu    Positions normales — créneau 02dzh UTC historiquement creux (WR z%)u     | Créneau favorable (WR hist. )rI  rJ  r\  rK  	zone_iconr  )	avg_ratiodays_analyzedra  pct_days_positivebtc_correlation)fort_positifr  neutrenegatifr  )r   r  r  
thresholds
tr_history
btc_seriestop_symbolshour_contextalt_breadth
btc_regimerO   zError in trend_risk_ratio: rS  rS   )5r1   rT   numpyrq   rr   rs   r@   rt   ru   rv   rw   r-   r   r	  r   r   r  r  rz   r6   rj  rA  r@  r  arrayr   r   r   r   r   
get_klinesr   r	   rO   r6  r   rb  rV   rb   r  std	enumerater}   corrcoefr7   utcnowhourr>  r   rU   r;   rQ   r   )OrH   rW   r
  npr  r   r  trades_by_daysymbol_countsrF  exit_strr  r!  rC  sorted_daysr  daily_trades_countdaily_avg_pnl_pct
day_tradesr  avg_pctpnl_arrpct_arrbtc_daily_returnsr   
bot_configr   	first_dayklines
btc_closesr8   r  	btc_datesr|  dprevrX   windowrolling_meanrolling_vol
rolling_trr}  r  r9   
current_travg_trrJ  r\  rK  r  r  btc_corrr  spy_valsbtc_valsr  top_sym_statscnt
sym_tradesr  r|  r  day_idx_HQ_cur_h_hqr  _r_days_b_valsalt_breadth_avg7
_today_keyalt_breadth_today_b_sig_b_color_b_labelr  _btc_chg_btc_regimer   sO                                                                                  r"   handle_trend_risk_ratioz$RouteHandler.handle_trend_risk_ratio  s   p	Y 2>F226:ww||DOO5JKH77>>(+22uOd3egjkhg6 *!!YYq\
* MM C55b1!&44X5E5Ec85T5\5\]egi5jkG &&z2m+)+M#&c"))!,eeHb)%2%6%6sA%>%Bc"%C( =!A%22#B!4 
  !!3!3!56KI!# "" 2*3/
HZHH''Z"P155A#6#;!#;"PQ  %"))#j/:!((12 hhy)Ghh01G !#I1+
 : :J<Y<YZ$--k!njI	**$t!9ya/@#@"K"K"MPT"TUk*Q. + 
  
 1A!//!t<EEjQB%*1Q4[JrN1 #:??#45	q#i.1 gA!!A$QU+D,6qMJt<L,LPZ[_P`+`cf+f%a(g CL)FLKJ6A:s7|4 =F
Qq1u5"''%.)"&&-(##A&""1%!!1u9!a%!<= ,6B1J3=U277:./1F C%+
&
&	!Qc! &
&
"	!Ld"%
&
"	!Id" '
&
"	!O%,
&
&	!E HJ '4 iFAs// (9!(<= (9#(>?"))3eL]^aLbdeFf*gh	i x=A%$U2;;x+J4+P%QSTUH !!4!4!6NTXYZ][]^KM' S)3NAquuX#7MaN
NHZHHTjTT36U4#:+Q/A$$!S a=b&  J3z?+ 	 1*q.!!'0":a=!4$),q/1$="'A":$))G*<a$@09# 	2d[9U2d[9U 2d[9U 2d[9U	
 2d[9U 2d[9U 2d[9U 2d[9U 2d[9U 2d[9U 2dX9U 2dX9U 2d[9U 2dX9U 2dX9U  2dX9U!" 2dX9U#$ dX9UdW9UdW9UdW9Ud[9UdX9UdX9U1C4 __&++F''&D8V_"`aC"%zR/d)"5zWWL ""#&GX_`STs3MM!<LMMN`G`DKuU2777+;%<a@QR!*33J?J #C'g]EVEVWaceEf'g$g h2%-X*(!R'-Z*(-V*(** !!K H ,008I8N8N8P1QRT1UV)-	IchiS).x);j[d+@BS).x);n_h+>@D).x);j[d+CED).x);k\e+@B */x);n_h+9; 7|w&:+;#CF3<Onorswoxnyy{!|W,c1A!/4TUXY]U^T__a2b!b  ":q1 ",",!*&4 "'vq!1%(%5$'
O).ugk5G5G5I/JS/PRS)T'/ %(""#	 )(., ,*)%\\^557;F@ )62..v6* * ! !!"*"3"3HSbMCV"W$ ! !  !< #Q<  I!CA3GHHIL O~ ah  	YLL6qc:TLJ..53q6/RTWXX	Ys    i A"i i f<*&i 5g	A=i A
i h
+A)i D#h
 8Ei B/i 0h9
h9G#i 1%h>H%i <gi 		hg-,h-	g;6h7i :g;;h>i hi 
	h6h1+i 1h66i 	j8j		jc                 `   	 ddl m} d}|j                  |ddi      }|j                  |d      5 }t	        j
                  |j                         j                               }ddd       g }D ]  }|j                  d	d
      }	|	j                  d      s(t        |j                  dd            }
t        |j                  dd            }t        |j                  dd            }|dk  r|j                  |	t        |d      t        |
d      t        |d      t        t        |j                  dd            d      t        t        |j                  dd            d      t        |j                  dd            d        |j                  d d       |j                  dt!        |      |dd t#        t%        |            dd |d       y# 1 sw Y   sxY w# t&        $ rB}t(        j+                  d| d       |j                  dt-        |      dd       Y d}~yd}~ww xY w) uV   GET /api/market-movers — Top gainers/losers Binance (tous tickers USDC, temps réel)r   Nr  r<  r=  r>  r  rA  r   r   r   r#  rB  r'  r@  r  	highPricelowPricer  )r   r!  r+  r,  high_24hlow_24htrades_countc                     | d   S )Nr+  r(  r)  s    r"   r+  z3RouteHandler.handle_market_movers.<locals>.<lambda>4  s
    AlO r2   Tr,  r   r  )r   r  r  r  rX  zError in market_movers: rS  Fr  rS   )r_  r`  re  rf  rv   rg  rh  ri  r-   r^  r   rz   r}   r   r?  rT   r6   r{   r  r   rV   rQ   r   )rH   rW   ureqr  r  r  rG  usdcrF  rC  r  r!  volumerX   s                 r"   handle_market_moversz!RouteHandler.handle_market_movers  s   )	Y)>C,,s\=,I,JCc2. ?$"jj););)=>? D  eeHb)||F+quu%91=>aeeK34quu]A67A:!"5!_"'"2"'"2 %eAEE+q,A&BA F$U155Q+?%@!D$'gq(9$: ( II3TIB..T#CRy"8D>23B70 7? ?D  	YLL3A37$LG..53q6/RTWXX	Ys/   0G" 2G$E0G" GG" "	H-+8H((H-z /home/ubuntu/crypto_trading_prodc           	      Z   	 t        dd      }||j                  |       yddl}t        j                  j                  | j                  d      }t        j                  j                  |      s+t        j                  j                  | j                  dd      }t        j                  j                  |      s|j                  dd	d
dd       yt        |dd      5 }t        j                  |      }ddd       j                  d      }d	}|rG	 |j                  |      }	dj                  |	j                               }
|	j                         xr d|
v }|j                  dd      }d	}|r|	 t#        j$                  |      }|j&                  rt#        j(                  |j&                        nt#        j(                         }||z
  j+                         }|dkD  }t-        |d      |d<   |r|r
d	|d<   d|d<   d|d<   ||d<   t1        d|       |j                  |       y# 1 sw Y   .xY w# |j                  |j                   f$ r Y w xY w# t.        $ r Y ow xY w# t.        $ rC}t2        j5                  d| d       |j                  dd	dt7        |      d        Y d}~yd}~ww xY w)!u;   GET /api/spy-prod-status — Statut temps réel du spy prodspy_prod_statusr  r  Nr   r  r,   TFr  u   Spy Prod non démarrér  r`   r  r  r  r  r  rO   r   r5   r   r  r  r  r  r   r  zError in spy prod status: rS  r   r  )r1   rT   r  rq   rr   rs   PROD_DIRrt   ru   rv   rw   r-   r7  r  r  r  r  r   r	  r   r   r  r}   r   r;   rV   rQ   r   )rH   rW   r
  r  r  r   rN   r  r  r  r  r+   r  r  r   r  rX   s                    r"   handle_spy_prod_statusz#RouteHandler.handle_spy_prod_statusG  s|   :	 1s;F!226:'',,t}}6GHK77>>+. ggll4==&BST77>>+.22#*7O4  k39 &Q1& **U#C!M!>>#.D!hht||~6G$(OO$5$Q,':QM K,BE"*"8"8"<K>I>P>P(,,{'9'9:V^VbVbVdC,;;=C"HE38a=F/0 !E$)y!"+w $F9&3F?#(&1..v6A& & ,,f.A.AB  !   	LL5aS9DLI..E 3q60  	s    I B-I I H!5I AH. I 0A;I +5I !H+&I .I	I II 	II II 	J*'9J%%J*c                 >   	 t        dd      }|r|j                  |       yt        j                  j	                  | j
                  d      }t        j                  j	                  |d      }t        j                  j	                  |d      }t        j                  j	                  |d      }t        j                  j	                  | j
                  d	d
      }i }t        j                  j                  |      r-	 t        |dd      5 }	t        j                  |	      }ddd       g }
t        j                  j                  |      r-	 t        |dd      5 }	t        j                  |	      }
ddd       g }t        j                  j                  |      r-	 t        |dd      5 }	t        j                  |	      }ddd       g }t        j                  j                  |      rY	 t        |dd      5 }	|	j                         }|dd D cg c]#  }|j                         s|j                         % }}ddd       g }i }|rx	 t        |j                               }|D ]X  }	 t        j                   dd|id      }|j"                  dk(  r,t%        |j                         j!                  dd            ||<   Z 	 |j'                         D ]]  \  }}|j!                  dd      }|j!                  |d      }|dk  r|j!                  d|      }|dkD  r||z
  |z  dz  nd}|j!                  dd      }|dkD  r||z
  |z  nd}|j)                  ||||t+        |d      t+        |d      |j!                  dd      |j!                  dd      |j!                  d|j!                  dd             |j!                  d!      r%|j!                  d!|j!                  d"d            d#z  n|j!                  d"d      |j!                  d$d%      |j!                  d&d      |j!                  d'i       d(       ` d}	 ddl}ddl}ddl}t        j                  j	                  | j
                  d)      }i } t        |dd      5 }	|	D ]]  }!|!j3                  d*      rd+|!v r|!j5                  d,      d-   | d.<   0|!j3                  d/      sBd+|!v sG|!j5                  d,      d-   | d0<   _ 	 ddd       | j!                  d.      r| j!                  d0      rt7        |j1                         d1z        }"d2|" d3}#|j9                  | d0   j;                         |#j;                         |j<                        j?                         }$t        j                   d4|# d5|$ d6| d.   id78      }|j"                  dk(  rV|j                         j!                  d9g       D ]3  }%|%d:   d;k(  st+        t%        |%d<         t%        |%d=         z   d      } n |
D 'cg c]  }'|'j!                  d?      s|' }(}'i })|
D ],  }'|'j!                  dd       }*|)j!                  |*d      d-z   |)|*<   . |
r|
d@d ng }+|+jE                          i },|r}tG        dA |D              }-tG        dB |D              }.tG        dC |D              tI        |      z  }/tG        dD |D              tI        |      z  }0i }1|D ]y  }2|2j!                  d|2j!                  dd             }3|2j!                  dEd      }*|3|1vr	dddFdG|1|3<   |*dkD  r|1|3   dHxx   d-z  cc<   n|1|3   dIxx   d-z  cc<   |1|3   dJxx   |*z  cc<   { g }4tK        |1j'                               D ]R  \  }3}5|5dH   |5dI   z   }6|4j)                  |3|5dH   |5dI   |6|6rt+        |5dH   |6z  dz  d-      ndt+        |5dJ   d      dK       T |D 2cg c]*  }2|2j!                  dEd      dkD  s|2j!                  dEd      , }7}2|D 2cg c]*  }2|2j!                  dEd      dk  s|2j!                  dEd      , }8}2|7r!t+        tG        |7      tI        |7      z  d      nd}9|8r!t+        tG        |8      tI        |8      z  d      nd}:|:dk7  rt+        tM        |9|:z        d      nd};tI        |      |-tI        |      |-z
  t+        |-tI        |      z  dz  d-      t+        |.d      t+        |/d      t+        |0d-      |9|:|;|4dL},|r|dMd ng }<|<dNd }=|=jE                          dO|tI        |      ||+tI        |
      tI        |(      |)|=|<|,|tO        jP                         jS                         dP}>tU        d|>       |j                  |>       y# 1 sw Y   QxY w# t        $ r Y `w xY w# 1 sw Y    xY w# t        $ r Y /w xY w# 1 sw Y   xY w# t        $ r Y w xY wc c}w # 1 sw Y   xY w# t        $ r Y w xY w# t        $ r Y w xY w# t        $ r Y Hw xY w# 1 sw Y   0xY w# t        $ r#}&t@        jC                  d>|&        Y d}&~&Cd}&~&ww xY wc c}'w c c}2w c c}2w # t        $ rB}&t@        jW                  dQ|& dOR       |j                  dStY        |&      dTdU       Y d}&~&yd}&~&ww xY w)VuK   GET /api/spy-prod-data — Positions, historique, opportunités du spy prodspy_prod_datar;  r  Nr,   r  r  r  r  market_spy_prod.logr`   r  r  r  r  r   r&  r  r  r!  r   r  r  r4   r  r  r  r  r  r  r  r   r  r  r  rO   r   r  r(  )r   r  r  r  r  rk  r  r  r  r  rO   r  r(  ri   r   rG  "r   r(   r   secretr   z
timestamp=z&recvWindow=5000z'https://api.binance.com/api/v3/account?z&signature=zX-MBX-APIKEYre   )r?  rh   r   r   r   r   r   zProd balance fetch failed: r  r  c              3   L   K   | ]  }|j                  d d      dkD  sd  ywr  rD  rn  s     r"   r5  z4RouteHandler.handle_spy_prod_data.<locals>.<genexpr>  r   r  c              3   @   K   | ]  }|j                  d d        ywrm  rD  rn  s     r"   r5  z4RouteHandler.handle_spy_prod_data.<locals>.<genexpr>  r  r  c              3   @   K   | ]  }|j                  d d        ywrq  rD  rn  s     r"   r5  z4RouteHandler.handle_spy_prod_data.<locals>.<genexpr>	  r  r  c              3   @   K   | ]  }|j                  d d        ywrt  rD  rn  s     r"   r5  z4RouteHandler.handle_spy_prod_data.<locals>.<genexpr>
  r  r  rk  rq  )r  r  r  r  r  r  )r  r  r  r   rf  r  )ra  r  r  rf  r0  rg  r  avg_win_usdtavg_loss_usdtpayoff_ratiowl_by_patternr  r  T)r   r	  r
  balance_usdtr  r  r  r  r  all_historyr  r  rO   zError in spy prod data: rS  Fr  rS   )-r1   rT   rq   rr   rs   r  rt   ru   rv   rw   r   rd  r   r{   rA  r  r-   r  r   r7   rz   r}   hmachashlibr/   
startswithrt  r   newr  sha256	hexdigestrV   rb   r-  r@  r6   rj  r   r   r   rU   r;   rQ   r   )?rH   rW   r
  data_dirrU  r  r  r  r3  r   r  r  r  r  r\  r  r  r  rC  r`   r   rV  r0   r  r  rj  rk  r   r  r  _tprod_config_filecfgrG  r+   qsr  r   rX   r  r  r  r   r   r  r  r  r  r!  r  rF  r  r  r  totwin_pnls	loss_pnlsavg_winavg_lossr  r"  r#  r   s?                                                                  r"   handle_spy_prod_dataz!RouteHandler.handle_spy_prod_data  sf
   G	YS9F226:ww||DMM6:H ggll85IJO%'WW\\(<W%X"!ww||H6KL77<<v?TUL Jww~~o.osWE 2%)YYq\
2 Mww~~454cGL 5PQ(,		!5 Kww~~./.gF 3!&*iil3 Iww~~l+lC'B Va$%KKM	8A#$$U11779QWWY$U	$UV &("!#"&z'8"9K* !! (-Z4<c?A!OA }}3:?WVW@X:Y 23 7! ",!1!1!3 		-3 2 6 6vq A A%$)IIk5$AMEJQYME1U:S@TUii
A.<AAIME1S81&--$#( #%2$Wa0 %h 2!&;!:#(99]A#>$yyuyyI7VWX]XaXabrXsUYY'77A9NORTTy~  zC  zC  DK  MN  zO!&;!;$yyA6"'))L""=/ 2  LB00#%77<<{#K *C'B ?a ! ???+<=#+)-C);CJ!__-ABsd{,0JJsOA,>CM	?? 775>cggh&7RWWY-.B%bT)9:B((3x=#7#7#9299;WaacC 'NrdR]^a]b%c-;SZ,HRSUA}}+!"j"!= &A zV3/4U1V95EaPXkHZ5Z\]/^ %& )6K1z9JQKMKN" AEE)Y/$2$6$6q!$<q$@q!A 2?--BK!MMkMMJkJJ	G;GG#kJZZMMMPST_P``
$ 	0A%%aeeIy.IJCj!,A*,34#*N
31u"3/14/"31Q61sOE*a/*	0 !#$Z%5%5%78 	FCF)ak1C!((#& !&	"#H+!$GJE!F)c/C*?$CPQ$QuXq1* 	 ;FbQz[\I]`aIaAEE*a0bb;Fda!%%PZ\]J^bcJcQUU:q1d	dEM%HH =qASTHQ5Y#i.!@!DWXDLPQMuS8);%<a@WX$'$4 !+.5 %dS-=&=&CQ G&+Iq&9#(!#4$)(A$6$+%-$0%2! 5@k$%0RO,ST2N""$  !7'*: ,(3'*='9"%m"4)7-.!.&%\\^557F /..v6g2 2  5 5  3 3   %VV V !   ) ! !  B? ?"  B!<QC@AAB LN cdP  	YLL3A37$LG..53q6/RTWXX	Ys   i Ci :e: e-e: &!i f f
,f 4!i f4 $f':f4 !i $g 2g	
g g2g	4g <i g6 "Ag&7g6 9E4i .Ah 4Ah9h>hC4h *h 7i ;iiF'i =ii,i 2ii!Ei -e72e: :	fi fi 
ff 	f$ i #f$$i 'f1,f4 4	g=i  gi g		gg 	g#i "g##i &	g3/g6 2g33g6 6	h?i hi hh 	h?h:4i :h??i 	j8jjc                   > 	 ddl >ddl}ddlm} | j                  }t
        j                  j                  t
        j                  j                  | j                        d      }t
        j                  j                  |d      }t
        j                  j                  |dd      }d }dE>fd		}	dF>fd	}
|j                         }i }d|fd|ffD ]  \  }}t
        j                  j                  |dd      } ||      }|rK||j                  dd      z
  }|j                  dd      |j                  dd      dd t        |      d||<   |dddd||<    i }d|fd|ffD ]  \  }}t
        j                  j                  |d      }t
        j                  j                  |      s!t
        j                  j                  |dd      } ||      xs i }t        |j                         D cg c]  \  }}|j                  dd      dk\  s| c}}      }t        |j                         D cg c]&  \  }}d|j                  dd      cxk  rdk  s"n n|( c}}      }||t        |      d||<    i }d|fd|ffD ]  \  }}t
        j                  j                  |d      }t
        j                  j                  |      s!t
        j                  j                  |dd      } ||      xs i }g }|j                         D ]c  \  }}|j                  dd      }||kD  s|j                  |t!        j"                  |      j%                  d       t        ||z
  d!z        d"       e |j'                  d# $       |||<    t
        j                  j                  |d      }t
        j                  j                  |dd      } ||      xs i } ||      xs i }t)        |      t)        |      z  }g } t        |      D ]  }||   ||   }"}!|!j                  dd      }#|"j                  dd      }$t+        |#|$z
        d%k\  sC| j                  ||#|!j                  d&d      |!j                  d'd      d(|$|"j                  d&d      |"j                  d'd      d(d)         |
|d
      }% |
|d
      }&t        t)        |%      t)        |&      z        }'g }(|'D ]Z  })|%j                  |)      }*|&j                  |)      }+|*r|+r|*d*   |+d*   k(  rd+},n|*r|+rd,},n|*rd-},nd.},|(j                  |)|*|+|,d/       \ i }-d|fd|ffD ]  \  }}. |	|.      }/|/sd0di|-|<   t        |/      }0|/D *cg c]
  }*|*d1   s	|* }1}*|/D *cg c]
  }*|*d1   r	|* }2}*|1rt-        d2 |1D              t        |1      z  nd}3|2rt-        d3 |2D              t        |2      z  nd}4|4dk7  rt        t+        |3|4z        d%      nd4}5t-        d5 |/D              |0z  }6 |t.              }7|/D ]  }*|7|*d6      j                  |*d7           |7j                         D 8ci c]6  \  }8}t        |      d%k\  s|8t        t-        |      t        |      z  d%      8 }9}8}t        |9j                         d8 $      dd }:t        |9j                         d9 $      dd };|0t        |1      t        |2      t        t        |1      |0z  d:z  d;      t        |3d%      t        |4d%      |5t        |6d;      |:D 8cg c]
  \  }8}|8|d< c}}8|;D 8cg c]
  \  }8}|8|d< c}}8d=
|-|<   	 d>|||| |(|-t!        j0                         j3                         d?}<|j5                  |<       yc c}}w c c}}w c c}*w c c}*w c c}}8w c c}}8w c c}}8w # t6        $ rB}=t8        j;                  d@|= d>A       |j5                  dBt=        |=      dCdD       Y d}=~=yd}=~=ww xY w)GuX   GET /api/maintenance/spy-compare — Compare SPY testnet vs prod (état + surges + perf)r   Nrv  r/  zmarket_spy_daemon.logr  r  c                     	 t        | ddd      5 }t        j                  |      cd d d        S # 1 sw Y   y xY w# t        $ r Y y w xY w)Nr`   r  r   r4  )ru   rv   rw   r   )rr   r   s     r"   
_load_jsonz3RouteHandler.handle_spy_compare.<locals>._load_json]  sI     dC')L ,PQ#yy|, , ,    s#   < 0	< 9< < 	AAc                    g }	 t        | ddd      5 }|j                         | d  }d d d        j                  d      }D ]}  }|j	                  |      }|s|j                  |j                  d      dk(  |j                  d      t        |j                  d	            t        |j                  d
            d        |S # 1 sw Y   xY w# t        $ r |cY S w xY w)Nr`   r  r   r4  uA   (✅|❌) VENDU (\S+) @ .* PnL: ([+-]?[\d.]+)%.*Hold: ([\d.]+)minr   rJ  r  r&  r  )rL   coinr  hold)ru   rd  FileNotFoundErrorcompilerD  rz   rE  r   )	r  rW  r\   r   rF  RErG  r  rw  s	           r"   _parse_sellsz5RouteHandler.handle_spy_compare.<locals>._parse_sellsd  s    "hgiP ;TU !yjk :; ZZ de! D		$A"#''!*"5$%GGAJ#(#4$)!''!*$5	'  ; ;( "!M"s'   C CC CC C C   c           
      L   i }j                  d      }j                  d      }j                  d      }	 t        | ddd      5 }|j                         | d  }d d d        d}t	              D ]  \  }	}
|j                  |
j                               }|r|j                  d	      }|j                  |
      }|sM|j                  d	      |j                  d
      }}d\  }}t        |	d	z   t        |	dz   t        |                  D ]l  }||   j                         }|j                  |      }|rd|j                  d	      d d }} n.d|v r||v rd} n"d|j                         v sd|v rd} nd|v sl n ||||d||<    |S # 1 sw Y   .xY w# t        $ r |cY S w xY w)Nu*   ⚡ SURGE: (\w+USDT|\w+USDC).*?\+([\d.]+)%u   ❌ Rejeté: (.+)rI  r`   r  r   r4  z00:00:00r   r  )r7  r   r   rejectedr5   r8  boughtu   bloquéSKIPblockedu	   ⚡ SURGE)r+   strengthdecisionrg  )r  ru   rd  r  r  rx  r   rE  rD  rb  r  r6   r8  )r  rW  surgesRE_SRE_RRE_TSr   rF  last_tsr|  rG  m_tsr  r  r#  r$  rg  r  l2mrrw  s                       r"   _parse_surgesz6RouteHandler.handle_spy_compare.<locals>._parse_surgesw  s   zz"OPzz"67

#:;"hgiP ;TU !yjk :; %(/ QGAt ;;tzz|4D"&**Q-D)A)*QWWQZh+8(&!&qsC"c%j,A!B &A!&q!1B!%RB!3=rxx{3B?O& %&"}+3 %(BHHJ6&B,+4 %*b0 %& /685=(Qt-Q0 ;; ;( "!M"s)   F FF FF F#"F#r   prodr,   zspy_regime_state.jsonlast_update_tsr  r  saved_atr   rc  )rn  r0  age_sinconnurf  r.  consec_lossesr  r&  )r"  neartotal_coinszspy_loss_state.jsonr1  r  r5   )r  untilleft_minc                     | d   S )Nr7  r(  r)  s    r"   r+  z1RouteHandler.handle_spy_compare.<locals>.<lambda>  s
    !J- r2   r  r  r  r  )clrn  r\  )r  r   r.  r$  sync	divergenttestnet_only	prod_only)r  r   r.  rN   r\   rL   c              3   &   K   | ]	  }|d      ywr  Nr(  rn  s     r"   r5  z2RouteHandler.handle_spy_compare.<locals>.<genexpr>  s     4!QuX4r6  c              3   &   K   | ]	  }|d      ywr?  r(  rn  s     r"   r5  z2RouteHandler.handle_spy_compare.<locals>.<genexpr>  s     6!QuX6r6  r:  c              3   &   K   | ]	  }|d      yw)r  Nr(  rn  s     r"   r5  z2RouteHandler.handle_spy_compare.<locals>.<genexpr>   s     71QvY7r6  r  r  c                     | d    S rm  r(  r)  s    r"   r+  z1RouteHandler.handle_spy_compare.<locals>.<lambda>  s    !u r2   c                     | d   S rm  r(  r)  s    r"   r+  z1RouteHandler.handle_spy_compare.<locals>.<lambda>  s
    ! r2   r4   r   )r  r  )
r\   r  r  rf  r  r  profit_factorr!  
best_coinsworst_coinsT)r   rn  r"  
timeblocksscore_divergedsurge_comparisonperfrO   zError in spy_compare: rS  Fr  rS   )r  )r  )rw  r/   rB  rw  r@   rq   rr   rs   rS  r-   r}   rt   rj  r7   r6   rz   r   r6  r  r?  r>  r   r@  r{   r   rU   rT   r   rV   rQ   r   )?rH   rW   r	  rw  TESTNET_DIRr  TESTNET_LOGPROD_LOGr  r  r-  r   rn  rL  baser   r  r  r"  scores_pathr  r9   bl7r4  rG  r,  but_pathp_patht_scoresp_scorescommondivergedtvpvt_clp_clt_surgesp_surgesall_surge_coinsrI  r  rF  r   rN   rJ  r  r\   nr  r  avg_wavg_lpfavg_hcoin_pnlccoin_avgbestworstr   rX   rw  s?                                                                 @r"   handle_spy_comparezRouteHandler.handle_spy_compareP  s   Q	Y///K'',,rwwt'GI^_H'',,{4KLK'',,x9NOH &#L '')CF!*K 868:LM WtGGLLv/FGqM&6 ::C"#%%(8#">$%EE*b$9#2$>!&s%F5M 09bSU$VF5MW G!*K 868:LM Wt ggll41GHww~~k2"$'',,tV=S"TK{+1rAGGIWSQqq9QUV9VqWXAGGI[SQqaeeOTU>V9ZYZ9Zq[\-0$sSTv!VW J!*K 868:LM +tGGLL'<=ww~~a(T63HIAqM'RGGI DAq2BCx$%%-%;%;B%?%H%H%T(-rCx2o(>'   78$*
5!+$ WW\\+/EFFWW\\(F4JKF!&)/RH!&)/RH]S]2FHF^ 	!!hqkBvvoq1vvoq1td{#q(OO !*.RVVF15EBFFS[\]L^#_*.RVVF15EBFFS[\]L^#_% 	 %[$7H$Xt4H$S]S]%BCO!' LL&LL&q}*=#F1(F+F(F ''  $	) & D%.$<vx>P#Q x%h/#+Q-DKK%+7qw!77%+;1T7!;;HL4t44TBTUHN6v66VDTU9>!s55=115777!;&t, 9AQvY'..qx89CK>>CSc41aWZ[\W]abWbAuSVCF]A66ccx~~/_EbqIx~~/_EbqI!"!$T!$V!&s4y{3!:!&ua!&ua%'!&uaFJ#KdaQq$9#KFK#LdaQq$9#LU'B  #)#*#-#+$4#'#+<<>#;#;#=	F ..v6Y X[N 8; d $L#L  	YLL1!5LE..53q6/RTWXX	Ys   G'^/ *^^ ^/ ,#^^C	^/ !D"^/ D$^/ (
^3^7^/ =
^^B:^/ ^$^B^/ ^#'^/ /^)>A^/ (^/ /	_:88_55_:c                 `  ) 	 ddl }ddlm}m}m} ddlm) t        j                  j                  | j                  d      }t        j                  j                  | j                  d      }t        j                  j                  |      s|j                  ddd	d
       yt        |d      5 }|j                  |      }	ddd        |j                  |j                        }
|
 |d      z
  } )d       }	D ]5  }|j!                  d      xs% |j!                  d      xs |j!                  dd      }	  |j"                  |      }|j$                  |j'                  |j                        }||k  r}|j)                  d      }||   dxx   dz  cc<   t+        |j!                  d|j!                  dd            xs d      }t+        |j!                  d|j!                  dd            xs d      }||   dxx   |z  cc<   ||   dxx   |z  cc<   |dkD  s|dkD  r||   dxx   dz  cc<   8 g }t/        |j1                               D ]c  }||   }|d   }|rt3        |d   |z  dz  d      nd}|rt3        |d   |z  d      nd}|j5                  |||d   ||t3        |d   d       d!       e  ))fd"      }t        j                  j                  |      r*t        |d      5 }|j                  |      }ddd       D ]  }|j!                  dd      }	  |j"                  |      }|j$                  |j'                  |j                        }||k  rV|j)                  d      }||   d#xx   dz  cc<   |j!                  d$      r||   d$xx   dz  cc<   |j!                  d%d&      }||   d'   |xx   dz  cc<   |j!                  d$      s1t7        |j!                  d(d            dd) }||   d*   |xx   dz  cc<    g }t/        |j1                               D ]  }||   }|d#   }|rt3        |d$   |z  dz  d      nd}t/        |d'   j9                         d+ ,      dd- } t/        |d*   j9                         d. ,      dd/ }!|j5                  |||d$   || D "cg c]
  \  }"}|"|d0 c}}"|!D #cg c]
  \  }#}|#|d1 c}}#d2        |D cg c]&  }|d3   |
 |d      z
  j)                  d      k\  s%|( }$}|D cg c]H  }|
 |d4      z
  j)                  d      |d3   cxk  r|
 |d      z
  j)                  d      k  sDn n|J }%}d5 }&d6|| |&|$       |&|%      |
j;                         d7}'|j                  |'       y# 1 sw Y   xY w# t,        $ r Y w xY w# 1 sw Y   xY w# t,        $ r Y w xY wc c}}"w c c}}#w c c}w c c}w # t,        $ rB}(t<        j?                  d8|( d69       |j                  dt7        |(      d	d:       Y d}(~(yd}(~(ww xY w);zMAnalyse performance du spy par jour: volume, WR, PnL moyen, raisons de rejet.r   Nr   rv  r  r  Fzespion_history.json introuvabler  r  r`   r  r  c                      dddddS )Nr   rq  )r\   r  pnl_sumpnl_pct_sumr(  r(  r2   r"   r+  z5RouteHandler.handle_spy_performance.<locals>.<lambda>:  s    AqSad)e r2   rb  r  rO   r   r  rQ  r\   r   r  
profit_pctr  profitrl  rm  r  r4   r&  r  )rQ  r\   r  rf  rg  r  c                  :    dd  t                 t               dS )Nr   )r   r  r  reject_reasons)r   rv  s   r"   r+  z5RouteHandler.handle_spy_performance.<locals>.<lambda>^  s-    QAS^_bSc  xC  DG  xH  ,I r2   r   r  r  r  r  rg  r5   rq  c                     | d    S rm  r(  r)  s    r"   r+  z5RouteHandler.handle_spy_performance.<locals>.<lambda>{  s    AaD5 r2   r  r  c                     | d    S rm  r(  r)  s    r"   r+  z5RouteHandler.handle_spy_performance.<locals>.<lambda>|  s    RSTURVQV r2   re   )r  r  )rg  r  )rQ  r%  r  	conv_raterj  top_rejectsrQ  r  c                     | si S t        d | D              }t        d | D              }|rt        t        d | D              |z  d      nd}||rt        ||z  dz  d      |dS d|dS )	Nc              3   &   K   | ]	  }|d      yw)r\   Nr(  r4  r  s     r"   r5  zNRouteHandler.handle_spy_performance.<locals>.period_summary.<locals>.<genexpr>  s     7(7r6  c              3   &   K   | ]	  }|d      yw)r  Nr(  rx  s     r"   r5  zNRouteHandler.handle_spy_performance.<locals>.period_summary.<locals>.<genexpr>  s     5a&	5r6  c              3   2   K   | ]  }|d    |d   z    yw)rg  r\   Nr(  rx  s     r"   r5  zNRouteHandler.handle_spy_performance.<locals>.period_summary.<locals>.<genexpr>  s     R1- 01X; >Rs   r&  r   r4   r   )r\   rf  rg  )r@  r}   )	days_listr_  rn  r  s       r"   period_summaryz;RouteHandler.handle_spy_performance.<locals>.period_summary  sv     )7Y775955^_eCR	RRUVVXYZef"#Qqs3wq1A^abbA^abbr2   T)r   daily_stats	opp_statsperiod_last3period_prev7rO   zError in spy_performance: rS  rS   ) rv   r   r	   r
   rB  rw  rq   rr   rs   r@   rt   rT   ru   rw   r   r  r-   r	  r   r   r  r   r   rj  rA  r}   rz   r   r7   rU   rV   rQ   )*rH   rW   _jsonr   r	   r
   history_path	opps_pathr   r   r   r"  by_dayrF  ts_rawr+   r!  r  r  r}  r  r_  r|  r  opp_daysoppsr  r  rg  r~  r   convrj  ru  r   r`   last_3prev_7r|  r   rX   rw  s*                                            @r"   handle_spy_performancez#RouteHandler.handle_spy_performance%  sg   v	Y >>/77<<9NOL77<<9TUI77>>,/22uOp3qsvwlC( (A**Q-( (,,x||,C9"--F !!efF {+\quu\/B\aeeKY[F\///7Byy(ZZx||Z<F{ ++j1C3K)Q.)#AEE)QUU<5K$L$QPQRG#AEE%x1C$D$IJG3K	*'9*3K.'9.{gksF+q0+& Kfkkm, 3KhK67U1V9q=3.2Q<=%- 01 4a81""$'$%$%fI$&$+$)!I,$:$  #  $I  JHww~~i()S) )Q ::a=D) !AUU;3F!3X33F;99,!#8<<!@B;$ kk*5 g.!3.55,$SM*5:5eeIs3 j1#6!;6 uuZ0%(x)<%=cr%BF$SM*:;FCqHC!!( Ihmmo. SM'
AFa
me3c91=A%a
m&9&9&;QRTSTU%a(8&9&?&?&AWXZYZ[  &)&+&'
m&*NZ&[da1q'A&[MX&YTQ!a'@&Y"   #.mQ6sYTUEV?V>`>`ak>l1lqmFm"-  `Q#	r8J2J1T1TU_1`defldm  2_qt  xA  GH  xI  rI  qS  qS  T^  q_  2_q  `F  `c  !,!*!/!7!/!7!$F ..v6M( (0 ! *) )& % ! ! '\&Y n `&  	YLL5aS9DLI..53q6/RTWXX	Ys   BW"  W" ,V>A7W" 6?V5W" 6B9V/B;W" *V/<W" ?V<W" B)V<BW" $W3W" ;W
W" &WWW" AWW9W" VW" 	V,(W" +V,,W" /V94W" <	W	W" W		W" "	X-+8X((X-c                 j   	 ddl }t        j                  j                  | j                  d      }t        j                  j                  |d      }t        j                  j                  |d      }ddg ddddd}t        j                  j                  |      r-	 t        |d	d
      5 }t        j                  |      }ddd       |j                  d      dk(  r/|j                  d      r	 ddl}t        j                  |d   d       t        j                  j                  |      rt        |d	d
d      5 }|j)                         }ddd       dd D cg c]  }|j+                          c}|d<   |j                  d      dk(  rUddl}d}|D ]1  }|j/                  d|      }|st1        |j3                  d            }3 |dkD  r||d<   d| d|d <   ng |d<   |j5                  d!d"i|       y# 1 sw Y   7xY w# t        j                  t        f$ r	 d|d<   Y [w xY w# t        t        f$ r ddl }	|	j!                  d       t        j                  j                  |      r	 t        |d	d
      5 }t        j                  |      }
ddd       n# 1 sw Y   nxY w
j                  d      r|
j                  d      dv r|
}nt        d      nx# t"        $ rb d|d<   d|d<   |dz   }t        |dd
      5 }t        j$                  ||       ddd       n# 1 sw Y   nxY wt        j&                  ||       Y nw xY wd|d<   d|d<   Y Hw xY w# 1 sw Y   xY wc c}w # t"        $ rB}t6        j9                  d#| d"$       |j5                  d%t;        |      dd&       Y d}~yd}~ww xY w)'uF   GET /api/spy-pipeline-status — Statut du pipeline optimizer en coursr   Nspy_optimizerpipeline_status.jsonpipeline_run.logidler   )rN   rk  logr  completed_atr  rQ   r`   r  r  rN   r  r  r\  r  r  znot updatedrQ   u*   Pipeline interrompu de manière inattendue.tmprn  r   r4  ir  u   ÉTAPE\s+(\d+)r   step_numu   Étape z/6rk  r   TzError in spy_pipeline_status: rS  FrS   )r/   rq   rr   rs   r@   rt   ru   rv   rw   JSONDecodeErrorr  r-   r  killProcessLookupErrorPermissionErrorrU  r   rv  r   rd  rs  rw  rD  r   rE  rT   rV   rQ   r   )rH   rW   r.   spy_opt_dirr  r   rN   r   _sig_time2	refreshedtmprF  r\  _recurrent_steprG  r  rX   s                      r"   handle_spy_pipeline_statusz'RouteHandler.handle_spy_pipeline_status  sp   D	Y '',,tHK'',,{4JKK'',,{4FGH &2Tcgpt  @D  EFww~~k*.k3A .Q!%1. zz(#y0VZZ5FX)GGF5M1-4 ww~~h'(C')L *PQKKME*5:34[ A Au::h'94$#$L % ;JJ'8$?+.qwwqz?L; $a'-9z*+2<.)Cv "u..	4/J6/JKm. .,,j9 .'-F8$. +O< X)LL%ww~~k29!%k3!I 9Q,0IIaL	9 9 9(}}^<xAX\pAp)2&0&? ? !'  ) 9/6F8,/[F7O"-"6C!%c3!A 5Q $		&! 45 5 5JJsK89 ,3x(+Ww-X4* * A"  	YLL9!=LM..53q6/RTWXX	Ys   BM' H  (G3>H  %M' ,H% 	.M' 7MM' M".9M' (A
M' 3G=8H   H"M' !H""M' %AM*K8J	KJ 	9KM&M<L	ML%!M>M MMM' MM' MM' '	N208N--N2c           
      $	   d 	 ddl }ddl}t        j                  j	                  | j
                  d      }t        j                  j	                  |d      }t        j                  j	                  |d      }t        j                  j	                  |d      }t        j                  j	                  | j
                  dd	d
      }	t        j                  j                  |	      r|	n|j                  }
t        j                  j                  |      r	 t        |dd      5 }t        j                  |      }ddd       j                  d      dk(  rB|j                  d      }	 t        j                  |d       |j                  dd| ddd       y|xs i }|j                  dd      }t%        |j                  dd            }|
|dt'        |      g}|r|j)                  d       t+        j,                  t.        j0                        j3                         }t        |dd      5 }|j5                  d| d| d| d       ddd       dddd |dddd!} ||       t        |d"d      5 }|j7                  |||j8                  |i t        j:                  d#d$i%      }ddd       j<                  |d<    ||       ddl}fd&}|jA                  ||||fd'(      }|jC                          tD        jG                  d)|j<                   d*|        |j                  d'|j<                  d+|j<                   d|d,       y# 1 sw Y   xY w# t        j                  t        f$ r i }Y 4w xY w# t         t"        f$ r Y w xY w# 1 sw Y   JxY w# 1 sw Y   xY w# tH        $ r}tD        jK                  d-| d'.       	 t        j                  j	                  | j
                  d      }t        j                  j	                  |d      } |d/t'        |      t+        j,                  t.        j0                        j3                         d0       n# tH        $ r Y nw xY w|j                  dt'        |      d1d2       Y d}~yd}~ww xY w)3uS   POST /api/spy-run-pipeline — Lance le pipeline complet (download + GPU + rapport)c                     | dz   }t        |dd      5 }t        j                  ||       ddd       t        j                  ||        y# 1 sw Y    xY w)u\   Écriture atomique : tmp + os.replace → jamais de fichier tronqué en lecture concurrente.r  rn  r  r  N)ru   rv   rv  rq   r   )rr   objr  r   s       r"   _atomic_json_writez@RouteHandler.handle_spy_run_pipeline.<locals>._atomic_json_write  sJ    -Cc31 "Q		#q!"JJsD!" "s   A

Ar   Nr  r  r  zfull_pipeline.pyr&  binpython3r`   r  r  rN   r  r  Fu   Pipeline déjà en cours (PID r   )r   rQ   rN   skip_download
gpu_trialsr  z--gpu-trialsz--skip-downloadrn  r$  u&   ] 🚀 Pipeline démarré (GPU trials=z, skip_download=z)
u   Démarrage...r$  rN   rk  r  steps_totalr  r  r  rQ   aPYTHONUNBUFFERED1)r   r0  r)  envc           
         | j                         }	 t        |dd      5 }t        j                  |      }d d d        t        j                  t        j                        j                         d	<   |dk(  rd
|d<   d|d<   t        j                  j                  t        j                  j!                  |      d      }t        j                  j                  t        j                  j!                  t        j                  j!                  |            d      }t        j                  j#                  |      rSdd l}|j'                  ||       t        |d      5 }	|	j)                  d       d d d        nd|d<   d| d|d<   d| |d<    
||       y # 1 sw Y   `xY w# t        j                  t
        t        f$ r ddddd d | j                  d d}Y w xY w# 1 sw Y   ZxY w)Nr`   r  r  r  r   r   r$  r  r  r   rN   u"   ✅ Pipeline terminé avec succèsrk  zreport.htmlzspy_report.htmlr  u(   
✅ Rapport copié → spy_report.html
rQ   u   ❌ Erreur (code r   u   Pipeline terminé avec code )waitru   rv   rw   r  r  r  r  r   r   r
   r  rU   rq   rr   rs   rS  rt   r   r  r  )r  r  r   retr   r   
report_src
report_dstr   lfr  s             r"   _watchz4RouteHandler.handle_spy_run_pipeline.<locals>._watchB  s   iikdk3A *Q!YYq\*
 &.\\(,,%?%I%I%K>"!8#,BxL#GBvJ!#bggook.JM!ZJ!#bggoobggook>Z.[]n!oJww~~j1%Z<!(C0 TBHH'QST T $+BxL%6se1#=BvJ%A##GBwK";3+* *,,j:KL d$-rqYZ(,d488^bdBdT Ts3   F" FF" GFF" "3GGG%T)r  argsr  u   Pipeline spy lancé: PID z	, trials=u   Pipeline démarré (PID )r   r  r   r  zError in spy_run_pipeline: rS  rQ   )rN   rQ   r  r  rS   )&r~   r  rq   rr   rs   r@   rt   r/  ru   rv   rw   r  r  r-   r  rT   r  r  r   r   rz   r   r   r
   r  rU   r  PopenSTDOUTenvironr  r  r  r  rV   r   r   rQ   )rH   rW   r,   r~   r  r  r  r   pipeline_pyvenv_pythonr3  r   r  r  r  r  cmdnow_strr  init_statusr  r  r  rF  rX   r  s                            @r"   handle_spy_run_pipelinez$RouteHandler.handle_spy_run_pipeline  s3   	"{	Y'',,tHK'',,{4JKK'',,{4FGH'',,{4FGK'',,t	RK)+)D+#..J ww~~k*!k3A /Q"&))A,/ ;;x(I5!++e,C	Q'::','EcU!%L&/< 
 
 :2D HH_e<Ms ;<J{lS_MC

,-ll8<<0::<G hg6 |"1WI%KJ<Wghugvvyz{|
 $' % $	K {K8 hg6 "!''%,,#?2::?'93? (  "&K{K8 44   dK5R[_ `AGGIKK3DHH:YzlST..xx5dhhZqA(	0 y/ /,,j9 ! G! /@ | |" j  		YLL6qc:TLJ ggll4??OL ggll;8NO";7SQRVemeqeqrzr~r~e  fJ  fJ  fL  1M  N ..53q6/RTWXX		Ys   D
N$ M M5M =%N$ #/M5 BN$ 'N*N$ -5N"B#N$ MM M2.N$ 1M22N$ 5NN$ NN$ NN$ N!N$ $	R-R
BQR
	Q$!R
#Q$$!R

Rc                 p
   	 ddl }ddl}ddl}t        j                  j                  | j                  d      }t        j                  j                  |dd      }t        j                  j                  |dd      }t        j                  j                  | j                  d      }	t        j                  j                  |      s|j                  d	d
dd       yt        |dd      5 }
t        j                  |
      }ddd       j                  di       }|j                  d|j                  dd            }|j                  dd      }|j                  dd      }|j                  dd      }g }t        j                  j                  |      rddl}t        |d      5 }
|j                  |
      }ddd       t        dd      }||_        |j!                  ||dz          t        |d      5 }
|j#                  ||
       ddd       |j%                  d|dd|d       t&        j)                  d|d       t        j                  j                  | j                  d       }t        j                  j                  | j                  d!d"d#      }t        j                  j                  |      r|n|j*                  }d}t        j                  j                  |	      r	 t        |	d      5 }
t-        |
j/                         j1                               }ddd       t        j2                  d$       ddl}|j7                  d%       t        j2                  |d&       |}t        j                  j                  | j                  d'      }t        |d(d      5 }|j?                  ||g||j@                  | j                  )      }ddd       t        |	d*      5 }
|
jC                  tE        jF                               ddd       |j%                  d+| d,jF                   d-       t&        j)                  d.|dd/|jF                          |j                  d0d1||||||jF                  d2       y# 1 sw Y   wxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# t8        $ r Y Tw xY w# t:        t8        t<        f$ r Y mw xY w# 1 sw Y   xY w# 1 sw Y   xY w# tH        $ rB}t&        jK                  d3| d04       |j                  d	tE        |      dd5       Y d}~yd}~ww xY w)6uW   POST /api/spy-apply-optimizer — Applique les résultats optimizer au spy + redémarrer   Nr  r,   zoptimizer_results.jsonrf  zsignal_classifier.pklzspy_testnet.pidFuA   optimizer_results.json introuvable — lancez d'abord le pipeliner  r  r`   r  r  rm   optimal_thresholdrB  auc_rocrq  win_rate_filtered
trade_rater#  r#  z.bakwbzThreshold ML: z.3f if old_threshold else "N/A"r  z.3fu"   Classifier threshold mis à jour: r(  r&  r  r  r   r  r}  r  r  )r   r0  r)  rn  u   Spy redémarré (ancien PID u    → nouveau PID r   u'   Spy redémarré avec nouveau threshold z: PID Tu,   Optimisations appliquées et spy redémarré)r   r   r  	thresholdaucr  r  new_pidzError in spy_apply_optimizer: rS  rS   )&r~   r  r   rq   rr   rs   r@   rt   rT   ru   rv   rw   r-   pickler   r  r  rv  rz   rV   r   r/  r   rh  r   r  r/   rU  r  r  r  r  r  r  r   r  r   rQ   )rH   rW   r,   r~   r  r   r  results_fileclassifier_pklr  r   r{  rm   r  r  r|  r  r  r  clfold_thresholdr4  r  r3  
killed_pidold_pidr	  r   r  new_procrX   s                                  r"   handle_spy_apply_optimizerz'RouteHandler.handle_spy_apply_optimizerr  sy   V	Y ggll4??OLK ggll;@XYL ggll;BYZN ggll4??<MNH77>>,/22u  PT  4U  WZ  [lC': 'a))A,'  Ir2G$7EXZ]9^_IIs3C$7=B \37JG ww~~n-.$/ )1 ++a.C) '-@$ G(1%^^f-DE.$/ (1KKQ'(>]/^^cdmnqcrst@3PQ dooGJ'',,t	RK)+)D+#..J Jww~~h'	h, 8"%affhnn&6"78GGGR(%rxx{!,!(J
 ww||DOO5EFHhg6 "%++,%,,	 ,  h$ +HLL)*+ NN9*EVW_WcWcVddefgKKA)CPVW_WcWcVdef..I"&%'(#<<	0 	w' ') )( (8 8
 .3t3"$68IJ 
 + +"  	YLL9!=LM..53q6/RTWXX	Ys   CS* S* 'Q2=B#S*  Q?2=S* /RCS* !R6 -(R3R6 R& R6  8S* ,SS* %S=A4S* 2Q<7S* ?R	S* RS* R#R6 &	R3/R6 2R33R6 6S
S* SS* SS* S'#S* *	T538T00T5)rJ   NrF   )T__name__
__module____qualname____doc__r   r   r   r   r   rI   rY   r   r   r   r   r  rO  r  r  r   r   r  r  r  r  r  r  r  r  r  r!  r  r  r  r  r  r  r  r  r  r  r  r$  ri  r  r  r  r  r%  r.  rL  rZ  r_  r   r  r  r   r-  r  r  r  rD  r]  staticmethodre  r  r  r  r  r$  r6  r  r$  rm  r  r  r  r  r  ri  r  r  r  r  r(  r2   r"   r?   r?   D   s   --- &- (	-
  - (-fPDL!FBHAFJXjX0c3h D B)VT d 0*XCJ#T #d #JD T 8$:xBfPB2#DcN #t #J6S#X 64 6p!$sCx. !UY !F_T#s(^ _ _BuDcN ut unS#X 4 0Y+YtCH~ +Y$ +YZ_4S> _d _BL\[zT TQU Tl%Nrh>4 >SW >@+ZS$ S4 SjQ4 QD QfLtCH~ LRV L\P
 P
d38n P
d[
 [
d38n [
z=T#s(^ =~*d *VZ *X0t 0W[ 0dED ETX ENCJeN * *X _ _JAF9vH3TeN>T >T >@fYXjY`~YHrYh	+Yb 2H<|IYVSYjxY|FYPEYT EYT EYNXY XYPT XYr2   r?   )r  )2r  rv   r  loggingr  rq   typingr   r   r   ra  r   r   r	   r
   rf  r   r   r   r   r   r   r"  r   r   r   securityr   r   r#   utilsr$   r%   r&   	getLoggerr  rV   r/   r.   r'   r   __annotations__r   r1   r;   r  r=   r  r   r?   r(  r2   r"   <module>r     s   
     	 & & ! 2 2  @ ? 7
 A @			8	$  "tCH~ "C e !C !s !(5#; 
FfY FfY	  (#' (s   B( (B21B2