
    _i                        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ZddlZddlZ	ddl
Z	ddlZ		 ddlZej                  j                  ej                  j!                  e            Z ej&                  e       dZdZd Zd Zd Zd#dZ G d	 d
      Zd$dZd Zd Zd Zd Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-e.dk(  r	  ej^                   e-              yy# e$ r dZY w xY w# e0$ r7  e1dejd                   d ejf                           ej^                  d!       Y ye4$ r@Z5 e1dejl                   d"e5 ejf                           ej^                  d!       Y dZ5[5ydZ5[5ww xY w)%u  
Script de Reset complet du système de trading - VERSION 3.0
============================================================

Fonctionnalités :
- Arrêt propre de TOUS les processus Python du projet
- Nettoyage des fichiers PID et cache
- Relance du dashboard_api_server.py (qui lance aussi le bot)
- Vérification que tout fonctionne

SÉCURITÉ: Ne touche PAS à VS Code, Pylance, ou autres applications !
    Ni"  z9C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exec                     t         j                  dk(  r't        j                  j	                  t
        ddd      } n&t        j                  j	                  t
        ddd      } t        j                  j                  |       r| S dS )zDRetourne le chemin Python du venv selon l'OS (Windows ou Linux/Mac).win32z.venvScriptsz
python.exebinpython3N)sysplatformospathjoin
SCRIPT_DIRexists)r   s    Reset_trading.pyget_venv_pythonr   *   sX    
||www||JLIww||J	B77>>$'41T1    c                     ddl }|j                  |j                  |j                        5 }|j                  d       |j	                  d| f      dk(  cddd       S # 1 sw Y   yxY w)uE   Cross-platform: vérifie si un port TCP local accepte des connexions.r   N   z	127.0.0.1)socketAF_INETSOCK_STREAM
settimeout
connect_ex)portr   ss      r   _is_port_listeningr   3   sU    	v~~v'9'9	: 6a	Q||[$/0A56 6 6s   'AA%c                     	 t        |       }t        rt        j                  |      S t        j                  |d       y# t
        t        f$ r Y yw xY w)u-   Cross-platform: vérifie si un PID est actif.r   TF)intpsutil
pid_existsr
   kill
ValueErrorOSError)pid_strpids     r   _pid_is_aliver%   ;   sK    'l$$S))
Q  s   %? ? AAc                    t        t        ||nt        j                  ||nt        j                  t        j                  d      }t        j
                  dk(  rd}d}d}||z  |z  |d<   t        j                  | fi |S )uI   Lance un processus détaché (cross-platform, sans fenêtre sur Windows).T)cwdstdoutstderrstdinstart_new_sessionr   i      i   creationflags)dictr   
subprocessDEVNULLr   r	   Popen)cmdr(   r)   kwargsCREATE_NO_WINDOWDETACHED_PROCESSCREATE_NEW_PROCESS_GROUPs          r   _spawn_detachedr7   G   s    +v1C1C+v1C1C  F ||w%%#- "25E"EH`"`C*6**r   c                   (    e Zd ZdZdZdZdZdZdZdZ	y)	Colorsz[92mz[93mz[91mz[94mz[96mz[0mz[1mN)
__name__
__module____qualname__GREENYELLOWREDBLUECYANRESETBOLD r   r   r9   r9   Y   s%    EF
CDDEDr   r9   c           	         t        dt        j                   d t        j                          |rBt        t        j                   t        j                   d| d|  t        j                          n>t        t        j                   t        j                   d|  t        j                          t        t        j                   d t        j                   d       y)u   Affiche un header stylisé
<============================================================z  PHASE z:   N)printr9   rA   rB   rC   )titlephases     r   print_headerrL   c   s    	Bv{{mH:fll^
45fkk](5'E76<<.QRfkk]"UGFLL>BC	V[[M(FLL>
45r   c                 b    t        dt        j                   d|  t        j                          y )NrH   z[OK] )rI   r9   r=   rB   msgs    r   print_successrP   m   s#    	Bv||nE#v||n
56r   c                 b    t        dt        j                   d|  t        j                          y )NrH   z[!] )rI   r9   r>   rB   rN   s    r   print_warningrR   q   s#    	Bv}}oT#v||n
56r   c                 b    t        dt        j                   d|  t        j                          y )NrH   z[X] )rI   r9   r?   rB   rN   s    r   print_errorrT   u   s#    	Bvzzl$seFLL>
23r   c                 b    t        dt        j                   d|  t        j                          y )NrH   z[i] )rI   r9   r@   rB   rN   s    r   
print_inforV   y   s#    	Bv{{m4uV\\N
34r   c                  :	   t        dd       d} t        j                  dk(  rdt         d}	 t	        j
                  t        ddd	d
|gddd      }|j                  j                         j                  d      D ]T  }|j                         s|j                         j                         s3t        d|j                          d       | dz  } V nt         st        d       nt#        j$                         fd}t!        j&                         D ]a  } ||      s	 dj)                  |j+                               }d|v sd|v r.|j-                          t        d|j.                   d       | dz  } c t5        j6                  d       	 t!        j8                         D ]  }|j:                  j<                  t        k(  s!|j.                  s.|j.                  k7  s>	 t!        j>                  |j.                        j-                          t        d|j.                   dt         d       | dz  }  	 tA        d      D ]h  }	t!        j&                         D ]:  } ||      s	 |j-                          t        d|j.                   d       | dz  } < t5        j6                  d       j t5        j6                  d       g d}
|
D ]j  }t"        jB                  j)                  tD        |      }t"        jB                  jG                  |      sG	 t#        jH                  |       tK        | d       l d d!g}|D ]\  }t"        jB                  j)                  tD        |      }t"        jB                  jG                  |      sG	 t#        jH                  |       ^ | dk(  rtK        d"       | S t        |  d#       | S # t        j                  $ r t        d       Y 0t        $ r}t        d|        Y d}~Ld}~ww xY w# t         j0                  t         j2                  f$ r Y w xY w# t         j0                  t         j2                  f$ r Y w xY w# t        $ r Y *w xY w# t         j0                  t         j2                  f$ r Y 2w xY w#  Y xY w#  Y axY w)$uJ  Arrête tous les processus Python du projet de manière robuste.
    
    Ordre critique:
    1. Watchdog en premier (évite qu'il respawn pendant le reset)
    2. Tous les autres processus du projet (venv ET système Python)
    3. Second passage pour tuer les survivants / processus respawnés
    4. Port 8889 forcé libre
    zARRET DES PROCESSUSr   r   r   aA  
$ErrorActionPreference = "SilentlyContinue"
$stoppedPids = @()

function Kill-ProjectPython {
    $all = Get-CimInstance Win32_Process -Filter "Name='python.exe' OR Name='pythonw.exe'" -ErrorAction SilentlyContinue
    foreach ($proc in $all) {
        $cmd = $proc.CommandLine
        if ($cmd -and
            $cmd -like "*crypto_trading_bot*" -and
            $cmd -notlike "*Reset_trading*" -and
            $cmd -notlike "*jedi*" -and
            $cmd -notlike "*language_server*" -and
            $cmd -notlike "*pylance*") {
            Stop-Process -Id $proc.ProcessId -Force -ErrorAction SilentlyContinue
            $script:stoppedPids += $proc.ProcessId
        }
    }
}

$watchers = Get-CimInstance Win32_Process -Filter "Name='python.exe'" -ErrorAction SilentlyContinue |
    Where-Object { $_.CommandLine -like "*bot_watchdog*" -or $_.CommandLine -like "*watchdog*" }
foreach ($w in $watchers) {
    Stop-Process -Id $w.ProcessId -Force -ErrorAction SilentlyContinue
    $stoppedPids += $w.ProcessId
}
Start-Sleep -Milliseconds 800

$conn = Get-NetTCPConnection -LocalPort aj   -ErrorAction SilentlyContinue
foreach ($c in $conn) {
    if ($c.OwningProcess -gt 4) {
        Stop-Process -Id $c.OwningProcess -Force -ErrorAction SilentlyContinue
        $stoppedPids += $c.OwningProcess
    }
}

Kill-ProjectPython
Start-Sleep -Milliseconds 1200
Kill-ProjectPython

$stoppedPids | Select-Object -Unique | ForEach-Object { Write-Output $_ }
z
-NoProfilez-ExecutionPolicyBypassz-CommandT   )capture_outputtexttimeoutrF   z
Processus u	    arrêtéu&   Timeout lors de l'arrêt des processusErreur: Nu,   psutil non disponible — pip install psutilc                 2   	 d| j                         j                         vrydj                  | j                               }d|v xr' d|vxr! d|vxr d|vxr d|vxr | j                  k7  S # t
        j                  t
        j                  f$ r Y yw xY w)	NpythonF crypto_trading_botReset_tradingjedilanguage_serverpylance)namelowerr   cmdliner$   r   NoSuchProcessAccessDenied)procr2   current_pids     r   is_project_procz+stop_all_processes.<locals>.is_project_proc   s    !tyy{'8'8'::$((4<<>2C0C7 4+364"#-4 .S84 &S0	4
 !HH35 ,,f.A.AB ! !s    A0 AA0 0#BBr`   bot_watchdogwatchdogg      ?u    arrêté (port )   g?)bot.pidauto_updater.pidzdashboard_api.pidz	 supprimezsell_all_signal.jsonzai_realtime_status.jsonz"Aucun processus du projet en coursu    processus arrêté(s))&rL   r   r	   DASHBOARD_PORTr/   run
POWERSHELLr(   stripsplitisdigitrP   TimeoutExpiredrR   	ExceptionrT   r   r
   getpidprocess_iterr   rh   r    r$   ri   rj   timesleepnet_connectionsladdrr   Processranger   r   r   removerV   )stopped_count	ps_scriptresultlineerm   rk   r2   conn_	pid_filespid_filefilepath
temp_files	temp_filerl   s                  @r   stop_all_processesr   }   s    &*M
||w)8 *8(8 99)	T	(^^\+=xU^_#	F ++-33D9 '::<DJJL$8$8$:!Jtzz|nI"FG!Q&M' HI))+K! ++- 	"4(!hht||~6)S0J#4E IIK)Jtxxj	*JK)Q.M	 JJsO
"224 !Dzz.8TXX$((VaJa!"NN488499;)Jtxxj@PQ_P``a*bc)Q.M! 1X 	 "//1 !D&t,! IIK)Jtxxj	*JK)Q.M! 

3	  	JJqM EI 77<<
H577>>(#		(#hZy12 )*CDJ 	77<<
I677>>(#		(#	 78  	'=>?{ (( 	DBC 	((1#''	(B #00&2E2EF  !' 4 4f6I6IJ ! !  !' 4 4f6I6IJ ! !s   AN: N: -$N:  AO?4Q Q Q  AP)2Q $.Q##RR:O<O<#O77O<?#P&%P&)#QQ QQ 	Q Q ##R
	R
RRc                     i } t         j                  j                  t        d      }t	        |dd      5 }|D ]  }|j                         }|j                  d      rd|v | d<   ,|j                  d      r"d	|v rd
|v r|j                  d
      d   nd| d<   _|j                  d      sqd	|v svd
|v r|j                  d
      d   nd| d<    	 ddd       | S # 1 sw Y   | S xY w)uW   Lit les credentials Binance depuis config.py — helper partagé (évite triplication).	config.pyrutf-8encodingTESTNET_MODETruetestnetBINANCE_API_KEY="r    api_keyBINANCE_API_SECRET
api_secretN)r
   r   r   r   openrstrip
startswithrx   )config_varsconfig_filefr   s       r   _read_binance_configr   !  s    K'',,z;7K	k3	1 VQ 	VD;;=D~.)/4I&!23t?Bd{C);PRI&!563$;BE+DJJsOA,>SUL)	VV V s   A3C)C.CC"c                    	 t         j                  j                  |  d      }t         j                  j                  |d      5 }t	        j
                  |j                         j                  d            }|d   t        t        j                         dz        z
  cddd       S # 1 sw Y   yxY w# t        $ r Y yw xY w)	zBRetourne l'offset ms entre l'horloge locale et le serveur Binance.z/api/v3/time   r\   r   
serverTime  Nr   )urllibrequestRequesturlopenjsonloadsreaddecoder   r~   r{   )base_urlreqrespdatas       r   _get_server_time_offsetr   1  s    nn$$z%>?^^##C#3 	@t::diik009:D%DIIK$,>(??	@ 	@ 	@  s1   AB3 AB'	B3 'B0,B3 0B3 3	B?>B?c                     t        dd       	 t        j                  j                  t        j                  j	                  t
        d            st        d       yt               } | j                  dd      }| j                  dd	      }| j                  d
d	      }|r|st        d       y|rdnd}|rdnd}t        d|        t        d|dd  d|dd         	 | d}t        j                  j                  |      }t        j                  j                  |d      5 }|j                  dk(  rt        d       n"t        d|j                          	 ddd       y	 ddd       t#        |      }
|
rt        d|
 d       	 t%        t'        j&                         dz        |
z   }d| d }t)        j*                  |j-                  d!      |j-                  d!      t.        j0                        j3                         }| d"| d#| }t        j                  j                  |d$|i%      }t        j                  j                  |d      5 }|j                  dk(  rt5        j6                  |j9                         j;                  d!            }d&}|j                  d'g       D ]  }|d(   d)k(  st=        |d*         } n t        d+       t        d,|d-d.       |d/k  r)t?        d0|d-d.       |rt        d1       nt?        d2       	 ddd       yt        d3|j                          	 ddd       y# 1 sw Y   xY w# t         $ r}	t        d|	        Y d}	~	yd}	~	ww xY w# 1 sw Y   nxY wy# t        j@                  jB                  $ r}	|	j9                         j;                  d!      }t        d4|	jD                          	 t5        j6                  |      }t        d5|j                  d6d7              n#  t        d8|        Y nxY wY d}	~	yd}	~	wt         $ r}	t        d9|	        Y d}	~	yd}	~	ww xY w# t         $ r}	t        d:|	        Y d}	~	yd}	~	ww xY w);u#   Teste la connexion à l'API BinancezTEST CONNEXION BINANCE0r   u   config.py non trouvéFr   Tr   r   r   u1   Clés API Binance non configurées dans config.pyhttps://testnet.binance.visionhttps://api.binance.comzTESTNET (fictif)zPRODUCTION (reel)zMode: z	API Key: Nr,   z...z/api/v3/pingr   r      u   Ping Binance réussiu   Ping échoué: zSynchronisation temps: offset msr   
timestamp=&recvWindow=5000r   /api/v3/account?&signature=X-MBX-APIKEYheadersr   balancesassetUSDTfreeu   Authentification réussiezBalance USDT: .2fz USDT
   zBalance faible: z6Testnet: Recharger sur https://testnet.binance.vision/u#   Production: Vérifier votre capitalu   Authentification échouée: zErreur API: z	Message: rO   zErreur inconnuez	Details: zErreur authentification: zErreur test Binance: )#rL   r
   r   r   r   r   rT   r   getrV   r   r   r   r   statusrP   r{   r   r   r~   hmacnewencodehashlibsha256	hexdigestr   r   r   r   floatrR   error	HTTPErrorcode)r   testnet_moder   r   r   mode_strping_urlr   responser   server_time_offset	timestampquery_string	signatureaccount_urlr   usdt_balancebalance	error_msg
error_datas                       r   test_binance_connectionr   <  s7   )3/fww~~bggll:{CD/0 +,"y$7//)R0 __\26
jKL 8D3Ib)5%;NVH:&'Ywr{m3wrs|n=>	"<0H..((2C''Q'7 !8??c)!"89/(//1B CD ! !9! 5X>78J7K2NO6	DIIK$./2DDI'	{2BCL!!'*##G, ik	  &J&6|nKPY{[K..(('1 ) C
 ''Q'7 !8??c)::hmmo&<&<W&EFD $%L#'88J#; ""7+v5+0+AL!"
 "$=?S/AGH#b(%(8c8J%&PQ'&'_`)*OP+! !.  ">x>O PQ 1! !C! !  	/!-.	6! ! !4 ||%% 	0I,qvvh/05!ZZ	2
i
u>O(P'QRS5i	{34 	3A378	  +A3/0s   AP> AP> +1P> AM "5L6M !M )P> CM4 A!M'0AM'M4 M'-M4 6M ;M 	M$MP> M$$P> 'M0,M4 4P;7P	3O=<P=PPP> P;#P61P> 6P;;P> >	QQQc                  "   t        dd       t        j                  j                  t        d      } t        j                  j                  |       st        d       y	 t        | dd      5 }t        j                  |      }d	d	d	       j                  d
g       }t        |      }t        d| d       h d}g }g }|D ]  }|j                         s|j                  |df       '||v r|j                  |df       ?|j                  d      rt        |      dk  r|j                  |df       r|j                  |        	 t!               }	|	j                  dd      }
|
rdnd}t"        j$                  j'                  | d      }t"        j$                  j)                  |d      5 }t        j*                  |j-                               }d	d	d	       t/               }d
   D ](  }|d   dk(  s|d   dk(  s|j1                  |d          * g }|D ]+  }||v r|j                  |       |j                  |df       - |}t3        dt        |       d       t/               }g }|D ]<  }||vr#|j1                  |       |j                  |       *|j                  |d"f       > |}|r2t        t        |       d#       |D ]  \  }}t        d$| d%|         t        |      |k7  r||d
<   t        |      |d&<   |j7                  d'i        |j7                  d(i        t9        j:                  d)      |d*<   t        | d+d      5 }t        j<                  ||d,d-.       d	d	d	       t3        d/| d%t        |       d0       yt3        d1t        |       d2       y# 1 sw Y   "xY w# 1 sw Y   xY w# t4        $ r}t        d | d!       Y d	}~}d	}~ww xY w# 1 sw Y   ~xY w# t4        $ r}t?        d3|        Y d	}~y-d	}~ww xY w)4uI  🔧 FIX 02/03: Nettoie la watchlist des symboles non exploitables.
    
    Filtre automatiquement:
    - Stablecoins (USD1, USDC, BUSD, etc.)
    - Fiat (EUR, GBP, etc.)
    - Or tokenisé (PAXG, XAUT)
    - Wrapped tokens (WBTC, BETH, etc.)
    - Tokens test (caractères non-ASCII)
    - Symboles inexistants sur Binance
    zNETTOYAGE WATCHLISTz0.2watchlist.jsonu,   watchlist.json introuvable, rien à nettoyerTr   r   r   NsymbolszWatchlist actuelle: z	 symboles>!   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	WBETHUSDTu"   Caractères non-ASCII (test token)z,Non exploitable (stablecoin/fiat/or/wrapped)r   r   zFormat invalider   r   r   z/api/v3/exchangeInfor   r   r   TRADING
quoteAssetsymbolzPaire inexistante sur BinancezValidation Binance: u    paires actives vérifiéesz#Impossible de valider sur Binance (z), filtrage local uniquementDoublonu    symbole(s) retiré(s):rH   u    → count
auto_addedspy_injectedz%Y-%m-%dT%H:%M:%S
updated_atwrq   F)indentensure_asciiu   Watchlist nettoyée: z symboles exploitableszWatchlist propre: u#    symboles, aucun parasite détectézErreur nettoyage watchlist: ) rL   r
   r   r   r   r   rR   r   r   loadr   lenrV   isasciiappendendswithr   r   r   r   r   r   r   setaddrP   r{   
setdefaultr~   strftimedumprT   )watchlist_filer   wl_datar   original_countNON_EXPLOITABLEremovedclean_symbolssym_cfgr   r   r   r   infoactive_pairsr   	validatedr   seenunique_symbolsreasons                         r   clean_watchlistr0    s%    &.WW\\*.>?N77>>.)DEl.#8 	#AiilG	#++i,W).)9CD
  	&C;;=%IJK o%%STU <<'3s8a<%678  %!	&&	a')Dhhy$/G;B7HaH..((H:5I)JKC''R'8 /Dzz$))+./ 5L)_ 2X;)+,60I $$Qx[12 I$ K,&$$S)NNC)H#IJ	K &M0\1B0CC^_` u  	1C$%%c*Y/0	1 ' S\N*ABC& 4VRuE&234 }/!.GI"=1GG|R0~r2$(MM2E$FGL!ncG< D		'1QUCD1.1As=GYFZZpqr  .s=/A.BBefgO	# 	#d/ /$  	a?sB^_``	a:D D  21#67s   O- +N!CO- A%N; *$N."N; 1N; :A"N; C.O- 
O!$#O- O- !N+&O- .N83N; ;	OOO- OO- !O*&O- -	P6P		Pc                     t        dt         d       t        r	 t        j                         D ]}  } | j                  j
                  t        k(  s!| j                  s.| j                  t        j                         k7  sP	 t        j                  | j                        j                           	 ddl}t        d      D ]  }	 |j                  |j                   |j"                        }|j%                  |j&                  |j(                  d       |j+                  dt        f       |j-                          t/        dt         d	        y
 t9        dt         d       y
# t        j                  t        j                  f$ r Y Xw xY w# t        $ r Y w xY w# t0        $ r2 |dk  rt3        d|dz    dd       t5        j6                  d       Y w xY w)uX   Vérifie que le port est libéré et force la fermeture si nécessaire (cross-platform).u   Vérification que le port z est libre...r   N   r   r   zPort z
 est libreT   z  ... attente port libre (z/20s)...endrq   uE    encore en cours de libération (TIME_WAIT) - on continue quand même)rV   rt   r   r   r   r   r$   r
   r|   r   r    ri   rj   r{   r   r   r   r   
setsockopt
SOL_SOCKETSO_REUSEADDRbindcloserP   r"   rI   r~   r   rR   )r   r   attemptr   s       r   verify_port_freer=  *  s   +N+;=IJ 	..0 ::??n4dhhRTR[R[R]F]txx0557 9 
	fnnf.@.@AALL**F,?,?CFFB'(GGIE.!1<= E.))nop+ #00&2E2EF  		  	|2719+XFDQJJqM	sT   4F F !F  -E!-F BF!#FF FF 	FF7GGc                  f   t        dd       t                t        j                  j	                  t
        d      } t        j                  j                  |       st        d       yt               }|st        d       yt        d       t        d|        	 t        j                  j	                  t
        d	      }t        |d
d      }t        || g|t        j                        }t        d|j                   d       t        d       t!        d      D ]N  }t#        j$                  d       t'        t(              rt        dt(                 yt+        d|dz    dd       P t'        t(              rt        d       yt-        d       y# t.        $ r}t        d|        Y d}~yd}~ww xY w)z2Lance le dashboard_api_server.py de maniere proprezLANCEMENT DU SERVEURrq   zdashboard_api_server.pyu$   dashboard_api_server.py non trouvé!FA   ❌ Python venv non trouvé. Créer le venv: python -m venv .venvz'Lancement de dashboard_api_server.py...Python: zdashboard_log.txtr  r   r   r(   r)   u   Serveur lancé (PID: rp   u1   Attente du démarrage (chargement modèles IA)...   r   u"   Serveur opérationnel sur le port Tz  ... z/25sr4  r5  u    Serveur finalement opérationnelu%   Timeout - vérifier dashboard_log.txtr]   N)rL   r=  r
   r   r   r   r   rT   r   rV   r   r7   r/   STDOUTrP   r$   r   r~   r   r   rt   rI   rR   r{   )script_pathvenv_pythonlog_filedashboard_logprocessir   s          r   start_dashboard_serverrJ  M  sr   '+ '',,z+DEK77>>+&:; "#KWX8:+'(!77<<
,?@ XsW=!;"<][e[l[lm-gkk]!<= 	FGr 	0AJJqM ".1 B>BRSTF1Q3%t$$/	0 n-<==> hqcN#s%   B9F 0F F 	F0F++F0c                     t        dd       t        j                  j                  t        d      } t        j                  j                  |       st        d       yt               }|st        d       yt        d       t        d|        	 t        j                  j                  t        d	      }t        j                  j                  t        d
      }t        |dd      }t        |dd      }t        |d| g||      }t        j                  j                  t        d      }t        |d      5 }|j                  t        |j                               ddd       t        d|j                   d       t        d       t        j                   d       t#        t        |j                              rt        d|j                   d       yt%        d       y# 1 sw Y   xY w# t&        $ r}	t        d|	        Y d}	~	yd}	~	ww xY w)uC   Lance le trading_bot.py de manière propre (SÉPARÉ du dashboard!)zLANCEMENT DU TRADING BOTz2.5ztrading_bot.pyu   trading_bot.py non trouvé!Fr?  zLancement de trading_bot.py...r@  zbot_stdout.txtzbot_stderr.txtr  r   r   z-urA  rr   Nu   Trading Bot lancé (PID: rp   u   Attente du démarrage du bot...r   u    Trading Bot opérationnel (PID: Tu    Vérification du bot en cours...zErreur lancement Trading Bot: )rL   r
   r   r   r   r   rT   r   rV   r   r7   writestrr$   rP   r~   r   r%   rR   r{   )
rD  rE  
stdout_log
stderr_logout_logerr_logrH  r   r   r   s
             r   start_trading_botrR    s   +U3'',,z+;<K77>>+&12 "#KWX/1+'("WW\\*.>?
WW\\*.>?
 z39z39!;k"B7[bc 77<<
I6(C  	&AGGC$%	& 	1'++a@A 	45

1 W[[)*<W[[MKL89	& 	&"  4QC89s8   B%G) 3%GA8G) G) G&"G) )	H
2HH
c                     t        d       	 t               } | st        d       yt        j                  j                  t        d      }t        j                  j                  |      st        d       yt        | |dg      }t        j                  d       t        j                  j                  t        d      }t        j                  j                  |      rCt        |d	      5 }|j                         j                         }d
d
d
       t        d d       yt        d|j                    d       y# 1 sw Y   3xY w# t"        $ r}t        d|        Y d
}~yd
}~ww xY w)u.   Lance le service auto_updater en arrière-planz$Lancement du service Auto Updater...r?  Fzauto_updater_service.pyu#   auto_updater_service.py non trouvéz--daemonrq   rs   r   Nu   Auto Updater lancé (PID: rp   TzErreur lancement Auto Updater: )rV   r   rT   r
   r   r   r   r   rR   r7   r~   r   r   r   rw   rP   r$   r{   )rE  rD  rH  r   r   
actual_pidr   s          r   start_auto_updaterrU    s&   56%'[\ggll:/HIww~~k*?@!;Z"HI 	

1 77<<
,>?77>>(#h$ .VVX^^-
.6zl!DE  6w{{m1EF. .  5aS9:sB   E AE 4A2E &D7E E 7E <E 	E$EE$c                     t        dd       	 t               } | st        d       yt        j                  j                  t        d      }t        j                  j                  |      st        d       t        d       yt        | |g      }t        j                  d       t        j                  j                  t        d	      }t        j                  j                  |      r%t        d
|j                   d       t        d       yt        d|j                   d       y# t        $ r#}t        d|        t        d       Y d}~yd}~ww xY w)uM   Lance le watchdog de surveillance du bot - CRITIQUE pour éviter les arrêts!z*LANCEMENT WATCHDOG (SURVEILLANCE CRITIQUE)z2.6r?  Fzbot_watchdog.pyu6   bot_watchdog.py non trouvé - SURVEILLANCE IMPOSSIBLE!u4   Le bot pourra crasher sans redémarrage automatique!rq   watchdog.logWatchdog actif (PID:    ) - Bot surveillé 24/7!u?   Le watchdog redémarrera automatiquement le bot en cas de crashu   Watchdog lancé (PID: rp   Tu'   ERREUR CRITIQUE: Watchdog non lancé - uB   Le bot ne sera PAS surveillé - risque d'arrêt sans redémarrage!N)rL   r   rT   r
   r   r   r   r   rR   r7   r~   r   rP   r$   rV   r{   )rE  rD  rH  watchdog_logr   s        r   start_watchdogr[    s   =uE%'[\ggll:/@Aww~~k*PQPQ!;"<= 	

1 ww||J?77>>,'1'++>VWXXY  27;;-qAB =aSABZ[s*   D$ AD$  B	D$ 
D$ $	E-EEc                  n   t        dd       d} t        t              r|d}	 t        rTt        j                         D ]=  }|j
                  j                  t        k(  s!|j                  dk(  s1|j                  } n |rd| dnd}t        d	t         |        nt        d
t                d} t        j                  j                  t        d      }t        j                  j!                  |      ra	 t#        |d      5 }|j%                         j'                         }ddd       t)              rt        d| d       nt        d| d       d} nt        d       d} d}dD ]  }		 t,        j.                  j1                  dt         |	       }
t,        j.                  j3                  |
d      5 }|j                  dk(  rt        d|	 d       d}	 ddd        n	 ddd        |st+        d       t        j                  j                  t        d      }t        j                  j!                  |      rD	 t#        |d      5 }|j%                         j'                         }ddd       t        d d       nt+        d       d}t        j                  j                  t        d      }t        j                  j                  t        d      }t        j                  j!                  |      r	 t#        |d      5 }t5        |j%                         j'                               }ddd       t        r[t        j6                        rFt        j8                  |      }d |j;                         j=                         v rd}t        d!| d"       |st        r	 t        j@                  g d#      D ]h  }	 d |jB                  d$   j=                         v rFd%j                  |jB                  d&   xs g       }d'|v r d}t        d!|jB                  d(    d"        nj |s0t+        d)       tI               rt        d*       d}nt        d+       d} |rqt        j                  j!                  |      rR	 t#        |dd,-      5 }|jK                         }|r&|d.   j'                         }d/|v sd0|v rtM        d1       ddd       | S | S # t        $ r Y Pw xY w# 1 sw Y   xY w# t        $ r}t+        d|        Y d}~d}~ww xY w# 1 sw Y   &xY w# t        $ r}Y d}~d}~ww xY w# 1 sw Y   xY w#  t+        d       Y xY w# 1 sw Y   #xY w# t>        t        f$ r Y w xY w# t        jD                  t        jF                  f$ r Y w xY w# t        $ r Y w xY w# 1 sw Y   | S xY w#  Y | S xY w)2u+   Vérifie que tous les services fonctionnentVERIFICATION   TNLISTENz (PID: rp   r   zDashboard actif sur port u!   Dashboard non détecté sur port Frr   r   zBot de trading actif (PID: zBot de trading NON ACTIF (PID z introuvable)u*   bot.pid existe mais erreur vérification: u0   bot.pid non trouvé - Trading Bot non démarré!)z/api/ai-surveillancez/api/statusz/dashboard.htmlzhttp://localhost:r   r   r   zDashboard accessible (u6   API non accessible (peut être en cours de chargement)rs   zAuto Updater actif (PID: z&auto_updater.pid existe mais illisibleu   Auto Updater non lancézwatchdog.pidrW  r_   rX  rY  )r$   rf   rh   rf   r`   rh   rn   r$   u3   WATCHDOG INACTIF DÉTECTÉ - Relance automatique...u   Watchdog relancé avec succès!u-   Échec relance watchdog - Bot NON surveillé!r   r   z	Bot actifu   Watchdog démarréu   Dernière vérification: Bot OK)'rL   r   rt   r   r   r   r   r   r$   r{   rP   rT   r
   r   r   r   r   r   r   rw   r%   rR   r   r   r   r   r   r   r   rf   rg   r!   r}   r*  ri   rj   r[  	readlinesrV   )all_okport_pidr   r#   bot_pid_filer   r$   r   api_okendpointr   r   updater_pid_filewatchdog_activewatchdog_pid_filerZ  watchdog_pidrk   r2   lines	last_lines                        r   verify_servicesrm    sA   #F .)	"224 Dzz.8T[[H=T#'88 ,4GH:Q'1.1A'KL77GHI 77<<
I6L	ww~~l#		LlC( 'Affhnn&'S! ;C5BC<SEOP 	FG FN 		..((+<^<LXJ)WXC''Q'7 8??c)!$:8*A"FG!F	 )	 NO ww||J0BC	ww~~&'	D&, 'ffhnn&'5cU!<= 	/0 OZ@77<<
N;L 
ww~~'(	'- 5"1668>>#345 $$\2!>>,7D499;#4#4#66*.%(=l^Kc&de
 v	++,FG 	499V#4#:#:#<<!hhtyy';'ArB)S0.2O),A$))EBRASSk*lm!	 KL;<"OGHF 277>>,7	lC': Fa %b	 1I"i/3G93T"#DEF M6Ma  		' '  	LFqcJKK	L 
  		' '	DBC5 5 I& 		 ,,f.A.AB  		 F M	Ms.  :R? R? ,R? 2S >S4S 'A	T0"TTT8T2 T%#T2 0U <(U$A)U V 1A#U(V ,V/ :9V"3V/ ?	SSSS 	S>%S99S>T	T	T"T"%T/*T2 2UU
U U%$U%(#VV VV 	VV"V,'V/ ,V/ /V4c                  N   t        dd       t               } | st        d       y	 t        j                  | ddgt
        ddd	      }|j                  d
k(  rt        d       yt        d       t        |j                         y# t        $ r}t        d|        Y d}~yd}~ww xY w)z(Vend toutes les positions avant le resetzVENTE DE TOUTES LES POSITIONSz0.5u>   Python .venv introuvable. Créer le venv: python -m venv .venvFzsell_all.pyz--forceTi,  )r'   rZ   r[   r\   r   u&   Toutes les positions ont été venduesu.   Certaines positions n'ont pas pu être vendueszErreur vente positions: N)rL   r   rT   r/   ru   r   
returncoderP   rR   rI   r(   r{   )rE  r   r   s      r   sell_all_positionsrp    s    0%8 "#KTU -3
 !BCJK&--  .qc23s   ;B " B 	B$BB$c            
      V   t        dd       	 t        j                  j                  t        d      } t               }t        j                  j                  |       r`	 t        | dd      5 }t        j                  |      }t        |j                  dg             }t        dt        |       d	       d
d
d
       |st        d       yt               }|j                  dd      }|j                  dd      }|j                  dd      }|rdnd}t        |      }	t!        t#        j"                         dz        |	z   }
d|
 d}t%        j&                  |j)                  d      |j)                  d      t*        j,                        j/                         }| d| d| }t0        j2                  j5                  |d|i      }t0        j2                  j7                  |d      5 }t        j8                  |j;                         j=                  d            }d
d
d
       t        j                  j                  t        d      }i }t        j                  j                  |      r-	 t        |dd      5 }t        j                  |      }d
d
d
       i }t        j                  j                  t        d      }t        j                  j                  |      rZ	 t        |dd      5 }t        j                  |      }d
d
d
       |r+t        ddj                  |j?                                       t        |j?                               t        |j?                               z  }h d }h d!}| d"}t0        j2                  j5                  |      }t0        j2                  j7                  |d      5 }t        j8                  |j;                         j=                  d            }d
d
d
       D ci c]  }|d#   tA        |d$          }}g }g }g }d%} j                  d&g       D ]  }!|!d'   }"|"|v s|"|v rtA        |!d(         tA        |!d)         z   }#|#d%k  r.|" d*}$|$|v r$|$|v r |jC                  |$       t        d+|$ d,       b|" d*}$|$|vrl|j                  |$d%      }%|%d%kD  s|#|%z  }&|&d-k\  rL|$|v }'|'s4|jC                  |$|"|#|%|&d.       | |&z  } t        d/|$ d0|#d1d2|&d3d4       |jC                  |$       |$|v r*|jC                  |$       t        d5|$ d0|#d1d2|&d3d6       t        d7|$ d0|&d3d8        |rt        d9t        |       d:       |r	 t        j                  j                  t        d      }(t        |(dd      5 }t        j                  |      })d
d
d
       g }*|D ]  }+|+)v s|)|+= |*jC                  |+        |*rLt        |(d;d      5 }t        jD                  )|d<=       d
d
d
       tG        d>dj                  |*              |stG        d@       ytK        dAtL        jN                   dBt        |       dC| d3dD       tK        dEtL        jP                   dA       	 d%dFl)m*}- tV        j                  jY                  d%t               d%d
l-}. |-|.j\                  |.j^                  |.j`                  G      }/d%}0|D ]k  }1|1d#   }$|1dH   }2	 |/jc                  |$      }3|3st        d9|$ dI       2d
}4d
}5|3dJ   D ](  }6|6dK   dLk(  stA        |6dM         }4tA        |6dN         }5 n |4rVdOte        |4      v r5t        te        |4      jg                  dP      ji                  dO      dQ         nd%}7tk        |2|2|4z  z
  |7      }2|5r|2|5k  rt        d9|$ dR|2 dS       |/jm                  |$|2T      }8|8j                  dUg       }9to        dV |9D              }:tG        d9|$ dW|:d3       |0dXz  }0|$|v rB||$= 	 t        |d;d      5 }t        jD                  ||d<=       d
d
d
       t        d9|$ dY       n |0d%kD  rtG        |0 d\t        |       d]       |D <ch c]  }<|<d#   	 }=}<	 t        j                  j                  t        d      }(t        |(dd      5 }t        j                  |      }>d
d
d
       d^}?|=D ]  }+|+>v s|>|+= d}? |?r/t        |(d;d      5 }t        jD                  >|d<=       d
d
d
       yt        d`       	 y# 1 sw Y   cxY w#  Y kxY w# 1 sw Y   xY w# 1 sw Y   xY w#  Y xY w# 1 sw Y   TxY w#  Y /xY w# 1 sw Y   xY wc c}w # 1 sw Y   xY w# 1 sw Y   xY w# tH        $ r},t        d?|,        Y d
},~,d
},~,ww xY w# 1 sw Y   xY w# tH        $ r};t        dZ|;        Y d
};~;d
};~;ww xY w# tH        $ r},t        d9|$ d[|,        Y d
},~,2d
},~,ww xY wc c}<w # 1 sw Y   XxY w# 1 sw Y   !xY w# tH        $ r};t        d_|;        Y d
};~;yd
};~;ww xY w# tp        $ r t        da       Y ytH        $ r},ts        db|,        Y d
},~,yd
},~,ww xY w# tH        $ r},ts        dc|,        Y d
},~,yd
},~,ww xY w)dui  🔴 FIX 27/02: Vérifie s'il y a du crypto orphelin sur Binance et le vend automatiquement.
    
    C'est la correction du bug qui causait l'accumulation de crypto non trackée:
    - L'ancien code ignorait les positions > 2h au redémarrage
    - Le crypto restait sur Binance sans suivi
    - Au fil des resets, TOUT le USDT finissait bloqué en crypto
    u"   VÉRIFICATION POSITIONS ORPHELINESz0.3r   r   r   r   r   zWatchlist: u    symboles surveillésNu5   Watchlist vide, impossible de détecter les orphelinsTr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   zpositions.jsonzespion_trades.jsonzPositions spy actives: z, >   UARSBRLCOPCZKDAIEURIDRJPYMXNPLNRONTRYUAHUSDZARAEURBUSDEURIFRAXTUSDUSD1USDCUSDEUSDPr   XUSDBFUSDFDUSDRLUSD>
      币安人生   这是测试币456BNBBETHETHWWBTCBNSOLLDBNBWBETHz/api/v3/ticker/pricer  pricer   r   r   r   lockedr   u     Fantôme: uB    = 0 sur Binance mais présent dans positions.json → suppressiong      @)r  r   quantityr  
value_usdtz  Orphelin: z = z.6fz (r   u    USDT) - NON TRACKÉz  Dust: u5   $) < 5$ min Binance → suppression de positions.jsonu     Dust ignoré: u   $ (invendable, non tracké)rH   u%    position(s) correctement trackée(s)r  rq   )r  u%     Dust supprimés de positions.json: z5  Impossible de nettoyer les dust de positions.json: u$   Aucune position orpheline détectéerF   u	     ⚠️ z position(s) orpheline(s) (z USDT)u/     → Vente ciblée des orphelins uniquement...)Client)r   r  u   : Symbole invalide, ignoréfilters
filterTypeLOT_SIZEstepSizeminQty.r   r`  u   : Quantité trop faible (u
   ), ignoré)r  r  fillsc              3   V   K   | ]!  }t        |d          t        |d         z   # yw)r  qtyN)r   ).0r   s     r   	<genexpr>z4check_and_sell_orphaned_positions.<locals>.<genexpr>  s&     %YaeAgJ&7%%/&I%Ys   ')z: Vendu pour $r   u   : Retiré de espion_trades.jsonz-  Impossible de nettoyer espion_trades.json: z: Erreur vente - /z orphelins vendusFu/     Impossible de mettre à jour positions.json: u;   Aucun orphelin vendu, le bot les récupérera au démarrageuN   Module binance non disponible, le bot récupérera les orphelins au démarragezErreur vente orphelins: u    Erreur vérification orphelins: ):rL   r
   r   r   r   r  r   r   r   r  r   rV   r  rR   r   r   r   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   keysr   r  r!  rP   r{   rI   r9   r>   rB   binance.clientr  r   insertconfigr   r   r   get_symbol_inforM  r   rx   roundorder_market_sellsumImportErrorrT   )@r"  watchlist_symbolsr   r#  r   r   r   r   r   r   r   r   r   r   r   r   account_datapositions_filelocal_positionsspy_positionsspy_filetracked_symbolsstablecoinsignore_assetsall_tickers_urlr   all_tickers_datat	price_maporphanedtracked_founddust_to_cleantotal_orphaned_valuebalance_itemr   totalr  r  r  
is_trackedpos_filecurrent_positionsr&  r(  r   BClientcfgclient
sold_countorphanr  symbol_info	step_sizemin_qtyflt	precisionorderr  total_value_eosold_symbolscurrent_poschangeds@                                                                   r   !check_and_sell_orphaned_positionsr    s    5u=z j2BCE77>>.).#@ \A"iilG(+GKK	2,F(G%S1B-C,DDYZ[\ !QR +,//)R0 __\26
"y$77C3Ib 5X> 		d*+.@@	#I;.>?HHg&(NN
 )+	 	 "
"2<.I;Wnn$$[>7:S$T^^##C#4 	G::hmmo&<&<W&EFL	G j2BC77>>.).#@ 3A&*iilO3 77<<
,@A77>>(#(C': 1a$(IIaLM1 !8=CUCUCW9X8YZ[ o2245M<N<N<P8QQ4 } &J&:;nn$$_5^^##C#4 	G#zz$))+*<*<W*EF	G=MNQx[%'
"33N	N (,,Z< /	nL )E#u'=,v./%X8N2OOEz!7$_,;L1L!((0!L8z"{|wd^F ..MM&!,Eqy"U]
$!'?!:J% &,%*(-%**4)  -
:,%VHCc{"ZX[L\\p&qr%,,V4 0%,,V4%E#;bTWHX  YN  'O  P"%5fXSC@PPk#lm_/	nb C.//TUV [77<<
4DE(C': 5a(,		!%5( ,C//-c2s+, hg> B!		"3QqAB!$I$))T[J\I]"^_ @A 	6==/3x=/9TUijmTnntuv?~RPQK	88HHOOAz* S00#2H2HRURbRbcFJ" )E)!*-&E"("8"8"@K&%6(2M&NO  $I"G*95 "|,
:(-c*o(>I&+CM&:G!	" !VY]`aj]kVkCI(=(=c(B(H(H(Mb(Q$Rqr	#(X	5I)JI#V8g#5"Rx/H
R\#]^ "44FX4VE!IIgr2E"%%YSX%Y"YK!Bvhn[<M"NO!OJ.)&1`!%hg!F F! $		-1 EF&F83R'STK)EV A~Ac(m_<MNO 6>>(>>Z!ww||J8HIHhg> 3!&*iil3#G+ ++- +C 0&*G+ !(C'B @a IIk1Q?@  XY _\ \:	G 	G3 31 1	G 	GN~5 5B B  [ UVWUXYZZ[lF F  ) `),YZ\Y]*^__`  E!Bvh.?s"CDDE  ?3 3@ @  Z!$STVSW"XYY Z
  	ljk   	821#677	8
  6qc:;s  Aj d! *A	d3d! ;j 	Dj "3d)Aj #e 1d6e Aj e #e95e .B j .3e !j -e-Bj &B6j 2f e2%f 9&f e?8%f j +A
j 6A)i  "g#i g#Bg#(i )Ag#?f>f1&f>=&i #h/i 22h* $h:h* h* %h>h* i dd! !d&#j )d3.j 6e ;e ej ee ej  e*%j 2e<7f ?f	f 	f.f)#j )f..j 1f;	6f>>	g gg#g  g##	h,h=i hi hh* h'"h* *	i3ii ii j"j $j,i?:j ?jj 	j(j##j(c                  p   dt         j                  v } t        dt        j                   t        j
                   dt        j                          | r-t        t        j                   dt        j                   d       t               }|st        dt        j                   d t        j                          t        t        j                   t        j                   dt        j                          t        t        j                   d t        j                          t        dt        j                   dt        j                   d       y	t        dt        j                   d
t        j                          t        j                  d       t                t        j                  d	       t                t        j                  d	       | r|t               }|s[t        dt        j                   dt        j                   d       t!               j#                         j%                         }|dk(  ry	t        j                  d       t'               }t        j                  d       t)               }t        j                  d       t+               }t-                t/               }t1               }|}	t        dt        j
                   d t        j                          |	rit        t        j                   t        j                   dt        j                          t        t        j                   dt        j                          n<t        t        j                   t        j                   dt        j                          t        t        j
                   d t        j                          t        dt        j2                   dt        j                   dt4         dt        j2                   dt        j                   dt        j                   dt        j                   d       |	rdS d	S )zFonction principalez
--sell-allrF   u  
================================================================
         RESET TRADING SYSTEM v3.2 (anti-orphelins)                           
         Arrêt propre et redémarrage des services               
================================================================
zMode: VENTE TOTALE + RESETrG   z  ERREUR CONNEXION BINANCEu   Actions recommandées:u   
  1. Vérifier votre connexion Internet
  2. Vérifier les clés API dans config.py
  3. Si Testnet: Recharger sur https://testnet.binance.vision/
  4. Si Production: Vérifier votre compte Binance
r   u   [OK] Connexion Binance validéerq   u,   Continuer malgré l'échec de vente? (O/n): r   r5  nr^  r   u,     RESET RÉUSSI - TOUS LES SERVICES ACTIFS !u%     Bot surveillé 24/7 par le watchdogu(     RESET ÉCHOUÉ - Vérifier les erreursz
Dashboard:z http://localhost:z/dashboard.html
zLogs:z dashboard_log.txt

zCommandes utiles:u   
  - Vendre tout: python sell_all.py
  - Vendre + Reset: python Reset_trading.py --sell-all
  - Arrêter tout: python stop_all.py
  - Relancer: python Reset_trading.py
  - Santé: python quick_check.py
r   )r   argvrI   r9   rC   rA   rB   r>   r   r?   r=   r~   r   r0  r  rp  inputrw   rg   r   rJ  rR  rU  r[  rm  r@   rt   )
sell_all_mode
binance_oksell_all_okr   stoppedserver_startedtrading_bot_startedwatchdog_started	verify_oksuccesss
             r   mainr    s1    !CHH,M	 fkk] 
   9&,,rJK )*J6::,xj78fjj\)CFLL>RSXJv||n56 %fll^ 4 	 	Bv||n;FLL>
JKJJqM JJqM &'JJqM (*Bv}}o%QRXR^R^Q_`fhiw}},,.H3

1 !"G 	JJqM ,-N 	JJqM ,-  &'  !I G 
Bv{{mH:fll^
45fll^+WX^XdXdWefgCFLL>RSfjj\)QRXR^R^Q_`a	V[[M(FLL>
23	 Z~%77G HU6<<. !  /	
 
 1Qr   __main__rF   u   Annulé par l'utilisateurr   zErreur fatale: )NN)N)7__doc__r
   r   r/   r~   r   r   r   urllib.requestr   urllib.parseurllib.errorr   r  r   dirnameabspath__file__r   chdirrt   rv   r   r   r%   r7   r9   rL   rP   rR   rT   rV   r   r   r   r   r0  r=  rJ  rR  rU  r[  rm  rp  r  r  r:   exitKeyboardInterruptrI   r>   rB   r{   r   r?   rD   r   r   <module>r     s   
 
        
 WW__RWW__X67
    J
26	+$ 67745aH jZ~B F6r4n"J#LDBDNeP z }'  FB(  6==/!:6<<.IJ 6::,oaS?@s/   C* C7 *C43C479E62E666E11E6