
    i:                     t   d Z ddlZddlZddlZddlZddlmZ ddlmZ ddlm	Z	 ej                  dk(  rhddlZ  ej                  d      ej                  j                  d      e_          ej                  d      ej                  j                  d      e_        ej                   j#                  ej                   j%                  e            Z ej*                  e        G d	 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!$ r7  e"dejF                   dejH                           ej@                  d       Y ye%$ rUZ& e"dejN                   de& ejH                          ddl(Z( e(jR                           ej@                  d       Y dZ&[&ydZ&[&ww xY w)u  
Script de Vente Automatique Complète - VERSION AMÉLIORÉE
========================================================

Fonctionnalités :
- Vend TOUTES les positions (depuis positions.json + vérification Binance)
- Met à jour automatiquement positions.json
- Crée un cooldown global de 5 minutes
- Gère les erreurs et nettoie les positions fantômes
- Évite les interventions manuelles

Usage:
    python sell_all.py              # Vend tout avec confirmation
    python sell_all.py --force      # Vend tout sans confirmation
    N)datetime)Client)BinanceAPIExceptionwin32utf-8strictc                   (    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     ./sell_all.pyr
   r
   &   s%    EF
CDDEDr   r
   c                  
   	 t         j                  j                  dt               ddl} | S # t
        $ rM}t        t        j                   d| t        j                          t        j                  d       Y d}~yd}~ww xY w)zCharge la configurationr   Nu%   ❌ Impossible de charger config.py:    )syspathinsert
SCRIPT_DIRconfig	Exceptionprintr
   r   r   exit)r   es     r   load_configr#   0   s^    :& A!V\\NSTs   ), 	BAA==Bc                    	 t        | j                  | j                  | j                        }|S # t        $ rM}t        t        j                   d| t        j                          t        j                  d       Y d}~yd}~ww xY w)u   Crée le client Binance)testnetu   ❌ Erreur connexion Binance: r   N)r   BINANCE_API_KEYBINANCE_API_SECRETTESTNET_MODEr   r    r
   r   r   r   r!   )r   clientr"   s      r   get_binance_clientr*   <   sj    ..0I0ISYSfSfg :1#fll^LMs   -0 	BABBc                     t         j                  j                  t        d      } t         j                  j	                  |       r.	 t        | dd      5 }t        j                  |      cddd       S i S # 1 sw Y   i S xY w#  i cY S xY w)z*Charge les positions depuis positions.jsonpositions.jsonrr   encodingN)osr   joinr   existsopenjsonload)positions_filefs     r   load_positionsr8   F   ss    WW\\*.>?N	ww~~n%	ncG< $yy|$ $ I	$ I	Is*   B A4(	B 4A>9B >B Bc                 N   t         j                  j                  t        d      }	 t	        |dd      5 }t        j                  | |dd       ddd       y	# 1 sw Y   y	xY w# t        $ r8}t        t        j                   d
| t        j                          Y d}~yd}~ww xY w)z,Sauvegarde les positions dans positions.jsonr,   wr   r.      F)indentensure_asciiNTu&   ❌ Erreur sauvegarde positions.json: )r0   r   r1   r   r3   r4   dumpr   r    r
   r   r   )	positionsr6   r7   r"   s       r   save_positionsr@   R   s    WW\\*.>?N.#8 	BAIIi15A	B	B B1#fll^TUs4   A# AA# A A#  A# #	B$,.BB$c                    g }	 | j                         }| j                         }|D ci c]  }|d   t        |d          }}h d}|d   D ]q  }|d   }||v rt        |d         }	t        |d         }
|	|
z   }|dkD  s4| d	}|j                  |d      }|dkD  sQ||z  }|d
k\  s\|j	                  ||||d       s 	 |S c c}w # t
        $ r9}t        t        j                   d| t        j                          Y d}~|S d}~ww xY w)u   Récupère toutes les positions depuis Binance
    
    🔴 FIX 27/02: Utilise get_all_tickers() en 1 seul appel API
    au lieu de N appels individuels. Le testnet a ~432 assets,
    ce qui causait un timeout de 120s avec l'ancienne méthode.
    symbolprice>(      币安人生   这是测试币U456ARSBNBBRLCOPCZKDAIEURIDRJPYMXNPLNRONTRYUAHUSDZARAEURBETHBUSDETHWEURIFRAXTUSDUSD1USDCUSDEUSDPUSDTWBTCXUSDBFUSDBNSOLFDUSDLDBNBRLUSDWBETHbalancesassetfreelockedr   rc   g      @)rB   quantityrC   
value_usdtu-   ❌ Erreur récupération positions Binance: N)
get_accountget_all_tickersfloatgetappendr   r    r
   r   r   )r)   r?   accountall_tickerst	price_mapIGNORE_ASSETSbalancerm   rn   ro   totalrB   rC   rq   r"   s                   r   get_binance_positionsr~   ^   sS    I(]$$& ,,.=HIQx[%'
"33I	I} z* 	GG$E%)D78,-F6MEqy!7$!fa019!&J "S(!((&,(-%**4	* %	8 K JD  ]I!V\\N[\\]s:   $C C>C  C 
C (C C 	D
.DD
c                    	 | j                  |      }|syd}d}|d   D ](  }|d   dk(  st        |d         }t        |d         } n |yd	t        |      v r5t        t        |      j	                  d
      j                  d	      d         nd}t        |      }t        |||z  z
  |      }||k  rdd| d| dfS | j                  ||      }|j                  dg       }	t        d |	D              }
dd|
dfS # t        $ r(}dd|j                   d|j                   fcY d}~S d}~wt        $ r}dt        |      fcY d}~S d}~ww xY w)zVend une position)FzSymbole invalideNfilters
filterTypeLOT_SIZEstepSizeminQty)FzImpossible de trouver stepSize.0r   Fu   Quantité trop faible (z < ))rB   rp   fillsc              3   V   K   | ]!  }t        |d          t        |d         z   # yw)rC   qtyN)rt   ).0fills     r   	<genexpr>z sell_position.<locals>.<genexpr>   s'     V%W.tE{1CCVs   ')T$.2fz
API Error : )get_symbol_infort   strlenrstripsplitroundorder_market_sellru   sumr   codemessager   )r)   rB   rp   symbol_info	step_sizemin_qtyfilter	precisionorderr   total_valuer"   s               r   sell_positionr      s   ),,V4, 	!), 	Fl#z1!&"45	x 01		 : GJSQZ^F[CI--c288=bABab	?X	%9:IFg3H:S	KKK (( ) 
 		'2&VPUVVqS)*** 9
166("QYYK888 c!f}sF   C= C= !C= A0C= >>C= =	ED)#E)E5EEEc                  h   t         j                  j                  t        d      } t	        j                         dz   }	 t        | dd      5 }t        j                  |dt        j                         j                         d|d	       d
d
d
       t        j                  |      j                  d      }t        t        j                   d| dt        j                           y# 1 sw Y   ]xY w# t"        $ r8}t        t        j$                   d| t        j                           Y d
}~yd
}~ww xY w)u'   Crée une pause de trading de 5 minutesztrading_pause.jsoni,  r:   r   r.   SELL_ALL_MANUAL)paused_untilreason	timestampr;   r<   Nz%H:%M:%Su"   ⏸️  TRADING EN PAUSE jusqu'à z (5 minutes)Tu   ❌ Erreur création pause: F)r0   r   r1   r   timer3   r4   r>   r   now	isoformatfromtimestampstrftimer    r
   r   r   r   r   )
pause_filer   r7   pause_until_strr"   s        r   create_trading_pauser      s    j*>?J99;$L*cG4 	II ,+%\\^557 		 #00>GG
SA/ARR^_e_k_k^lmn	 	  8FLL>JKs0   C0 =C$AC0 $C-)C0 0	D19.D,,D1c                     dt         j                  v } t        dt        j                   t        j
                   dt        j                   d       t        t        j                   dt        j                          t               }|j                  rdnd}t        dt        j                   | t        j                          t        dt        j                   dt        j                          t        |      }t        d	t        j                   d
t        j                          t        dt        j                   dt        j                          t               }t        dt        |       d       t        |      }t        dt        |       d       t!        |j#                               }|j%                  d |D               |s.t        dt        j                   dt        j                          yt        dt        j                   dt        |       t        j                          d}|D ]0  }t        d|d    d|d   dd|d   dd|d   d       ||d   z  }2 |dkD  r0t        dt        j                   d|dt        j                          | st        dt        j                   dt        j                          t'        t        j                   d t        j                         j)                         j+                         }	|	d!k7  r-t        t        j,                   d"t        j                          y#t        dt        j                   d$t        j                          t        t        j
                   d% t        j                          d}
d}d&}t/        |      D ]o  }d}|D ]  }|d   |k(  s|d   } n |dk(  r<t        t        j                   d'| d(t        j                          ||v r||= |d#z  }]t1        |||      \  }}|rpt        t        j                   d)| d*| t        j                          |
d#z  }
	 t3        |j5                  d+d,      j5                  d-d,            }||z  }||v s||= t        t        j,                   d.| d| t        j                          |d#z  }d/|j7                         v sd0|j7                         v s;t        t        j                   d1t        j                          ||v sm||= r t        t        j
                   d% t        j                          t        dt        j                   d2t        j                          t9        i       r-t        d	t        j                   d3t        j                          t        dt        j                   d4t        j                          t;                	 t<        j>                  jA                  tB        d5      }tE        |d6d78      5 }tG        jH                  d9tK        |      tM        jN                         jQ                         d:d;|d<=       d>d>d>       t        t        j                   d?t        j                          t        dt        j
                   dA t        j                          t        t        j                   t        j
                   dBt        j                          t        t        j
                   dA t        j                          t        t        j                   dC|
 dDt        |       t        j                          |dkD  r:t        t        j                   dE| dDt        |       t        j                          t        t        j                   dF|dt        j                          	 |jU                         }|dG   D ]X  }|dH   dIk(  st3        |dJ         t3        |dK         z   }t        t        j                   dL|dt        j                           n t        t        j
                   dA t        j                   d       |
t        |      k(  r-t        t        j                   dMt        j                          yt        t        j                   dNt        j                          y#  Y _xY w# 1 sw Y   xY w# tR        $ r9}t        t        j                   d@| t        j                          Y d>}~d>}~ww xY w#  Y xY w)OzFonction principalez--force
u   ================================================================
    VENTE AUTOMATIQUE COMPLÈTE - Version Améliorée
================================================================z![1/6] Chargement configuration...TESTNET
PRODUCTIONz      Mode: u   [2/6] Connexion à Binance...z      u   ✓ Connectéu%   [3/6] Récupération des positions...z      positions.json: z
 positionsz      Binance: u    positions (≥5 USDT)c              3   &   K   | ]	  }|d      yw)rB   Nr   )r   poss     r   r   zmain.<locals>.<genexpr>   s     Bs8}Bs   u!   ℹ️  Aucune position à vendrer   u   Total positions à traiter: u
         • rB   r   rp   z.4fu    × $rC   z = $rq   r   u   Valeur totale estimée: $u4   ⚠️  Confirmer la vente de TOUTES les positions ?z   Taper 'OUI' pour continuer: OUIu   ❌ Annulér   z[4/6] Vente des positions...u   ────────────────────────────────────────────────────────────g        u   ⚠️  u1   : Position fantôme (0 sur Binance), nettoyage...u   ✓ z: Vendu pour r    ,u   ✗ insufficientu   quantité trop faibleu!     → Nettoyage position fantômeu$   [5/6] Mise à jour positions.json...u4   ✓ positions.json vidé complètement (0 positions)u    [6/6] Création pause trading...zsell_all_signal.jsonr:   r   r.   SELL_ALLzsell_all.py)actionsymbolsr   sourcer;   r   Nu9   ✓ Signal sell_all envoyé au bot (sell_all_signal.json)u2   ⚠️ Impossible de créer sell_all_signal.json: u   ════════════════════════════════════════════════════════════u   RÉSUMÉu   ✓ Positions vendues: /u   ⚠️ Échecs/Nettoyages: u   💰 Valeur récupérée: $rl   rm   rc   rn   ro   u   💵 Solde USDT final: $u9   ✅ Toutes les positions ont été vendues avec succès !uP   ⚠️  Certaines positions n'ont pas pu être vendues (voir détails ci-dessus))+r   argvr    r
   r   r   r   r   r#   r(   r   r*   r   r8   r   r~   setkeysupdateinputstripupperr   sortedr   rt   replacelowerr@   r   r0   r   r1   r   r3   r4   r>   listr   r   r   r   rr   )forcer   moder)   local_positionsbinance_positionsall_symbolsr   r   response
sold_countfailed_counttotal_recoveredrB   rp   successresultvaluesignal_filer7   r"   rw   r|   
usdt_totals                           r   mainr      s   !E	 fkk] AAG O  
V[[M:6<<.
IJ]F++9D	Lvfll^
<= 
Bv{{m8
GH'F	F6<<.fll^
<= 
Bv{{m@
OP %&O	"3#7"8

CD .f5	OC 1233I
JK o**,-KB0ABB6==/!B6<<.QR	Bv{{m7K8H7I&,,
XY K  )
3x=/C
OC+@c'lSVEWW[\_`l\mnq[rsts<(() Q6;;-8S8I&,,XY 6==/!UV\VbVbUcdeFMM?*I&,,XY__aggiuVZZLFLL>:; 
Bv{{m7~
FG	V[[M*fll^
45JLO% (0$ 	C8}&z?	
 q=V]]O8F83dekeqeqdrst(#F+AL (AV\\N$vhmF8FLL>RS!OJfnnS"5==c2FG5(
 (#F+VZZLVHBvhv||nEFAL /3Jflln3\'HWX_,'/Q(0T 
V[[M*fll^
45 
Bv{{m?~
NO bv||n$XY_YeYeXfgh	Bv{{m;FLL>
JKeggll:/EF+sW5 	II$,%\\^557'	
 	 	WX^XdXdWefg
 
Bv{{mJ<~
67	V[[M&++hv||n
=>	V[[M*fll^
45	V\\N1*Qs;?O>PQWQ]Q]P^
_`a:<.#kJZI[\b\h\h[ijk	V[[M4_S4I&,,
XY$$&z* 	Gw6)"76?3eGH<M6NN
%=j=Mfll^\]		 
V[[M*fll^2
67S%%WX^XdXdWefgopvp|p|o}~QB	 	  eQRSQTU[UaUaTbcdde(sP   0c%22c: $Ac-+4c:  d?  Ad? %c*-c72c: :	d<.d77d<?e__main__r   u   ❌ Annulé par l'utilisateurr   u   ❌ Erreur fatale: )*__doc__r0   r   r4   r   r   binance.clientr   binance.exceptionsr   platformcodecs	getwriterstdoutbufferstderrr   dirnameabspath__file__r   chdirr
   r#   r*   r8   r@   r~   r   r   r   r   r!   KeyboardInterruptr    r   r   r   r"   r   	traceback	print_excr   r   r   <module>r      s    
 
    ! 2 <<7*!!!'*3::+<+<hGCJ*!!!'*3::+<+<hGCJ WW__RWW__X67
   			2j+\*eP z	   6==/!>v||nMN 6::,1!V\\NCD		s   
D# #9F7F7"AF22F7