
    i5>                       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
m
Z
mZ ddlmZ ddlZddlZej"                  j%                  ej"                  j'                  e            Zej"                  j-                  de       	 ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z" dZ&d	Z'ere'ne&Z(e&Z)d
Z*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:dZ;dZ<dZ=dZ>ej"                  j                  ed      Z@ej"                  j                  ed      ZAej"                  j                  ed      ZBej"                  j                  ed      ZCh d ZDd!ZE ej                  ej                  d"d#$        ej                  d%      ZI ej                  ej"                  j                  ed&      d'(      ZKeKj                   ej                  d"             eIj                  eK        G d) d*      ZO G d+ d,      ZP G d- d.      ZQ G d/ d0      ZR G d1 d2      ZS G d3 d4      ZTd5 ZUeVd6k(  r eU        yy# e#$ r  e$d        ejJ                  d       Y w xY w)7u  
═══════════════════════════════════════════════════════════════════════════════
🕵️ MARKET SPY - Scanner indépendant de tout le marché crypto
═══════════════════════════════════════════════════════════════════════════════

Script espion qui balaye TOUTES les paires USDT du marché Binance
(pas seulement les 58 de la watchlist) pour détecter des opportunités
exceptionnelles en temps réel.

FONCTIONNEMENT:
  1. Scan rapide de TOUTES les paires USDT (1 seul appel API)
  2. Filtrage intelligent: volume, variation, exclusion watchlist
  3. Analyse technique approfondie des meilleurs candidats (RSI, BB, momentum)
  4. Scoring et détection de patterns (CREUX, SQUEEZE, BREAKOUT)
  5. Achat automatique si opportunité exceptionnelle (score ≥ 85)
  6. Coordination avec le bot principal via positions.json

USAGE:
  python market_spy.py                 # Mode scan continu (défaut)
  python market_spy.py --once          # Un seul scan puis quitte
  python market_spy.py --dry-run       # Scan sans acheter
  python market_spy.py --min-score 70  # Score minimum personnalisé
  python market_spy.py --top 20        # Analyser top 20 au lieu de 10

Auteur: Bot Trading System
═══════════════════════════════════════════════════════════════════════════════
    N)datetime	timedelta)	urlencode)BINANCE_API_KEYBINANCE_API_SECRETTESTNET_MODEMAX_OPEN_POSITIONSMIN_ORDER_SIZEMAX_ORDER_SIZESTOP_LOSS_PERCENTTAKE_PROFIT_PERCENTTRAILING_STOP_DISTANCETRAILING_STOP_ACTIVATIONENABLE_TRAILING_STOPuE   ❌ Impossible de charger config.py - vérifiez que le fichier existe   zhttps://api.binance.comzhttps://testnet.binance.visioni        @g      .@P  gMbP?T   5m1hd   0   P      >   ?gffffff?<   皙?zpositions.jsonzwatchlist.jsonzespion_opportunities.jsonzespion_trades.json>	   DAIUSDTEURUSDTGBPUSDTBUSDUSDTTUSDUSDTUSDCUSDTUSDPUSDTUSTCUSDT	FDUSDUSDTBTCUSDTz%(asctime)s [SPY] %(message)s%H:%M:%S)levelformatdatefmt
market_spyzmarket_spy.logutf-8encodingc                   T    e Zd ZdZdZdZd Zd Zd ZddZ	ddZ
d	 Zdd
Zd Zd Zy)SpyApiClientu(   Client API léger pour le scanner espionr   c                     t         | _        t        | _        t	        j
                         | _        | j                  j                  j                  d| j                  i       | j                          y )NzX-MBX-APIKEY)
r   api_keyr   
api_secretrequestsSessionsessionheadersupdate_sync_server_timeselfs    ./market_spy_v2_backup.py__init__zSpyApiClient.__init__   sM    &,'')##^T\\$BC     c                 >   	 | j                   j                  t         dd      }|j                         d   }t	        t        j
                         dz        }||z
  t        _        t        j
                         t        _        y# t        $ r dt        _        Y yw xY w)z-Synchronise l'horloge avec le serveur Binancez/api/v3/time   )timeout
serverTime  r   N)
r8   getTRADING_APIjsoninttimer2   TIME_OFFSET
_last_sync	Exception)r=   respserver_time
local_times       r>   r;   zSpyApiClient._sync_server_time   s~    	)<<##{m<$@!#LD))+l3KTYY[4/0J'2Z'?L$&*iikL# 	)'(L$	)s   BB BBc                     t        |      }t        j                  | j                  j	                  d      |j	                  d      t
        j                        j                         }|S )u   Signe une requête HMAC SHA256r.   )r   hmacnewr5   encodehashlibsha256	hexdigest)r=   paramsquery_string	signatures       r>   _signzSpyApiClient._sign   sU     (HHOO""7+(NN
 )+	 	
 r@   Nc                 \   	 | j                   j                  ||d      }|j                         }t        |t              r>|j                  dd      dk  r)t
        j                  d|j                  dd              y|S # t        $ r"}t
        j                  d	|        Y d}~yd}~ww xY w)
u$   Requête publique (pas de signature)r   rX   rC   coder   zAPI error: msgunknownNu   Requête échouée: )	r8   rF   rH   
isinstancedictloggerwarningrM   error)r=   urlrX   rN   dataes         r>   
public_getzSpyApiClient.public_get   s    		<<##C#CD99;D$%$((61*=*ATXXeY-G,HIJK 	LL/s34	s   A;B  >B   	B+	B&&B+c                    |i }t        j                          t        j                  z
  dkD  r| j                          t	        t        j                          dz        t        j
                  z   |d<   d|d<   | j                  |      |d<   t         | }	 |dk(  r| j                  j                  ||d	
      }n%|dk(  r| j                  j                  ||d	
      }ny|j                         }t        |t              r|j                  d      dv rt        j                  d       | j                          t	        t        j                          dz        t        j
                  z   |d<   |j!                  dd       | j                  |      |d<   |dk(  r| j                  j                  ||d	
      }n| j                  j                  ||d	
      }|j                         }t        |t              r=|j                  dd      dk  r(t        j#                  d|j                  d              y|S # t$        $ r"}t        j#                  d|        Y d}~yd}~ww xY w)u   Requête signée (pour ordres)Ni,  rE   	timestampi'  
recvWindowrZ   GETr   r]   POSTr^   )iiu!   ⏰ Re-synchronisation horloge...r   u   API signée error: r_   u   Requête signée échouée: )rJ   r2   rL   r;   rI   rK   r[   rG   r8   rF   postrH   ra   rb   rc   infopopre   rM   )r=   methodendpointrX   rf   rN   rg   rh   s           r>   signed_requestzSpyApiClient.signed_request   s   >F 99;00036""$!$))+"458P8PP{$|"jj0{hZ(	||''FB'G6!||((VR(H99;D $%$((6*:n*L?@&&(&)$))+*<&=@X@X&X{#

;-&*jj&8{#U?<<++C+KD<<,,S,LDyy{$%$((61*=*A2488E?2CDEK 	LL7s;<	s&   AH1 EH1 /H1 1	I:IIc                 &    | j                  dd      S )u   Récupère le compterm   z/api/v3/accountrt   r<   s    r>   get_accountzSpyApiClient.get_account   s    ""5*;<<r@   c                     | j                         }|r/|j                  dg       D ]  }|d   |k(  st        |d         c S  y)u   Récupère le solde d'un assetbalancesassetfreer   )rw   rF   float)r=   rz   accountbs       r>   get_balancezSpyApiClient.get_balance   sM    ""$[[R0 ,W:& 6++, r@   c                 :    |dd|dd}| j                  dd|      S )z!Achat market avec montant en USDTBUYMARKET.2f)symbolsidetypequoteOrderQtyrn   z/api/v3/orderrv   )r=   r   usdt_amountrX   s       r>   
market_buyzSpyApiClient.market_buy   s3      +C0	
 ""6?FCCr@   c                 x    | j                  t         dd|i      }|rd|v rt        |d         dkD  r|d   d   S y)u2   Récupère les infos du symbole (précision, etc.)z/api/v3/exchangeInfor   symbolsr   N)ri   rG   len)r=   r   rg   s      r>   get_symbol_infozSpyApiClient.get_symbol_info  sL    +.BChPVEWXI%#d9o*>*B	?1%%r@   N)USDT)__name__
__module____qualname____doc__rK   rL   r?   r;   r[   ri   rt   rw   r   r   r    r@   r>   r2   r2      s>    2KJ!	).`=Dr@   r2   c                       e Zd ZdZedd       Zedd       Zed        Zedd       Zedd       Z	edd       Z
edd       Zedd	       Zedd
       Zedd       Zy)SpyIndicatorsz2Calcul rapide d'indicateurs techniques pour le spyc                    t        |       |dz   k  ryt        j                  | t              } t        j                  |       }t        j
                  |dkD  |d      }t        j
                  |dk  | d      }t        j                  || d       }t        j                  || d       }|dk(  r|dk(  ry|dk(  ry|dk(  ry||z  }ddd|z   z  z
  S )	zRSI classiquer   g      I@dtyper   Ng     Q@g      >@r   )r   nparrayr|   diffwheremean)pricesperioddeltasgainslossesavg_gainavg_lossrss           r>   rsizSpyIndicators.rsi  s     v;!#&.!VQ/&1*vgq1775&?+7766'(+,q=X]q=q= cQVn%%r@   c                    t        |       |k  ryt        j                  | | d t              } t        j                  |       }t        j
                  |       }|||z  z   }|||z  z
  }| d   }||z
  }|dkD  r||z
  |z  nd}	||||	fS )u@   Bollinger Bands → retourne (upper, middle, lower, bb_position))NNN      ?Nr   r   r   )r   r   r   r|   r   std)
r   r   std_devmiddler   upperlowercurrentbb_widthbb_positions
             r>   bollinger_bandszSpyIndicators.bollinger_bands*  s     v;(&&*%8ffVn3&3&*5=6>lw(2fe[00r@   c                     t        |       |k  rt        |       dkD  r| d   S dS t        j                  | t              } d|dz   z  }| d   }| dd D ]  }||z
  |z  |z   } |S )zMoyenne mobile exponentieller   r   r   r   r   N)r   r   r   r|   )r   r   
multiplierema_valps        r>   emazSpyIndicators.ema<  s}     v;!$Vq6":7a7&.FQJ'
) 	;A7{j07:G	;r@   c                 d    t        |       |dz   k  ry| |dz       }| d   }|dk(  ry||z
  |z  dz  S )u   Variation en % sur N périodesr   r   r   r   )r   )r   periodsoldrS   s       r>   momentumzSpyIndicators.momentumI  sN     v;1$w{^$Rj!8sc!S((r@   c                 z    t        |       |dz   k  ryt        j                  | | dz
  d       }|dk(  ry| d   |z  S )z0Ratio du volume actuel vs moyenne des N derniersr         ?r   r   )r   r   r   )volumeslookbackavg_vols      r>   volume_spikezSpyIndicators.volume_spikeT  sK     w<(Q,&'''8)a-34a<r{W$$r@   c                    t        |      |dz   k  ryt        j                  | | dz
  d t              } t        j                  || dz
  d t              }t        j                  || dz
  d t              }t        j                  | dd |dd z
  t        j                  t        j
                  | dd |dd z
        t        j
                  |dd |dd z
                    }t        j                  |      S )zAverage True Ranger   r   Nr   r   )r   r   r   r|   maximumabsr   )highslowsclosesr   trs        r>   atrzSpyIndicators.atr^  s     v;!#wqyz*%8xxfWQYZ(6&&,E:ZZ!"IQR JJuQRy6#2;./tABx&"+-.
 wwr{r@   c                    t        |       ||z   k  ryt        j                  | |      }t        j                  | |      }||z
  }g }t        |dz         D ]h  }t        |       |z
  dz
  |z   }	|	|k\  st        j                  | d|	dz    |      }
t        j                  | d|	dz    |      }|j	                  |
|z
         j t        |      |k\  rt        j                  ||      n|}||z
  }|||fS )z!MACD (trend direction + momentum))r   r   r   r   N)r   r   r   rangeappend)r   fastslowsignalema_fastema_slow	macd_linemacd_historyiidxefessignal_line	histograms                 r>   macdzSpyIndicators.macdp  s
    v;& $$VT2 $$VT2x'	 vz" 	-Af+&*Q.Cd{"&&vfs1u~t<"&&vfs1u~t<##BG,	- BE\ARV\A\m''f=bk+	+y00r@   c                     t        |      |k  rt        |      }| | d }|| d }t        |      }t        |      }|d   }|dkD  r||z
  |z  dz  nd}	|dkD  r||z
  |z  dz  nd}
|||	|
fS )u.   Détecte le support et la résistance récentsNr   r   r     )r   minmax)r   r   r   r   recent_lowsrecent_highssupport
resistancer   dist_supportdist_resistances              r>   support_resistancez SpyIndicators.support_resistance  s     v;!6{HH9:&hYZ(k"&
*@G!7*g5;QTFMPQkJ0G;cAWX
L/AAr@   c           	          d}t        dt        |dz   t        |                   D ]  }| | dz      | |    kD  r|dz  } |S  |S )u<   Compte les bougies consécutives vertes (haussières) en finr      r   )r   r   r   )r   	max_checkcountr   s       r>   consecutive_greenzSpyIndicators.consecutive_green  s^     q#i!mS[9: 	Aqbd|faRj(
	
 r@   c                 F   t        |       |k  rt        |       }t        j                  | | d t              }t        j                  || d t              }t        j                  |      }|dk(  ryt        j                  ||z        |z  }|dkD  r| d   |z
  |z  dz  S dS )z$Position du prix par rapport au VWAPNr   r   r   r   )r   r   r   r|   sum)r   r   r   cv	total_volvwaps          r>   price_vs_vwapzSpyIndicators.price_vs_vwap  s     v;[FHHVVGH%U3HHWfWX&e4FF1I	>vva!e}y(59AXd"d*S0D1Dr@   N)   )   r   )   )r   )      	   )   )
   )r   r   r   r   staticmethodr   r   r   r   r   r   r   r   r   r   r   r@   r>   r   r     s    <& &* 1 1" 
 
 ) ) % %  " 1 1* B B   
E 
Er@   r   c                        e Zd ZdZed        Zy)MultiTimeframeAnalyzeruG   Analyse la tendance sur timeframe lent (1h) pour confirmer les entréesc           
         t        |       dk  r	dddddddS t        j                  |       }t        j                  | d      }t        j                  | d      }|dkD  r||z
  |z  dz  nd}t        j	                  | d	      }t        j                  |       \  }	}	}
d}|d
kD  r|dz  }n&|dkD  r|dz  }n|dkD  r|dz  }n|dkD  r|dz  }n|dz  }d|cxk  rdk  r	n n|dz  }n8d|cxk  rdk  r	n n|d	z  }n$|dk  r|dz  }nd|cxk  rdk  r	n n|d	z  }n|dz  }|dkD  r|dz  }n&|dkD  r|dz  }n|dkD  r|dz  }n|dkD  r|dz  }n|dz  }t        |
t        t        f      r|
dkD  r|dz  }n|dz  }t        dt        d|            }|dk\  rd}n|dk\  rd}n|dk\  rd}n
|dk\  rd}nd}||t        |d       t        |d!      t        |d!      t        |
t        t        f      rt        |
d"      dS ddS )#u  
        Analyse la tendance H1 et retourne un score de -100 (bear) à +100 (bull).
        
        Returns:
            dict: {
                'trend_score': float,     # -100 à +100
                'trend_label': str,       # STRONG_BULL, BULL, NEUTRAL, BEAR, STRONG_BEAR
                'h1_rsi': float,
                'h1_ema_trend': float,    # EMA9 vs EMA21 en %
                'h1_momentum': float,     # Momentum 5 périodes
                'h1_macd_hist': float,
            }
        r   r   UNKNOWN2   )trend_scoretrend_labelh1_rsih1_ema_trendh1_momentumh1_macd_histr      r   rB   r   r   r   gɿ      (   r   r   F   r   r   r         g       iSTRONG_BULLBULLiNEUTRALiBEARSTRONG_BEARr   r      )r   r   r   r   r   r   ra   rI   r|   r   r   round)	closes_h1highs_h1lows_h1
volumes_h1rsi_h1ema9ema21	ema_trendmom5_	macd_histscorelabels                r>   analyze_trendz$MultiTimeframeAnalyzer.analyze_trend  si    y>B aST 
 ""9-  A.!!)R06;aidUle+c1Q	%%i3',,Y71i  s?RKE_RKEQJERKERKE 2RKE6BQJEb[RKE&BQJERKE #:RKECZRKED[QJED[RKERKE i#u.1} D#c5/* B;!Eb[Ec\Ec\E!E ! FA&!)Q/ q>3=i#u3VE)Q/
 	
 ]^
 	
r@   N)r   r   r   r   r   r   r   r@   r>   r   r     s    Q_
 _
r@   r   c                        e Zd ZdZed        Zy)MarketRegimeFilteru-   Vérifie le régime global du marché via BTCc                    	 | j                  t         dt        ddd      }|rt        |      dk  rdi fS |D cg c]  }t	        |d          }}t
        j                  |      }t
        j                  |d      }t
        j                  |d	      }|d
kD  r||z
  |z  dz  nd
}t
        j                  |d      }t
        j                  |d      }	t        |d      t        |d      t        |d      t        |	d      |d   d}
|dk  r	|	dk  rd|
fS |dk  s|	dk  rd|
fS |dkD  r	|	dkD  rd|
fS d|
fS c c}w # t        $ r&}t        j                  d|        di fcY d}~S d}~ww xY w)u   
        Analyse BTC pour déterminer le régime marché.
        Returns: 'BULLISH', 'NEUTRAL', 'BEARISH', 'STRONG_BEARISH'
        /api/v3/klinesr   r   r   intervallimit   r  r   r   r  r   r   r   r   r   )
btc_rsi_h1btc_ema_diff
btc_mom_4hbtc_mom_24h	btc_pricer  STRONG_BEARISH333333ӿBEARISHr   BULLISHzErreur check BTC regime: N)ri   SCAN_API
BTC_SYMBOLr   r|   r   r   r   r   r  rM   rc   rd   )clientklineskr   r   r  r  ema_diffmom_4hmom_24hrp   rh   s               r>   check_btc_regimez#MarketRegimeFilter.check_btc_regime  s   %	!&&*N+%4"EF S[2- "}$+12aeAaDk2F2##F+C $$VQ/D!%%fb1E9>.4H"++FA6F#,,VR8G $Cm %h 2#FA.$Wa0#BZD $7R<'--DGbL $&CGaK $& $&3 36  	!NN6qc:;b= 	!sF   4D7 D7 D2CD7 D7  D7 .D7 2D7 7	E& E!E&!E&N)r   r   r   r   r   r<  r   r@   r>   r"  r"    s    7*! *!r@   r"  c                   "    e Zd ZdZedd       Zy)SpyPatternDetectoru2  
    Détection de patterns v2 - BEAUCOUP plus sélectif.
    
    Critères v1 vs v2:
    - v1 SQUEEZE: bb_width < 3%, mom3 > 0.1% → TROP PERMISSIF (tout passait)
    - v2 SQUEEZE: bb_width < 1.5%, mom3 > 0.3%, vol_spike > 1.5, RSI < 60 → STRICT
    
    - v1: pas de filtre overbought → achetait BB=1.17 (au-dessus des bandes!)
    - v2: BB position max 0.70, RSI max 62 → JAMAIS acheter en haut
    
    - v1: pas de confirmation volume → achetait VolSpike=0.08 (volume mort)
    - v2: VolSpike minimum 1.3 → VOLUME OBLIGATOIRE pour confirmer
    Nc                    t        |       dk  rddg i dS t        j                  |       }t        j                  |       \  }}}}	t        j	                  | d      }
t        j	                  | d      }t        j	                  | t        dt        |                   }t        j                  | d      }t        j                  | d	      }t        j                  | d
      }t        j                  |      }t        j                  |||       }t        j                  |       \  }}}t        j                  |||       \  }}}}t        j                  |       }t        j                  | |      }| d   }|dkD  r|
|z
  |z  dz  nd}|dkD  r||z
  |z  dz  nd}t        j	                  | dd d      }|dkD  r|
|z
  |z  dz  nd}|r|dkD  r||z
  |z  dz  nd}i dt        |d      dt        |	d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |t        t         f      rt        |d      nddt        |d      d t        |d      d!|d"t        |d      d#|} |r| j#                  |       g }!g }"d$}#g }$|t$        kD  rd%}#|$j'                  d&|d'd(t$         d)       |	t(        kD  rd%}#|$j'                  d*|	d+d(t(         d)       |d,k  rd%}#|$j'                  d-|d+d)       |d.k  r|dk  rd%}#|$j'                  d/|d0d1       |r;|j+                  d2d      d3k  r&d%}#|$j'                  d4|j+                  d5       d)       |#s|$| d6<   d7d|$| |$d8S d}%g }&|	d9k  r~|d:k  rx|d;kD  rrd<}%|&j'                  d=       |dk  r|%d>z  }%|&j'                  d?       n|d@k  r|%dAz  }%|&j'                  dB       |dCkD  r|%dAz  }%|&j'                  dD       n
|dkD  r|%d	z  }%|dEkD  r|%dFz  }%|&j'                  dG       n|dHkD  r|%dIz  }%|&j'                  dJ       |d,kD  r|%d
z  }%|&j'                  dK       n
|dLkD  r|%d	z  }%|dEk  r|%dIz  }%|&j'                  dM       t        |t        t         f      r|dkD  r|%d	z  }%|&j'                  dN       |r+|j+                  d2d      dk\  r|%d
z  }%|&j'                  dO       t        |&      dk\  r|"j'                  dPt        |%d      |&f       d}'g }(|r|r|dEk  r|d9kD  r|t,        kD  rd<}'|(j'                  dQ       |dRk  r|'dSz  }'|(j'                  dT       n|dUk  r|'d
z  }'|(j'                  dV       |dWkD  r|'dSz  }'|(j'                  dX       n7|dEkD  r|'dAz  }'|(j'                  dY       n|dUkD  r|'dz  }'|(j'                  dZ       |dRkD  r|'dAz  }'|(j'                  d[       n|d,kD  r|'d\z  }'|(j'                  d]       d<|cxk  rd^k  rn n|'dIz  }'|(j'                  d_       n
|d<k  r|'d	z  }'|dkD  r|dkD  r|'dIz  }'|(j'                  d`       t        |t        t         f      r|dkD  r|'d	z  }'|(j'                  da       |r+|j+                  d2d      dkD  r|'dIz  }'|(j'                  db       t        |(      dk\  r|"j'                  dct        |'d      |(f       d})g }*|ddkD  rdL|	cxk  rdek  rn nd<|cxk  rdfk  rn n|dgkD  rd<})|*j'                  dh       |
dkD  rt/        ||
z
  |
z  dz        nd}+|+d9k  r|)dFz  })|*j'                  di       n|+djk  r|)dIz  })|*j'                  dk       t        |       dlkD  rt        j	                  | ddm d      n|},|,dkD  r||,z
  |,z  dz  nd}-|-dnkD  r|)dAz  })|*j'                  do       |djk  r|)dIz  })|*j'                  dp       |ddkD  r|dk\  r|)dAz  })|*j'                  dq       n
|dkD  r|)d	z  })t        |t        t         f      r|dkD  r|)d	z  })|*j'                  dr       |r,|j+                  d2d      dFk\  r|)dAz  })|*j'                  ds       n|r|j+                  d2d      dk\  r|)d	z  })t        |*      dk\  r|"j'                  dtt        |)d      |*f       d}.g }/|dWkD  r&|d,kD  r |duk  rdv}.|/j'                  dw       |dxkD  r|.dFz  }.|/j'                  dy       n|dzkD  r|.d
z  }.|/j'                  d{       |dUkD  r|.dFz  }.|/j'                  d|       n
|djkD  r|.dIz  }.|dWkD  r|.dIz  }.|/j'                  d}       |dk  r|.dIz  }.|/j'                  d~       |dkD  r|.d	z  }.|/j'                  d       |r+|j+                  d2d      dk\  r|.dIz  }.|/j'                  d       t        |/      dk\  r|"j'                  dwt        |.d      |/f       d}0g }1|dk  r|d9kD  r|dk  r	dv}0|1j'                  d       |dk  r|0dSz  }0|1j'                  d       n|dk  r|0d
z  }0|1j'                  d       |dkD  r|0dAz  }0|1j'                  d       |dk\  r|0dAz  }0|1j'                  d       n|dk\  r|0d\z  }0|1j'                  d       |	ddk  r|0d
z  }0|1j'                  d       n
|	dLk  r|0d	z  }0|dUk  r|0dIz  }0|1j'                  d       t        |1      dk\  r|"j'                  dt        |0d      |1f       d}2g }3|dkD  r||z  dz  nd}4|4dUk  r|dUkD  r|dk  r
t/        |      dEk  rd<}2|3j'                  d       |dkD  r|2dFz  }2|3j'                  d       n
|dkD  r|2dIz  }2|d9kD  r|dkD  r|2dFz  }2|3j'                  d       n
|ddkD  r|2d	z  }2dv|cxk  rd^k  rn n|2d
z  }2|3j'                  d       |dkD  r|2dIz  }2|3j'                  d       |r+|j+                  d2d      dk\  r|2dIz  }2|3j'                  d       t        |3      dk\  r|"j'                  dt        |2d      |3f       |"sdd|!| dS |"j1                  d d$       |"d   \  }5}6}7t        |"      dk\  rEt        t        |"      dz  d
      }8t        |6|8z   d      }6|7j'                  dt        |"       d       |5|6|7| |"D 9:cg c]
  \  }9}:}|9|:f c}}:}9t        |7      dS c c}}:}9w )u   
        Analyse les données et retourne le meilleur pattern détecté.
        Inclut maintenant des filtres qualité stricts.
        r   INSUFFICIENT_DATAr   )patternr  signals
indicatorsr   r  r   r   rB   r   r   r   Nr   r   r   r   r   r   r9  	ema_sloper   price_vs_ema50
momentum_3
momentum_5momentum_10r   r   r  macd_histogramr   r   green_candlesvwap_positionpriceTFzRSI_TOO_HIGH(.0f>)zBB_TOO_HIGH(r   r   zVOLUME_DEAD(g      zFREEFALL(m10=.1f%)r  izH1_BEAR(r  quality_rejectionQUALITY_REJECTED)rA  r  rB  rC  quality_flagsg333333?-   g?#   BB_LOW_ZONEr   RSI_DEEPLY_OVERSOLD&   r   RSI_OVERSOLDg{Gz?EMA_TURNING_UPr   r   STRONG_VOLUME_CONFIRMr      VOLUME_CONFIRMGOOD_BOUNCE_MOMENTUMr   NEAR_SUPPORTMACD_BULLISHH1_TREND_OKCREUX_REBOUNDSQUEEZE_DETECTEDr      EXTREME_SQUEEZE      ?TIGHT_SQUEEZEg      @VOLUME_EXPLOSIONSTRONG_VOLUMEVOLUME_RISINGEXPLOSIVE_MOMENTUM   GOOD_MOMENTUM7   RSI_OPTIMALEMA_BULLISHMACD_POSITIVE
H1_BULLISHSQUEEZE_BREAKOUTg?皙?:   r0  PULLBACK_ZONETOUCHING_EMA9g?	NEAR_EMA9r(  r.  g{Gz?TREND_INTACTLOW_SELL_VOLUMEBOUNCE_CONFIRMEDMACD_STILL_BULLISHH1_CONFIRMS_UPTRENDPULLBACKr   r	  VOLUME_BREAKOUTg      @EXTREME_VOLUME_5X      @	VOLUME_4XSTRONG_PRICE_MOVEROOM_TO_RUNRSI_HEALTHY
ABOVE_VWAPH1_NOT_BEARg          DIP_REVERSAL   EXTREME_OVERSOLD   DEEPLY_OVERSOLD      @CAPITULATION_VOLUMESTRONG_BOUNCE_3_GREENBOUNCE_2_GREENBELOW_BANDS
AT_SUPPORTREVERSAL_DIPACCUMULATION_ZONEACCUMULATION_VOLUMEg?BREAKOUT_STARTINGRSI_NEUTRAL_READYH1_OKACCUMULATION
NO_PATTERNc                     | d   S )Nr   r   xs    r>   <lambda>z+SpyPatternDetector.detect.<locals>.<lambda>  s
    !A$ r@   keyreverseCONFLUENCE_	_PATTERNS)rA  r  rB  rC  all_patternsnum_confirmations)r   r   r   r   r   r   r   r   r   r   r   r   r   r  ra   rI   r|   r:   SPY_MAX_RSIr   SPY_MAX_BB_POSITIONrF   SPY_MIN_VOLUME_SPIKEr   sort);r   r   r   r   
trend_datar   r   r   r   bb_posr  r  ema50mom3r  mom10	vol_spiker   r  r  r   r   r   r   rJ  vwap_poscurrent_pricer9  rE  	ema9_prevrD  r   rC  rB  patterns_found
quality_okrT  creux_scorecreux_signalssqueeze_scoresqueeze_signalspullback_scorepullback_signalsprice_vs_ema9
ema21_prevema21_slopevb_score
vb_signals	dip_scoredip_signals	acc_scoreacc_signalsatr_pctbest_pattern
best_scorebest_signalsconfluence_bonusr   ss;                                                              r>   detectzSpyPatternDetector.detect`  s    v;2Q2]_`` ''4'D'DV'L$vuf  +!!&"-!!&#b#f+*>?%%fa0%%fa0&&vr2!..w7	tV4',,V41i=J=]=]^bdikq=r:\?%77? ..vw?r
5:QYTE\U*c1ADIAI=50E9C?ST "%%fSbk15	>G!mdY&)3c9QR	 8>&1*UU]f,s2RU
5a=
5+
 h*
 h*	

 y!,
 eNA6
 %a.
 %a.
 5?
 E)Q/
 5a=
 Z	CQV<5XeIq1^_
 E,2
 u_a8
 ]
  U8Q/!
" ]#

* j) 
 J  =S	;-q!IJ ''J  <s|1=P<QQR!ST s?J  <	#a!@A 4<D1HJ  =s2!>? *..:S@J  8JNN=,I+J!!LM.;J*+-((!.  D=S2X$+K  / Rxr!$$%:;rr!$$^4 4r!$$%56Qq  3r!$$%<=Sq $$%56 czr!$$%;<q  c!q $$^4 )c5\2y1}q $$^4 jnn]A>!Cr!$$]3=!Q&%%K8M}&]^ Ux#~czi*>> "&&'9: c>!R'M#**+<=^!R'M#**?; s?!R'M#**+=>_!R'M#**?;_!Q&M#**?; #:!R'M#**+?@CZ!Q&M#**?; ??!Q&M#**=92X!Q&M a<IM!Q&M#**=9 i#u69q=!Q&M#**?; *.."BQ"F!Q&M#**<8'1,"))+=s=RU?VXg*hi c>df44SB4$;!# ''8 MQSTH]T%9T$AC$G HZ] 3&"b(N$++O<"S("a'N$++K8 DGv;QSCS]..vcr{B?Y^
KUXY>
 2j@3F_`%"b(N$++N; s?"a'N$++,=> #:-1"4"b(N$++,>?AX"a'N i#u69q="a'N$++,@A *.."Bb"H"b(N$++,ABJNN=!$D$I"a'N'(A-")):s>37OQa*bc 
s?tczcBhH/03B!!"56SB!!+. czB!!"56A $A!!-0 RxA!!-0 !|A!!,/jnn]A>!CA!!-0:!#%%'8#h:Lj&YZ 	$;4#:#(I~.RxR	""#56rR	""#45 3R	""#89 !R	""#:;!#Q	""#34 }R	""=1$Q	 c!Q	""<0;1$%%~s9c7JK&XY 	 2?1B3&,S=Y_#~#e*s"2	""#67 s?OI&&'<=_NI #:)a-OI&&':;CZNI ??OI&&':; a<NI&&|4 *.."Ba"GNI&&w/{#q("))>3y#;NP[*\]
 '"(	  	=1?1B.j, ~!#"3~#6#:B?Z*::C@J+c..A-B) LM $#$3ABB1aaVB!$\!2
 	

 Cs   s7r   )r   r   r   r   r   r  r   r@   r>   r>  r>  Q  s     H
 H
r@   r>  c                   n    e Zd ZdZdeefdZd Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd ZddZd Zd Zd Zy)	MarketSpyu<   Scanner espion du marché crypto complet - v2 haute qualitéFc                    || _         || _        || _        t               | _        | j                         | _        d| _        d| _        d| _	        g | _
        d| _        i | _        t        j                  d       t        j                  d       t        j                  d       t        j                  d|rdnd        t        j                  dt                t        j                  d	t                 t        j                  d
| j                          t        j                  dt"                t        j                  dt%        | j                         d       t        j                  dt&         d       t        j                  dt(         d       t        j                  dt*         dt,                t        j                  d       t        j                  d       t        j                  d       y )Nr   r     ════════════════════════════════════════════════════════════u.   🕵️ MARKET SPY v2 - Scanner haute qualitéz	   Mode: zDRY-RUN (pas d achat)zLIVE (achats actifs)z   API Trading: z   API Scan: z   Score min achat: z   Confirmations min: z   Watchlist exclue: z	 symbolesz   Position size: z USDTz   Anti-pump max 24h: +%z   Max RSI: z | Max BB: z   Multi-timeframe: 5m + 1hz   BTC regime filter: ON)dry_runmin_score_buytop_nr2   r6  _load_watchlist	watchlist
scan_counttotal_opportunitiestrades_executedopportunities_history
btc_regimebtc_inforc   rp   rG   r4  SPY_MIN_CONFIRMATIONSr   SPY_POSITION_SIZEMAX_PRICE_CHANGE_24Hr  r  )r=   r  	min_scorer  s       r>   r?   zMarketSpy.__init__3  s   &
"n--/#$  %'"#JDEJi7 7H^_`a&{m45mH:./*4+=+=*>?@,-B,CDE+C,?+@	JK():(;5AB-.B-C1EFl;-{;N:OPQ13.0Jr@   c                 R   	 t         j                  j                  t              rLt	        t        dd      5 }t        j                  |      }t        |j                  dg             cddd       S 	 t               S # 1 sw Y   t               S xY w# t        $ r Y t               S w xY w)u9   Charge la watchlist du bot principal (à exclure du scan)rr.   r/   r   N)
ospathexistsWATCHLIST_FILEopenrH   loadsetrF   rM   )r=   frg   s      r>   r  zMarketSpy._load_watchlistP  s    	ww~~n-.#@ 8A99Q<Dtxx	2678 8 . u8
 u  	u	s.   5B 0A<'	B <BB B 	B&%B&c           	      h   	 t         j                  j                  t              rit	        t        dd      5 }t        j                  |      }|j                         D ci c]  \  }}t        |t              rd|v r|| c}}cddd       S 	 i S c c}}w # 1 sw Y   i S xY w# t        $ r Y i S w xY w)z/Charge les positions actuelles du bot principalr  r.   r/   entry_priceN)r  r  r  POSITIONS_FILEr  rH   r  itemsra   rb   rM   )r=   r  rg   r8  r   s        r>   _load_positionszMarketSpy._load_positions[  s    	ww~~n-.#@ KA99Q<D-1ZZ\ KTQ)!T2}7I qD KK K . 		KK 	  			s@   5B$ )B !BB	B$ BB!B$ !B$ $	B10B1c                     	 t         j                  j                  t              r1t	        t        dd      5 }t        j                  |      cddd       S 	 i S # 1 sw Y   i S xY w# t        $ r Y i S w xY w)zCharge les trades du spyr  r.   r/   N)r  r  r  SPY_TRADES_FILEr  rH   r  rM   )r=   r  s     r>   _load_spy_tradeszMarketSpy._load_spy_tradesh  sp    	ww~~o./3A (Q99Q<( ( /
 		( 	  			s.   5A& A	A& A#A& #A& &	A32A3c                     	 t        t        dd      5 }t        j                  ||dt               ddd       y# 1 sw Y   yxY w# t
        $ r"}t        j                  d|        Y d}~yd}~ww xY w)zSauvegarde les trades du spywr.   r/   r   indentdefaultNzErreur sauvegarde spy trades: )r  r  rH   dumpstrrM   rc   re   )r=   tradesr  rh   s       r>   _save_spy_tradeszMarketSpy._save_spy_tradesr  sb    	?osW= <		&!As;< < < 	?LL9!=>>	?s1   A ;A A A A 	A2A--A2c                 p    t        | j                               }t        | j                               }||z   S )z'Compte toutes les positions (bot + spy))r   r  r  )r=   bot_positionsspy_positionss      r>   _count_total_positionsz MarketSpy._count_total_positionsz  s3    D0023D1134},,r@   c                    t         j                  d       | j                  j                  t         d      }|st         j                  d       g S g }d}d}d}|D ]  }|j                  dd      }|j                  d      s(|dz  }t        r	|t        v r<|t        k(  rF|| j                  v rU| j                         }| j                         }	||v s||	v r~	 t        |j                  d	d            }
t        |j                  d
d            }t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }t        |j                  dd            }|
t$        k  s	|
t&        kD  rP|t(        k  r|dz  }`|t*        kD  r|dz  }p|dk  rwt-        |      }|t.        k  rd}|dkD  r|dz  }n|dkD  r|dz  }n|dkD  r|dz  }n|dz  }|dkD  r|dz  }n|dkD  r|dz  }n
|dkD  r|dz  }||kD  r6|
|z
  ||z
  z  }|dk  r|dz  }n |dk  r|dz  }n|d k  r|dz  }n
|d!kD  r|dz  }d"|cxk  rd#k  r	n n|dz  }n;d$|cxk  rd"k  r	n n|dz  }n'd#|cxk  rdk  r	n n|dz  }nd|cxk  rdk  rn n|dz  }|dkD  r|
|z
  |z  d%z  }d#|cxk  rd&k  rn n|dz  }|j1                  ||
||||||d'        |j3                  d( d)*       t         j                  d+| d,       t         j                  d-| d.t*         d/       t         j                  d-| d0t(        d1z  d2d3       t         j                  d4t5        |       d5       |r>|d6d }|D ]4  }t         j                  d7|d    d8|d9   d:d;|d<   d1z  d=d>|d?           6 |d6| j6                   S # t         t"        f$ r Y w xY w)@u   
        Scan ALL USDT pairs on Binance via /ticker/24hr
        v2: filtre anti-pump, meilleur pré-scoring, exclut les coins en chute libre
        u$   🔍 Scan du marché complet (v2)...z/api/v3/ticker/24hru)   ❌ Impossible de récupérer les tickersr   r    r   r   	lastPricequoteVolumepriceChangePercent	highPricelowPriceweightedAvgPricer   ii r   ir   i -1r]  r   i r   rB   i N  r   g      ?g?r   ru  g333333?ir.  ir   r  )r   rL  volume_usdtprice_change_24hhigh_24hlow_24hcount_trades	pre_scorec                     | d   S )Nr  r   r  s    r>   r  z'MarketSpy.scan_market.<locals>.<lambda>  s
    an r@   Tr  u      📊 u    paires USDT scannéesu      🚫 u    rejetés (anti-pump >+rQ  u    rejetés (volume < g    .ArM  zM)u      🎯 u    candidats après filtrageNu      ⭐ : r	  +.1f	% | Vol: r  rP  zM | PreScore: r  )rc   rp   r6  ri   r4  re   rF   endswithEXCLUDE_STABLECOINSSTABLECOINSr5  r  r  r  r|   rI   
ValueError	TypeError	MIN_PRICE	MAX_PRICEMIN_VOLUME_USDTr  r   MIN_PRICE_CHANGE_ABSr   r  r   r  )r=   rg   
candidatestotal_pairsrejected_pumprejected_volumetickerr   	positions
spy_tradesrL  r  price_change_pctr
  r  weighted_avgr  
abs_changer  position_in_rangeprice_vs_avgtop3r   s                          r>   scan_marketzMarketSpy.scan_market  s   
 	:; {{%%
2E&FGLLDEI
 x	FZZ"-F ??6*1K #v'< # ' ,,.I..0J"f
&:	fjja89#FJJ}a$@A#(4H!)L#M  K!;<

:q 9:$VZZ0BA%FG"6::gq#9:
 y EI$5_,1$  "66"  #% -.J00 I [(R	z)R	z)Q	Q	 g%Q	&Q	&Q	 '!%*W_G9K$L!$t+OI&-OI&-NI&-OI %++R	(-2-R	&+!+Q	%**Q	 a!&!5 EL+t+NI *$4$" ,&	 	_x	v 	4dCh{m+ABCh}o-DEYDZZ\]^h//COTWDWX[C\\^_`hs://IJKbq>D \gak]"Q7I5J44P Q""#M"23"6s!;>!K.IY[ \\ +4::&&K 	* s   B=OO/.O/c                 "   |d   }| j                   j                  t         d|t        t        d      }|rt        |      dk  ryt        j                  t               | j                   j                  t         d|t        t        d      }|D cg c]  }t        |d          }}|D cg c]  }t        |d          }}|D cg c]  }t        |d          }}|D cg c]  }t        |d	          }	}d}
|rt        |      d
k\  r|D cg c]  }t        |d          }}|D cg c]  }t        |d          }}|D cg c]  }t        |d          }}|D cg c]  }t        |d	          }}t        j                  ||||      }
t        j                  ||||	|
      }||d<   |d   |d<   |d   |d<   |d   |d<   |d   |d<   t!        j"                         j%                         |d<   | j&                  |d<   |d   |d<   |j)                  dd      }|t*        k  rB|d   dkD  r:t-        |d   d      |d<   d|vrg |d<   |d   j/                  d| dt*         d       |S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )u   
        Analyse technique approfondie d'un candidat.
        v2: Multi-timeframe (5m + 1h), filtres qualité, scoring réaliste.
        r   r$  r%  r   Nr   r   r   rB   r(  rL  r  r	  r  rk   r  r  final_scorer  r   A   rB  zLOW_CONFIRMATIONS(/rO  )r6  ri   r4  KLINES_INTERVAL_FASTKLINES_LIMIT_FASTr   rJ   sleepAPI_RATE_LIMIT_PAUSEKLINES_INTERVAL_SLOWKLINES_LIMIT_SLOWr|   r   r   r>  r  r   now	isoformatr  rF   r  r   r   )r=   	candidater   klines_fastklines_slowr8  r   r   r   r   r  r  r  r  r  resultr  s                    r>   deep_analyzezMarketSpy.deep_analyze   s   
 8$ kk,,j'+?J[\

 c+.3

'( kk,,j'+?J[\
 (33!%!+33&12qt22%01ad11(34151;44 
3{+r1.9:qt:I:-89ad9H9,78quQqT{8G8/:;!%!+;J;/==iSZ\fgJ $**65$T "x#G,w )- 8}%./A%B!"'4{&lln668{#| !'w} #JJ':A>4419L$'w$<F=!&$&y!9$$'9:K9LANcMdde%fgM 4214
 ;98;s0   I)-I.I3#I8I=+JJ!Jc                 d	   |d   }|d   }|d   }|j                  di       }t        j                  d|        t        j                  d| d| d| j                          t        j                  d	|d
    d|d   dd       t        j                  ddj	                  |j                  dg                     | j                         }|t        k\  r!t        j                  d| dt         d       y| j                  j                  d      }|t        dz   k  rt        j                  d|dd       y| j                  r4t        j                  dt         d|        | j                  |dd       yt        j                  dt         d| d        	 | j                  j                  |t              }|rgt        |j                  d!i g      d"   j                  d
|d
               }	t        d# |j                  d!g       D              }
|
d"k(  rt        |j                  d$d"            }
|	d"k(  r%t        |j                  d%d"            }|
d"kD  r||
z  }	|j                  d&d"      }|	d"kD  r||	z  d'z  nd(}t!        t"        |d(z        }t%        |d)      }t!        t&        |d*z        }t%        |d+      }|	d,|d'z  z
  z  }|	d,|d'z  z   z  }| j)                         }i d-|	d.|
d/|d0|d1t+        |d2      d3t+        |d2      d4d5d6|j                  d7      d8t-        j.                         j1                         d|d9|d:d;d<|	d=d>d?| j                  d|j                  dg       d|||<   | j3                  |       | j5                  |||          | xj6                  d,z  c_        t        j                  d@|
 dA| dB|	        t        j                  dC|dDdE|dFdG|dDdH|dFdI	       t        j                  dJ||z  dF       | j                  |dKL       yKt        j9                  dM|        | j                  |ddN       y# t:        $ rV}t        j9                  dO| dP|        t=        j>                          | j                  |dtA        |             Y dQ}~ydQ}~ww xY w)Ru   
        Exécute un achat pour une opportunité exceptionnelle.
        v2: SL/TP basés sur l'ATR (adaptatifs à la volatilité).
        r   r*  rA  rC  u   🎯 OPPORTUNITÉ VALIDÉE: z   Pattern: 
 | Score: z | BTC: z	   Prix: rL  z | Var 24h: r	  r  r  z   Signaux: , rB  u!      ⚠️ Max positions atteint (r,  z), pas d'achatFr   rB   u      ⚠️ Solde insuffisant (r   z USDT), pas d'achatu%      🏜️ DRY-RUN: Achat simulé de z	 USDT de zdry-runexecutedreasonu      💰 Achat de z...fillsr   c              3   R   K   | ]  }t        |j                  d d             ! yw)qtyr   N)r|   rF   ).0r  s     r>   	<genexpr>z.MarketSpy.execute_spy_trade.<locals>.<genexpr>  s      XAquuUA!7 Xs   %'executedQtycummulativeQuoteQtyr   r   rg  r  r  g      @r   r  quantity	stop_losstake_profitsl_pctr   tp_pctr   r   order_idorderIdrk   r  source
MARKET_SPY	max_pricemax_pnl        r  u      ✅ ACHAT RÉUSSI:   @ z
      SL: .6fz (-rP  z	%) | TP: z (+rQ  z      Ratio R:R = 1:T)r>  u      ❌ Ordre échoué pour order_failedu      ❌ Erreur achat r  N)!rF   rc   rp   r  joinr  r	   rd   r6  r   r  r  _log_opportunityr   r|   r   r   r   r   r   r  r  r   r3  r4  r  _register_in_main_positionsr  re   rM   	traceback	print_excr  )r=   opportunityr   r  rA  rC  	total_posbalanceorderfilled_price
filled_qtycummulativer   r  dynamic_sl_pctdynamic_tp_pctrH  rI  r!  rh   s                       r>   execute_spy_tradezMarketSpy.execute_spy_tradec  s<   
 X&M*i( __\26
26(;<l7):eWHT__DUVWiG 45\+N`BabfAgghijl499[__Y-K#L"MNO //1	**NN>ykK]J^^lmn ++))&1&**NN:73-GZ[\<<KK?@Q?RR[\b[cde!!+i!P 	'(9':)F83OPI	KK**63DEE$UYYw%=a%@%D%DWkZaNb%cd  X7TVAW XX
?!&uyy'B!CJ1$"'		2G(K"LK!A~'2Z'? !nnUA.8Dq8H3-3c "%%6#!F!$^S!9 "%%8'C-!H!$^S!9(A0D,DE	*a.32F.FG "224
&!<&
&  & ";	&
 eNA6& eNA6& E& 		) 4&  !9!9!;& w& U& l&  & s& !$//&  {y"=!&" !*#&
6"& %%j1 00F9KL$$)$4ZL&\N[\j3s>#:N O!!,S 1^C4HL M2>.3PQT2UVW%%kD%A:6(CD%%kE.%Y 	LL/xr!=>!!!+c!f!M		s    J	Q #,Q 	R/AR**R/c                 *   	 i }t         j                  j                  t              r0t	        t        dd      5 }t        j                  |      }ddd       |d   |d   |d   |d   d	|d
   |d   |d   d|d   ddd||<   t	        t        dd      5 }t        j                  ||dt               ddd       t        j                  d       y# 1 sw Y   xY w# 1 sw Y   +xY w# t        $ r"}t        j                  d|        Y d}~yd}~ww xY w)z<Enregistre le trade spy dans positions.json du bot principalr  r.   r/   Nr  rG  rH  rI  r   rL  rk   rA  rO  rP  rR  F)r  rG  rH  rI  r   rL  rk   rA  rN  rP  rQ  bb_breakout_entryr  r   r  uA      📝 Position enregistrée dans positions.json (bot principal)u5      ⚠️ Erreur enregistrement position principale: )r  r  r  r  r  rH   r  r  r  rc   rp   rM   re   )r=   r   
trade_datar   r  rh   s         r>   rY  z%MarketSpy._register_in_main_positions  s   	VIww~~n-.#@ -A $		!I-
  *-8&z2'4)-8&z2'4%i0&'4%*!If ncG< ?		)Qq#>? KK[]-- -&? ?  	VLLPQRPSTUU	VsG   7C' CAC' C1C' CC' C$ C' '	D0DDNc                    t        j                         j                         |d   |d   |d   |d   |d   |d   |j                  di       |j                  dg       ||d	}| j                  j                  |       | xj                  d
z  c_        	 g }t        j                  j                  t              r0t        t        dd      5 }t        j                  |      }ddd       |j                  |       t        |      dkD  r|dd }t        t        dd      5 }t        j                  ||dt                ddd       y# 1 sw Y   fxY w# 1 sw Y   yxY w# t"        $ r Y yw xY w)u&   Log une opportunité dans l'historiquer   rA  r*  rL  r	  r  rC  rB  )rk   r   rA  r  rL  r	  r  rC  rB  r>  r?  r   r  r.   r/   Ni  ir  r   r  )r   r3  r4  rF   r  r   r  r  r  r  SPY_LOG_FILEr  rH   r  r   r  r  rM   )r=   r\  r>  r?  entryhistoryr  s          r>   rX  zMarketSpy._log_opportunity  sS    "113!(+"9- / ) +,> ?&}5%//,;"y"5 
 	""))%0  A% 	Gww~~l+,g> +!"iilG+ NN5! 7|c!!$%.lC': =a		'1Q<= =+ += = 		sH   7E 	E>E E;E E	E EE E 	E('E(c                 
   | xj                   dz  c_         t        j                         }t        j                  dd        t        j                  d| j                    dt	        j
                         j                  d              t        j                  d        | j                         | _        t        j                  | j                        \  | _        | _        ddd	d
dj                  | j                  d      }t        j                  d| d| j                          | j                  rmt        j                  d| j                  j                  dd       d| j                  j                  dd       d| j                  j                  dd       d       | j                  dk(  rt        j                  d       g S | j                   }| j                  dk(  r.t#        | j                   d      }t        j                  d|        | j%                         }|st        j                  d       g S t        j                  dt'        |       d       g }d}t)        |      D ]}  \  }}| j+                  |      }	|	r7|	d    d!k(  rF|dz  }|	j                  d"g       }
t        j                  d#|	d$   d%d&d'j-                  |
              n|	d(   dkD  r|j/                  |	       |	d)   |k\  rdn|	d)   d*k\  rdnd}d+}|	j                  d,i       j                  d-      rd.|	d,   d-    }t        j                  d| d/|	d$   d%d0|	d    d1d2|	d)   d3d4|	d,   j                  d5d      d3d6|	d,   j                  d7d      d8d9|	d,   j                  d:d      d;d<|	d,   j                  d=d      d>d?|        |t'        |      dz
  k  set        j0                  t2                |j5                  d@ dAB       |dkD  rt        j                  d#| dC       d}|D ]  }|d)   |k\  r|j                  dDd      }|t6        k  rFt        j                  dE|d$    dF|d)   dGdH| dIt6         dJ	       | j9                  |dKdL| dMN       l| j;                  |      }|s|dz  }|t<        k\  st        j                  dOt<         dP        n|d)   dQk\  s| j9                  |dKdRN        t        j                         |z
  }t        j                  dS| j                    dT|d>dU       t        j                  dV| j                   dWt'        |       dX| dY|        |S )ZuA   Exécute un cycle complet de scan (v2 avec BTC regime + multi-TF)r   
u   ──────────────────────────────────────────────────u   🔄 Cycle #z - r)      🟢u   🟡u   🟠   🔴)r3  r  r2  r/  u   ⚪   u    Régime BTC: z      BTC RSI=r)  ?z EMA=r*  z% Mom4h=r+  r  r/  u;      🛑 Marché fortement baissier → AUCUN ACHAT ce cycler2  X   u4      ⚠️ Marché bear → score minimum relevé à u&      Aucun candidat intéressant trouvéu!   
📈 Analyse multi-timeframe de z candidats...r   rA  rS  rT  u      ⛔ r   12su    | REJETÉ: r<  r  r*  r   r  rC  r  z | H1:rS  z | 18sr;  z5.1fz | RSI: r   z | BB: r   r   z	 | Mom3: rF  +.2fr  r   rP  r  c                     | d   S )Nr*  r   r  s    r>   r  z*MarketSpy.run_scan_cycle.<locals>.<lambda>h  s    Am$4 r@   Tr  u(    candidats rejetés par filtres qualitér  u
      ⚠️ z: Score OK (rM  z) mais seulement r,  z confirmationsFzconfirmations_low(rO  r=  u      ⚠️ Max z achat(s) par cycle atteintro  score_insufficientu   
📊 Cycle #u    terminé en r  z   BTC: u    | Analysés: u    | Rejetés qualité: z | Trades: )r  rJ   rc   rp   r   r3  strftimer  r  r"  r<  r6  r  r  rF   rd   r  r   r(  r   	enumerater9  rW  r   r/  r0  r  r  rX  re  SPY_MAX_TRADES_PER_CYCLE)r=   
start_timeregime_emojieffective_min_scorer  analyzedquality_rejectedr   r5  r8  flagsemoji
trend_infotrades_this_cycleoppnum_confsuccesselapseds                     r>   run_scan_cyclezMarketSpy.run_scan_cycle  s   1YY[
b%&l4??"33x||~7N7Nz7Z6[\]zl$ --/ *<)L)LT[[)Y&&
 #doou
% 	
 	c,~doo5FGH==KK.):):<)M(N O"mm//DE F  $ 1 1, DEQH I
 ??..NNXYI #00??i'"%d&8&8""=KKNObNcde %%'
KK@AI 	8Z8IWX%j1 	1LAy&&y1F)$(::$)$"JJ;EKK'&*:3)?|DIIV[L\K] ^_G_q(OOF+ '-]&;?R&RFbhivbw{}b}X^  DIE!#Jzz,377F'-f\.B=.Q-R%S
KKeWAfX&6s%;3!),S1 2""("7!= >  &| 4 8 8 B4H I%l377qI#N O!!'!5!9!9,!J4 P Q  &| 4 8 8 KCPPQ%,(	 3z?Q&&

/0=	1B 	4dCaKK'"2!33[\]  	\C=!%8877#6:33KK*S]O<MHZ[^G_ `008z;P:QQ_!a b))#HZ[cZddeFf)g005%*%(,DDn5M4NNi$jk }%+))#FZ)['	\* ))+
*nT__$5]73-qQRht/~c(m_ M**:);;GXFY[ 	\ r@   c                 4   | j                         }|syt        j                  dt        |       d       g }|j	                         D ]{  \  }}	 | j
                  j                  t         dd|i      }|s0t        |d         }|d   }||z
  |z  dz  }||j                  d	|      kD  r
||d	<   ||d
<   ||d   k  r9t        j                  d| d| d|d   dd|dd	       |j                  |       ||d   k\  r9t        j                  d| d| d|d   dd|dd	       |j                  |       t        rD|t        k\  r;|d	   dt        dz  z
  z  }	|	|d   kD  r!|	|d<   t        j                  d| d|	d       |dkD  rdnd}
t        j                  d|
 d| d|dd|j                  d
d      dd |d   d
       ~ |D ]
  }||v s||=  | j#                  |       y# t        $ r&}t        j!                  d!| d"|        Y d}~d}~ww xY w)#u   
        Vérifie les positions spy et gère SL/TP/trailing.
        Le bot principal PEUT aussi les gérer via positions.json,
        mais on fait un double check ici par sécurité.
        Nu   
📋 Vérification de z positions spy...z/api/v3/ticker/pricer   rL  r  r   rP  rQ  rH  u      🔴 SL HIT: rT  z (SL: rU  z, PnL: rv  rQ  rI  u      🟢 TP HIT: z (TP: r   u      📈 Trailing SL relevé: u    → r   ro  rp  rq  rS  z: PnL z	% | Max: z% | SL: u      ⚠️ Erreur check r  )r  rc   rp   r   r  r6  ri   r4  r|   rF   rd   r   r   r   r   rM   re   r  )r=   r!  	to_remover   trade
price_datar  r  pnl_pcttrailing_slr  rh   s               r>   check_spy_positionszMarketSpy.check_spy_positions  s    **,
.s:.??PQR	'--/ 0	FMFE/F![[33j 45&7I
 " %j&9 :#M2)K7;F#M !599[+#FF)6E+&'.E)$ !E+$66NN%5fXS P)).{);C(@PT~UW$Y Z $$V, !E-$88KK"26(#m_ M&&+M&:3%?wwtnTV!X Y$$V, (G7O,O"'"4<RUX<X8X"YK"U;%77-8k*&CF85Q\]`Pa$bc #*A+6c%&~ F""'))Iq"9$!? @!!&{!3C 8: ;W0	Ff   	'F#v&	' 	j)  F6vhbDEEFs-   'G(8A=G(6A G(7BG((	H1HHc           
          t         j                  d       t         j                  d       t         j                  d       t         j                  d| j                          t         j                  d| j                          t         j                  d| j                          | j                         }|r]t         j                  dt        |              |j                         D ])  \  }}t         j                  d| d	|d
    d|d           + | j                         }t         j                  dt        |              t         j                  dt        |      t        |      z    dt                t         j                  d       y)u%   Affiche un résumé de la session spyu   
════════════════════════════════════════════════════════════u    📊 RÉSUMÉ SESSION MARKET SPYr  u      Scans effectués: u      Opportunités détectées: u      Trades exécutés: z   Positions spy actives: z      r  rA  z
 | Entry: r  z   Positions bot principal: z   Total positions: r,  N)
rc   rp   r  r  r  r  r   r  r  r	   )r=   r!  symtbot_poss        r>   print_summaryzMarketSpy.print_summary  sF   %&67J+DOO+<=>4T5M5M4NOP,T-A-A,BCD**,
KK4S_4EFG$**, XQfSEAiL>AmDTCUVWX &&(23w<.AB*3w<#j/+I*J!L^K_`aJr@   )FN)r   r   r   r   SPY_MIN_SCORE_BUYDEEP_ANALYSIS_TOP_Nr?   r  r  r  r  r  r(  r9  re  rY  rX  r  r  r  r   r@   r>   r  r  0  s_    F$0AI\  :	?-Z'|?Fl\V>#NrlE*R r@   r  c                     t        j                  d      } | j                  ddd       | j                  ddd       | j                  d	t        t        d
t         d       | j                  dt        t
        dt
         d       | j                  dt        t        dt         d       | j                         }t        |j                  |j                  |j                        }|j                  r1|j                         }|j                          |j                          y t         j#                  d|j$                   d       	 	 	 |j                         }|j                          |j&                  dz  dk(  r|j                          t         j#                  d|j$                   d       t)        j*                  |j$                         # t,        $ r  t.        $ rK}t         j1                  d|        t3        j4                          t)        j*                  d       Y d }~Yd }~ww xY w# t,        $ r= t         j#                  d       |j                          t         j#                  d       Y y w xY w)Nu.   🕵️ Market Spy - Scanner de marché crypto)descriptionz--once
store_truezUn seul scan puis quitte)actionhelpz	--dry-runzMode simulation (pas d achat)z--min-scoreu#   Score minimum pour achat (défaut: rO  )r   r  r  z--topu*   Nombre de candidats à analyser (défaut: z
--intervalu-   Intervalle entre scans en secondes (défaut: )r  r  r  u%   
🔄 Mode continu - Scan toutes les u   s (Ctrl+C pour arrêter)r   r   u   
⏳ Prochain scan dans zs...u   ❌ Erreur dans le cycle: u   

🛑 Arrêt du Market Spy...u   Au revoir! 👋)argparseArgumentParseradd_argumentrI   r  r  SCAN_INTERVAL_SECONDS
parse_argsr  r  r  toponcer  r  r  rc   rp   r&  r  rJ   r/  KeyboardInterruptrM   re   rZ  r[  )parserargsspyresultsrh   s        r>   mainr    s0   $$1abF
<VW
L?^_
C9JABSATTUV  X
c3FHI\H]]^_  a
38MKLaKbbcd  f D
..hhC yy$$&! KK8G_`a',,.'') >>B&!+%%'7dKL

4==)  %  9!=>##%

2
  '67%&'s?   H2 BG H2 H/$AH*%H2 *H//H2 2AI87I8__main__)Wr   r  sysrH   rJ   rR   rU   r  loggingrZ  r   r   urllib.parser   r6   numpyr   r  dirnameabspath__file__
SCRIPT_DIRinsertconfigr   r   r   r	   r
   r   r   r   r   r   r   ImportErrorprintexitPRODUCTION_APITESTNET_APIrG   r4  r  r  r  r  r  r  r  r-  r1  r.  r2  r  r  r  r{  r  r  r  SPY_MIN_TREND_SCOREr  r0  rW  r  r  rj  r  r  r5  basicConfigINFO	getLoggerrc   FileHandlerfile_handlersetFormatter	Formatter
addHandlerr2   r   r   r"  r>  r  r  r   r   r@   r>   <module>r     s  8 
 
        ( "   WW__RWW__X67
 : 
    +.)k~    		                    j*:;j*:;ww||J(CD'',,z+?@= 
   
,,*
 
		<	( #w""GGLL-.   +'++,KL M   , { {DZE ZEBc
 c
T.! .!jX
 X
~x
  x
 ~4'n zF S7  	
QRCHHQKs   H2 2II