
    iR                       d Z ddlZej                  j                  dd       ej                  j                  dd       ej                  j                  dd       ej                  j                  dd       ej                  j                  dd       ddlZdd	lmZmZ dd
lm	Z	 ddl
mZmZmZm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  ej,                  ej.                  dd        ej0                  d      ZdZdZ	 ddlmZmZ dZej?                  d       dZ#	 ddl$m%Z%m&Z& dZ#ej?                  d       dZ'	 ddl(m)Z) dZ'ej?                  d       dZ*	 ddl+m,Z, dZ*ej?                  d       dZ-	 ddl.m/Z/ dZ-ej?                  d        dZ0	 dd"l1m2Z2m3Z3 dZ0ej?                  d#       dZ4	 dd%l5m6Z6 dZ4ej?                  d&       dZ7	 dd(l8m9Z9 dZ7ej?                  d)       dZ:	 dd+l;m<Z< dZ:ej?                  d,       dZ=	 dd.l>m?Z? dZ=ej?                  d/       dZ@	 dd1lAmBZB dZ@ej?                  d2       dZC	 dd4lDmEZE dZCej?                  d5       dZF	 dd7lGmHZH dZFej?                  d8       dZI	 dd:lJmKZK dZIej?                  d;       dZL	 dd=lMmNZN dZLej?                  d>       dZO	 dd@lPmQZQ dZOej?                  dA       dZR	 ddClSmTZT dZRej?                  dD       ddFlUmVZVmWZWmXZXmYZYmZZZm[Z[m\Z\m]Z]m^Z^m_Z_m`Z`maZambZbmcZcmdZdmeZemfZfmgZgmhZhmiZimjZjmkZk g dGZldHZmdZndIZo	 ddlpZpddlqmrZr  epj                  dJ       	  epj                  dK       epj                  j                         rzdLZoepj                  j                  d      Zyej?                  dMey        ej?                  dNepj                  j                          ej?                  dOepj                          dZnnej?                  dP       dZnenrC G dR dSerj                        Z}	 epj                  j                  e}g       ej?                  dT        G dU dV      Z G dW dX      Z G dY d      Z G dZ d[      Z e       Z ee      Zd\efd]Zd\efd^Zd_ Zed`k(  rddlZ eda       dbZdcdddedfZ ej                  eeg      Zej                         ZeD  cg c]  }  e| dh          c} ZeD  cg c]  }  e| di          c} Z e       Zej-                  dcee      Z edj        edkej0                   dl        edmej2                           ednej4                           edoej6                  dpdq        edrej8                   ds        edtej:                          yy# e $ rZ!ejE                  de!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  de!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  de!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  de!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d!e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d$e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d'e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d*e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d-e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d0e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d3e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d6e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d9e!        Y dZ![!dZ![!ww xY w# e $ rZ!ejE                  d<e!        Y dZ![!(dZ![!ww xY w# e $ rZ!ejE                  d?e!        Y dZ![!3dZ![!ww xY w# e $ rZ!ejE                  dBe!        Y dZ![!>dZ![!ww xY w# e $ rZ!ejE                  dEe!        Y dZ![!IdZ![!ww xY w# eu$ r Y w xY w# e $ r ej?                  dQ       dZnY gw xY w# e$ r Y .w xY wc c} w c c} w )uu   
AI Predictor - Analyse prédictive des cryptomonnaies avec Deep Learning
Utilise PyTorch avec GPU (RTX 5060 Ti) pour anticiper les mouvements de marché
    NOMP_NUM_THREADS2MKL_NUM_THREADSOPENBLAS_NUM_THREADSVECLIB_MAXIMUM_THREADSNUMEXPR_NUM_THREADS)datetime	timedeltadeque)DictListTupleOptional)ThreadPoolExecutoras_completedz1%(asctime)s [%(levelname)s] %(name)s: %(message)s%H:%M:%S)levelformatdatefmtAIPredictorF)get_smart_rotationanalyze_rotation_opportunityTu   ✅ Smart Rotation disponibleu&   ⚠️ Smart Rotation non disponible: )get_advanced_scorerCryptoProfileu'   ✅ AI Advanced Scorer (GPU) disponibleu*   ⚠️ AI Advanced Scorer non disponible: )get_performance_analyzeru#   ✅ Performance Analyzer disponibleu,   ⚠️ Performance Analyzer non disponible: )get_volatility_scoreru    ✅ Volatility Scorer disponibleu)   ⚠️ Volatility Scorer non disponible: )get_opportunity_selectoru6   ✅ AI Opportunity Selector disponible (PyTorch + GPU)u/   ⚠️ AI Opportunity Selector non disponible: )calculate_optimal_sltpget_dynamic_sltp_calculatoru'   ✅ Dynamic SL/TP Calculator disponibleu0   ⚠️ Dynamic SL/TP Calculator non disponible: )get_multi_tf_analyzeru'   ✅ Multi-Timeframe Analyzer disponibleu0   ⚠️ Multi-Timeframe Analyzer non disponible: )get_volume_analyzeru&   ✅ Volume Profile Analyzer disponibleu/   ⚠️ Volume Profile Analyzer non disponible: )get_regime_detectoru%   ✅ Market Regime Detector disponibleu.   ⚠️ Market Regime Detector non disponible: )get_feature_extractoru)   ✅ Advanced Feature Extractor disponibleu2   ⚠️ Advanced Feature Extractor non disponible: )get_time_pattern_analyzeru$   ✅ Time Pattern Analyzer disponibleu-   ⚠️ Time Pattern Analyzer non disponible: )get_correlation_analyzeru#   ✅ Correlation Analyzer disponibleu,   ⚠️ Correlation Analyzer non disponible: )get_risk_adjusted_scoreru#   ✅ Risk-Adjusted Scorer disponibleu,   ⚠️ Risk-Adjusted Scorer non disponible: )get_monte_carlo_simulatoru$   ✅ Monte Carlo Simulator disponibleu-   ⚠️ Monte Carlo Simulator non disponible: )get_ensemble_predictoru!   ✅ Ensemble Predictor disponibleu*   ⚠️ Ensemble Predictor non disponible: )get_long_term_analyzeru'   ✅ Long-Term Trend Analyzer disponibleu0   ⚠️ Long-Term Trend Analyzer non disponible: )get_reversal_predictoru,   ✅ LSTM Reversal Predictor (GPU) disponibleu/   ⚠️ LSTM Reversal Predictor non disponible: )MOMENTUM_REVERSAL_MINMOMENTUM_REVERSAL_MAXMOMENTUM_MODERATEMOMENTUM_THRESHOLDMOMENTUM_STRONGMOMENTUM_DROP_LIGHTMOMENTUM_DROP_MODERATEMOMENTUM_DROP_SIGNIFICANTMOMENTUM_DROP_SEVEREMOMENTUM_CRASHCREUX_MIN_GAPCREUX_OPTIMAL_STARTCREUX_OPTIMAL_ENDCREUX_TOO_DEEPSQUEEZE_FAVORABLESQUEEZE_CROSS_ZONEPULLBACK_MIN_GAPDEATH_CROSS_LIGHTDEATH_CROSS_MODERATEDEATH_CROSS_STRONG	EMA_SHORTEMA_LONG)BTCUSDTETHUSDTBNBUSDTXRPUSDTADAUSDTDOGEUSDTSOLUSDTDOTUSDTPOLUSDTLTCUSDTAVAXUSDTLINKUSDTATOMUSDTUNIUSDTXLMUSDTETCUSDTFILUSDTAPTUSDTNEARUSDTARBUSDT   cpu      cudau   ✅ PyTorch GPU activé: z   - CUDA version: z   - PyTorch version: u1   ℹ️  Aucun GPU CUDA détecté, utilisation CPUu4   ℹ️  PyTorch non installé, mode règles utiliséc                   *     e Zd ZdZd fd	Zd Z xZS )PredictorLSTMu/   Modèle LSTM pour la prédiction de prix cryptoc                 6   t         |           t        j                  |||d|      | _        t        j
                  |      | _        t        j                  |d      | _        t        j                  dd      | _	        t        j                  dd      | _
        y )NT)
input_sizehidden_size
num_layersbatch_firstdropout@          )super__init__nnLSTMlstmDropoutrb   Linearfc1fc2fc3)selfr^   r_   r`   rb   	__class__s        //home/ubuntu/crypto_trading_bot/ai_predictor.pyrg   zPredictorLSTM.__init__   su    G%'% DI ::g.DLyyb1DHyyR(DHyyQ'DH    c                 <   | j                  |      \  }}|d d dd d f   }| j                  |      }t        j                  | j	                  |            }| j                  |      }t        j                  | j                  |            }| j                  |      }|S )N)rj   rb   torchrelurm   rn   ro   )rp   xlstm_out_last_outputs        rr   forwardzPredictorLSTM.forward  s|    ))A,KHa"1b!8,K[)A

488A;'AQA

488A;'AAHrs   )      rX   皙?)__name__
__module____qualname____doc__rg   r|   __classcell__)rq   s   @rr   r\   r\      s    =	(		rs   r\   u8   ✅ PredictorLSTM enregistré pour chargement sécuriséc                   f   e Zd ZdZeddee   dee   defd       Zede	j                  dedefd       Zedde	j                  ded	edefd
       Zedde	j                  dededeeeef   fd       Zedde	j                  dedededeeeef   f
d       Zedde	j                  dedefd       Zy)PatternFeaturesz1Extraction de features pour l'analyse de patternsNpricesvolumesreturnc           	        J t        |       dk  ryt        j                  |       } i }| d   |d<   t        |       dk\  r| d   | d   z
  | d   z  dz  nd|d	<   t        |       d
k\  r| d   | d   z
  | d   z  dz  nd|d<   t        |       dk\  r| d   | d   z
  | d   z  dz  nd|d<   t        j	                  | t
              }t        j	                  | t              }t        |       dk\  rt        j	                  | d      n|}||d<   ||d<   ||z
  |z  dz  |d<   t        j                  | t
              |d<   t        j                  | t
        d      |d<   t        j                  | t        d
      |d<   t        ||z
        |z  dz  |d<   |d   }|d   }|d   }|dk\  xr |dkD  }	|dk\  }
|	r|
rdnd|d<   |dk  s
|dk  r|dk  rdnd|d<   | d   |z
  |z  dz  }| d   |z
  |z  dz  }t        | dd       }| d   |z
  |z  dz  }t        |       dk\  r| d   | d    z
  | d    z  dz  nd}|}||kD  xr |d!k  xr |dk  }|rdnd|d"<   ||d#<   ||d$<   ||d%<   t        |       t        d&z   k\  rt        j	                  | dd' t
              }t        j	                  | dd' t              }t        j	                  | dd t
              }t        j	                  | dd t              }||k  }||k  }||kD  }|s|r|rdnd|d(<   |r|rdnd|d)<   |s|sdnd|d*<   nd|d(<   d|d)<   d|d*<   t        j                  |       \  }}}|dkD  r||z
  |z  dz  nd}||d+<   ||d,<   ||d-<   ||d.<   ||z
  dkD  r| d   |z
  ||z
  z  nd/|d0<   |d0   d1k  }|d2k  rdnd|d3<   |rdnd|d4<   t        j                  |       \  }}} ||d5<   ||d6<   | |d7<   | d   |kD  rdnd|d8<   | d   |kD  rdnd|d9<   ||kD  rdnd|d:<   g }!t        d
t        dt        |                   D ]A  }"t        j                  | d|"dz          \  }#}$}%|$dkD  s(|!j                  |#|%z
  |$z  dz         C |!r4t        j                  |!      }&|&dkD  r||&z  nd|d;<   |d;   d<k  rdnd|d=<   n
d|d;<   d|d=<   d}'t        dt        dt        |                   D ]O  }"t        |       d|"z   k\  st        j                  | d|"        \  }#}$}%|$dkD  r|#|%z
  |$z  dz  nd}(|(dk  r|'dz  }'O n |'|d><   d|d?<   |'dk\  r|dkD  r|dz  dz  |d?<   t        j!                  |       })|)|d@<   |)dAk  rdnd|dB<   |)dCkD  rdnd|dD<   t        |       dk\  r| d   | d   z
  | d   z  dz  nd|dE<   t        |       d
k\  r| d   | d   z
  | d   z  dz  nd|dF<   t        |       dk\  r| d   | d    z
  | d    z  dz  nd|dG<   t        |       dk\  rt        | dd       }| d   |z
  |z  dz  |dH<   | d   | d'   cxk  r| d    k  rn ndnd|dI<   t        j	                  | dd t
              }*||*k  r
|dF   d&kD  rdnd|dJ<   t        |       dkD  rt        j!                  | dd       n|)}+|)dKkD  r|)|+k  rdnd|dL<   nd|dH<   d|dI<   d|dJ<   d|dL<   d},|dD   r|,dMz  },|dL   r|,dMz  },|dJ   r|,dMz  },|dI   r|,dz  },|dH   dk  r|,d
z  },t        d|,      |dN<   t        |       dOk\  r<| dPd }-t        j"                  |-      |-dd z  }.t        j$                  |.      dz  |dQ<   nd|dQ<   t        |       dRk\  r| dSd n| }/t        |/      dk\  r0t        |/      t        |/      z
  t        t        |/      dT      z  dz  ndU}0t'        |0d&      |dV<   t)        |0dWk  xr* |j+                  dQd      dXk  xr |j+                  d=d             |dY<   t        |       dk\  r6t        dt        |       d      D "cg c]  }"t        | |"dz
  |"        c}"d d n| d   gJt        J      d&k\  r)t-        JfdZt        dt        J            D              rdnd|d[<   t        | dd       }t        | dd       }1| d   |d\z  kD  rdnd|d]<   | d   |1d^z  k  rdnd|d_<   |t        |      dk\  rt        j                  |      }t        j                  |dd       }2|2dkD  r|d   |2z  nd|d`<   t        j                  |dd       dkD  rMt        j                  |dd       t        j                  |dd       z
  t        j                  |dd       z  dz  nd|da<   n
d|d`<   d|da<   d|db<   t        |       dk\  rd|d@   }3t        |       dkD  rt        j!                  | dd       n|3}+|j+                  d	d      }4|4dk  r|3|+d&z   kD  rd|db<   n|3dck  r|3|+dz   kD  rd/|db<   d|dd<   t        |       t        dez   k\  rz|d   }5t        j	                  | dd  t
              }6t        j	                  | dd  t              }7|7dkD  r|6|7z
  |7z  dz  nd}8|5dk  r|8|5z
  }9t        d|9      |dd<   n|5dkD  r
|5dfk  rd/|dd<   d|dg<   d|dh<   t        |       dik\  rg|dG   }:| dj   dkD  r| dk   | dj   z
  | dj   z  dz  nd};|:|;z
  |dg<   t        |       dlk\  r.| d   dkD  r| dj   | d   z
  | d   z  dz  nd}<|;|<z
  }=|dg   |=z
  |dh<   d|dm<   |Lt        |      d
k\  r>|j+                  d`d      }>t        |j+                  dGd            dfk  }?|>dnkD  }@|@r|?r|>|dm<   d}A|A|db   dMz  z  }At        do|dd   dXz        }B|A|BdMz  z  }A|dg   dkD  rt        do|dg   d/z        }CA|CdMz  z  }A|dm   dkD  rt        do|dm   doz
  doz        }DA|DdMz  z  }At        dA      |dp<   d|dq<   t        |       t        d&z   k\  rt        dt        dt        |       t        z
              D ]  }E|EdkD  rt        j	                  | dE  t
              n|}FEdkD  rt        j	                  | dE  t              n|}GEdz   t        |       t
        z
  k  r!t        j	                  | dEdz     t
              nF}HEdz   t        |       t        z
  k  r!t        j	                  | dEdz     t              nG}IH|Ik  sFGk\  sE|dq<    |S  |S c c}"w )ru;   Extrait toutes les features pertinentes pour la prédiction2   Nru   price_current   d   r   price_change_5
   iprice_change_10r}   price_change_20c   ema9ema21ema_diff	ema_sloperV   )lookbackema_slope_longema21_slopeema_cross_distance333333ÿ皙rY   ema_trend_bullishema_trend_bearishre   333333ӿprice_correctingprice_drop_from_highprice_above_ema9price_above_ema21rX   ema_cross_bullishema_cross_freshema_cross_bearishbb_bandwidthbb_upperbb_lowerbb_mid      ?bb_positionr   g      @
bb_squeezenear_bb_lowerkc_upperkc_midkc_lowerprice_above_kc_midprice_above_kc_upperkc_above_bbbb_squeeze_ratio333333?bb_squeeze_confirmedsqueeze_durationbreakout_strengthrsi   rsi_oversoldF   rsi_overbought
momentum_5momentum_10
momentum_3distance_from_highprice_decliningema9_turningA   rsi_turning_down   sell_signal_score   i
volatility0   i绽|=     X@	range_48hg      @333333?is_flat_marketc              3   :   K   | ]  }|   |d z
     kD    yw)rY   N ).0ihighs_5s     rr   	<genexpr>z3PatternFeatures.extract_features.<locals>.<genexpr>  s&     A|`a'!*wWXYZWZ|B[A|s   higher_highsg\(\?near_resistancegRQ?near_supportvolume_ratiovolume_trendrsi_divergence_bullish-   ema_convergence_speed   333333?momentum_accelerationmomentum_jerk   i   volume_precursor?      ?early_cycle_scorecandles_since_bullish_cross)lennparrayr   _emar@   rA   
_ema_slopeabsmax
_bollinger_keltnerrangeminappendmean_rsidiffstdroundboolgetall)Kr   r   featuresr   r   ema50r   r   r   ema9_trend_okema21_trend_okr   r   recent_highr   momentum_3_precalcr   is_correction
ema9_prev2ema21_prev2
ema9_prev1ema21_prev1was_below_2was_below_1is_above_nowr   r   r   r   r   r   r   r   historical_bandwidthsr   bbubbmbblavg_bandwidthr   bwr   	ema9_prevrsi_prevsell_signalsprice_slicereturns
_slice_48h
_range_48h
recent_low
avg_volumersi_currentr   ema_diff_current
ema9_prev3ema21_prev3ema_diff_prev3convergencemom_3_current
mom_3_prevmom_3_prev2
accel_prev	vol_ratioprice_stablevol_increasingearly_score
conv_speedaccel_normalizedvol_normalizedr   ema9_lbema21_lbema9_lb_prevema21_lb_prevr   sK                                                                             @rr   extract_featuresz PatternFeatures.extract_features  s    v;&! %+2J!UXY_U`deUefRj6":&=%Kc%Qkl!"X[\bXcgiXivbzF3K'?6#;&NQT&Top"#X[\bXcgiXivbzF3K'?6#;&NQT&Top"# ##FI6$$VX647K24E$$VR05! $u5; / : :69 M%4%?%?	\^%?%_!""1"<"<VXXZ"<"[),TE\):U)BS)H%& [)	!"23}- '!+A	E0A$,.;UV$% /=q.@YQR]WbefWfno$%
 #2J-5;#BZ%/583> &,' &r
[ 8KG#M
 NQQW[\]M]fRj6":5CcIcd (
5L  4'N 	
 -:qq#$+?'('7#$(9$% v;(Q,&(--fSbk9EJ)..vcr{HEK(--fSbk9EJ)..vcr{HEK %{2K${2K%<L 4?+S_AfgH()0;!STH&'6A,A]^H(),-H()*+H&',-H() &5%?%?%G"&(?Ez8+v5;q#/ ''#V^aiVimnUn6":#8X=P"Qtw !/$6&2S&8a)6AA! &5%=%=f%E"&('#'.4Rj6.Aq%&06r
X0E11'('/(':! !#r3r3v;/0 	FA+66vdqs|DMCcQw%,,cCi3->-DE	F
 !GG$9:MKX[\K\<-+GbcH'(4<=O4PSV4Vq\]H+,+,H'(/0H+, q#b#f+./ 	A6{b1f$ / : :6#A2; GS#03acCi3&,S6$)$	 (8#$ )*$%q \A%5-9A-=,DH() ""6*(+b1a *-(Q!" RUU[Q\`aQa&*vbz"9VBZ!G#!MghTWX^T_ceTe6":s#;vc{"JS"PklQTU[Q\`aQa&*vbz"9VBZ!G#!Mgh v;!fRSk*K.4Rj;.F+-UX[-[H)* 06bzF2J/SPR/S!YZH&' (,,VCR[)DI,09,<-AX[\A\qbcH^$ =@K"<L++F3BK8RUH03bS8^1QRH'(-.H)**+H&''(H^$+,H'( $%|r'9|&');N#\R%7\%&(:()B.0B(+C(>$% v;" ,Kggk*["-==G%'VVG_s%:H\"%&H\"
 &)[B%6VCD\F
`cdn`ost`tc*oJ73s:PU;VVY\\z~
 %j! 4%) 8LLr*T183Q77&
!" RUU[Q\`bQbuQFQ/GH!3vac!}%HMioprisht(+G(9cA|ejklnqrynze{A|>|1  CD  &,'&
+1":d8J+JaPQ"#(.r
Z$5F(F1A  3w<2#5hhw'G/JCMPQ>wr{Z'?WXH^$ A  F  F  GN  OR  SU  GV  W  Z[  [(=PSTV@X(X\^\c\cdkloprds\t'twz'z  abH^$'(H^$'(H^$ ./)*v;""5/K<?K"<L++F3BK8R]H%\\*:A>N$x!|)C5612r!kHqL&@5812 -.()v;(Q,&'
3(--fSbk9EJ)..vcr{HEKOZ]^j;6+EKdeN!#,/??47;4G01!A%*:S*@4701 -.()$%!v;!$\2MIOPRVW&*vbz1VBZ?#E]^J0=
0JH,-6{b PVWZP[^_P_vbzF3K76#;FLef'+5
,45L,MPZ,Z) ()#$3w<2#5 ^Q7Ix||L!<=CL&_N,/8+, x 89B>>h'>?$FG
zB&+,q0"31H(IC(OP+b00K&'!+ x0B'Cc'IS&PQN>B..K(+C(=$% 35./v;(Q,&!!SS[8-C%DE QY\]Q]/..vjy/A9McgQY\]Q]?//z	0BHMchZbefZfilmsit  xA  jA  [A33F>hqjM4JIV  GNZbefZfilmsitwiZ 4 4VNxz]5KX V  FN-/Gx4G>FH:; [ Is   +speriodc                     t        |       |k  r| d   S d|dz   z  }t        j                  | d|       }| |d D ]  }||z  |d|z
  z  z   } |S )zCalcule l'EMAru   rX   rY   N)r   r   r   )r   r7  multemaprices        rr   r   zPatternFeatures._emal  sm     v;":FQJggfWfo&FG_ 	6E4<C1t8$45C	6
rs   r   c                     t        |       ||z   k  ryt        j                  | |      }t        j                  | d|  |      }|dkD  r||z
  |z  dz  S dS )zCalcule la pente de l'EMAr   Nr   )r   r   r   )r   r7  r   ema_currentema_prevs        rr   r   zPatternFeatures._ema_slopew  se     v;(**%**66:"''z	(:FC<DqLh&(2S8OaOrs   std_devc                     t        |       |k  r| d   | d   | d   fS t        j                  | | d       }t        j                  | | d       }|||z  z   ||||z  z
  fS )zCalcule les bandes de Bollingerru   N)r   r   r   r   )r   r7  r?  smar   s        rr   r   zPatternFeatures._bollinger  sv     v;":vbz6":55ggffWX&'ffVVGH%&Ws]"Cw})<<<rs   
ema_period
atr_periodatr_multc           	         t        |       t        ||dz         k  r| d   | d   | d   fS t        j                  | |      }g }t	        dt        |dz   t        |                   D ],  }t        | |    | | dz
     z
        }|j                  |       . |rt        j                  |      nd}|||z  z   }	|||z  z
  }
|	||
fS )uy   Calcule les Keltner Channels basés sur l'ATR
        
        Returns:
            (kc_upper, kc_mid, kc_lower)
        rY   ru   r   )
r   r   r   r   r   r   r   r   r   r   )r   rB  rC  rD  r   true_rangesr   tratrr   r   s              rr   r   zPatternFeatures._keltner  s     v;Za88":vbz6":55 !%%fj9 q#j1nc&k:; 	#AVQBZ&!A,./Br"	# '2bggk"qHsN*HsN*))rs   c                 J   t        |       |dz   k  ryt        j                  |       }t        j                  |dkD  |d      }t        j                  |dk  | d      }t        j                  || d       }t        j                  || d       }|dk(  ry||z  }ddd|z   z  z
  S )zCalcule le RSIrY   r   r   Nr   )r   r   r   wherer   )r   r7  deltasgainslossesavg_gainavg_lossrss           rr   r   zPatternFeatures._rsi  s     v;!#!VQ/&1*vgq1775&?+7766'(+,q= cQVn%%rs   N)r   )r}   rX   )r}   r          @)   )r   r   r   r   staticmethodr   floatr   r6  r   ndarrayintr   r   r   r   r   r   r   rs   rr   r   r     si   ;Me MtE{ Md M M^
 RZZ     P2:: Ps Pc P% P P =2:: =s =# =eTY[`bgTgNh = = * * *s *[` *kpqvx}  @E  rE  lF * *4 &RZZ & &e & &rs   r   c                       e Zd ZdZdefdZy)WatchlistItemz$Item de surveillance avec scoring IAsymbolc                     || _         d| _        d | _        d | _        d| _        d| _        i | _        d | _        d| _        d| _	        d| _
        y )Nr   watching )rZ  scorepatterntrigger_pricepredicted_gain
confidencer  last_updatestatusreason	countdown)rp   rZ  s     rr   rg   zWatchlistItem.__init__  sR    
! rs   N)r   r   r   r   strrg   r   rs   rr   rY  rY    s    .s rs   rY  c                      e Zd ZdZej
                  j                  ej
                  j                  e            Z	dZ
d'defdZd Zd Zdefd	Zdefd
Zd Zd ZdZdZdZd'dedee   dee   defdZdee   dee   fdZdedefdZdedee   dededeeef   f
dZ d(dededee   fdZ!d Z"d Z#dedefdZ$dee   fdZ%dee   fdZ&ded ed!efd"Z'd# Z(defd$Z)d%ee   fd&Z*y))r   u   
    Système de prédiction IA pour anticiper les mouvements de marché
    Utilise le GPU pour l'analyse massive de patterns
    FN
model_pathc                    |+t         j                  j                  | j                  dd      }|| _        d | _        d | _        d | _        i | _        g | _	        g | _
        d| _        d| _        t        j                         | _        dt         _        dt         _        d t         _        t(        j+                  d       d| _        d| _        d	d
d
d d d d
d
d
d t0        xr	 t2        dk(  d| _        | j7                          t8        r
t;               nd | _        t>        r
tA               nd | _!        tD        r
tG               nd | _$        tJ        r
tM               nd | _'        tP        r
tS               nd | _*        tV        r
tY               nd | _-        t\        r
t_               nd | _0        tb        rte        d      nd | _3        th        r
tk               nd | _6        d | _7        tp        r=	 ts               | _7        t(        j+                  d| jn                  jt                   d       t8        st>        stD        rt(        j+                  d       d| _=        d
| _>        | j                          y # tv        $ r"}t(        jy                  d|        Y d }~ld }~ww xY w)Nmodelszpredictor.h5Fr           u,   🔄 Mode crash réinitialisé au démarrage<   7   	untrainedr   rZ   )rd  samples_countepochs_completed	last_losslast_accuracylast_trainingpredictions_madecorrect_predictionsvalidation_accuracygpu_namegpu_available  )num_simulationsu2   🧠 LSTM Reversal Predictor initialisé (trained=)u"   ⚠️ Erreur init LSTM Reversal: u5   🚀 Modules d'amélioration IA activés avec succèsNEUTRAL)@ospathjoin
SCRIPT_DIRri  modelklines_fetcherbinance_client	watchlisthistorical_patternsprediction_history
is_runningupdate_interval	threadingLock_lockr   _market_crash_mode_btc_momentum_last_market_checkloggerinfoSCORE_THRESHOLDCONFIDENCE_THRESHOLDTORCH_AVAILABLEDEVICEtraining_stats_load_training_statsMULTI_TIMEFRAME_AVAILABLEr!   multi_tf_analyzerVOLUME_PROFILE_AVAILABLEr"   volume_analyzerREGIME_DETECTOR_AVAILABLEr#   regime_detectorFEATURE_EXTRACTOR_AVAILABLEr$   feature_extractorTIME_PATTERN_AVAILABLEr%   time_analyzerCORRELATION_ANALYZER_AVAILABLEr&   correlation_analyzerRISK_ADJUSTED_AVAILABLEr'   risk_scorerMONTE_CARLO_AVAILABLEr(   monte_carloENSEMBLE_PREDICTOR_AVAILABLEr)   ensemblereversal_predictorLSTM_REVERSAL_AVAILABLEr+   
is_trained	Exceptionwarning_cached_market_regime_regime_cache_time_init_model)rp   ri  es      rr   rg   zAIPredictor.__init__  s5   dooxPJ$
""35#% "$ ^^%
 */&$'!)-&BC  "$&! " !!! !#$#$,A61A
 	!!# =V!6!8[_8P24VZ8Q24W[<W!6!8]a<R68X\B`$<$>fj!9P35VZNc4TJim4P.0VZ #'"I*@*B'PQUQhQhQsQsPttuvw %(@D]KKOP &/""# 	  I!CA3GHHIs   <I 	J&JJc                    t         j                  j                  | j                  d      }	 t         j                  j	                  |      rmt        |d      5 }t        j                  |      }| j                  j                  |       t        j                  d|j                  dd              ddd       t        rGt         dk(  r=	 t"        j$                  j'                  d	      | j                  d
<   d| j                  d<   yyy# 1 sw Y   WxY w# t        $ r"}t        j                  d|        Y d}~d}~ww xY w#  Y yxY w)u5   Charge les statistiques d'entraînement sauvegardéesai_training_stats.jsonru&   📊 Stats d'entraînement chargées: rd  unknownNz!Impossible de charger les stats: rZ   r   rx  Try  )r~  r  r  r  existsopenjsonloadr  updater  r  r  r  r  r  r  rv   rZ   get_device_name)rp   
stats_filefsaved_statsr  s        rr   r  z AIPredictor._load_training_stats  s   WW\\$//3KL
	Dww~~j)*c* qa"&))A,K''..{;KK"HYaclImHn opq v/27**2L2LQ2O##J/7;##O4  0?q q  	DNN>qcBCC	Ds<   +D AD0D ;E  DD 	D=D88D= Ec                 F   t         j                  j                  | j                  d      }	 t	        |d      5 }t        j                  | 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)u+   Sauvegarde les statistiques d'entraînementr  wrX   )indentdefaultNz%Impossible de sauvegarder les stats: )r~  r  r  r  r  r  dumpr  rg  r  r  r  )rp   r  r  r  s       rr   _save_training_statsz AIPredictor._save_training_stats/  s    WW\\$//3KL
	Hj#& I!		$--qCHI I I 	HNNB1#FGG	Hs4   A5 (A) A5 )A2.A5 2A5 5	B >BB r   c                    ddl }|j                         }|| j                  z
  dk  r| j                  dk7  r| j                  S d}	 ddlm}  |       }|r1t        |d      r%|j                  }|r|dk7  r|}|| _        || _        |S 	 | j                  r4t        | j                  d      r| j                  j                  }|r|dvr|}|| _        || _        |S # t        $ r Y \w xY w# t        $ r Y *w xY w)u   
        🔧 FIX 07/02: Récupère le régime marché de façon fiable.
        Lit le singleton partagé avec trading_bot.py (synchronisé via get_market_regime_detector).
        Cache le résultat 30s pour éviter les appels répétés.
        r   Nr   r}  )get_market_regime_detectorcurrent_regime)r}  SIDEWAYS)	timer  r  market_regimer  hasattrr  r  r  )rp   _timenowregimer  
_singleton_rs          rr   _get_market_regimezAIPredictor._get_market_regime8  s    	jjl(((2-$2L2LPY2Y---	@35Jgj2BC.."	/F17D..1D+!M
	##0D0DFV(W))88"$;;F &,""%  		  		s%   ?C A C% 	C"!C"%	C10C1c                    d}| j                   d   dk(  rd}| j                   j                  dd      r| j                   d   dkD  r|dz  }| j                   j                  dd      d	kD  r|d
z  }| j                   j                  dd      }|dkD  r|d
z  }n*|dkD  r|dz  }n|dkD  r|dz  }n| j                   d   dk(  rd}t        |d      | j                   d   ddddj                  | j                   d   d      | j                   d   | j                   d   | j                   j                  dd      xs d| j                   j                  dd      xs d| j                   j                  dd      | j                   d   | j                   d   | j                   j                  d      | j                   j                  dd      | j                   d   | j                  d ud!S )"u;   Retourne les informations d'entraînement pour le dashboardr   rd  trainedr   rs  r   r}   rw  rn  rV   rp  rz  i  r   r   r   trainingr   u   🔴 Non entraînéu   🟡 En cours...u   🟢 Entraîné)ro  r  r  Inconnurq  rr  ru  rv  rt  rx  CPUry  N)r   rd  status_labelrp  epochsaccuracylossrw  ru  rv  rt  rx  ry  model_loaded)r  r  r   r  )rp   r   sampless      rr   get_training_infozAIPredictor.get_training_infob  s    x(I5E""&&:t?R?RSb?cfi?i""&&'<a@2E))--oqAG~33
  *j8E _))(32., c$%%h/;!00A))*<=++//CHq''++K;@q#'#6#6#:#:;PRS#T $ 3 34F G#'#6#67L#M!0044_E++//
EB!00A JJd2%
 	
rs   c                    t         s1t        j                  s t        j	                  d       dt        _        y	 | j
                  j                  dd      }t        j	                  d|        t        j	                  dt        j                  j                  |              t        j                  j                  |      r	 t        j                  j                  t        g       	 t        j                  |t        d	      }t!        |t"              rPd
|v rL| j%                         | _        | j&                  j)                  |d
          t        j	                  d|        n|| _        t        j	                  d|        | j&                  rF| j&                  j/                          y| j%                         | _        t        j	                  d       yy#  Y xY w# t*        $ rL}t        j-                  d|        | j%                         | _        t        j	                  d       Y d}~d}~ww xY w# t*        $ r)}t        j1                  d|        d| _        Y d}~yd}~ww xY w)u,   Initialise le modèle de prédiction PyTorchuR   ℹ️  PyTorch non disponible, utilisation du mode règles (performance réduite)TN.h5.ptu   🔍 Recherche modèle: z   Fichier existe: F)map_locationweights_onlymodel_state_dictu*   ✅ Modèle PyTorch chargé (state_dict): u'   ✅ Modèle PyTorch chargé (complet): u%      Impossible de charger le modèle: u3   ✅ Nouveau modèle PyTorch créé (non entraîné)u   Erreur chargement modèle: )r  r   _pytorch_warning_loggedr  r  ri  replacer~  r  r  rv   serializationadd_safe_globalsr\   r  r  
isinstancedict_create_modelr  load_state_dictr  r  evalerror)rp   model_path_ptloadedr  s       rr   r  zAIPredictor._init_model  s   66pq6:3(	 OO33E5AMKK2=/BCKK-bggnn].K-LMNww~~m,''88-I
W"ZZFY^_F!&$/4F&4P%)%7%7%9


226:L3MN&PQ^P_$`a &,
&Mm_$]^ ::JJOO% "//1
QR /  ! WNN%J1##NO!%!3!3!5DJKK UVV	W  	LL6qc:;DJJ	s\   BH4 $G 'BG &H4 )*H4 GH4 	H1%AH,'H4 ,H11H4 4	I&=I!!I&c                 N    t         syt               j                  t              }|S )u9   Crée un modèle LSTM PyTorch pour la prédiction de prixN)r  r\   tor  )rp   r  s     rr   r  zAIPredictor._create_model  s!     ""6*rs   rl  rZ  r   r   c                 \'   t        |      }t        j                         |_        t        j
                  xr |dk7  }g d}|j                  dd      }||v xs d|v xs
 d|v xs d|v }|r7d|_        d	|_        d
|_	        d|_
        t        j                  d| d       |S d}	t        r-t        |      dk\  r	 t               }
|
j!                  |||      }	t"        j%                  ||      xs i |_        |	j)                         |j&                  d<   |	j*                  |j&                  d<   |	j,                  |j&                  d<   |	j.                  |j&                  d<   |	j0                  |j&                  d<   t3        |	j*                        |_        |j                  }d|_        |	j                  |_
        |t4        v r|j                  }t7        d|j                  t8        z         |_        d|j&                  d<   t8        |j&                  d<   |j                  dk\  r@t        j;                  d| dt8         d| d|j                   d	       nd|j&                  d<   t<        rt?               }|jA                         r|jC                          |jE                         \  }}||v r|jG                  |i       }|jG                  d d!      }|j                  }t7        d|j                  |z         |_        d|j&                  d"<   ||j&                  d#<   t        j;                  d| d$| d| d|j                   d%|jG                  d&d'       
       nd|j&                  d"<   tH        r	 tK               }|jM                  |      }|jO                  |      }|jQ                  |      r@d(|_	        t3        |j                  d)z        |_        t        j;                  d*| d+| d,       |jS                  |      ryd-}|j                  }t7        d|j                  |z         |_        d|j&                  d.<   ||j&                  d/<   t        j;                  d0| d1| d| d|j                   d2| 
       n}|d3k(  rxd4}|j                  }t7        d|j                  |z         |_        d|j&                  d5<   ||j&                  d/<   t        j;                  d6| d7| d| d|j                   d2| 
       ||j&                  d8<   ||j&                  d9<   d>}|j                  ||z   kD  r;||z   }t        j;                  d?| d@| dA|j                   dB| dC| d       ||_        ||j&                  dD<   |j                  |z
  |j&                  dE<   tX        r	 t[        | dFd      }t]        |      }|j_                  ||      }||j&                  dG<   |dH   |j&                  dH<   |jG                  dId      |j&                  dI<   |dJ   |j&                  dJ<   |dK   |j&                  dK<   |dL   |j&                  dM<   |ja                  |      \  }}|rbdN|_	        d|_        |dJ   rdOndP|_        d|_
        t        jW                  dQ| dR|        t        jW                  dS|dH   dTdU|dL           |S |jc                  |      }|j&                  jG                  dVd      }|j&                  jG                  dWd      }|j&                  jG                  dXd      } |dkD  s|dYkD  r4t3        |dZz        }|dkD  r!t        j;                  d[| d\|d]d^|d]d_       | d`k(  r |d4kD  rd4}t        j;                  da| db       |dkD  r|j                  }te        d|j                  |z
        |_        ||j&                  dc<   |d-k\  r_t        j;                  d*| dd| d| d|j                   d	       t        j;                  de|df    d;dgjg                  |dh   ddi               d}!| jj                  rt        |      dk\  r	 tm        jn                  |tl        jp                  k      }"|r%tm        jn                  |tl        jp                  k      nd}#| jj                  js                  |"|#      }!|!r@|!jG                  dld      |j&                  dm<   |!jG                  dnd      |j&                  do<   |!jG                  dpd      |j&                  dq<   |!jG                  drd      |j&                  ds<   |!jG                  dtd      |j&                  du<   |!jG                  dvd      |j&                  dw<   |!jG                  dtd      r|!jG                  drd      }$|!jG                  dpd      }%t7        d-t3        |$|%z  dxz              }&|&dkD  r|j                  }t7        d|j                  |&z         |_        |&|j&                  dy<   t        j;                  da| dz|& d| d|j                   d{|$d|d}|%d]       n|!jG                  dvd      r|!jG                  drd      }$t7        d!t3        |$d~z              }'|'dkD  re|j                  }te        d|j                  |'z
        |_        |'|j&                  d<   t        j;                  da| d|' d| d|j                   d	       | jj                  ju                  |"|#       |j&                  jG                  dd      }(|j&                  jG                  dWd      }|j&                  jG                  dd      })|j&                  jG                  dd      }*|j&                  jG                  dVd      }+|j&                  jG                  dd      },|j&                  jG                  dd      }-|j&                  jG                  dd      }.|j&                  jG                  dd      }/|j&                  jG                  dd      }0|/t        |      d-k\  r!|d   tm        jv                  |dd       dz   z  nd}1|1|j&                  d<   |1|j&                  d<   |dk(  r|,t        _<        t        j                         t        _=        | j}                         }2dddddjG                  |2d      }3dddddjG                  |2d      }4|,|3k  xr |+|4k  }5|+dkD  xs |,dkD  }6|5r:t        j
                  st        jW                  d|,d]d|+d]d       dt        _        n;|6r9t        j
                  rt        jW                  d|+d]d|,d]d       dt        _        | j}                         }7|t4        v }8|7dk(  rd}9n
|7dk(  rd}9nd}9|(|9k  }:|8rd};nd};|1|;k\  }<|8rdnd~}=|+|=kD  }>d}?|-|?k  }@|.dk(  xs |)dkD  xs |dkD  xr |+dZkD  }A|*dk(  xs |)dkD  }B|j&                  jG                  dd      }C|Cdk  }D|:xr |<xr |>xr
 @xr Bxr D}E|Exr Axr |1dk\  xr |0dik\  }F|Frd|_        d|_	        t7        d-t3        |1dz
  d!z              }Gt7        d|j                  |Gz         |_        t        j;                  d| d|(d]d|d]d|1dTd|-d|d|+d]d|j                          |S ErId|_        d|_	        t        j;                  d6| d|(d]d|d]d|1dTd|-d|d|+d]d|j                          |S d|_        d|_	        |j                  dk\  rg }H|:sHj                  d|(d]d|9        |<sHj                  d|1dTd|;        |>sHj                  d|+d]d|=        @sHj                  d|-d|d|?        BsHj                  d|)dd       DsHj                  dC d       |8r,t        j;                  d| ddgjg                  H              |S t        j                  d| ddgjg                  H              |S t"        j%                  ||      }J|Js	d|_	        |S J|_        |JjG                  dd      }K|JjG                  dWd      }L|JjG                  dd      }M|JjG                  dd      }N|JjG                  dVd      }O|JjG                  dd      }P|JjG                  dd      }Q|JjG                  dd      }R|JjG                  dd      }S|JjG                  dd      }T|/t        |      d-k\  r!|d   tm        jv                  |dd       dz   z  nd}U|UJd<   Kdk  }V|Udk\  }WOd~kD  }XQdk  }YNdk(  xs MdkD  }ZVxr Wxr
 Xxr Yxr Z}[Rdk(  xs MdkD  }\[xr \xr Udk\  xr Tdik\  }]|]rFd|_        t7        d|j                  t7        d-t3        Udz
  d!z              z         |_        d|_	        n0[rd|_        d|_	        nd|_        |j                  dk\  rdnd|_	        |t4        v r||j                  }t7        d|j                  t8        z         |_        dJd<   t8        |Jd<   |j                  dk\  r6t        j;                  d| dt8         d| d|j                   d	       ndJd<   |r[d|_        d|_	        |j                  Jd<   d4|_        t        | j                        dk  rt        jW                  d| dJd    d͝       |S # tT        $ rE}t        jW                  d:| d;| d<       d|j&                  d8<   d=|j&                  d9<   Y d}~d}~ww xY w# tT        $ r&}t        ji                  dj| d;|        Y d}~d}~ww xY w# tT        $ r&}t        j                  d| d;|        Y d}~sd}~ww xY w# tT        $ rP}ddl@}It        jW                  d| d;|        t        j                  d|Ij                                 Y d}~d}~ww xY w)u  
        Analyse complète d'un symbole pour détecter les opportunités
        Retourne un WatchlistItem avec le score et les prédictions
        Utilise le scorer GPU avancé si disponible
        
        L'ANALYSE CONTINUE TOUJOURS - Seul l'ACHAT est bloqué en mode crash
        rB   )USDCUSDTBUSDUSDTDAIUSDTTUSDUSDT	FDUSDUSDTUSDPUSDTFRAXUSDTLUSDUSDTUSTCUSDT	PYUSDUSDTEURUSDTGBPUSDTPAXGUSDTXAUTUSDTWBTCUSDT	STETHUSDTRETHUSDTBETHUSDT	WBETHUSDT	CBETHUSDTLUNCUSDTUSDTr]  USDEURPAXGr   STABLECOIN_REJECTEDrejected   🚫 u3   : Stablecoin rejeté - ne peut jamais atteindre TP!Nr   advanced_profileadvanced_scoreprofit_potentialentry_qualityreversal_scorer}  r   Tis_top20top20_bonusrm     ⭐ z: TOP 20 BONUS + (u   →r|  Fbonus_scorerV   is_whitelistedwhitelist_bonusz: PERFORMANCE WHITELIST +z) - Win rate win_ratezN/Avolatility_poorr      ⚠️ u   : VOLATILITÉ MAUVAISE (score=u   ) - Réduction 40%r}   volatility_excellentvolatility_bonusu   🌟 u   : VOLATILITÉ EXCELLENTE +z) - Score vol=goodr   volatility_good   ✅ u   : VOLATILITÉ BONNE +volatility_scorevolatility_categoryu%   ⚠️ Erreur volatility scorer pour : u    - Ignoré, analyse continuer  r   u   🔒 u   : BONUS CAPPÉ — GPU=z, brut=u	   , cappé=z (max +gpu_original_scoretotal_bonusr  long_term_analysistrend_4htrend_8his_dead_cat_bounceis_prolonged_downtrend
risk_scorelong_term_risk_scorelong_term_blockedDEAD_CAT_BOUNCEPROLONGED_DOWNTREND   ⛔ u   : BLOQUÉ - u      └─ Trend 4h: .1fz	%, Risk: r   r   lstm_reversal_direction      r   u   📈 u/   : Pénalité long terme RÉDUITE (reprise: mom=.2fz% ema_diff=%)REVERSAL_UP   🧠 u:   : LSTM REVERSAL_UP → pénalité long terme CAPPÉE à 10long_term_penaltyu"   : PÉNALITÉ TENDANCE LONG TERME -u
      └─ recommendation, reasonsrX   zErreur analyse long terme dtypereversal_classlstm_reversal_classreversal_labellstm_reversal_labelreversal_probabilitylstm_reversal_probrb  lstm_reversal_confidenceis_reversal_signallstm_is_reversal_signalis_danger_signallstm_is_danger_signalr   lstm_reversal_bonusu   : LSTM REVERSAL_UP détecté! +z) conf=.0f% prob=r   lstm_reversal_penaltyu!   : LSTM REVERSAL_DOWN détecté! -zErreur LSTM reversal r   r   r   r   r   r   r   r   consec_green_candlesru   r   r   r   r+  r                            BULL_STRONG	BULL_WEAKr}  BEARg            u   🚨 CRASH MARCHÉ! BTC Mom5=% Mom3=u   % - Achats BLOQUÉS!u%   ✅ FIN CRASH - BTC en reprise: Mom3=% Mom5=u   % - Achats DÉBLOQUÉS!rV  ?rW  gzG?gffffff?r   皙?rY   r   r   r   g?CREUX_REBOUNDready   🔥 u   : SIGNAL FORT — BB=z
 EMA_diff=z% VOL=zx RSI= Mom=z% Score=u   : SIGNAL ACHAT — BB=r\  zBB=z>=zVOL=zx<zMom=z%<zRSI=zBEARISH(slope=.3fz
DOWNTREND(zbougies)u   ⏳ u   : WATCHING — manque: u   Erreur scorer avancé pour zTraceback: insufficient_datag?low_potentialMARKET_CRASH_BLOCKEDmarket_crash_blockedreal_score_before_crash_blockre      🚨 u+   : ACHAT BLOQUÉ (mode crash) - Score réel=u    conservé pour analyse)CrY  r	   r  rc  r   r  r  r^  r_  rd  rb  r  debugADVANCED_SCORER_AVAILABLEr   r   analyze_cryptor   r6  r  to_dictfinal_scorer  r  r  rW  TOP_20_CRYPTOSr   TOP_20_SCORE_BONUSr  PERFORMANCE_ANALYZER_AVAILABLEr   should_updater  get_whitelistr  VOLATILITY_SCORER_AVAILABLEr   	get_scoreget_categoryis_pooris_excellentr  r  LONG_TERM_TREND_AVAILABLEgetattrr*   analyze_long_term_trendshould_block_buyget_score_penaltyr   r  r  r  r   r   float64predict	feed_datar   r  r  r  r   	traceback
format_excr  )^rp   rZ  r   r   itemis_market_crashSTABLECOINS
base_assetis_stablecoinr  scorerr'  	old_scoreanalyzerperf_whitelistwhitelist_scores
bonus_databonus
vol_scorer	vol_scorevol_categoryr  	max_bonuscapped_scorer  lt_analyzerlt_analysisshould_blockblock_reasonscore_penaltycurrent_momentumr   lstm_rev_dirlstm_reversal_result
prices_arrvolumes_arrrev_confidencerev_prob
lstm_bonuslstm_penaltyr   r   r   r   r   r   r   r   consec_greenr+  _crash_regime	_crash_m5	_crash_m3is_btc_crashingis_btc_recovering_regime_now	_is_top20_bb_thresholdsignal_bb_low_vol_thresholdsignal_volume_mom_minsignal_momentum_rsi_max
signal_rsisignal_ema_turningsignal_trend_ok_candles_since_crosssignal_not_structural_downtrendis_buy_signalis_strong_signalstrength_bonusmissingr  r  bb_position_c
ema_diff_cema_slope_cema_trend_bearish_cmomentum_3_cmomentum_5_crsi_cema_cross_bullish_cema_cross_fresh_cconsec_green_cvol_ratio_csignal_bb_low_csignal_volume_csignal_momentum_csignal_rsi_csignal_trend_ok_cis_buy_signal_csignal_ema_cis_strong_signal_cs^                                                                                                 rr   analyze_symbolzAIPredictor.analyze_symbol  s/    V$#<<> &88PVy=P
 ^^FB/
+-o*1DoQ[H[o_eio_oDJ0DL$DKDOLL5([\]K  $V):XE,.#)#8#8#Q  !0 @ @ Q WUW4D4L4L4N012B2N2N./4D4U4U011A1O1Oo.2B2Q2Q./ !!1!=!=>
%)ZZ"  )"2"="=
 ^+ $

I!$S$**7I*I!JDJ04DMM*-3EDMM-0zzR'd6(2BCUBVVXYbXccfgkgqgqfrrs$tu05DMM*- 279H  --/ ) 8@7M7M7O4N$4/%5%9%9&"%E
 *}b A$(JJ	%(djj5.@%A
:>&67;@&78d6(2KE7RTU^T__bcgcmcmbnn{  }G  }K  }K  LV  X]  }^  |_  %`  a:?&67 /)I%:%<

 %/$8$8$@	'1'>'>v'F
 &--f5*;DK),TZZ#-=)>DJ"KK'&9WXaWbbt(uv &226:$&E(,

I),S$**u2D)EDJDHDMM*@A@EDMM*<="KK%x7QRWQXXZ[dZeehimisisht  uC  DM  CN  )O  P *V3$&E(,

I),S$**u2D)EDJ?CDMM*;<@EDMM*<="KK$vh6KE7RTU^T__bcgcmcmbnn|  ~G  }H  )I  J<E&89?K&;< 	:: 2Y >>#5	#ALKK%x/FGYFZZabfblblammv  xD  wE  EL  MV  LW  WX  !Y  Z!-DJ6H23/3zz<N/Nm, ->Q)07G)N&<^&L&1&I&I&RX&Y ?J&:;4?
4Kj14?OOJPQ4Rj1>IJ^>_&:;BMNfBg&>?@KL@Y&<= 6A5Q5QR]5^2l'*=DK)*DJ@KL`@a+<g|DL./DO"NNT&l^+TU"NN-A+jBYZ]A^^ghs  uA  iB  hC  ,D  E#'K
 )4(E(Ek(R ,0==+<+<\1+M(#'==#4#4Z#C'+}}'8'89RTV'W ,a/8d?,/0C,DM,q0 &eF8;jk{|  kA  AL  MU  VY  LZ  Z\  -]  !^ (=8]R=O,.M"KK%x7q(rs(1,(,

I),Q

]0J)KDJANDMM*=>,2 &gfX=_`m_nnpqzp{{~  @D  @J  @J  K  KL  -M  !N &jEU9V8WWYZ^ZcZcdopydz{}|}d~Z  ZA  -B  !C (,$**s6{b/@(L%'XXfBJJ%G
MTbhhwbjj&IZ^/3/F/F/N/Nz[f/g,/CWC[C[\lnoCpDMM*?@CWC[C[\lnwCxDMM*?@BVBZBZ[qstBuDMM*>?H\H`H`amopHqDMM*DEG[G_G_`tv{G|DMM*CDEYE]E]^prwExDMM*AB  4778LeT1E1I1I,XY1Z+?+C+CDZ\]+^-0S(9RUX9X5Y-Z
#->04

I14S$**z:Q1RDJKUDMM2G$H$*KK%x?^_i^jjlmvlwwz{  |F  |F  {G  GN  O]  ^a  Nb  bi  jr  sv  iw  1x  %y!5!9!9:Le!T1E1I1I,XY1Z/22s>D;P7Q/R#/!#304

I14Q

\8Q1RDJMYDMM2I$J$*KK%x?`am`nnpqzp{{~  @D  @J  @J  K  KL  1M  %N !33==j+V& %)MM$5$5mS$I$(MM$5$5j!$D$(MM$5$5k1$E	$(MM$5$56I1$M!$(MM$5$5lA$F
$(MM$5$5lA$F
$(MM$5$5eR$@$(MM$5$56I1$M!$(MM$5$56G$K$(MM$5$56La$P
  +G0B BK277734=#9E#ABIL  .7k*09n- Y&0:K-5=\\^K2$($;$;$=M044TXbf g k kly{  !AI044TXbf g k kly{  !AI)3i)?)ZJQZDZO)3a)I:>%&*=="NN-J:VYJZZablmpaq  rF  ,G  H9=6*&99"NN-RS]^aRbbijtuxiy  zQ  ,R  S9>6 #557"n4	 -/$(M K/$(M$(M +m ; %(N%(N )^ ; $-4$",x"7  8^
 &* <M<%:*s*: # $5#9#JY] (,}}'8'89VXZ'[$2F"2L/ "/ "E= "E!0"E5?"EDS"E%D 
 $1 $& &$& A% ! $#2DL#*DK%(S)c/R1G-H%IN!$S$**~*E!FDJKKx'<[<M N$$,S>	# G"3iuZ,<HTZZLR: 1 ##2DL#*DKKKvh&<[<M N$$,S>	# G"3iuZ,<HTZZLR*  $-DL#-DKzzR'"$,#kRUEVVXYfXg@h1i,$yQToUWXfWg@h1i.$zRUFVVXYaXb@c1d)$s3irRZQ[@\1]..QZ[^P__`@a1b>Q[\p[qqyOz@{$"KK$vh6MdiiX_N`Ma(bc  #LL4x7NtyyY`OaNb)cd #33FGD-DKK 
 'll=#>&ll:q9
&ll;:&ll+>B&ll<;&ll<;&ll5"5&ll+>B&ll+<a@&ll+A1E #G(: BK277734=1E9:AD 	 !,+d2)S0*T1#bj2a7J;?-~/~FW~\h~m~2a7J;?-o<3nKSVDV3n[imn[n*DLsDJJRkC>OSU=U9V1W$WXDJ"DK*DL"DK$DL)-r)9:DK
 ^#

IS$**/A"ABDJ#'HZ &8H]#zzRd6(*:;M:NbQZP[[^_c_i_i^jjklm#(HZ  1DL0DK 9=

H45DJ4>>"Q&vh.YZb  dC  [D  ZE  E\   ]  ^q % I)NvhVXYZX[[w'xy<>&89?H&;<Il % Q'A&A3%OPPQb % L'<VHBqc%JKKL|  E !<VHBqcJK{9+?+?+A*BCDDEs   :J*AM %F"AJ BAM 	DAK. !E*AK. AM *J-AL  N$AM <A
AM C#AM ++AM J	AK+J&:AK&K AM K&AK+K+AM K.	ALK7ALLAM LALLAM L 	AML)AM
MAM M
AMMAM M	AN+MAAN&N&AN+c                    | j                   rt        |      dk  st        syt        j                  |dd       }|t        j
                  |      z
  t        j                  |      dz   z  }t        j                  dt        j                        }||ddddf<   t        d      D ];  }|dk\  r||   ||dz
     z
  dz  |d|d	f<   |d
k\  s%||   ||d
z
     z
  d
z  |d|df<   = t        j                  |      j                  t              }| j                   j                          t        j                         5  | j                  |      }|j!                         j#                         }ddd       g dt        j$                  d            }t'        t        j(                  |d         dz        }| j*                  dxx   d	z  cc<   ||t'        |d   d   dz        dS # 1 sw Y   yxY w)u:   Utilise le modèle LSTM PyTorch pour prédire la directionr   Ng:0yE>)rY   r   r}   r?  r   r   rY   r   rX   )downneutralupr   ru  )	directionrb  r^  )r  r   r  r   r   r   r   zerosfloat32r   rv   tensorr  r  r  no_gradrW   numpyargmaxrU  r   r  )	rp   r   prices_normXr   X_tensor
predictionr  rb  s	            rr   _predict_with_modelzAIPredictor._predict_with_model  s   zzS[2-_ hhvcd|,"RWW[%99bff[>QTX>XY HH[

3 !Q'
 r 	GAAv)!n{1Q3/??1D!Q'
Bw)!n{1R4/@@BF!Q'
		G <<?%%f- 	

]]_ 	2H-J#)//1J	2
 .bii
1.FG	266*Q-0367
 	./14/ #$:a=+c12
 	
	2 	2s   90G!!G*r  c                     |j                  dd      r	|d   dk  ry|d   r	|d   dk  ry|d   r	|d   dkD  ry|d   dk  r	|d   dkD  ry	|d
   ry|d   r	|d   dkD  ry|d   dkD  r	|d   dk  ry|d   dk  r	|d   dkD  ryy)zIdentifie le pattern principalr   r   r   SQUEEZE_BREAKOUTr   SQUEEZE_SETUPr   r6  DIP_RECOVERYr   RSI_OVERSOLDr   r   SUPPORT_BOUNCEr   r   GOLDEN_CROSSr   LOW_VOL_TRENDr}  r  )rp   r  s     rr   _identify_patternzAIPredictor._identify_pattern  s     <<.2x
7Ka7O%l#(<q(@"l#(=(A%j!D(Xk-BQ-F!n%!n%(<*@1*D#j!A%(3G*H3*N!l#c)h{.Ca.G"rs   entry_pricecurrent_profit_pctc           	         t        |      dk  ryt        j                  |      }|sy|j                  dd      }g }d}|j                  dd      }	|j                  dd      }
|j                  dd      }|j                  d	d
      }|j                  dd      }|dkD  xr |	dkD  xr |
dkD  }|ry|dk  r#|	dk  rd}|d
z  }|j	                  d|dd       nP|dk  r&|dk  r!|
dk  r|dz  }|j	                  d|dd       n%|dk  r |	dk  r|dz  }|j	                  d|dd       |	dk  rd}|d z  }|j	                  d!|	d"d#       nF|	dk  r!|
d$k  r|d%z  }|j	                  d&|	d"d'       n |
d(k  r|dz  }|j	                  d)|
d"d*       |d+kD  r(|	d,k  r#|d kD  r|d%z  }|j	                  d-|d"d.|d       |dk  r3|dk  r.|	dk  r)d}|dz  }|j	                  d/t        |      d"d0|d       |j                  d1d      r|d%z  }|j	                  d2       |j                  d3d      r|dz  }|j	                  d4       |j                  d5d      }|dk  r$|d6z  }|j	                  d7t        |      d8d9       |	dk  r|d6z  }|j	                  d:|	d"d'       |dk  r|dkD  r|dz  }|j	                  d;       |j                  d<d      r|d%z  }|j	                  d=       |dk  r|dz  }|j	                  d>       |rD|d?k\  r?d@| dAdBj                  |dCdD       z   }t        j                  dE| dF| dG|d"d'       d|fS |dHk\  rI|dk\  s|dk  r?dI| dAdBj                  |dCdD       z   }t        j                  dE| dJ| dG|d"d'       d|fS |dk  rD|d k\  r?dK| dAdBj                  |dCdD       z   }t        j                  dL| dM| dG|d"d'       d|fS |dNk\  rd6}n2|dOk\  rd%}n*|dPk\  rd}n"|dQk\  rdR}n|dSk\  rdT}n|dUk\  rdV}n
|dk\  rdW}nd
}||k\  }|rdX| dAdBj                  |dCdD       z   }d|fS y)Yu  
        Détecte si une position doit être vendue aux premiers signes de faiblesse
        Retourne (should_sell, reason)
        
        AMÉLIORATIONS v2.0:
        - Détection RSI TRAP (chute soudaine du RSI)
        - Détection ventes massives avec momentum
        - Seuils abaissés pour réactivité
        - Vente urgente en cas de danger
        
        Stratégie: Vendre dès les premiers signaux de retournement - RÉACTION RAPIDE
        L'IA prend le contrôle de la décision de vente
        r}   )Fr]  r   r   Fr   r   r   r   r   r   r   r   r   )Fu%   🚀 Tendance haussière forte - HOLDr   r6  Tu   🚨 RSI TRAP: RSI=rM  z + chuter   r   r   (   u   ⚠️ RSI danger précoce: u    + EMA baissière皙ɿu   ⚠️ RSI faible: u    + momentum négatif      rm  u   🚨 CRASH: r7  z% sur 3 bougies皙#   zChute rapide: Mom3=%rY  zChute forte: z% sur 5 bougies      ?r]  u   ⚠️ SOMMET PROCHE: BB=z Mom ralentit RSI=u   🚨 FIN CYCLE: EMA-% RSI=r   zRSI retourne en zone hauter   u   EMA9 fléchitr   r   zPrix -r4  z% du sommetzMomentum 3 bougies: zSortie zone BB hauter   u   3 bougies baissièreszDeath cross EMAP   u   🚨 IA VENTE URGENTE (z): r=  Nre   rh  z: VENTE URGENTE IA - Score=z P&L=r   u   ⚠️ IA VENTE FORTE (z: VENTE FORTE IA - Score=u   ⚠️ CUT LOSS (u   ✂️ z: CUT LOSS IA - Score=r   r         @      @rn        ?r   皙?K   U   u   🔔 IA VENTE ()	r   r   r6  r  r   r   r  r  r  )rp   rZ  r   r  r  r  
sell_scorer>  urgent_sellr   r   r   r   r   strong_uptrendr   re  	thresholdshould_sells                      rr   should_sell_earlyzAIPredictor.should_sell_early*  s|    v;"33F; \\"5q9

 \\,2
\\,2
<<
A.ll5"%ll=#6 #S.RZ#-=R*sBRA 8
T)K"JNN0S	BC2X(U*zD/@"JNN9#cBSTU2X*t+"JNN0S	9MNO K"JNN\*S)9IJ$:#4"JNN0C0@BC$"JNN]:c*:/JK *s"2sRx"JNN6{36GGYZ]^aYbcd d?sRxJNK"JNN1#h-1DF3s)TU <<*A."JNN78 <<*"JNN?+ &\\*>B$"JNNVC(:$;C#@LM "JNN1*S1ACD !3c!9"JNN12 <<)1-"JNN23 d?"JNN,- :+.zl#>7SUTU;AWWFNNU6(*Ej\QVWijmVnnopq< "4";?QUY?Y.zl#>7SUTU;AWWFNNU6(*CJ<uUghkTllmno< $r)9(C8499WRa[;QQFNNWVH,B:,eTfgjSkklmn<
 "I1$I3&I3&I3&I3&I1$II I-&zl#672A;9OOF<rs   intervalc                 $   | j                   st        j                  d       y	 | j                  ||d      }|rt        |      dk  ryddl}t        |      dk\  r+t        |d   d         d	z  |j	                         kD  r|dd }n|}|D cg c]  }t        |d
          }}|D cg c]  }t        |d          }}| j                  |||      }	|||	j                  |	j                  |	j                  |	j                  |	j                  |	j                  |	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      nd|	j                  r|	j                  j                  dd      ndd
t        j                          j#                         d
S c c}w c c}w # t$        $ r(}
t        j'                  d| d| d|
        Y d}
~
yd}
~
ww xY w)u~  
        Analyse un symbole pour un intervalle spécifique.
        Cette méthode est utilisée par l'API pour analyser à la demande.
        
        Args:
            symbol: Le symbole à analyser (ex: BTCUSDT)
            interval: L'intervalle Binance (1m, 5m, 15m, 1h, 4h, 1d)
        
        Returns:
            Dict avec les données d'analyse ou None si erreur
        u;   klines_fetcher non défini pour analyze_symbol_for_intervalNr   r   r   rX   ru      rz  r   r   r   r   r   r   r   r   r   r   r   r   )
r   r   r   r   r   r   r   r   r   r   )
rZ  r   r^  r_  ra  rb  rd  re  r  	timestampz#Erreur analyze_symbol_for_interval  r&  )r  r  r  r   r  rU  r  r^  r_  ra  rb  rd  re  r  r  r	   r  	isoformatr  r  )rp   rZ  r   klines_now_tfclosed_klineskr   r   r  r  s              rr   analyze_symbol_for_intervalz'AIPredictor.analyze_symbol_for_interval  s    ""NNXY.	((3?FS[2- #6{aE&*Q-$84$?',,.$P &s &+89aeAaDk9F9,9:quQqT{:G: &&vvw?D !$<<"&"5"5"oo++++DHMM 1 1*a @WXFJmm!2!2;!BYZPTP]P]dmm&7&78H!&LcdJN--4==#4#4]A#F]^VZVcVc):):;NPQ)RijVZVcVc):):;NPQ)RijLPMMDMM$5$5na$H_`HL$--"3"3L!"D[\;?==4==,,UB7bHL$--"3"3L!"D[\ &\\^557+  ::<  	LL>vhazQSTUSVWX	s=   #K AK K K &K;HK 
K 	L'L

Lc                 b    || _         | j                  r| j                  j                  |       yyu0   Définit la fonction pour récupérer les klinesN)r  r  set_klines_fetcherrp   fetchers     rr   r  zAIPredictor.set_klines_fetcher&  s,    %!!""55g> "rs   c                     || _         y)u4   Définit le client Binance pour l'analyse long termeN)r  )rp   clients     rr   set_binance_clientzAIPredictor.set_binance_client-  s
    $rs   r  c                 d    | j                   5  || j                  |<   ddd       y# 1 sw Y   yxY w)u%   Met à jour un item dans la watchlistN)r  r  rp   rZ  r  s      rr   update_watchlistzAIPredictor.update_watchlist1  s,    ZZ 	*%)DNN6"	* 	* 	*s   &/c                 @   	 ddl m}m} d}| j                  5  g }| j
                  j                         D ]  \  }}||j                  |j                  |j                  |j                  |j                  |j                  |j                  r|j                  j                         nd|j                  rCi d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d	|j                  j!                  d	d      d
|j                  j!                  d
d      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      d|j                  j!                  dd      |j                  j!                  dd      |j                  j!                  dd      |j                  j!                  dd      dni i ddddd }|r|j                  r	 t#        |j                  j!                  d!d      d"k(        }t%        |j                  j!                  dd            }	t%        |j                  j!                  dd            }
t%        |j                  j!                  dd            }t%        |j                  j!                  dd            }t%        |j                  j!                  d	|            }t%        |j                  j!                  d
d            }t#        |j                  j!                  dd      d"k(        }t#        |j                  j!                  dd      d"k(        }t%        |j                  j!                  dd#            }t%        |j                  j!                  dd            }t#        |j                  j!                  d$d            }t#        |j                  j!                  d%d            }t#        |j                  j!                  d&d            }t%        |j                  j!                  d'd(            }t%        |j                  j!                  d)d*            }t%        |j                  r|j                  j!                  dd      nd      }t%        |j                  r|j                  j!                  dd      nd      }|j                  d+k\  xr |d,k  xs- |j                  d-k\  xr |dk  xr |d.kD  xs |j&                  d/v }t#        |j                  j!                  d0d            }t#        |j                  j!                  d1d            }t%        |j                  j!                  d2d            }t%        |j                  j!                  d3d            }t)        |j                  j!                  d4d5            }t%        |j                  j!                  dd            } t#        | d6k        }!t%        |j                  j!                  d7"            }#t%        |j                  j!                  d8|
            }$d7|j                  xs i v }%|%xr |#|"d9z   kD  xr |$dkD  }&dt+        |j                        t#        |j                  d:k(        |t#        |	d;k        t#        |
d<kD  xr |
d=kD  xs |d;kD  xs |!      t#        |d>k  xs	 |xr |
d?k        d@t#        |xr |d>k        t#        |dk        t#        |	d;k\        dAdB}'|'dC   }(|'dD   |j                  r|j                  ni })|)j!                  dd      }|)j!                  dd      }*|)j!                  dd      }+|)j!                  dd      },|*d<k  xr
 |+t,         k  xs |,d;k  xr
 |*t.         k  }-|)j!                  dd      }"|	dEkD  xr+ |*t0         kD  xr |+t2         kD  xr |,dFkD  xr |"dGk  xr |dk(  }.|	dHk  }/t#        |)j!                  dId            }0t#        |)j!                  dJd            }1t%        |)j!                  dKd            }2t%        |)j!                  dLd            }3t%        |)j!                  dMd            }4|&rdNndE}5|&rdOndP}6|/xr_ |
|5kD  xrX |dkD  xs	 |
dHkD  xs |&xrF ||6kD  xs |
dQkD  xr8 |"dRk\  xr1 |"dSk  xr* |d<kD  xr# |dTk\  xr |0 xs |1xs |"dUk  xr |
d6kD  xr |dVk\  }7|/xr< |xr8 |dGk\  xr1 |dWk\  xr* |"dRk\  xr# |"dXk  xr |d<kD  xr |
dYkD  xr |0 xs	 |1xs |d-k\  }8|7xs |8}9|/xr3 |
dFk  xs, |d;k  xr |
dPk  xs |d;k  xr |
dHk  xs |xr |dk\  xr |
dHk  }:|	t4        kD  xr |	dZk  };|;xr6 |d[kD  xr/ |d\k\  xr( |
d[k\  xr! |
d]k  xr |d;kD  xr |"dGk  xr |dk(  xr |"d^kD  }<|xs |d_k  }=t7        |	      dk  }>|
dPkD  xs |
dOkD  xr |dEkD  }?|"dSk  xs |"dXk  xr |
d`kD  }@|=xrD |>xr@ |?xr< @xr8 |"dUkD  xr1 |"dGk  xr* | xr% |d;kD  xr |d=kD  xr |xs |dkD  xs |	dHkD  xr |
dPkD  }A|
dak  xr |dbk  }B|	d<k  xr	 |
dck  xr |}C|	dk  xr |	dckD  xr |d[kD  xr |
d=kD  }D|	dkD  xr |	dk  xr |d[kD  xr |
dEkD  xr |d<kD  }E|	dkD  xr |	d`k  xr |
dkD  xr |d<kD  }F|	ddkD  xr! |	d.k  xr |d[kD  xr |
dOkD  xr |"dUkD  xr |dckD  }GDsEsFsGrd}C|xr, |
d>k  xr% D xr  |
t0        kD  xr |dkD   xr |
d.kD  xr |"dek   }H| j9                         }IdfdgdhdXdXdij!                  |Idg      }JdHd`d.ddjj!                  |Id`      }Kdhdkdlddjj!                  |Idm      }LdHdHdnj!                  |Id;      }Mdodkdlddjj!                  |Idm      }NdpdfdqdGdjj!                  |Idf      }Ot;        |dr      r(|j                  r|j                  j!                  dd      nd}PdGdmdsdtdudij!                  Ids      }Q|t<        v rQ|dkD  rL|
dHkD  rGdhdGdSdddij!                  IdS      }Rt?        |RQdvz         }Qt@        jC                  dw| dx|Q dy|dzd{       |j&                  d|k(  r|&rdPndH}S|
|SkD  xr |"Qk  xr B xr
 | xs |dkD  }T|TrLd}|'d~<   d|'d<   d||d<   |&rd|#ddn	|%rd|#dnd}Ut@        jE                  d| d|"dd|
dd|dd|U d       	nd|'d~<   d|'d<   d|d<   t@        jC                  d| d|"dd|
ddB d| d|dd       	nQ|j&                  d5k(  r Idnv rPBsNDrLd}|'d~<   d|'d<   t?        d#|j                  dRz         |'d<   dI d|d<   t@        jE                  d| d|I        nIdnv rcBsaEsFr]FrdUnd}Vd}|'d~<   d|'d<   t?        d#|j                  |Vz         |'d<   Frdnd}W|W dI d|d<   t@        jE                  d| d|W d|I        nIdnv rPBsNGrLd}|'d~<   d|'d<   t?        d#|j                  dz         |'d<   dI d|d<   t@        jE                  d| d|I        n2d|'d~<   d|'d<   d|d<   n!FsH|"JkD  rC|
Kk  r>t@        jG                  d| d|"ddJ d|
ddI 
       d|'d~<   d|'d<   d|J d|I d|d<   n|j&                  dv rMDsKEsIFsGGsE|"LkD  r@|
Mk  r;t@        jG                  d| d|"ddL d|
ddI 
       d|'d~<   d|'d<   d|I d|d<   n||
d.k  rP|"Nk\  rK|"Ok  rFPdkD  rAPdk  r<t@        jG                  d| d|"ddPdd|
ddI 
       d|'d~<   d|'d<   d|I d|d<   n'|j&                  dv rM|
dHk  rHt@        jG                  d| d|j&                   d|
dd       d|'d~<   d|'d<   |j&                   d|d<   nCrd|'d~<   d|'d<   d|d<   n|	dk  r6|+dk  r1t@        jG                  d| d|	dd|+d       d|'d~<   d|'d<   d|d<   n~Dr/Bs-d}|'d~<   d|'d<   t?        d#|j                  dRz         |'d<   d|d<   nMEsFraBs_d}|'d~<   d|'d<   FrdUnd}Vt?        d#|j                  |Vz         |'d<   Frdnd|d<   t@        jE                  d| dFrdnd d|	dd|
dd	       nGrSBsQd}|'d~<   d|'d<   t?        d#|j                  dRz         |'d<   d|d<   t@        jE                  d| d|	dd|
dd|"d       nBrd|'d~<   d|'d<   d|d<   nHrd|'d~<   d|'d<   d|d<   nm|r5d|'d~<   d|'d<   d|d<   t@        jE                  d| d|
dd|+dd|d       n6|r1d|'d~<   d|'d<   d|d<   t@        jE                  d| d|
dd|d       n|r9|s7|dvr3d|'d~<   d|'d<   d|dd{|d<   t@        jE                  d| d|dd֝       n|rI|rG|d,k  rdn|d.kD  rdnd}Xt@        jE                  d| d|X d|dd|j                   d|dd|dd       n}ArIdvrd}|'d~<   d|'d<   |j                  r|j                  j!                  dd      nd}Y|j                  r|j                  j!                  d)d*      nd*}ZYdvk\  rZd]k\  rdvnYdk\  rZdk\  rdnd}[t?        d#|j                  dz   |[z         }\|\|'d<   |[dvk\  rdn[dk\  rdnd}]d|] |d<   t@        jE                  d| d|] dI dY dZdd\ d       nAr1d|'d~<   d|'d<   dI d|d<   t@        jE                  d| d|I d       nh|rBsHs|dGk\  r|dk\  r|"dGk  r|"dRkD  r||
d<kD  rw|r|dfk\  rpt?        dRt+        ||z  d6z              }^d}|'d~<   d|'d<   t?        d#|j                  |^z         |'d<   d|dd{|d<   t@        jE                  d| d|dd|dd|^        nBsHs|j                  r|j                  j!                  dd      }_|j                  j!                  dd      }`|j                  j!                  dd      }a|j                  j!                  dd      }b|j                  j!                  dd      }c|j                  j!                  dd      }dtI        |`dk\  rd"ndadPkD  rd"ndbdHkD  rd"ndcdVkD  rd"ndddk  rd"ndg      }e_dtk\  redZk\  r|"dGk  r}|
dckD  rxt?        dRt+        _dz              }fd}|'d~<   d|'d<   t?        d#|j                  |fz         |'d<   d|d<   t@        jE                  d| d|_dde d`ddaddbddcddd d       nX_dUk\  r\adkD  rW|
dkD  rR|"dXk  rMd}|'d~<   d|'d<   t?        d#|j                  dvz         |'d<   d|d<   t@        jE                  d| d _ddad       n|.r*|+dkD  r%|
dPkD  r d|'d~<   d|'d<   |j                  |'d<   d|d<   n|.r<|+dkD  r7|
dPk  r2d|'d~<   d|'d<   d|d<   t@        jE                  d| d|
dd       n|9r.|:s,d|'d~<   d|'d<   d|d<   t@        jC                  d| d	       n]|<rd}|'d~<   d|'d<   d
|d<   nJ|:rd|'d~<   d|'d<   d|d<   n7|/rd|'d~<   d|'d<   d|d<   n$|=r|>rd|'d~<   d|'d<   d|d<   nd|'d~<   d|'d<   d|d<   |'|d<   |'d~   |d<   |'d   |d<   |'d   |d<   |j!                  dd      }gd|gv sd|gv rd||_        nd
gv sdgv r	d|_        ndgv r	d|_        ndgv r	d|_        ndgv sdgv rd||_        nudgv rd||_        nidgv r	d|_        n\dgv r	d|_        nOdgv sdgv rd||_        n=|'d~   d}k(  r&|'d   r!|j&                  dvr!d5|_        d|'d<   d|'d~<   n|'d~   dk(  rd5|_        |j&                  r|j&                  nd5|d<   |j&                  dk(  r&d|d<   d|d<   t@        jE                  d| d       	 d|vs|d   |j&                  r|j&                  nd5|d<   |jO                  |        d  }q|jQ                  |q!       	 ddl)}rddl*}s|sjV                  jY                  |sjV                  j[                  t\              d"      }t|sjV                  j_                  |t      rta        td#      5 }u rjb                  |u      }vddd       vj                         D ]  \  }}w|wj!                  d$d      }x|xdk  r d}y|D ]  }|j!                  d%      |k(  s|}y n i })|| j
                  v r | j
                  |   }z|zj                  xs i })nyryj!                  dri       })|)j!                  dd      }{|{dk  ryrx}{xdkD  r{dkD  r{xz  d"z
  d#z  nd}|d}}g }~d}|)j!                  dd      }|)j!                  dd      },|)j!                  dd      }*|)j!                  dd      }+|)j!                  dd      }|)j!                  dd      }||d&k  r}d+z  }}~jO                  d'|dd       nC|d?k  r}dz  }}~jO                  d(|dd       n!|dck  r}dz  }}~jO                  d)|dd       |d]k\  r#|*d;k  r}d*z  }}~jO                  d+|dd       n&|d*k\  r!|*d=k  r}dez  }}~jO                  d,|dd       dYk  r}dez  }}~jO                  d-       ndFk  r}dRz  }}~jO                  d.       |*d<k  r}dUz  }}~jO                  d/|*dd       n!|*d=k  r}dz  }}~jO                  d0|*dd       |,d=k  r}dz  }}~jO                  d1       n|,d2k  r}d3z  }}~jO                  d4       dfkD  r}dz  }}~jO                  d5d       n"dGkD  r|*dk  r}d3z  }}~jO                  d6       d7kD  r|*dk  r}dRz  }}~jO                  d8       |d9k\  rdU}n,|d:k\  rdt}n#|dk\  rd}n|d;k\  rdX}n|d`k\  rdo}n
|d<k\  rdf}nd}}k\  }i d%|d|}dd<d=|d>|}dkD  rt?        d#}      nddrd?nd@dA~rdBjY                  ~      ndC|dzddDddEte        jf                         j                         dr|)drdFndGd}dd|rdHndI|dzd{drdFndJ}ti        |dZ      x~dKdL|xwj!                  dMd      |wj!                  dNd      |wj!                  dOd      ti        ||dZ      |wj!                  dd      dP}yrRd   yd<   }|yd<   |yd<   |d   |yd<   |d   |yd<   |dL   |ydL<   wj!                  dd<      |yd<   ||yd=<   |jO                          tj        rtm        |      dkD  r	 to               }g }|D ]  }|j!                  dri       })|)rRjq                  |d%   |)      }|dR   |dS   |dT   |dU   |dV   dd9 dW|dX<   jO                  |dR   |f       idddYdZg dW|dX<   jO                  d|f        d#d[d-ddvdd\jQ                  fd]d^       |D cg c]  \  }}|	 }}}t@        jC                  d_tm        |       d`       |cddd       S # t        $ r d}Y Jw xY w# tL        $ r'}pt@        jC                  d| dp        Y d}p~pd}p~pww xY w# 1 sw Y   #xY w# tL        $ r$}pt@        jC                  dQp        Y d}p~pd}p~pww xY wc c}}w # tL        $ r#}pt@        jG                  dap        Y d}p~pd}p~pww xY w# 1 sw Y   yxY w(b  u?   Retourne la watchlist triée par score avec Smart Criteria v3.0r   )quick_analyze
SignalTypeTFNr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   price_change_recentr   r   r   r   r   r   r   )r   r   r   HOLDz
En attente)rZ  r^  ra  rb  rd  re  rf  rc  r  smart_criteriasmart_signalsmart_scoresmart_eligiblesmart_statusr   rY   r   is_ventre_mouis_downtrend_persistentr   r   r   r   r   r  *   r  r   )r^  PULLBACKrI  rK  rF  rG  rD  r}  g      ?rsi_1mmomentum_1m_3re   r_  r   r6  r  r  r  )r   ema9_under_ema21hausse_confirmeebaisse_confirmee)ema_baisse_permanentepeu_variationsema9_above_ema21)signalr^  eligiblecriteria
exclusionsr.  r/  g{Gz?皙r   r]  cycle_is_ongoingcycle_exhaustingcycle_vel_h1cycle_vel_h2cycle_drop_5hg{Gzt?{Gz?皙?g{Gz?r}   rn  gffffff?r   g333333?r\  rm  r   rX   rl  {GzrR  &   r  r   rT  rS  r   gٿr  r  D   H   )rV  rW  r}  rX  
CORRECTIONrU  >   ?   :   rV  rW  r   R   N   r  r   r  +   r   r  u.   : TOP20 rebond — _rsi_creux_max assoupli à z (slope=z+.2fr8  r^  ACHATr,  r-  r  z RSI1m=rM  u   ↑r]  r#  u   : CREUX_REBOUND → ACHAT (RSI=ra  .2%z VOL=r4  rx   r|  NO_BUYu/   CREUX_REBOUND invalide (conditions dégradées)r  u   : CREUX_REBOUND rejeté (RSI=z crash=z	 bearish=z slope=z+.3fr^  zCROSSOVER IMMINENT (r`  u"   : NEUTRAL→CROSSOVER IMMINENT en r   zFRESH CROSSOVER STRONGzFRESH CROSSOVERr  u   : NEUTRAL→z en rV   zPOST CROSSOVER (u   : NEUTRAL→POST CROSSOVER en zEn surveillanceu   : ACHAT TARDIF bloqué - RSI=>z regime=zAchat tardif (RSI>r  )r}  NoneNu-   : Pattern NEUTRAL APRÈS CYCLE bloqué - RSI=u   NEUTRAL après cycle (r   333333?u#   : PHASE DISTRIBUTION bloqué - RSI=z BB=r7  zPhase distribution ()r  
: Pattern z SANS momentum (Mom=u   ) → BLOQUÉz sans momentumzEMA BEARISHrQ  g      $u#   : BAISSE ACTIVE bloqué - EMA_diff= Mom5=zBaisse active (NO_BUY absolu)zCROSSOVER IMMINENTr&  zSTRONG zFRESH CROSSOVER - EMA_diff=rb  rZ  r  zPOST CROSSOVERu   ⚡ z: POST CROSSOVER - EMA_diff=r  zCrash actifzBEARISH TRENDzBaisse persistante (HOLD)u   📉 z": Baisse persistante smart - Mom3=r[  z% accel=zVentre mou (sans direction)u   😴 z: Ventre mou smart - Mom3=z% EMA_slope=>
   rF   rD   rB   rI   rC   rK   rH   rE   rL   rG   zCoin plat structurel (range48h=u   📊 u   : COIN PLAT — range_48h=u$   % < 5% → NO_BUY (pas de potentiel)z	RSI creuxzmomentum accelerationzpattern rebondu   🔓 z: COIN PLAT override (u   ) — range48h=z% mais score= RSI=z accel=u    → analyse continue)rX  r<  r   r   r  u    [LONG+VOL🔥]u    [LONG📊]zSQUEEZE BREAKOUTz: SQUEEZE BREAKOUTu    → ACHAT (regime=z, dur=zb, vol=z	x, score=u!   SQUEEZE BREAKOUT bloqué (regime=u&   : SQUEEZE BREAKOUT bloqué — regime=z (BEAR/CORRECTION)zLSTM REVERSAL (conf=r:  u#   : LSTM REVERSAL_UP → ACHAT! conf=rN  z +zEARLY UPTREND CYCLEu   🌅 u-   : EARLY UPTREND CYCLE détecté! early_score=z	 signals=z (div=z conv=z vol=z cross=gQ?zEARLY CYCLE PARTIALu   🌄 z$: EARLY CYCLE PARTIAL - early_score=u!   Tendance haussière (observation)u   Correction après pic (HOLD)r  u1   : TREND CONTINUATION bloqué - momentum négatif .4fu   % (correction après pic)u3   Creux + Rebond Phase2 (HOLD — Phase1 non validé)u   ⏸️ u6   : CREUX_REBOUND Phase2 → HOLD (Phase1 non confirmé)zPullback haussieru    Creux - Momentum négatif (HOLD)zCreux - Attendre rebond (HOLD)zSqueeze - Surveiller (HOLD)r  r  r  r  zCreux + Rebondr#  zTREND CONTINUATIONTREND_CONTINUATIONr  EMA_BULLISHzLSTM REVERSALzLSTM FORCED REVERSAL)r^  r#  r  rO  CROSSOVER_IMMINENTr_  POSSIBLE_BLOCKEDu:   : POSSIBLE_BLOCKED → smart_eligible=False, signal=NO_BUYrd  zSmart Criteria error for c                 f    dddddd}|j                  | j                  dd      d      }|| d	    fS )
Nr   rY   rX   re   r   )rD  POSSIBLEr  VENTE
ABANDONNEEr  r  r^  r  )rx   signal_priorityprioritys      rr   sort_keyz+AIPredictor.get_watchlist.<locals>.sort_key
  sJ      !"## +..quu^V/LaP 1W:+..rs   )keypositions.jsonr  r  rZ  rY  u   🚨 STOP LOSS u   ⚠️ Perte u   Perte légère r   u   💰 Sécuriser +u   📈 Protéger +zDeath cross fortzEMA9 < EMA21zChute rapide u   Mom↓ u   Tendance baissièreg{Gz   u   EMA fléchitzRSI surachat u   RSI élevé + baisseg?zSortie BB hauter   r  r  POSITION_OUVERTEra  rb  sell_signalposition_openre  r=  zP&L: rf  rc  rT  EN_POSITIONzSignal vente IAzEn position (
SURVEILLER)r,  r-  r  r  
profit_pctr  r>  position_infoquantity	stop_losstake_profit)r  rc  rd  re  ra  entry_patternz%Erreur analyse positions pour vente: total_score
percentagegradecompatibilityr>  )r^  rh  ri  rj  r>  ai_compatibilityFu   NON_ANALYSÉZ   )rD  rT  r_  rS  rU  r  c                 X    j                  | d   j                  dd      d      | d   fS )NrY   r  r  r   r  )rx   rV  s    rr   <lambda>z+AIPredictor.get_watchlist.<locals>.<lambda>  s1    +//!0PRSTaD' rs   rY  reverseu,   ✅ Watchlist triée par compatibilité IA (z items)u"   ⚠️ Erreur tri compatibilité: )9smart_entry_criteriar  r  ImportErrorr  r  itemsr^  ra  rb  rd  re  rf  rc  r  r  r  r  rU  r_  rg  rW  r3   r2   r,   r1   r<   r   r  r  rn  r   r  ri  r  r  sumanyr  r   sortr  r~  r  r  dirname__file__r  r  r  r	   r  r   AI_COMPATIBILITY_AVAILABLEr   get_compatibility_scorercalculate_compatibility_score)rp   r  r  smart_availablert  rZ  r  	item_databb_squeeze_valema_diff_valmomentum_3_valmomentum_5_valema_slope_valema_slope_long_valema21_slope_valr   r   bb_bandwidth_valmom_accel_valis_ventre_mou_valis_downtrend_persistent_valis_flat_market_val_range_48h_valvol_ratio_val_rsi_flat_check_mom_accel_flat_flat_overridelstm_is_reversallstm_is_dangerlstm_rev_problstm_rev_confidencelstm_rev_labelbb_position_valnear_bb_lower_valrsi_val
rsi_1m_valmom_1m_3_val
has_rsi_1mrsi_1m_rebounding
smart_datar.  r  r   r   r   
is_fallingis_bullish_trendis_creux_sc_cycle_ongoing_sc_cycle_exhausting
_sc_vel_h1
_sc_vel_h2_sc_drop_5h	_mom3_min_ema_slope_altis_creux_rebound_technicalis_creux_rebound_lstmis_creux_reboundis_creux_fallingis_pullbackis_pullback_valid
is_squeezeis_ema_cross_zoneis_breakout_activeis_not_too_lateis_squeeze_breakoutis_crashis_absolute_bearishis_crossover_imminentis_fresh_crossoveris_fresh_crossover_strongis_post_crossoveris_bearish_trend_regime_rsi_tardif_mom_tardif
_rsi_cycle
_mom_cycle_rsi_dist_min_rsi_dist_max_bb_position_val_rsi_creux_max_rsi_creux_cap_mom3_valid_min_signal_still_valid
_rsi1m_tagr  lbl_reason_sq_duration_sq_vol	_sq_bonus	_sq_score_sq_tagr  early_cyclersi_divema_conv	mom_accelvol_precursorcandles_crosssignals_countearly_bonusrd  critical_exclusionshas_criticalema_trend_bearish_checkbb_position_checkmomentum_3_check
is_bearishis_creux_rebondre  r  rX  r  r~  positions_filer  	positionsposr  existing_itemwicurrent_pricera  r  sell_reasonsr  r   r   r   r  	sell_itemr  scored_itemscompatrz   r/  rV  s                                                                                                                                            @@rr   get_watchlistzAIPredictor.get_watchlist6  s+   	$F"O ZZ e	E $ 4 4 6 Q( %!ZZ '+&9&9"&//"kk"kk!%CGCSCS4#3#3#=#=#?Y]. -!'):):?A)N!"DMM$5$5j!$D! $T]]%6%6{A%F! )$--*;*;<La*P	!
 &t}}'8'8'J! ,T]]->->?RTU-V! ,T]]->->?RTU-V! '(9(9.!(L! t}}00;! %dmm&7&7a&H! %dmm&7&7a&H! ():):?A)N! &t}}'8'8'L! .t}}/@/@AVXY/Z!  ,T]]->->?RTU-V!!" 1$--2C2CD\^_2`#!$ 01B1BCZ\]1^%!& 261B1BCZ\]1^,0MM,=,=>PRS,T7;}}7H7HIfhj7k+!, -/&($*#$&+$0O(	V #t}}]P *.dmm.?.?a.PTU.U)V',T]]->->z1-M'N).t}}/@/@q/Q)R).t}}/@/@q/Q)R(-dmm.?.?Q.O(P-24==3D3DEUWd3e-f**/0A0A-QR0S*T,01B1BCVXY1Z^_1_,`),01B1BCVXY1Z^_1_,`)+01B1B>SV1W+X( ).dmm.?.?@WYZ.[(\,01B1B?TY1Z,[)6:4==;L;LMfhm;n6o3-1$--2C2CDTV[2\-]*).t}}/@/@d/S)T(-dmm.?.?PS.T(U*/PTP]P]0A0A%0Lce*f*/aeanan0A0ABY[\0]tu*v!ZZ2-G/R2G J!ZZ2-a/R2GaO^aLaJ LL,II ' ,00A0AB[]b0c+d()-dmm.?.?@WY^._)`(-dmm.?.?@TVW.X(Y.3DMM4E4EF`bc4d.e+),T]]->->?TV_-`)a*/0A0A-QT0U*V,041G,H) &+4==+<+<Xw+O%P
',T]]->->P^-_'`%-$--2E2%F
,6,h:RS;S,hXdghXh) '-%(_(,T[[G-C(D.<489L4M 59%3d%:%nQU@U@mYfimYm %6$55" 59$9N9SdS~iwz~i~  5A) :>>O>iTbeiTi9j267G#7M2N489M4N+#&
6 $.j#9%/%=
 59MM4==r,4LL9La,P)%-\\,%B
%-\\,%B
$,LLa$@	 ($.Z:AZ@Z3Z X&-V*@V?V2V # #+,,ub"9 )4/ 3&*?)??3&*=)==3 &-3 $bL	3
 .2 )* $0##5
 -1>PRW1X,Y)/3HLLASUZ4[/\,%*8<<+J%K
%*8<<+J%K
&+HLL!,L&M .?ED	1B5= 6*Y6 d*Q.\.42G\K\d*^;T~PT?Td $rMd /6md +T1	d
 *S0d "32 c 4c!(B!a>D3H!a]^aMa 3( 19 	1=M 	1/25 i)T1i#rMi.5mi +T1i +U2	i "32g6JgNaegNg . ,F+^I^( ,4 ,*U2 e*T1Knt6Ke*T1Knt6Ke ,c0Cr0Icn_cNc	 ) (46F'F'[<Z[K[,7 	-)C/ )+u4)*c1) +S0) +U2	)
 $bL) .2) $bL *  &4%M7G#7M
,/,=,C) +T1 M+d2K}t7K + $bL D$r\Bns.B ( ' M-M.M ,M $bL	M .5r\	M
 !21M *D0M +T1M / L*Q.L*S0J^d5J ," %3T$9$Snt>S )4/ .*T1.- , )1, 2(4/2)C/2 +T1	 . )1, 2(3.2)C/2 +T12 +T1 + )1, 2(3.2*S02 +T1	 2 )4/ 2(C/2)C/2 +T12 $bL	2
 +T1 * 14FJcgx27/ . H*T1H 55H "02G!G!]M\]L]^H "0#!5!F'B,G )  #'"9"9"; 79rVXbdtv&w&{&{  }D  FH  'I69X[eh&i&m&mnuwz&{57bUWac%d%h%hiprt%u
 69s%K%O%OPWY]%^
8:XZdf(g(k(klsuw(x8:XZdf(g(k(klsuw(xT[\`blTmrvrr4==+<+<]C+P  FI( :<"Y[egwy)z)~)~  @G  IK  *L
 "^38In_cNc=?b]_ik{}-~  .C  .C  DK  MO  .PN-0RTAT-UN"LL4x7efteuu}  L  MQ  ~R  RT  *U  V  <<?:6GdTO . @ !M '> 9!M %-	!M &7!6!K-!:K 0  39@
8 49=
: 6<K	. 9N_wz#6Fc-J  EOhopz{~o  gA  UW
 &&*6( 3,,3C=nS=Q R++8*=Qzl!%M!" :B
8 49>
: 6<m	. 9 &&+F8 4,,3C=nS=QQXYaXb&/0A/B'-X\I]]^%`!" "\\Y6  '*FFx\q9@
8 49=
: 69<S$**r/9R
7 3>RSZR[[\<]	. 9 &eF8;]^e]f,g h!(,H!HQY_q  vO.GR9@
8 49=
: 69<S$**uBT9U
7 3B[&>ar?Be2gYa<P	. 9 &eF8<uDQXPY,Z [!(,H!HQY^o9@
8 49=
: 69<S$**r/9R
7 3>NwiWX<Y	. 9 &eF8;YZaYb,c d9?
8 49>
: 6<M	. 9 #<%38T"NNU6(:WX_`cWddefqerrw  yG  HK  xL  LT  U\  T]  ,^  _3;Jx05:Jz2:L[MYZ[bZccd8eIn5 #ll.GG"7@R[t  ~O%
2~
7R"NNU6(:ghopsgttu  wA  vB  BG  HV  WZ  G[  [c  dk  cl  ,m  n3;Jx05:Jz2:PQXPYYZ8[In5 -s2%67];R.5:JT:Q"NNU6(:]^efi]jjno  AD  oE  EJ  KY  Z]  J^  ^f  gn  fo  ,p  q3;Jx05:Jz2:NwiWX8YIn5 "\\-AAnWZFZ"NNU6(*T\\NRfguvyfz  {H  ,I  J3;Jx05:Jz2;?<<.8WIn503;Jx05:Jz28EIn5 *D0Z%5G"NNU6(:]^jkn]oou  wA  BE  vF  ,G  H3;Jx05:Jz28WIn5283:Jx059Jz225c4::?2KJw/8LIn5
 14MW_3:Jx059Jz2*CBE25c4::;M2NJw/Tm8P  tEIn5"KK%xrG`)fh9i  jE  FR  SV  EW  W^  _m  nq  ^r  rs  )t  u /x3:Jx059Jz225c4::?2KJw/8HIn5"KK$vh6RS_`cRddklz{~k  @F  GN  OR  FS  )T  U%3;Jx05:Jz28EIn5-3;Jx05:Jz28GIn5 939Jx05:Jz28SIn5"KK%x7YZhilYmmtu  AD  uE  EM  N[  \_  M`  )a  b /39Jx05:Jz28UIn5"KK%x7QR`adQeeqr  AD  rE  )F  G 06  ZA  LA3;Jx05:Jz2:YZhilYmmo8pIn5"KK%x7QR`adQe  fJ  )K  L/N5D5Jkkz  ~A  lAPg  GWG"KK%x7MgYVeftuxey  zG  HL  HR  HR  GS  SX  Yh  il  Xm  mt  uD  EH  tI  I^  )_  ` 1WDZ5Z3:Jx059Jz2 X\WdWd4==+<+<=OQR+SjkLPTP]P]dmm&7&7&LcfG/;r/AgQTnamqrarw~  CF  xF[\  MNI(+Cb91L(MI2;Jw/;D?&7ajnoaoP]uwG:J7)8TIn5"KK%x7I'Refmennt  vB  uC  CJ  KR  SV  JW  W`  aj  `k  kl  )m  n039Jx05:Jz2:[\c[dde8fIn5"KK%x7]^e]ffx(yz /xHX1R7MT<Q%lw|,t3#48Kr8Q),R5H=5X[_5_1`)aJ3:Jx059Jz225c4::
;R2SJw/:NObcfNggi8jIn5"KK%x7Z[norZssz  |I  JM  {N  NP  Q[  P\  )]  ^ "*2Bt}}*.--*;*;<OQR*SK&*mm&7&78PRS&TG'+}}'8'89PRS'TH(,(9(9:QST(UI,0MM,=,=>PRS,TM,0MM,=,=>[]_,`M -0%,^%-_!%._!%2S%8a%2a%7Q1 -M  +b0]a5GGVXL]knr]r.1"c+/6J.K7>
8 49=
: 669#tzzK?W6X
7 3<Q	. 9 &eF8;hituxhy z66C_F7SV-W]^fgj]k l44=c?%VYGZZaboappq-s !t "-!2x$>\]K]bilnbn7>
8 49=
: 669#tzzB6O
7 3<Q	. 9 &eF8;_`klo_ppvw  AD  wE  -F  !G!1j1nZ^I^ 8>
8 49>
: 66:jj
7 3<_	. 9!1j1n[_I_7=
8 49>
: 6<Z	. 9 &gfX=no}  B  oC  C\  -]  !^!1:J 8>
8 49>
: 6<q	. 9 &wvh>t-u v!27>
8 49=
: 6<O	. 9!17=
8 49>
: 6<^	. 9!)7=
8 49>
: 6<\	. 9!+0A7=
8 49>
: 6<Y	. 97=
8 49>
: 6<H	. 96@	"234>x4H	.13=g3F	-06@6L	"23 "+~r!B ,v5F9R+:DL 1F:jF>R+5DL 2V;+?DL 069+=DL 3f<@UY_@_+:DL 2V;+:DL /&8+8DL .7+8DL -6:PTZ:Z+:DL (1W<JAW#||  4J   J/89>
: 67=
8 4 (1V;+4DL @D||t||QZ	),  <<+==:?I&678@In5"KK%x7q(rs !^ I-91E1M;?<<4<<YIi(Y'cQ(h
/ JJ8J$
AJ!#bggooh.GIY!Z77>>.1nc2 1a$-DIIaL	1 (1'8 v4&)ggmQ&?&!+$ )-$) &D#xx1V;04 %& $&!T^^3!%!7B'){{'8bH*'4'8'8R'HH )1_a(H(A--,7MR]`aRafsvwfw}{'Ba&G3%N}~
 &'
')&+ $,<<
A#>$,LLa$@	%-\\,%B
%-\\,%B
&ll5"5&.ll=#&F &-&",J(///*SAQQR0ST'4/&",J(//-
3?Oq0QR'4/&",J(///*SAQQR0ST &,d1B&",J(//2CJsCSST0UV'3.:3D&",J(//2B:cBRRS0TU $e+&",J(//0BC%-&",J(//? &,&",J(//-
3?Oq0QR'$.&",J(//'*S9I0KL %t+&",J(//0EF&.&",J(//? 8&",J(//-Cy0IJ 2X*q.&",J(//2FH ',a&",J(//0AB &?(*I'3.(*I'3.(*I'3.(*I'3.(*I'4/(*I(*I&0I&= %$f %#Z % &'9 % -j	 %
 )*q.#c:*>VX % %{m % %dii&=UZ[efjZkklSm % ( % *8<<>+C+C+E % ' % +{G % *: % -k % +,=TablmqarrtRu % -5@'l,7.8-6.3J.B/:+7/ %0 ,/:,/GGJ,B-0WW[!-D/2ww}a/H.3J.B14B1G.1 %	F )<En<UM.9;EM-8>IM*:;<En<UM.9>GHX>YM*:;=F=WM/:7:wwyJ\7]M)4>HM*:;!LL3mv4| *c%j1n5M57F $&L % ;#'88J#;#%+%I%I $X (&F
 *0)>.4\.B)/171H+1)+<Ra+@8D!34 )//1F0MN *+./),1?+-8D!34 )//D	:/;6 "%!#')$&&( !'O !%% !% &  2>>gaT>E>LL#OPSTYPZ|[b!cd
 K#e	 e	  	$#O	$^ % P'@1#%NOOP@1 1v  JDQCHIIJn ? ! MNN%Gs#KLLME#e	 e	s  
A}
 K7B@AVA}bAB@c0A+A~eA~e.AA~gQ0A~x3B@y	CA|A|'A|?B@}
A}}A}}	A~}%A~~B@~A~~B@~A~	~A~~	A	~%A~>B@A		B@A	A>A94B@9A>>B@@B@
c                     | j                   5  | j                  j                         D cg c]/  \  }}|j                  dk(  r|j                  | j
                  k\  r|1 c}}cddd       S c c}}w # 1 sw Y   yxY w)u8   Retourne les symboles prêts à acheter (score >= seuil)r_  N)r  r  rt  rd  r^  r  r  s      rr   get_ready_symbolszAIPredictor.get_ready_symbols  sl    ZZ 	+/>>+?+?+A'64;;')djjD<P<P.P 	 		 	s   A24A,A2,A22A;r  actual_resultc                 <   | j                   j                  |t        j                         j	                         |||dkD  d       t        | j                         dkD  r| j                   dd | _         t        | j                         dz  dk(  r| j                          yy)u>   Enregistre le résultat d'une prédiction pour l'apprentissager   )rZ  r  r  r  successrz  Nr   )r  r   r	   r  r  r   _save_history)rp   rZ  r  r  s       rr   record_predictionzAIPredictor.record_prediction  s    &&!113$*$q((
 	 t&&'$.&*&=&=ef&ED# t&&'#-2  3rs   c                     	 t        dd      5 }t        j                  | j                  dd |       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)u(   Sauvegarde l'historique des prédictionszai_prediction_history.jsonr  r  NzErreur sauvegarde historique: )r  r  r  r  r  r  r  )rp   r  r  s      rr   r  zAIPredictor._save_history  sj    	?2C8 >A		$11%&91=> > > 	?LL9!=>>	?s1   A $;A A A A 	A2A--A2c           
         t         r| j                  r| j                  sd| j                  dddS 	 | j                  j	                  ddd      }|rt        |      d	k  rd| j                  dddS | j                  j                  |      }|j                  d
d      |j                  dd      |j                  d| j                        |j                  dd      |j                  dd      |j                  dd      |j                  dd      dS # t        $ r3}t        j                  d|        d| j                  dddcY d}~S d}~ww xY w)u   
        Obtient le régime de marché actuel et les paramètres adaptés
        
        Returns:
            Dict avec regime, min_score, max_positions, risk_multiplier
        UNKNOWNr}   r   )r  	min_scoremax_positionsrisk_multiplierzBTC/USDT1dr   )limitrS  r  regime_nameUnknownrecommended_min_scorerecommended_max_positionsrecommended_risk_multiplierbtc_trend_24hr   btc_trend_7d)r  r  r  r  r  r  r  u   Erreur détection régime: N)r  r  r  r  fetch_klinesr   detect_regimer  r  r  r  )rp   
btc_klinesregime_resultr  s       rr   get_market_regime_parametersz(AIPredictor.get_market_regime_parameters  sa    )0D0DDL_L_#!11!##&	 	,,99*dRT9UJZ2!5'!%!5!5%''*	  !00>>zJM (++Hi@,00	J*../FH\H\]!.!2!23NPR!S#0#4#45RTW#X!.!2!2?A!F - 1 1.! D   	LL6qc:;#!11!##&	 	s$   >D 0BD 	E(E EEtraining_datac                    | j                   rt        st        j                  d       yt        j	                  dt        |       d       d| j                  d<   | j                          g }g }|D ]2  }|d   }t        |      dk  rt        j                  |d	d       }t        j                  |      }|d
k(  rK|t        j                  |      z
  |z  }t        j                  dt        j                        }	||	ddd
f<   t        d      D ]9  }
|
dk\  r||
   ||
dz
     z
  dz  |	|
df<   |
dk\  s$||
   ||
dz
     z
  dz  |	|
df<   ; |j                  |	       |d   dk(  r|j                  d       |d   dk(  r|j                  d
       "|j                  d       5 t        |      dk  r%t        j                  d       d| j                  d<   yt!        j"                  t        j                  |      t         j                        j%                  t&              }t!        j"                  t        j                  |      t         j(                        j%                  t&              }t+        t        |      dz        }|d| ||d }}|d| ||d }}t         j,                  j/                  | j                   j1                         d      }t3        j4                         }| j                   j7                          d}d}t        |      D ]  }d
}d
}d
}t        d
t        |      |      D ]  }
||
|
|z    }||
|
|z    }|j9                          | j                  |      } |||      }|j;                          |j=                          ||j?                         z  }t!        j@                  |jB                  d      \  }}||jE                  d
      z  }|||k(  jG                         j?                         z  } |d
kD  r||z  nd
}| j                   jI                          t!        jJ                         5  | j                  |      }t!        j@                  |jB                  d      \  }} t        |      d
kD  r-| |k(  jG                         j?                         t        |      z  nd
}!ddd       | j                   j7                          |dz  d
k(  st        j	                  d|dz    d| d|dd|d d!!d 
        d"| j                  d<   t        |      | j                  d#<   || j                  d$<   | j                  d%<   | j                  d&<   !dz  | j                  d'<   tM        jN                         jQ                         | j                  d(<   | j                          | jR                  jU                  d)d*      }"tW        jX                  tV        jZ                  j]                  |"      rtV        jZ                  j]                  |"      nd+d,-       t!        j^                  | j                   |"       t        j	                  d.|"        y# 1 sw Y   xY w)/u   
        Entraîne le modèle sur les données historiques
        training_data: Liste de {prices: [], result: 'up'/'down'/'neutral'}
        u+   Modèle non disponible pour l'entraînementNu"   🎓 Entraînement du modèle sur u    échantillons...r  rd  r   r   r  r   )r   r}   r?  r   rY   r   rX   resultr  r  r   u*   Pas assez de données pour l'entraînementro  r  gMbP?)lrrd   z  Epoch /z	 - Loss: rM  z - Train Acc: rE  z - Val Acc: r  rp  rq  rr  rs  rw  rt  r  r  .T)exist_oku'   ✅ Modèle entraîné et sauvegardé: )0r  r  r  r  r  r   r  r  r   r   r   r   r  r  r   r   rv   r  r  r  longrW  optimAdam
parametersrh   CrossEntropyLosstrain	zero_gradbackwardstepr  r   datasizeru  r  r  r	   r  r  ri  r  r~  makedirsr  rx  save)#rp   r  r  ysampler   r  r   r  r  r   	split_idxX_trainX_valy_trainy_val	optimizer	criterionr  
batch_sizeepoch
total_losscorrecttotalbatch_Xbatch_youtputsr  rz   	predicted	train_accval_outputsval_predictedval_accr  s#                                      rr   train_modelzAIPredictor.train_model  s   
 zzNNHI8]9K8LL]^_ )3H%!!# # 	FH%F6{R &,/J&&$Cax%
(;;sBKxx

;H(HQTN 2Y O6&1!n{1Q37G&G1%LHQTN7&1!n{1R47H&HB%NHQTN	O HHX h4'!V+=	@ q6C<NNGH,7D) LL!EMM:==fELL!EJJ7::6B A%	:I)*:I)* KK$$TZZ%:%:%<$G	'')	 	


6]  	JEJGE 1c'lJ7 ?!!AjL1!!AjL1##%**W- '2 diik)
$yyq99a(I0557<<>>? ,119%!I JJOO f"jj/#(99[-=-=q#A =PSTYPZ]^P^=E1668==?#e*Ldef JJrzQhuQwiq	*SAQQ_`ijm_nnz  |C  DG  {H  I  JA 	JF )2H%/21vO,28./+5K(/8O,5<s]12/7||~/G/G/IO,!!# //u=
bggoom6TBGGOOM2Z]hlm

4::}-=m_MN/f fs   7A2YY	rQ  )5m)+r   r   r   r   r~  r  rx  abspathry  r  r  rg  rg   r  r  r  r   r  r  r  r  r  r  r   rU  rY  r  r   r  r  r   r  r  r
  r  r  r  r  r  r  r  r  r-  r   rs   rr   r   r     s    !:;J $H3 HT(H'C 'T+
4 +
Z1f MWS W$u+ WU W_l Wr)
$u+ )
(4. )
V$ 3 ,z zT%[ zu zjo ztyz~  AD  {D  uE zx># > >PXY]P^ >@?%*s *- *
ntDz n`#49 ! ! !e !$?-d -^zOd zOrs   c                   p    e Zd ZdZdefdZd Zd Zdee	   fdZ
d Zd	 Zd
 Zd Zd ZdefdZdefdZy)SurveillanceServiceum   
    Service de surveillance en temps réel
    Analyse toutes les cryptos et maintient une watchlist IA
    	predictorc                 6   || _         d| _        d | _        g | _        d | _        d | _        d| _        d | _        g | _        i | _	        d| _
        ddlm}  |d      | _        d | _        d| _        d| _        d| _         |d	      | _        d| _        i | _        y )
NFr   x   r   r   r   )maxlenNOT_STARTEDrm  )r2  r  _threadsymbols_to_watchr  on_signal_callbackr  last_cycle_time_cached_ready_signals_cache_expiration
_cache_ttlcollectionsr   _recent_analysis_logsia_start_timecurrent_phaseerrors_countlast_cycle_durationcycle_durationssignals_found_totallast_smart_summary)rp   r2  r   s      rr   rg   zSurveillanceService.__init__z  s    " """&   $ &("!#
 	&%*"%5" "*#$ $B/#$ "$rs   c                     || _         yr  )r  r  s     rr   r  z&SurveillanceService.set_klines_fetcher  s
    %rs   c                     || _         y)u-   Définit le callback pour les signaux d'achatN)r9  )rp   callbacks     rr   set_on_signalz!SurveillanceService.set_on_signal  s
    "*rs   symbolsc                 V    || _         t        j                  dt        |       d       y)u#   Définit les symboles à surveilleru   📋 Surveillance IA: u    symboles configurésN)r8  r  r  r   )rp   rK  s     rr   set_symbolszSurveillanceService.set_symbols  s%     ',S\N:OPQrs   c                    t         j                  d| j                          | j                  rt         j                  d       y| j                  st         j                  d       yt         j                  dt        | j                         d       t         j                  d| j                  du        t         j                  d| j                  r| j                  j                  dund	        | j                  st         j                  d
       yd| _        t        j                         | _
        d| _        t         j                  d       t        j                  | j                  d      | _        t         j                  d       | j                  j!                          t         j                  dt        | j                         d| j                  j#                                 y)u#   Démarre le service de surveillanceu)   🔍 [START] Début start() - is_running=u+   ⚠️ Service déjà en cours d'exécutionNu9   ⚠️ Impossible de démarrer: aucun symbole configuré!u   🔍 [START] symbols_to_watch: 	 symbolesu   🔍 [START] klines_fetcher: u'   🔍 [START] predictor.klines_fetcher: zNo predictoru>   ⚠️ Impossible de démarrer: klines_fetcher non configuré!TINITIALIZINGu#   🔍 [START] Création du thread...targetdaemonu$   🔍 [START] Démarrage du thread...u*   ✅ Service de surveillance IA démarré (z symboles) - Thread: )r  r  r  r  r8  r  r   r  r2  r  r@  rA  r  Thread_surveillance_loopr7  startis_aliverp   s    rr   rV  zSurveillanceService.start  s   ??PQR??NNHI$$LLTU5c$:O:O6P5QQZ[\3D4G4Gt4S3TUV=kokykydnn>[>[cg>g  @N  >O  P  	Q""LLYZ!YY[+9; ''t/F/FtT:<@TEZEZA[@\\qrvr~r~  sH  sH  sJ  rK  L  	Mrs   c                     d| _         | j                  r| j                  j                  d       t        j	                  d       y)u   Arrête le serviceFr   timeoutu*   ⏹️ Service de surveillance IA arrêtéN)r  r7  r  r  r  rX  s    rr   stopzSurveillanceService.stop  s2    <<LLa(@Ars   c           
        	
 	 t         j                  d       t         j                  d| j                   d| j                  rt	        | j                        nd        | j                  r	 t        | dd      dz   }t        j                         }t        j                         | _	        d| _
        t         j                  dd	        t         j                  d
| dt        j                         j                  d       dt	        | j                         d       t         j                  d	        | j                          t        rit        | d      r\| j                  j                   rE	 | j                  j                   

j#                         rt         j                  d       i 		
fd}t%        j&                  |d      }|j)                          |j+                  d       |j-                         rt         j/                  d       nd	v r~	d   }|j1                  d      r?t         j                  d|j1                  dd      dd|j1                  dd      dd       nHt         j3                  d |j1                  d!d"              nd#	v rt         j3                  d$	d#           t        j                         |z
  }|| _        | j8                  j;                  |       d'| _
        | j=                          t         j                  d(| d)|dd*| j>                   d+       t        j@                  | j>                         | j                  ry&y&# t4        $ r"}t         j3                  d%|        Y d&}~d&}~ww xY w# t4        $ rw}| xjB                  dz  c_!        d,| _
        t         jE                  d-|        dd&l#}|jI                          | j=                          t        j@                  d.       Y d&}~d&}~ww xY w# t4        $ r=}t         jE                  d/|        dd&l#}|jI                          d0| _        Y d&}~y&d&}~ww xY w)1z!Boucle principale de surveillanceu@   🔍 [THREAD] Entrée dans _surveillance_loop - Thread démarréu   🔍 [THREAD] is_running=
, symbols=r   _cycle_countrY   	ANALYZING
zP================================================================================u   🔄 CYCLE IA #z - r   z - Analyse z symboles...r2  uK   🧠 LSTM Reversal: Lancement entraînement online (thread non-bloquant)...c                  v    	 j                         d<   y # t        $ r} t        |       d<   Y d } ~ y d } ~ ww xY w)Nmetricsr  )train_onliner  rg  )_e_lstm_resultrev_preds    rr   _run_lstm_trainz?SurveillanceService._surveillance_loop.<locals>._run_lstm_train  s<    %HBJBWBWBYY(?+4 %H@CBW(=%Hs    	838TrQ  rm  rZ  u\   🧠 LSTM Reversal: Entraînement timeout (>60s) — cycle IA non bloqué, thread abandonnérc  r  u,   🧠 LSTM Reversal: Entraînement OK - loss=
final_lossrM  z acc=r  r4  r  u   🧠 LSTM Reversal: re  u   pas assez de donnéesr  u*   🧠 LSTM Reversal: erreur entraînement: zErreur train LSTM reversal: NWAITINGu   ✅ CYCLE #u    TERMINÉ en zs - Prochain dans zs
ERRORu   ❌ Erreur cycle surveillance: r   u%   💥 CRASH FATAL _surveillance_loop: F)%r  r  r  r8  r   ry  r  r	   r  r:  rA  strftime_analyze_all_symbolsr  r  r2  r  should_retrainr  rT  rV  r  rW  r  r  ri  r  rC  rD  r   _write_ia_statusr  sleeprB  r  r  	print_exc)rp   	cycle_numcycle_startrh  _lstm_threadrc  r  cycle_durationr  rf  rg  s            @@rr   rU  z&SurveillanceService._surveillance_loop  s)   E	$KKZ[KK3DOO3DJmq  nC  nCsSWShShOi  IJ  OK  L  M//;" 'na @1 DI"&))+K ,4<<>D()4D&KK"VH.KK/)C@W@WXb@c?ddopstx  uJ  uJ  qK  pL  LX  !Y  ZKK6(,--/
 /743MRVR`R`RsRsM'+~~'H'HH'668 &,y z/1!H
 09/?/?_c/d , 2 2 4 , 1 1" 1 =#/#8#8#:$*NN  4R  %S%.,%>.:9.EG'.{{9'=(.6bcjcncno{}~c  AD  cE  EJ  KR  KV  KV  Wa  cd  Ke  fi  Jj  jk  5l  )m(.7KGKKX`byLzK{5|(}%,%<$*LL3]^jkr^s]t1u$v &*YY[;%>N/=D,((//?)2D&))+KK+i[nUXEYYklp  mA  mA  lB  BE  !F  GJJt334i //T  ) M"LL+Gs)KLLM ! "%%*%)0D&LL#B1#!FG$'')))+JJqMM"  	$LL@DE!#DOO		$sp   A(P -D N	 .EM 2BN	 P 	N$N<N	 NN	 		P	A-P?P P		P 	Q3QQc                    	 ddl }ddl}ddlm} | j                  r!t	        j                         | j                  z
  nd}| j
                  r+t        | j
                        t        | j
                        z  nd}t        | dd      }|dkD  r|dkD  r||z  dz  nd}| j                  xs i }i d| j                  d| j                  dd	d
t        |d      d|d| j                  dt	        j                         dt        | j                  d      dt        |d      dt        |d      dt        | j                        d|j!                  dt        | j                              d|j!                  dd      d|j!                  dd      d|j!                  dd      d|j!                  dd      d|j!                  dd      | j"                  t        | j$                        | j&                  |j)                         j+                         |j-                         d }	|j.                  j1                  |j.                  j3                  t4              d!      }
d"}	 |j.                  j1                  |j.                  j3                  t4              d#      }|j.                  j7                  |      rt9        |d$      5 }t;        |j=                         j?                               }ddd       d%}	 |jA                  d       d"}|j-                         k7  r|rd%}n|s	 |jG                  |       |rD|
d&z   }t9        |d'd()      5 }|jK                  |	|d%d*       ddd       |jM                  ||
       yy# 1 sw Y   xY w# tB        tD        f$ r d%}Y w xY w# tH        $ r Y uw xY w# tH        $ r Y w xY w# 1 sw Y   ^xY w# tH        $ r"}tN        jQ                  d+|        Y d}~yd}~ww xY w),uK   Écrit le statut temps réel de la surveillance IA pour le widget dashboardr   Nr	   r_  rm  runningphasemodePOLLINGuptime_secondsrY   cycle_countr  r:  rC  rX   avg_cycle_durationcycles_per_minutesymbols_totalsymbols_analyzedanalyzedsignals_achatachatsignals_possiblepossiblesignals_venteventesignals_abandonnee
abandonneeeligible_countr-  )rB  cached_signals	cache_ttlr  pidzia_status.jsonTbot.pidr  F.tmpr  utf-8encoding)ensure_asciir  u!   Erreur écriture ia_status.json: ))r~  r  r	   r@  r  rD  ru  r   ry  rF  r  rA  r   r  rC  r8  r  rB  r;  r=  r  r  getpidr  r  rx  ry  r  r  rW  readstripkillProcessLookupErrorPermissionErrorremover  r  r  r  ri  )rp   _os_json_dtuptimeavg_durationr}  cycles_per_minsmartrd  status_file_should_write_status_bot_pid_file_f_bot_pid
_bot_alive
status_tmpr  r  s                      rr   ro  z$SurveillanceService._write_ia_status  s   E	B 09=9K9KTYY[4#5#55QRFTXThTh3t334s4;O;O7PPnoL!$:K<BQJ;YZ?kF2R7`aN++1rE4??++ 	 !%"2	
 { "4#7#7 "499; &uT-E-Eq'I %eL!&< $U>1%=  T%:%:!; #EIIj#d>S>S:T$U  7A!6 #EIIj!$<  7A!6  %eiia&@!" !%))J":#$ !% 1 1"%d&@&@"A!__ WWY002zz|-F2 ((--(8(8(BDTUK $(  #chh.>.>x.H) T88??=1mS1 :R#&rwwy'8#9:!&J+1-%)
 zz|x/J/4,'!JJ}5 $(61
*cG< HJJvquQJGHJ4	 $%: : /@ +%*
+  ) ! ! 
H H  	BLL<QC@AA	Bs   IO A N' ;(M5#
N' .N N' N .O N6O 5M>:N' NN' NN' 	N$!N' #N$$N' '	N30O 2N33O 6N?;O 	O-O((O-c                      j                   r j                  sIt        j                  d j                   du d j                  rt	         j                        nd        yt        j                  dt	         j                         d        j                  j                   s% j                  j                   j                          t        j                         }d}d} fd}d _	        t        d	
      5 } j                  D ci c]  }|j                  ||      | }}t        |      D ]o  }|j                         }	|	s|	\  }
} j                  j                  |
|       |dz  }|j                  dk(  sL|dz  } j                   s^ j!                  |
|       q 	 ddd       t        j                         |z
  }|dkD  r"t#         d      r xj$                  dz  c_        nd _        d _	        	 ddl}ddl} j+                         }|j-                  di        _        | j.                  d<   t#         d      rt1         j2                        |d<   t5        |d      |d<   ||d<   |j6                  j9                  |j6                  j;                  t<              d      }d}	 |j6                  j9                  |j6                  j;                  t<              d      }|j6                  j?                  |      rNtA        |d      5 }tC        |jE                         jG                               }ddd        |jH                         }d}	  |jJ                  d       d}|k7  r|r|j6                  j?                  |      r_tA        |dd      5 } |jP                  |      }ddd       j-                  dd      dkD  r!|j-                  d j.                         _        d}t        j                  d| d| d       nI|sG|j6                  j?                  |      r,	  |jR                  |       t        jU                  d| d        |rJ|d!z   }tA        |d"d      5 } |jX                  ||dd#tZ        $       ddd        |j\                  ||       t        jU                  d&| d't	         j                         d(| d)|d*d+	       |dkD  rt        jU                  d,| d-       yyc c}w # 1 sw Y   SxY w# 1 sw Y   xY w# tL        tN        f$ r d}Y w xY w# 1 sw Y   xY w# tV        $ r Y w xY w# tV        $ r Y w xY w# 1 sw Y   xY w# tV        $ r"}t        j                  d%|        Y d}~d}~ww xY w).uC   Analyse tous les symboles - cycle rapide pour réactivité maximaleu1   ❌ _analyze_all_symbols BLOQUÉ: klines_fetcher=Nr^  r   u-   🔄 _analyze_all_symbols: Début analyse de rO  c           	      f   	 j                  | dd      }|rt        |      dk  ryddl}t        |      dk\  r+t        |d   d         d	z  |j                         kD  r|dd }n|}|D cg c]  }t        |d
          }}|D cg c]  }t        |d          }}j                  j                  | ||      }|r$|j                  r	 j                  | dd      }|r t        |      dk\  rt        |      dk\  r*t        |d   d         d	z  |j                         kD  r|dd }t        j                  |D cg c]  }t        |d
          c}      }	t        t        j                  |	            }
|
|j                  d<   t        |	      dk\  r!|	d   |	d   z
  |	d   z  dz  |j                  d<   t        |	      dk\  r!|	d   |	d   z
  |	d   z  dz  |j                  d<   | |fS c c}w c c}w c c}w # t        $ r Y w xY w# t        $ r%}t        j                  d|  d|        Y d}~yd}~ww xY w)u/   Analyse un symbole (pour exécution parallèle)r.  r   r   Nr   rX   ru   r  rz  r   r   1mr}   rV   r$  re   r   r%  r   momentum_1m_5zErreur r&  )r  r   r  rU  r2  r  r  r   r   r   r   r  r  ri  )rZ  r  _nowr  r	  r   r   r  	klines_1m	prices_1mr$  r  rp   s               rr   analyze_one_symbolzDSurveillanceService._analyze_all_symbols.<locals>.analyze_one_symbolo  s@   +,,VT3?Vr!1 $v;!#fRjm(<t(Cdiik(Q$*3BKM$*M/<=!%!+==0=>151;>>~~44VVWM
 DMM$($7$7b$I	$Y2)="9~2uYr]1=M7NQU7UX\XaXaXc7c,5crN	(*y1Q!%!+1Q(RI%*?+?+?	+J%KF6<DMM(3"9~2BKB-R[\^R_B_clmocpApsvAvo >"9~2BKB-R[\^R_B_clmocpApsvAvo > ~%3 >> 2R %   wvhb45ss   #H AH *G$?H G)/H 
A/G3 9G.BG3  H $
H .G3 3	G?<H >G??H 	H0H++H0SCORINGr[  )max_workersrY   r_  r_  
VALIDATINGsmart_summaryr  r?  recent_logscycle_duration_secondsanalyzed_symbolsia_surveillance_cache.jsonTr  r  Fr  r  u1   📊 Cache IA non écrit (process secondaire PID u    ≠ bot PID r|  u%   🧹 bot.pid périmé supprimé (PID z mort)r  r  rX   )r  r  r  zErreur sauvegarde cache IA: u   📊 Résultats: r  u    symboles analysés | ⚡ u    signaux prêts | ⏱️ r4  su   🎯 u#    opportunités d'achat détectées!)/r  r8  r  r  r   ri  r2  r  r  rA  r   submitr   r  r  rd  r9  r  r_  r  r~  _build_surveillance_statusr  rF  listr?  r   r  r  rx  ry  r  r  rW  r  r  r  r  r  r  r  r  r  r  r  rg  r  )rp   
start_timer  signals_foundr  executorsymfuturesfuturer  rZ  r  elapsedr  r~  rd  
cache_fileshould_writebot_pid_filer  bot_pidmy_pid	bot_alivef_checkexisting	cache_tmpr  s   `                          rr   rm  z(SurveillanceService._analyze_all_symbols]  sh   ""$*?*?LLLTM`M`hlMlLmmw  W[  Wl  Wlx{  }A  }R  }R  yS  rs  xt  u  vDSI^I^E_D``ijk ~~,,NN--d.A.ABYY[
-	^ '
  B/ 	B8PTPePefx'93?DfGf&w/ 
B#)LFDNN33FDAMH{{g-%*22 33FDA
B	B  ))+
*a<GD.9" !D)>	=446F '-jj"&ED#2:D##J/ t45(,T-G-G(H}% 05Wa/@F+,)1F%&bggooh&?A]^J
  L!ww||BGGOOH,EyQ77>>,/lC0 8A"%affhnn&6"78&RYY[F %I*+$(	 (Y 77>>*5!%j#!H >G+4499W+=>'||J:Q>:B,,X\XoXo:p 7','XY_X``mnumvvw%xy&277>>,+G!%BIIl3"KK*OPWyX^(_` &/	)S7; TqDIIfaeAsST

9j1
 	'z3t7L7L3M2NNhivhw  xQ  RY  Z]  Q^  ^_  `  	a1KK%.QRS u g	B 	Bf8 8 /@ *$)	*> >  ) ! ! 
T T  	=LL7s;<<	=s   :S4	S/#"S45S4<S4S48B1U *A!U (T3U T $0U T&'A:U "+T3 U "U>U /S44S>TU T#U "T##U &T0+U 3	T?<U >T??U 	UU UU UU 	V	'VV	r   c                 h   	 ddl }ddl}|j                  j                  |j                  j	                  t
              d      }|j                  j                  |      rUt        |dd      5 } |j                  |      }t        j                  d|j                  dd       d	       |cddd       S i d| j                  dddddddddddg dg dg di dg dg ddddddddddddg g g g dS # 1 sw Y   PxY w# t        $ r"}t        j                  d
|        Y d}~yd}~ww xY w)z@Retourne le statut de la surveillance - LECTURE DIRECTE DU CACHEr   Nr  r  r  r  u%   📊 Cache IA retourné directement (r  z
 symboles)u   ⚠️ Erreur lecture cache: r  ai_availableTtotal_symbolsr?  ready_to_buyr\  top_opportunitiesready_signalsrotation_opportunitiesrotation_statusai_opportunitiesai_selected_symbolsai_opportunity_countdynamic_sltp_enabledFr  )r  r  r  r  r-  	by_statusr  en_surveillancer  r  )r~  r  r  r  rx  ry  r  r  r  r  ri  r  r  r  r  )rp   r~  r  
cache_pathr  
cache_datar  s          rr   get_surveillance_statusz+SurveillanceService.get_surveillance_status  s   
	@bggooh&?A]^Jww~~j)*cG< &!*1JLL#HXbdeIfHggq!rs%& &
$//
D
 R
 	

 A
 
  
 R
 %b
 r
 
 "2
 #A
 #E
 qa!STbcd
  2"rY[\!
 	
& &  	@NN:1#>??	@s0   A*D ,=C:)	D :D?D 	D1D,,D1c                 5   st  j                   j                         }t        j                  dt	        |       d        fd}t        t        dd      }|dk(  rdnd}|dk(  rdnd}g d	}|D cg c]U  }|j                  d
      dk(  r?|j                  d      dk(  r+|j                  dd      |k\  r|j                  dd      |v r|W }}|D cg c]U  }|j                  d
      dk(  r?|j                  d      dk(  r+|j                  dd      |k\  r|j                  dd      |v r|W }	}|	r%t        j                  dt	        |	       d| d       |D cg c]  }|j                  d      dk(  s| }
}t               sdt	 ddl
m}  |       tddl}j                  j                  |j                  j                  t               d      }|j                  j#                  |      rCt%        |dd      5 }|j'                  |      }t        |j                  dg             sddd       dֈstfd 	}g }sstrt	        |      }t	        |	      }g }g }|D ]^  } ||j                  dd      |j                  dd      !      \  }}|r|j+                  |       Dd|d"<   ||d#<   |j+                  |       ` |}|j-                  |       g }g }|	D ]^  } ||j                  dd      |j                  dd      !      \  }}|r|j+                  |       Dd|d"<   ||d#<   |j+                  |       ` |}	|j-                  |       |
D cg c]2  } ||j                  dd      |j                  dd      !      d   s1|4 }
}|t	        |      z
  |t	        |	      z
  z   }|dkD  rcd$j                  |dd% D cg c]*  }|j                  d&d'       d(|j                  dd       d), c}      }t        j                  d*| d+|        t               }g }|D ];  }|j                  d&d      }||vs|j/                  |       |j+                  |       = |	r"t        j                  d,t	        |	       d-       |
D ]  }|j                  d&d      }|j                  d
      r@|j                  d
      dk7  r,t        j                  d.| d/|j                  d
       d0       f||vsk|j/                  |       |j+                  |        t	        |      dkD  r:t        j                  d1t	        |       d2t	        |       d3t	        |
       d)       g } d}!g d4}"|D ]  }|j                  d&d      }|j                  dd      }#|j                  dd      }$|j                  d5i       }%|$|"v rt        j                  d6| d7|$ d8       m|#|!k  r t        j                  d6| d9|# d:|! d;        ||      }&|&r?| j+                  |       t	        |       d<k  st        j                  d=| d>|# d?|$        |#d@k  rt        j                  dA| dB|# dC       |$d4v r!t        j                  dA| dD|$ dE|# d)       "|%j                  dFd      dGk  rX|%j                  dHd      dIk  rCt        j                  dA| dJ|%j                  dFd      dKdL|%j                  dHd      dKd)       |%j                  dMd      dGk  s|%j                  dFd      dNk  st        j                  dA| dO|%j                  dMd      dKdP|%j                  dFd      dKd)         ddl}' |'j0                         }( j2                  D )cg c]&  }) j4                  j                  |)d&   d      |(kD  r|)( c}) _         j2                  D )ch c]  })|)d&   	 }*})| D ]  }+|+d&   }||*vrv|(|+dQ<    j2                  j+                  |+       |( j6                  z    j4                  |<   t        j                  dR| dS j6                  dz   dT j6                  dz   dU       t9         j2                        D ]P  \  },})|)d&   |k(  s|)j                  dQ|(      }-|-|+dQ<   |+ j2                  |,<   |( j6                  z    j4                  |<   R  |D ci c]  }|j                  d&      | }.}g }/g d4}"t        j                  dVt	         j2                         dW        j2                  D ]  }0|0j                  d&d      }|.j                  |      }1|1s*|1j                  d
d      }2|1j                  ddX      }3|1j                  dd      }4|dYk(  r!t        j                  dZ| d[|2 d\|3 d]|4        |1j                  dd      }5|1j                  d5i       }6|2dk(  xr |3}7|2dk(  r.|/j+                  |       t        j                  d^| d_|5 d)       |7s2|/j+                  |       t        j                  d^| d`|2 da|5 d)       |4|"v r/|/j+                  |       t        j                  d^| db|4 d)       M|4|vr/|/j+                  |       t        j                  d^| dc|4 d)       |5|!k  r2|/j+                  |       t        j                  d^| dd|5 d:|! d)       |2|0d
<   |3|0d<   |4|0d<   |5|0d<   |6|0d5<     j2                  D )cg c]  })|)j                  d&d      |/vr|) c}) _        t;         j2                  de df      }8t	        |8      dkD  rRd$j                  |8dd% D cg c]  }|d&    dg|d     c}      }9t        j                  dht	        |8       di|9 d)       |D cg c]  }|j                  d
      dk(  s| }:}dj };|D cg c]  } |;|      s| }<}g }=d}>t<        rz	 t?               }?|?jA                         }>j                  j                  |j                  j                  t               dk      }@|j                  j#                  |@      r
t%        @d      5 }A Bj&                  |A      }Cddd       |?jC                         }Dt        j                  dlt	        |D       d       i }E|D ch c]  }|j                  d&d       }F}|D ]t  }|j                  d&d      }|j                  d5i       jE                         }%Dj                  |d      }G|GdkD  rG|%dm<   n|%rdm|%vr|j                  dnd      |%dm<   |%sp|%E|<   v CjG                         D ]  \  }}H|Hj                  dod      }IDj                  |d      }G|IdkD  s0GdkD  s6GIz  dpz
  dqz  }J|Evri E|<   E|   jI                  GJdkD  rdrndsJdtkD  rdunJdvk  rdwnddJd%z  |Jdxz  dy|Jd%z  z   dz|Jd<z  z   d{d|	       t        j                  d}| d~|Jdd        t        j                  dt	        E       d       |?jK                  C||E      }=|=r"t        j                  dt	        |=       d       g }Lg }MtL        r	 tO               }N|NjQ                         r3t        j                  d       g }O|D ]d  }i d&|j                  d&d      d|j                  dnd      d|j                  dd      dF|j                  d5i       j                  dFd      dH|j                  d5i       j                  dHd      d|j                  d5i       j                  dd      d|j                  d5i       j                  dd      d|j                  d5i       j                  dd      d|j                  d5i       j                  dd      d|j                  d5i       j                  ddy      d|j                  d5i       j                  ddz      d|j                  d5i       j                  dd      d|j                  d5i       j                  dd      dpk(  d|j                  dd      dv d|j                  dd      d|j                  dd      d|j                  dd      |j                  d5i       j                  dd      |j                  d5i       j                  dd      |j                  d5i       j                  dd      d}POj+                  |P       g NjS                  O      }Q|QD Rcg c]  }R|RjT                  sRjW                         ! }L}RQD Rcg c]  }R|RjT                  sRjX                   }M}Rt        j                  dt	        |M       d       |Mrd$j                  Mdd%       }St        j                  d|S        nNj[                         }Q|QD Rcg c]  }R|RjT                  sRjW                         ! }L}RQD Rcg c]  }R|RjT                  sRjX                   }M}Rt        j                  dt	        |M       d       t        j                  dt	        |8       dt	        |8       dt	        M              t	        |8      dkD  rEd$j                  |8dd% D cg c]  }|d&    dg|d     c}      }Tt        j                  d|T        |8}U|D cg c]  }|j                  d
      dk(  s| }V}||Vz   }V|D cg c]  }|j                  d
      dv s| }W}|WD ch c]  }|j                  d&       }X}UD ch c]  }|j                  d&       }Y}VD ch c]  }|j                  d&       }Z}t;        |D cg c]  }|j                  d      dk(  r|j                  dd      dk\  r|j                  d&      Xvr|j                  d&      Yvr|j                  d&      Zvr|j                  d5i       j                  dFd      dkD  rJ|j                  d5i       j                  dd      dkD  r%|j                  d5i       j                  dMd      dk\  s|j                  dd      dvr| c}d df      }[dxt	        V      z
  }\|\dkD  rV[d\ z   }V|D cg c]  }|j                  d
      dk(  s| }]}|D cg c]  }|j                  d      dk(  s| }^}t^        r	 d}_|8D ]  }+|+d&   }d}`| j                   j`                  v r j                   j`                  |   }a|ajb                  j                  dd      }`|`|+d<   d|ajb                  v rajb                  d   |+d<   dajb                  v rajb                  d   }bd|bv rbd   |+d<   te        ||+_      \  }c}d|c|+d<   |d|+d<   tg        |d|cz  d      |+d<    t        j                  dt	        |8       d        jh                  rt	         jh                        nd}e|edk(  r	 ddl5}|j                  j                  |j                  j                  t               d      }f|j                  j#                  |f      rt%        fdd      5 }Addl}B |Bj&                  |A      }g|gj                  dg       }htm        |gj                  di       jo                               }itm        |gj                  di       jo                               }jt	        t        |h|iz   |jz               }eddd        jp                  }kdX}l	 ddl5}ddl9m9}m |j                  j                  t               }n|j                  j                  |nd      }o|j                  j#                  |o      rd}k|j                  j                  nd      }p|j                  j#                  |p      rK|j                  ju                  p      }q mjv                         jy                         |qz
  }r|rdk  r	d}lrdk  rd}kt	        |8      dkD  st	        |      dkD  rd}li dkdldedt{         dǫ      r( j|                  r j|                  j                  de      nedt	        |8      dt	        |:      d|<dd< d|8d|=dd% d|>dLdMdt	        |M      dt^        dt	        U      t	        V      t	        W      t	        ]      t	        |8      t	         jh                        dҜd|Udd% t	        |V      d%kD  rVdd% nVWdd ]dd% d՜S c c}w c c}w c c}w # 1 sw Y   xY w# t(        $ r Y w xY wc c}w c c}w c c})w c c})w c c}w c c})w c c}w c c}w c c}w # 1 sw Y   xY wc c}w # t(        $ r#}Kt        j                  dK        Y d}K~K9d}K~Kww xY wc c}Rw c c}Rw c c}Rw c c}Rw # t(        $ r#}Kt        j]                  dK        Y d}K~Kd}K~Kww xY wc c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w # t(        $ r#}Kt        j]                  dK        Y d}K~Kbd}K~Kww xY w# 1 sw Y   GxY w# t(        $ r d}eY Xw xY w# t(        $ r#}Kt        j                  dK        Y d}K~Krd}K~Kww xY w)uV   Construit le statut complet depuis la watchlist du predictor (pour générer le cache)u4   📊 Construction cache depuis watchlist predictor: rO  c                    | j                  dd      }| j                  dd      }| j                  dd      }| j                  dd      }| j                  dd      }|d	k(  r$t        j                  d
| d| d| d| d| 
       |dk7  s|s%|d	k(  rt        j                  d| d| d| d       y|dk  ry|dv ryg d}||vrt        j                  d| d| d       y| j                  di       }|j                  dd      }|j                  dd      }	t	        t
        d      rlt
        j                  }
|
dk(  rW|dk  rR|	dk  rM|j                  dd       }|d!v xr |d"k  xr |d#k\  }|d$k\  s$|s"t        j                  d| d%|d&d'|	d&d(       y| j                  di       }|j                  dd      }|j                  dd      }|j                  d)d      }|j                  d*d      }|j                  dd       }|j                  d+d,      }|j                  d-d      }|j                  d.d      }|d/v }|d0kD  r.|d1k  r)|d2k  r$|s"t        j                  d| d3|d4d5|d&d(       y|d0kD  r(|d6k  r#|s!t        j                  d| d3|d4d7| d8       y|d9kD  r(|d:k  r#|s!t        j                  d| d3|d4d;| d<       y|d=v }|d>k  r |st        j                  d| d3|d4d?       y|d@k  rt        j                  d| d3|d4dA       y|dBk(  rt        j                  dC| dD       dE}ns|dFk(  r(|dGk\  r#dH}t        j                  dC| dI| dJ|d4dK       nF|r*|dGk\  r%dE}t        j                  dC| dL| dM| dN|d4       n|dGk\  rdO}n|d2k\  rdP}n
|d6k\  rdQ}ndR}||kD  r"t        j                  d| d3|d4dS|d4dT       y|dFk(  r^|dOkD  rY|j                  dd       }|d:kD  r"t        j                  d| dU|d4dV|dWdX       yt        j                  dY| dZ|d4dV|dW       |d[v }|rd\nd1}|j                  d]t	        +d^      r+j                         nd_      }|dBk(  xr |d`v }g da}||v s|rn0||kD  r+|dbkD  r&t        j                  d| dc|d4dd|d4de|dWdf	       y|r|dGk\  rd#}n
|d2k\  rd2}nd6}||kD  r!t        j                  d| dg|dWdS| dh       y|dBk(  r|dkD  r1|dikD  r,|d#k\  r|dbk  s"t        j                  d| dj|dkdl|d4dm       yt        |t              r|j                  dd      nd}|dnkD  xr |d6k\  } |dokD  r<|dpkD  r7|dbkD  r2|d#k\  r|d"k  s(| s&t        j                  d| dq|dkdr|d4ds|dWdt	       y| r t        j                  dC| du|dvdw| d       |dok  r%|d=vr!t        j                  d| dx|dkdy| dz       y|dk  r|d{v }!| j                  d      dk(  xr |dkD  }"|d|k  s|!s|"r>|!rt        j                  dC| d}|        nB|"r@t        j                  dC| d~|dkd       n"t        j                  d| dc|dkd|dWd       y|dk  r|dk  r|d=v xr |dkD  }#|#sy|dk  r|dk  ry|dk  r|dk  ry|dk  r9|d=v xr |d"k  }$|d$k\  xr |dkD  }%|$s |%st        j                  d| d|d4d       y	 ddl
m}&m}'  |&       }(|(rft	        |(d      rZ|(j                  xs d_})|'j                  |)i       j                  ddb      }*||*k  r#t        j                  d| d| d|* d|) d	       yy# t        $ r Y yw xY w)NrZ  r]  r_  r^  r   r  r  F	MATICUSDTu   🔍 VALIDATION z: smart_signal=, eligible=
, pattern=, score=rD  u   ❌ VALIDATION u   : REJETÉ (smart_signal=r|  rV   )	ACTIVE_CRASHPRICE_CORRECTIONRSI_TRAPSTRONG_DOWNTRENDBEARISH_TRENDr9   END_OF_CYCLEr1  r2  )
r^  r  EARLY_BREAKOUTCONSOLIDATION_BREAKOUTrO  rP  VOLUME_REVERSALRSI_REVERSALSTRONG_UPTRENDHIGH_SCORE_OVERRIDEr  z: Pattern 'u1   ' non-achetable - REJETÉ par is_valid_buy_signalr  r   r   _current_regimerW  r6  r   r   )r^  r  r  r  rm  z': BULL_WEAK + baisse persistante (Mom3=rE  rK  u   ) - ACHAT BLOQUÉr   r   r   r   r   r   )r  r  r  r#  g
ףp=
?r   r  z: BB_position=r7  z' en zone haute SANS momentum fort (mom=r   z > 0.72 avec score=u9    < 70 - ACHAT BLOQUÉ (score insuffisant pour zone haute)g?r   z > 0.65 avec score=uB    < 65 - ACHAT BLOQUÉ (score insuffisant pour zone médiane-haute))r^  r  r   u?    < 0.20 - ACHAT BLOQUÉ (zone trop basse, risque falling knife)r]  u'    < 0.10 - ACHAT BLOQUÉ (zone EXTRÊME)r^  r#  u9   : CREUX_REBOUND EXEMPT de bb_threshold (rebond légitime)r   r#  r  g)\(?z: PULLBACK score u    → bb_threshold=z (conservateur)rJ  z	 + score u    → bb_threshold relevé à rI  g=
ףp=?g(\?r  z > u    - ACHAT BLOQUÉ (zone haute)u&   : PULLBACK en zone haute BLOQUÉ - BB=rL  rM  z (fin de cycle probable)r  u6   : PULLBACK en zone haute ACCEPTÉ avec vigilance - BB=)rO  r#  r  r  r   r  r  r}  r@  )r  r#  r  r  r  z: EMA_diff=z% > z% + RSI=u    - ACHAT BLOQUÉ (pas un creux)z: RSI=u    - ACHAT BLOQUÉ (surachat)r   z%: CREUX_REBOUND trop tard - EMA_diff=rb  z% positif + BB=u    > 0.60 (creux déjà rebondi)g      @r   g?u;   : CREUX_REBOUND fictif — aucun signe de creux réel (EMA=z%, BB=z, RSI=u'   ) → position mid-range, achat bloquéu;   : CREUX_REBOUND mid-range ACCEPTÉ — momentum fort (Mom5=r4  z	%, Score=z: EMA_slope=u   % CHUTE FORTE — pattern u    BLOQUÉ)r  r  r  r^  r   u0   : EMA négatif AUTORISÉ - Pattern retournement u<   : EMA négatif AUTORISÉ - Smart criteria validé (ema_diff=r8  u   % NÉGATIF (bearish) + RSI=u    - ACHAT BLOQUÉr   rS  rR  r  z: Momentum3=z&% CHUTE MAJEURE (< -1%) - non-tradable)r  REGIME_CONFIGr  r  u   🛡️ : Score  < u
    (régime z) - non-tradableT)r  r  r  ri  r  r   r  r  r  r  r  r  r  r  r  ),r  rZ  r_  r^  r  r  BUYABLE_PATTERNS_VALIDATIONr  r  r  r  rsi_tempis_strong_reboundr   r   r   r   r   r   r   r   is_strong_patternis_low_zone_patternbb_thresholdrsi_pullback_checkis_ema_patternema_thresholdr  _creux_in_bullallowed_uptrend_patternsrsi_threshold	_mom5_val_strong_momentum_bypassis_reversal_patternsmart_validated_earlyis_oversold_creuxis_creux_oversoldis_exceptionalr  r  _regime_detector_regime_name_regime_minrp   s,                                              rr   is_valid_buy_signalzKSurveillanceService._build_surveillance_status.<locals>.is_valid_buy_signal1  s~
   UU8R(FeeIr*GEE'1%E554LUU#3U;N $.vhol^S^_m^nnx  zA  yB  BJ  KP  JQ  R  S w&n[(KK/&9QR^Q__jkyjzz{ |} rz   |  |
+' 99uVHKy@qrs uuZ,H%\\,:N%\\,:N {$56$44[(%,$1F#+<<r#:-48]-]-bjmobo-ty}t) %/@"KK%x7^_mnq^rrx  zH  IL  yM  M^  )_  `#(uuZ,H!lA6J!lA6J||J2H [!4I,,ub)C",,}c:K<<*DLL!,E  !(+u u T!j4&7EBJO`eF8>+c9JJqr|  ~A  rB  BS  T  U
 T!ebj9JeF8>+c9JJ]^c]d  e^  _  `t#
;LeF8>+c9JJ]^c]d  eg  h  i #*-N"NT!*=eF8>+c9J  KJ  K  Lt#eF8>+c9JJqrs /)d6(*cde#J&5B;#d6(*;E7BTUabeTffuvw"u{#d6(*WIYugMjkwx{j|}~"#"#"##\)eF8>+c9J#l[^M__|}~ *$t);%-\\%%<"%*KK%x/UVabeUffkl~  @C  lD  D\  !]  ^ gfX-cdopsctty  {M  NQ  zR  S  T %(ooN$2DM #,,U\]acwUx8O8O8Q  H  IK%8h[Lh=hN'p$22nM)cBheF8;xnDWZH[[cdghkcl  mL  M  N !Ub[ "" " "]"eF86#c#m_Lghi /)a<K$$6PSVXPXKK%x/TU]^aTbbqr}  B  rC  Ca  !b  c  >HRV=WHLLq9]^	+4s?+Ju{'e#d(:sRxQVZ\Q\adgiai  tKKK%x/jkstwjxx~  @K  LO  P  PV  WZ  [^  V_  _F  !G  H *KK$vh.ijstwix  yB  CH  BI  IJ  !K  L 5 W4U%UeF8<	#F`ah`iiqrs !|&-1y&y#)*~)>')I)]hY]o%826K*d6(2bcjbk$lm.d6(2nowx{n||~$  AKK%x{8C.Hcdghkcll| }~  RxJN%,0Q%Q%gV`cgVg!(  D Z$%6 $:#4 $%,0Q%Q%^VY\^V^!"'2+"G.42G)^KK%x|N3;OOu vw 
S#=#? #0@BR(S#3#B#B#OiL"/"3"3L""E"I"I+WY"ZK{*hvhhugSU_`l_mm}$~$
 	   	s   A6] 	]]r  r}  rV  rn  r   )r^  r#  r  r  r  rO  rP  r  r  r  r  r  rD  r  Tr^  r   r_  r]  rS  u   🆕 z  signaux POSSIBLE avec score >= u
    acceptésrd  r_  N)PatternManagerzpattern_config.jsonr  r  r  blacklistedrm  c                 V    rj                  | |      \  }}||fS | v rdd|  dfS y)u?   Vérifie si le bot accepterait ce pattern (cohérence IA↔Bot)ai_scoreFz	Pattern 'u   ' blacklisté)TOK)is_pattern_allowed)pattern_namer  allowedre  _blacklisted_patterns_pattern_managers       rr   _is_pattern_allowed_by_botzRSurveillanceService._build_surveillance_status.<locals>._is_pattern_allowed_by_bot  sJ    "2"E"El]e"E"f&44	,}EEErs   r  pattern_blockedpattern_blocked_reasonr=  r   rZ  ?(r|  u   🚫 PATTERN COHERENCE: u    signaux exclus → u   👁️ z8 signaux POSSIBLE (surveillance uniquement, pas d'achat)r  z#: status='ready' mais smart_signal=u
    - IGNORÉu   🔍 SURVEILLANCE: u!    signaux ACHAT détectés (smart=z	, status=)r  r  r  r  r  r9   r  r  r3  z: Pattern DANGEREUX u    - REJETÉ IMMÉDIATEMENTr  r  u    (seuil absolu) - REJETÉr   r#  u   : Validé pour achat - Score=z	 Pattern=rV   r  u   : Rejeté (score=z < 15)u   : Rejeté (pattern dangereux=z score=r   gQr   g{Gzu   : Rejeté (momentum_3=rE  z momentum_5=r   g{Gzu   : Rejeté (ema_diff=z momentum_3=detected_atu   💾 CACHE: u    ajouté (expire dans zmin zs)u   🔄 Revalidation cache: u    signaux à vérifierFr  u   🔍 CACHE DEBUG z: watchlist smart_signal=r  r  u   🗑️ CACHE: u=    retiré — signal est POSSIBLE (pas ACHAT confirmé, score=u'    retiré — signal n'est plus ACHAT (=r  u    retiré (pattern dangereux=u     retiré (pattern non-achetable=u    retiré (score=c                 &    | j                  dd      S Nr^  r   r  rx   s    rr   ro  z@SurveillanceService._build_surveillance_status.<locals>.<lambda>  s    wPQAR rs   rp  =u   📊 SURVEILLANCE: u*    signaux en cache prêts pour achat (top: c                     | j                  di       }|j                  dd      }|j                  dd      }|dk  xs d|cxk  xr dk  nc xs |S )Nr  r   r   r   rX   r  )r  r  r   r   s       rr   has_valid_opportunityzMSurveillanceService._build_surveillance_status.<locals>.has_valid_opportunity  sP    uuZ,H||J2H$LL!<MqLHa(&6Q&6H=Hrs   rZ  u    🔄 Prix actuels récupérés: r   r;  r  rY   r   r6  r8  r   r7  r   r   r   r   r   r  )	r   r   r   r   r   r   r   r   r   u"   🔄 Features avec vrai prix pour z (P&L: r7  r8  u   🔄 Features map: z symboles avec featuresu   🔄 u)    rotation(s) potentielle(s) détectée(s)zErreur analyse rotation: u7   🧠 AI OPPORTUNITY SELECTOR: Analyse des 58 cryptos...r  r  r   ema_9ema_21r   r   r   r   squeeze_activer   breakout_detected)r  VOLUME_BREAKOUTtechnical_scorepattern_scorerb  r   r   momentum_20)r   r   r+  u   ✅ AI OPPORTUNITY SELECTOR: u    cryptos sélectionnéesz
   TOP 5: u!   📂 AI Opportunities chargées: u    sélectionnéesu'   ⚠️ Erreur AI Opportunity Selector: u3   📤 RETURN get_surveillance_status: ready_signals=z ready_to_buy=z ai_selected=u      📤 Signaux retournés: )rT  r_  r\  ru   r0  )r}  r  r]  c                 &    | j                  dd      S r  r  r   s    rr   ro  z@SurveillanceService._build_surveillance_status.<locals>.<lambda>P  s    !%%+ rs   rU  g      I@r$  atr_percentai_opportunitypredicted_volatility_6h)rZ  crypto_datar  
dynamic_sl
dynamic_tprX   
dynamic_rru$   ✅ SL/TP dynamiques calculés pour z signauxu'   ⚠️ Erreur calcul SL/TP dynamiques: zwatchlist.jsonrK  
auto_addedspy_injectedrw  r  r  iX  r4  u!   Erreur vérification is_running: r  r  r  r  rF  r  r  r  r  r  r  r  r  r  r  )r  r  r  r  r-  r  r  r   r  )rm  )?r2  r  r  ri  r   ry  r   r  r  setpattern_managerr  r  r  r  rx  ry  r  r  r  r  r   extendaddr  r;  r<  r=  	enumeratesortedSMART_ROTATION_AVAILABLEr   
get_statusget_current_pricescopyrt  r  find_rotation_opportunities!AI_OPPORTUNITY_SELECTOR_AVAILABLEr   rq  select_opportunitiesselectedrl  rZ  load_opportunitiesr  DYNAMIC_SLTP_AVAILABLEr  r  r   r   r8  r~  r  keysr  r	   getmtimer  r  r  rF  )urp   r  r  _ready_regimeMIN_SCORE_READYMIN_SCORE_POSSIBLEBUYABLE_PATTERNS_LISTr  ready_from_smartready_from_possibleready_from_statusr  _json_blr~  _pc_path_f_bl_pc_datar  _pattern_blocked_signals_before_smart_before_possible_smart_allowed_smart_blockedr  re  _possible_allowed_possible_blocked	_filteredblocked_detailsready_symbolsready_from_analyzerrZ  ready_validatedMIN_SCORE_ABSOLUTEDANGEROUS_PATTERNSr^  r_  r  is_validr  current_timer  cached_symbolsr,  r   original_detectionwatchlist_mapcache_to_removecached_signalcurrent_statecurrent_smart_signalcurrent_smart_eligiblecurrent_patterncurrent_scorecurrent_featuresis_valid_signalr_  top_signalsr\  r#  valid_opportunitiesr  r  rotation_mgrr  r  r  r  current_pricesfeatures_mapwatchlist_symbols
real_pricer  r  ra  r  r  r  opportunity_selectorcrypto_data_listr0  profilesptop_5symbols_strsmart_achat_validatedsmart_possiblesmart_vente
vente_syms
achat_symspossible_symswatching_candidatesremaining_slotssmart_abandonneeeligible_valuesr  r$  cached_itemai_oppsl_pcttp_pctr  watchlist_pathwatchlist_datamanualr4  spy_injis_running_statusr  r	   
script_dirr  r  mtimeage_secondsr  r  su   `                                                                                                                  @@rr   r  z.SurveillanceService._build_surveillance_status%  s\    NN002	KCPYNK[[defo	v	  ->	J - >"B#0M#ARr!
 (1 N!eeN3w> uu%56$> uuWa0OC uuY37LL	  N N +4 RQ"#%%"7:"E#$55)9#:d#B#$55!#48J#J#$55B#7;P#P	  ! R R KK%$7 899YZlYmmwxy(1P1QUU8_5OQPP !$
	6-/#ww||BGGOOH$=?TUHww~~h'(C': Qe'}}U3H,/]B0O,P)Q	 $&  $4 01M"#67  NN% -"<QUU9b=Q\]\a\abikm\n"o"))!,+/A'(28A./"))!,-  .$++N; " "( 0"<QUU9b=Q\]\a\abikm\n"o%,,Q/+/A'(28A./%,,Q/0 #4$++,=>,=  !SqA[\]\a\abkmo\p{|  |A  |A  BI  KM  |N  BO  PQ  BR  !S  !S&-=)>>CSVYZmVnCnoI1}"&))f~  @B  AB  gC  -Dabhs0C/DAaeeIVXFYEZZ[-\  -D  #E6ykAUVeUfgh   " 	.AUU8R(F]*!!&)#**1-		. KK(3':#;"<<tuv # 	.AUU8R(Fuu^$~)>')Iwvh.QRSRWRWXfRgQhhrst]*!!&)#**1-	. "#a'KK-c2E.F-GGhilm}i~h  @I  JM  N_  J`  Ia  ab  c  d
  
 U % 	WAUU8R(FEE'1%EeeIr*GuuZ,H ,,d6(*>wiG`ab ))tF88E7#>P=QQjkl +1-H&&q)'2-KK$vh.KE7R[\c[d ef 2:KK%x/@v NO  !X  XKK%x/LWIU\]b\ccd ef\\,2U:x||LZ[?\_d?dKK%x/EhllS_abFcdgEhhtu}  vB  vB  CO  QR  vS  TW  uX  XY  !Z  [\\*a058X\\,XY=Z]b=bKK%x/CHLLQ[]^D_`cCddpqyq}q}  K  MN  rO  PS  qT  TU  !V  W?	WH 	 tyy{ 11&
%%))!H+q9LH &
" 04/I/IJ!!H+JJ% 	XFH%F^+(4}%**11&91=1O&&v.l6(2HZ\I\H]]abfbqbqrtbtauuwxy &d&@&@A XDAq{f,-.UU=,-O*0B}-8>22159E9W..v6X	X, 6??x!+?? U0T5O5O1P0QQfgh!77 6	AM"&&x4F)--f5M'4'8'8'L$)6):):;KU)S&"/"3"3Ir"B [(KK"3F8;TUiTjju  wM  vN  NX  Yh  Xi  !j  k !. 1 1'1 =#0#4#4Z#D  )G3N8N   (:5#**62KK/&9v  xE  wF  FG  !H  I )#**62KK/&9`au`vv~  @M  N  NO  !P  Q$(::#**62KK/&9UVeUffg hi$,AA#**62KK/&9YZiYjjk lm"%77#**62KK/&9I-X[\n[oop qr 5IM.16LM"23/>M),-:M'*0@M*-m6	At 11&
uuXr"/9 &
" t117R\`au:>))ERTSTI$Vq(}Aaj\%B$VWKKK-c%j\9cdocppqrs(P!AEE.,AZ,OAPP	I +4PQ7LQ7OqPP
 "$#F>13"."9"9"; "$bggooh.GIY!Z77>>.1nc2 1a$-DIIaL	1 &2%D%D%FNLL#CCDWCXXa!bc $&LFO(Px)<(P%(P& <!"x!4#$55R#8#=#=#? &4%7%7%B
%>8BH_5%/*I89gq8IH_5#3;L0< (1'8 q&)ggmQ&?%3%7%7%B
&?zA~+5+Cq*HC)OJ  &\979V 4(0771;4>ND5?#5ETT^aeTeDkl23.81n.81n')Z!^'</2j2o/F03
9 
 #LL+MfXU\]ghk\lln)op-q0 LL#6s<7H6II`!ab .:-U-U!!$.* .eC0F,G+HHq$rs  ,6N'?'A$ (557KK YZ (*$& ='$aeeHb&9'+QUU7A->' 'gq(9' )!%%
B*?*C*CLRS*T	'
 )!%%
B*?*C*CLRS*T' *155R+@+D+D]TU+V' $QUU:r%:%>%>w%J' %aeeJ&;&?&?!&L' (z2)>)B)B;PQ)R' "155R#8#<#<UB#G' *155R+@+D+D]TW+X' +AEE*b,A,E,EnVW,X' -aeeJ.C.G.GVW.X\].]' 0y"1EIp1p' .quu5F/J'  ,QUU?A-F!'" )!%%a*@#'& 23z21F1J1JK^`a1b/0uuZ/D/H/HIZ\]/^+,55R+@+D+D]TU+V+'. )//<1=6  4HHIYZH >F'T		'T$'T=E*T188*T'*TKK"?DW@X?YYq rs* $		*=bq*A Bj$89  4FFHH=E'T		'T$'T=E*T188*T'*TLL#DSI\E]D^^n!op 	I#e*Ucdghmdncoo|  ~A  BU  ~V  }W  X  	Yu:>))ERTSTI$Vq(}Aaj\%B$VWKKK6{mDE !&%.V!%%2G:2U!VV 2NB"+aQquu^/DH`/`qaa
 0;;!aeeHo;
;/DE!aeeHoE
E2@AQxAA$! 1h:-w"b(x
2x
2x5 %%
B'++L!<q@eeJ+//Q?!CeeJ+//
B?5HEE)Y/7NN   ,T
" c.11Q+.ABR?.SSN'0Z!AEE.4I\4YAZZ&/S1559I3Jd3R1SS "#N )# EF#H-F (,$!9!99&*nn&>&>v&F+6+?+?+C+CDVX\+](5E12 )K,@,@@4?4H4H4WF=1 ,{/C/CC%0%9%9:J%KF8FBDJKdDe'@ A &<%$*&3&NFF
 ,2F<(+1F<(+0&!+DF<(=E> CCJ<xXY 7;6K6KD112QRA"!#bggooh.GIY!Z77>>.1ncGD P#)21!/!3!3Ir!B%).*<*<\2*N*S*S*U%V
"&~'9'9."'M'R'R'T"U(+C0Cg0M,N(OP !OO	B)2J 77<<
I>Lww~~l+$(! j2NOJww~~j)((4+x||~779EA$#'L"S(,0) 5zA~Y!!3##
+#
L#
 ]#

 RYZ^`tRuz~  {R  {R//33JN  Xe#
 CJ#
 H#
  !4Sb!9#
 U#
 %&<Ra&@#
 #
  0#
 "#6#
 #C(;$<#
" #$:##
& 23/[)!"23J 5 56'#
8 .r29<^9Lq9P>"1#5Vd$Sb).r29#
 #	
oNR QQ Q  		d !S -Dr&
 K. @D&
 %WP Q 1 1 )Qj  >8<==>d (U*T (U*T  N!HLMMN %W W b
 <EA& [SL  N!HLMMNP P  " !":  	BLL<QC@AA	Bs{  0AAdAAdAd1AdA3Ad 7-Ad$Ad 2Ad-;Ad-5/Ad2=+Ad7>Ad<>Ae8AeAeAe4AeAeAe!A;Ae, Ae/A Ae, /Ae'A3Ae, <AAe, Ae, 	CAe, &J1Af/ DAfD)AfD;Af/ EAf EAf E!A'Af/ GAf%GAf%G,Af/ G2Af*HAf*H$Af/ JAgKAg#K"Ag#K1Ag(L
Ag(LAg-L2Ag2MAg7M3C.Ag<RAhR%AhR/AhS	AhSC:Ah W:A&Ai Y BAh:[5Ai \DAi dAddAd d	Ad*d)Ad*eAe$eAe, e,	Afe5AffAffAf/ f/	Agf8AggAgh	Ah7hAh2h2Ah7h:Aih?Ai iAiiAii	Aji"Aj j AjN)r   r   r   r   r   rg   r  rJ  r   rg  rM  rV  r\  rU  ro  rm  r   r  r  r   rs   rr   r1  r1  t  sn    
%+ %@&+R49 R
M:BG$RGBRbTH"
 "
Hm
D m
rs   r1  r   c                      t         S )u*   Retourne l'instance globale du prédicteur)ai_predictorr   rs   rr   get_ai_predictorr    s    rs   c                      t         S )z6Retourne l'instance globale du service de surveillance)surveillance_servicer   rs   rr   get_surveillance_servicer    s    rs   c                 X    t         j                  |        t        j                  |        y)z5Configure le fetcher de klines sur l'instance globaleN)r  r  r  )r  s    rr   setup_klines_fetcherr    s    ##G,++G4rs   __main__u    🧪 Test du module AI Predictorz%https://api.binance.com/api/v3/klinesrB   r.  r   )rZ  r   r  )paramsr   r   u   
📊 Analyse BTCUSDT:z
   Score: z/100z   Pattern: z   Status: u      Gain prédit: r7  r  z   Countdown: ~z minz   Raison: )r   r~  environ
setdefaultr  r   r	   r
   r>  r   typingr   r   r   r   r  r  r  loggingconcurrent.futuresr   r   basicConfigINFO	getLoggerr  rz  r<  smart_rotationr   r   r  rs  r  r  rj  ai_advanced_scorerr   r   rp  performance_analyzerr   rs  volatility_scorerr   rA  ai_opportunity_selectorr   rE  dynamic_sltpr   r    r  multi_timeframe_analyzerr!   r  volume_profile_analyzerr"   r  market_regime_detectorr#   r  advanced_feature_engineeringr$   r  time_pattern_analyzerr%   r  r  r&   r  risk_adjusted_scorerr'   r  monte_carlo_simulatorr(   r  ensemble_predictorr)   rx  long_term_trend_analyzerr*   r  lstm_reversal_predictorr+   configr,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rn  ro  r  r  rv   torch.nnrh   set_num_threadsset_num_interop_threadsRuntimeErrorrZ   is_availabler  rx  version__version__Moduler\   r  r  AttributeErrorr   rY  r   r1  r  r  r  r  r  r   requestsprinturlr  r  r  r  rU  r   r   r2  r  r  r^  r_  rd  ra  rf  re  )r	  s   0rr   <module>r     s	   
 

  ' - 

  ' - 

  ,c 2 

  . 4 

  +S 1  (  . .  	    ?   
,,>
 
		=	) #  ! AO#
KK/0
 " EE $
KK9:
 "' G=%)"
KK56
 $ D7"&
KK23
 %* !J@(,%
KKHI
  KP!
KK9:
 " K> $
KK9: ! J;#
KK89 " I: $
KK78 $ MB"&
KK;<  H?!
KK67 "' G=%)"
KK56   G="
KK56  H? 
KK67  % E9#' 
KK34 " K? $
KK9:
   J>"
KK>?
        	E!%%%a( zz ::--a0/z:;)%--*<*<)=>?,U->->,?@AGH 		 8,,m_=NOX& X&v "l&O l&O^M^
 ^
D+ }*<8 + 
 "5  
5 z	
,- 2C!tcBFS(AVVXF#)*aeAaDk*F$*+quQqT{+G I##Ivw?D	#%	Jtzzl$
'(	L
'(	K}
%&	d11#6a
89	ODNN+4
01	K}
%&3 oM  A
NN;A3?@@A  E
NN?sCDDE  G
NNA!EFFG  D
NN>qcBCCD  J
NNDQCHIIJ  K
NNEaSIJJK  K
NNEaSIJJK  J
NNDQCHIIJ  I
NNCA3GHHI  M
NNGsKLLM  H
NNB1#FGGH  G
NNA!EFFG  G
NNA!EFFG  H
NNB1#FGGH  E
NN?sCDDE  K
NNEaSIJJK  J
NNDQCHIIJN    
KKFGOL  DG ++s  V !W ?W* X 7X8 Y 1Z Z- )[ [; !\" =]	 ]0 5^ ^> -_% 	` `? :`3 B'`? -a a*a/W !V;;W W'W""W'*X/X		XX5X00X58Y=YYZ$Y>>ZZ*Z%%Z*-[2[[[8[33[8;\ \\"]']]	]-]((]-0^5^^^;^66^;>_"__"%`	*``	`0`++`03`<8`? ;`<<`? ?aaa'&a'