
    i                       d Z ddlZddlZddlZddlZddlZddlZddlZddlZ	ddl
m
Z
mZ ddlmZ ddlmZmZ ddlmZmZmZmZ ddlZ ej.                  d       dZd	Ze	Z	 ddlZej:                  j<                  j?                         dkD  rqd
ZeZej:                  j<                  jA                  d      Z! e"e!d   e#      re!d   jI                         n
 e%e!d         Z e&de         e&de!d   dz  dd       d Z*d Z+	 ejX                  dk(  r2ddl-Z- e-j\                  ej^                  j`                  dd      e_/        ejb                  je                  ejb                  jg                  e4            Z5 ejl                  e5       e G d d             Z7e G d d             Z8e G d d             Z9 G d  d!      Z: G d" d#      Z; G d$ d%      Z< G d& d'      Z=	 dd(l>m?Z?m@Z@ d
ZAejb                  j                  e5d*      ZCejb                  j                  eCd+      ZDejb                  j                  e5d,      ZE G d- d.      ZF G d/ d0      ZG G d1 d2      ZH G d3 d4      ZI G d5 d6      ZJ G d7 d8      ZKg d9ZLeLg d:z   ZMeMg d;z   ZNd< ZOePd=k(  r ej                   eO              yy# e'$ r  e&d       Y e($ rZ) e&de)        Y dZ)[)dZ)[)ww xY w#  Y xY w# e'$ r dZA e&d)       Y 
w xY w)>uU  
AI TRADING OPTIMIZER - GPU Accelerated (RTX 5070)
==================================================
Script d'optimisation IA pour ameliorer les performances du trading.
Utilise CUDA via CuPy pour acceleration GPU massive.

Fonctionnalites:
1. Backtesting automatique sur donnees historiques
2. Optimisation des parametres par algorithmes genetiques
3. Exploration des strategies par apprentissage par renforcement
4. Analyse de correlation entre indicateurs
5. Generation de rapports de performance
6. [GPU] Calculs vectorisés sur CUDA (10-100x plus rapide)
7. [GPU] Backtesting parallèle de centaines de combinaisons
8. [GPU] Optimisation PSO (Particle Swarm Optimization)

Usage:
    python ai_optimizer.py --mode backtest
    python ai_optimizer.py --mode optimize
    python ai_optimizer.py --mode explore
    python ai_optimizer.py --mode full
    N)datetime	timedelta)deque)	dataclassasdict)ListDictTupleOptionalignoreFCPUTnamez[GPU] CUDA disponible: z[GPU] Memoire GPU: totalGlobalMemi   @.1fz GBzD[GPU] CuPy non installe - Utilisation CPU (pip install cupy-cuda12x)z"[GPU] Erreur initialisation CUDA: c                 p    t         r/t        | t        j                        rt	        j
                  |       S | S )u-   Transfère un array vers le GPU si disponible)GPU_AVAILABLE
isinstancenpndarraycpasarrayarrs    ./ai_optimizer.pyto_gpur   >   s%    C4zz#J    c                 J    t         rt        | d      r| j                         S | S )u   Transfère un array vers le CPUget)r   hasattrr   r   s    r   to_cpur    D   s    e,wwyJr   win32utf-8replace)encodingerrorsc                      e Zd ZU dZdZeed<   dZeed<   dZ	eed<   dZ
eed	<   d
Zeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed<   dZeed <   dZeed!<   d"Zeed#<   d$Zeed%<   dZeed&<   d'Zeed(<   d)Zeed*<   dZeed+<   dZ eed,<   d'Z!eed-<   dZ"eed.<   d$Z#eed/<   dZ$eed0<   d1Z%eed2<   d3Z&eed4<   d5Z'eed6<   dZ(eed7<   dZ)eed8<   d$Z*eed9<   d:Z+eed;<   dZ,eed<<   d=Z-eed><   dZ.eed?<   d@Z/eedA<   d"Z0eedB<   dCZ1eedD<   d"Z2eedE<   dFZ3eedG<   dZ4eedH<   dIZ5eedJ<   dZ6eedK<   dL Z7e8dM        Z9e8dN        Z:dRdOefdPZ;yQ)STradingParamsu7   Paramètres de trading à optimiser - VERSION COMPLÈTE   
rsi_period      >@rsi_oversold     Q@rsi_overbought   	ema_short   ema_long   	bb_period       @bb_std(   trend_strength_threshold      ?momentum_threshold      ?	stop_loss      ?take_profitTenable_trailing_stoptrailing_stop_distance皙?trailing_stop_activationmax_order_sizemax_open_positions
   min_order_sizemax_risk_per_trade   required_signals<   min_ai_score_for_buyblock_buy_on_bearish   min_buy_signals   min_sell_signalsenable_breakout_detectionmin_breakout_strengthbreakout_signal_bonusenable_advanced_strategiesstrategy_consensus_thresholdenable_ensemble_ml   ml_min_training_samples2   ml_retrain_interval?ml_confidence_thresholdenable_advanced_featuresenable_smart_rotationrotation_min_cycle_end_scoreF   rotation_min_opportunity_scorerotation_min_score_advantage皙rotation_min_profitrotation_min_hold_time-   rotation_cooldownrotation_max_per_hour   max_total_exposure_percentmax_exposure_per_crypto   max_trades_per_hourenable_conservative_mode      @btc_volatility_thresholdconservative_factorc                     t        |       S N)r   )selfs    r   to_dictzTradingParams.to_dict   s    d|r   c           
         	 ddl } | d}i dt        |dd      dt        |dd      d	t        |d
d      dt        |dd      dt        |dd      dt        |dd      dt        |dd      dt        |dd      dt        |dd      dt        |dd       d!t        |d"d#      d$t        |d%d&      d't        |d(d      d)t        |d*d+      d,t        |d-d      d.t        |d/d      d0t        |d1d2      d3t        |d4d      d5t        |d6d7      d8t        |d9d:      d;t        |d<d&      d=t        |d>d?      d@t        |dAdB      dCt        |dDd&      dEt        |dFd#      dGt        |dHd?      dIt        |dJd&      dKt        |dLd:      dMt        |dNd&      dOt        |dPdQ      dRt        |dSdT      dUt        |dVdW      dXt        |dYd&      dZt        |d[d&      d\t        |d]d:      d^t        |d_d`      dat        |dbd      dct        |ddde      dft        |dgd      dht        |didj      dkt        |dld7      dmt        |dndo      dpt        |dqd7      drt        |dsdt      dut        |dvd&      dwt        |dxdy      dzt        |d{d#      S # t        $ r}t        d||         |        cY d}~S d}~ww xY w)~u'   Charge les paramètres depuis config.pyr   Nr)   
RSI_PERIODr(   r+   RSI_OVERSOLDr*   r-   RSI_OVERBOUGHTr,   r/   	EMA_SHORTr.   r1   EMA_LONGr0   r3   	BB_PERIODr2   r5   BB_STDr4   r7   TREND_STRENGTH_THRESHOLDr6   r9   MOMENTUM_THRESHOLDr8   r;   STOP_LOSS_PERCENTr:   r=   TAKE_PROFIT_PERCENTr<   r>   ENABLE_TRAILING_STOPTr?   TRAILING_STOP_DISTANCErA   TRAILING_STOP_ACTIVATIONr@   rB   MAX_ORDER_SIZErC   MAX_OPEN_POSITIONSrE   MIN_ORDER_SIZErD   rF   MAX_RISK_PER_TRADErH   REQUIRED_SIGNALSrG   rJ   MIN_AI_SCORE_FOR_BUYrI   rK   BLOCK_BUY_ON_BEARISHrM   MIN_BUY_SIGNALSrL   rO   MIN_SELL_SIGNALSrN   rP   ENABLE_BREAKOUT_DETECTIONrQ   MIN_BREAKOUT_STRENGTHrR   BREAKOUT_SIGNAL_BONUSrS   ENABLE_ADVANCED_STRATEGIESrT   STRATEGY_CONSENSUS_THRESHOLDrU   ENABLE_ENSEMBLE_MLrW   ML_MIN_TRAINING_SAMPLESrV   rY   ML_RETRAIN_INTERVALrX   r[   ML_CONFIDENCE_THRESHOLDrZ   r\   ENABLE_ADVANCED_FEATURESr]   ENABLE_SMART_ROTATIONr^   ROTATION_MIN_CYCLE_END_SCOREr`   ROTATION_MIN_OPPORTUNITY_SCOREr_   ra   ROTATION_MIN_SCORE_ADVANTAGErc   ROTATION_MIN_PROFITrb   rd   ROTATION_MIN_HOLD_TIMErf   ROTATION_COOLDOWNre   rg   ROTATION_MAX_PER_HOURri   MAX_TOTAL_EXPOSURE_PERCENTrh   rj   MAX_EXPOSURE_PER_CRYPTOrl   MAX_TRADES_PER_HOURrk   rm   ENABLE_CONSERVATIVE_MODEro   BTC_VOLATILITY_THRESHOLDrn   rp   CONSERVATIVE_FACTORz+[WARNING] Impossible de charger config.py:  )configgetattr	Exceptionprint)clsr   es      r   from_configzTradingParams.from_config   s   7	 2"6<<2$V^TB2  'v/?F2 "&+r:	2
 !R82 "&+r:2 vx52 *19SUW)X2 $+63G#M2 "&*=sC2 $F,A3G2 &-V5KT%R2 (/v7OQT'U2 *19SUX)Y2  'v/?D2  $+63G#L!2"  'v/?D#2$ $+63G#L%2& ")1CQ!G'2( &-V5KR%P)2* &-V5KT%R+2, !(0A1 E-2. ")1CQ!G/20 +2&:UW[*\122 '.f6Ms&S324 '.f6Mq&Q526 ,36;WY]+^728 .5V=[]_-`92: $+63G#N;2< )08QSV(W=2> %,F4I2$N?2@ )08QSW(XA2B *19SUY)ZC2F '.f6Mt&TG2H .5V=[]_-`I2J 07v?_ac/dK2L .5V=[]_-`M2N %,F4I4$PO2P (/v7OQS'TQ2R #*&2Er"JS2T '.f6Mq&QU2X ,36;WY[+\Y2Z )08QST(U[2\ %,F4I1$M]2^ *19SUY)Z_2` *19SUX)Ya2b %,F4I3$Oc2 2f  	?sCD5L	s   JJ 	K'K;KKc           	          | dTi dt        j                  dd      dt        j                  dd      dt        j                  dd	      d
t        j                  dd      dt        j                  dd      dt        j                  dd      dt        j                  dd      dt        j                  dd      dt        j                  dd      dt        j                  dd      dt        j                  dd      dt        j                  ddg      d t        j                  dd      d!t        j                  d"d      d#t        j                  dd$      d%t        j                  dd      d&dd't        j                  dd      d(t        j                  d)d*      d+t        j                  dd,      d-t        j                  ddg      d.t        j                  d/d      d0t        j                  d*d      d1dd2t        j                  dd      d3t        j                  d)d      d4dd5t        j                  dd	      d6dd7t        j                  d$d8      d9t        j                  dd$      d:t        j                  dd;      d<dd=t        j                  ddg      d>t        j                  dd	      d?t        j                  dd@      dAt        j                  ddB      dCt        j                  dDd      dEt        j                  ddF      dGt        j                  ddH      dIt        j                  d)dJ      dKt        j                  dd      dLt        j                  ddM      dNt        j                  dOd      dPt        j                  ddg      dQt        j                  ddR      dSt        j                  dd;      S )Uu7   Génère des paramètres aléatoires pour l'explorationr)         r+   r2   r6   r-   rI   P   r/      rh   r1   rX   r3   rD      r5   r8   rn   r7   r9   r:   r;   r<   r=   333333?r4   r>   TFr?   rA   皙?rB   d   rC   rE   rF   rH      rL   rJ   K   rK   rM   rG   rO   rP   rQ   rR   rS   rT   rU   rW   i,  rY   r[   皙?r\   r]   r^   r`   U   ra   #   rc   g      rd   re   rf   Z   rg      ri   rj         @rl   rN   rm   ro         @rp   r   )randomrandintuniformchoice)r   s    r   r   zTradingParams.random   s     2
~~a,2
B/2
 ">>"b12
 nnQ+	2

 ^^B+2
 nnR,2
 >>#s+2
 &,^^B%;2
  &~~c372
 nnS#.2
 sC02
 "(e}!=2
 $*>>#s#;2
 &,^^C%=2
 ">>"c22
   &~~a4!2
" #2
$  &~~b"5%2
& $^^Aq1'2
( "(B!7)2
* "(e}!=+2
, #NN1a0-2
. $^^Aq1/2
0 '+12
2 #)..c":32
4 #)..A"652
6 (,72
8 *0B)?92
:  $;2
< %+NN3$<=2
> !'r3 7?2
@ %+NN3$<A2
B &*C2
F #)--u">G2
H *0B)?I2
J ,2>>"b+AK2
L *0B)?M2
N !'tS 9O2
P $*>>"b#9Q2
R %nnR4S2
T #)..A"6U2
X (.~~b"'=Y2
Z %+NN3$<[2
\ !'q" 5]2
^ &,]]D%=%A_2
` &,^^C%=a2
b !'sC 8c2
 2	
r   mutation_ratec           	         | j                         }|j                         D ]  \  }}t        j                         |k  st        |t              r| ||<   5t        |t
              r't        d|t        j                  dd      z         ||<   lt        |t              s}t        d|t        j                  dd      z        ||<    t        di |S )u&   Mutation pour l'algorithme génétiquer   rL   皙?r   g333333?r   )rt   itemsr   r   boolintmaxr   floatr   r'   )rs   r   paramskeyvalues        r   mutatezTradingParams.mutate  s     ,,. 	MJC}}.eT*&+)F3Ks+"%aA1F)F"GF3Ku-"%c56>>#s3K+K"LF3K	M &v&&r   N)r   )<__name__
__module____qualname____doc__r)   r   __annotations__r+   r   r-   r/   r1   r3   r5   r7   r9   r;   r=   r>   r   r?   rA   rB   rC   rE   rF   rH   rJ   rK   rM   rO   rP   rQ   rR   rS   rT   rU   rW   rY   r[   r\   r]   r^   r`   ra   rc   rd   rf   rg   ri   rj   rl   rm   ro   rp   rt   classmethodr   r   r   r   r   r   r'   r'   Z   sO   AJL% NE IsHcIsFE %'c& ## IuK "&$%$'E'&)e) NC  NC   c "#"!%$%OSc '+t*#&5&!"3" (,+(* #*  $##&S&!!%)U) &*d)
 #'4&(* #**,"C,(* #*!%%"$C$s!"3"
 ')(#$S$  %)d)&)e)!$$ 9 9v 4
 4
l'E 'r   r'   c                   b    e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   y
)TradeResultu   Résultat d'un trade simulésymbolentry_price
exit_price
entry_time	exit_timepnlpnl_percentreasonN)r   r   r   r   strr   r   r   r   r   r   r   r   ,  s2    &K	JKr   r   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   eed<   eed<   eed	<   eed
<   eed<   eed<   ee	   ed<   defdZ
y)BacktestResultu   Résultat d'un backtest completr   total_tradeswinning_tradeslosing_trades	total_pnlwin_rateavg_winavg_lossprofit_factormax_drawdownsharpe_ratiotradesreturnc                    | j                   dk  ry| j                  dz  | j                  dz  z   | j                  dz  z   d| j                  z
  dz  z   | j
                  dz  z   d	t        | j                   d	      z  d
z  z
  }|S )u>   Score de fitness pour l'optimisation (plus élevé = meilleur)rD   ir   r4         $@r   r<   r   r   rX   )r   r   r   r   r   r   r   )rs   scores     r   fitness_scorezBacktestResult.fitness_scoreI  s    r! NNS MMC %& 4$$$+, #	$
 T&&**b01 	 r   N)r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r   9  s[    )ONOu r   r   c                       e Zd ZdZedee   dedee   fd       Z	edee   dedee   fd       Z
eddee   dedee   fd       Zeddee   dededeee   ee   ee   f   fd	       Zy
)TechnicalIndicatorsz/Calcul des indicateurs techniques - Version CPUpricesperiodr   c                 D    t        |       |k  ry t        | | d        |z  S rr   lensum)r   r   s     r   smazTechnicalIndicators.smaa  s*    v;66'(#$v--r   c                 h    t        |       |k  ry d|dz   z  }| d   }| dd  D ]  }||z
  |z  |z   } |S )NrG   r   r   r   )r   r   
multiplieremaprices        r   r   zTechnicalIndicators.emag  sU    v;&1*%
QiABZ 	3E3;*,s2C	3
r   c                 n   t        |       |dz   k  ry t        dt        |             D cg c]  }| |   | |dz
     z
   }}|| d  D cg c]  }|dkD  r|nd }}|| d  D cg c]  }|dk  r| nd }}t        |      |z  }t        |      |z  }|dk(  ry||z  }	ddd|	z   z  z
  S c c}w c c}w c c}w )Nr   r   r   )r   ranger   )
r   r   ideltasdgainslossesavg_gainr   rss
             r   rsizTechnicalIndicators.rsiq  s    v;!#38CK3HIa&)fQqSk)II,2F78,<=qa!e"==.4fWX.>?A1"1$??u:&v;'q= cQVn%% J=?s   B(	B-#B2std_devc                     t        |       |k  ry| | d  }t        |      |z  t        fd|D              |z  }|dz  }||z  z   ||z  z
  fS )NNNNc              3   .   K   | ]  }|z
  d z    ywrG   Nr   ).0pr   s     r   	<genexpr>z0TechnicalIndicators.bollinger.<locals>.<genexpr>  s     <!CA~<   r<   r   )r   r   r  slice_pricesvariancestdr   s         @r   	bollingerzTechnicalIndicators.bollinger  sl    v;#vgh',&(<|<<vE#oWs]"Cw})<<<r   Nr(   )r2   rG   )r   r   r   r   staticmethodr   r   r   r   r   r   r
  r
   r  r   r   r   r   r   ^  s    9.DK . .% . .
 DK  %   &DK & &huo & &" 	=$u+ 	=s 	=% 	=PUV^_dVegopugv  yA  BG  yH  WH  QI 	= 	=r   r   c                       e Zd ZdZedefd       Zedefd       Zeddefd       Zeddede	fd       Z
edded	ed
efd       Zy)GPUIndicatorszCCalcul des indicateurs techniques sur GPU (RTX 5060 Ti) - VECTORISEr   c                 H   t        |       }||k  r$t        j                  |t        j                        S t        j	                  |       }t        j                  |dz         }||dd ||d |d|  z
  |z  }t        j                  |t        j                        }|||dz
  d |S )u6   SMA vectorisée sur GPU - calcule pour TOUS les pointsr   N)r   xpfullnancumsumzeros)
prices_gpur   nr   cumsum_paddedr   results          r   sma_gpuzGPUIndicators.sma_gpu  s     
Ov:771bff%% :&Q"abVW%hw(??6I BFF#vaxyr   c                    t        |       }||k  r$t        j                  |t        j                        S d|dz   z  }t        j	                  |      }t        t        j                  | d|             ||dz
  <   t        ||      D ].  }|t        | |         z  d|z
  t        ||dz
           z  z   ||<   0 t        j                  |d|dz
   |S )u   EMA vectorisée sur GPUr4   r   N)r   r  r  r  r!  r   meanr  )r"  r   r#  alphar%  r  s         r   ema_gpuzGPUIndicators.ema_gpu  s     
Ov:771bff%%vz" ! GV)<!=>vax vq! 	XAjm 44E	U6RSTURU;EW7WWF1I	X FFyqr   c                    t        |       }||dz   k  r$t        j                  |t        j                        S t        j	                  |       }t        j                  |dkD  |d      }t        j                  |dk  | d      }t        j                  |dz
        }t        j                  |dz
        }t        t        j                  |d|             ||dz
  <   t        t        j                  |d|             ||dz
  <   t        ||dz
        D ]Z  }t        ||dz
           |dz
  z  t        ||         z   |z  ||<   t        ||dz
           |dz
  z  t        ||         z   |z  ||<   \ t        j                  |dkD  ||z  d      }	ddd|	z   z  z
  }
t        j                  |t        j                        }|
|dz
  d ||d |S )u6   RSI vectorisée sur GPU - calcule pour TOUS les pointsr   r           Ng      Y@r:   )
r   r  r  r  diffwherer!  r   r(  r  )r"  r   r#  r  r  r  	avg_gains
avg_lossesr  r	  r
  r%  s               r   rsi_gpuzGPUIndicators.rsi_gpu  s    
Ovz>771bff%% $ !VS1&1*vgs3 HHQUO	XXa!e_
 $BGGE'6N$;<	&($RWWVGV_%=>
6!8 vq1u% 	`A!)AaC.1VaZ@5q?RV\\IaL":ac?3vzBU6RS9EUUY__JqM	`
 XXj1ni*&<eDub)* BFF#fQhi.vwr   r  c                    t        |       }||k  rkt        j                  |t        j                        t        j                  |t        j                        t        j                  |t        j                        fS t        j                  | |      }t        j                  |t        j                        }t        |dz
  |      D ]1  }| ||z
  dz   |dz    }t        t        j                  |            ||<   3 |||z  z   }|||z  z
  }	|||	fS )u$   Bollinger Bands vectorisées sur GPUr   )	r   r  r  r  r  r&  r  r   r  )
r"  r   r  r#  r   r  r  windowupperlowers
             r   bollinger_gpuzGPUIndicators.bollinger_gpu  s     
Ov:771bff%rwwq"&&'92771bff;MMM ##J7 gga vz1% 	+AF
Qq1u5F266&>*CF	+ gm#gm#c5  r   fastslowsignalc                     t         j                  | |      }t         j                  | |      }||z
  }t         j                  ||      }||z
  }|||fS )u   MACD vectorisée sur GPU)r  r*  )	r"  r7  r8  r9  ema_fastema_slow	macd_linesignal_line	histograms	            r   macd_gpuzGPUIndicators.macd_gpu  s[     !((T: ((T:x'	#++Iv>+	+y00r   Nr  )r2   r4   r.   r0   	   )r   r   r   r   r  r   r&  r*  r1  r   r6  r@  r   r   r   r  r    s    MC  $ C  & !C ! !F !# !U ! !( 	13 	13 	1S 	1 	1r   r  c                   d    e Zd ZdZdeeej                  f   fdZd
dZ	dde
e   dede
e   fdZy	)GPUBacktesteruR   Backtester parallèle sur GPU - teste des centaines de combinaisons simultanémentprices_dictc                    t        |j                               | _        t        | j                        | _        t        d |j                         D              }|| _        t        j                  | j                  |f      | _
        t        j                  | j                  |ft              | _        t        | j                        D ]W  \  }}||   }t        |      }t        t        j                   |            | j                  |d|f<   d| j                  |d|f<   Y t#        d| j                   d| d       t$        j&                  j)                          y)z?
        prices_dict: {symbol: np.array de prix close}
        c              3   2   K   | ]  }t        |        y wrr   r   )r  r  s     r   r  z)GPUBacktester.__init__.<locals>.<genexpr>  s     ;c!f;   )dtypeNTz[GPU] Matrice de prix: z cryptos x z points)listkeyssymbolsr   	n_symbolsr   valuesmax_lenr  r!  prices_matrixr   
valid_mask	enumerater   r   arrayr   sysstdoutflush)rs   rE  rO  r  r   r   r#  s          r   __init__zGPUBacktester.__init__  s    K,,./T\\* ;k&8&8&:;;  XXt~~w&?@((DNNG#<D(I"4<<0 	*IAv (FFA(.rxx/?(@Dq"1"u%%)DOOArrE"		* 	''7{7)7ST

r   c                 p   t         j                  | j                        t         j                  | j                        t         j                  | j                        t         j                  | j                        t         j                  | j                        t         j                  | j                        d}t        | j                        D ]  }| j                  |   }t        t         j                  | j                  |               }	|	dkD  sC|d|	 }
t        j                  |
|      |d   |d|	f<   t        j                  |
|      |d   |d|	f<   t        j                  |
|      |d   |d|	f<   t        j                  |
||      \  }}}||d   |d|	f<   ||d   |d|	f<   ||d	   |d|	f<    |S )
uB   Calcule tous les indicateurs pour toutes les cryptos en parallèle)r
  r/   r1   bb_upper	bb_middlebb_lowerr   Nr
  r/   r1   rY  rZ  r[  )r  
zeros_likerP  r  rM  r   r   rQ  r  r1  r*  r6  )rs   r)   r/   r1   r3   r5   resultsr  r   	valid_lenvalid_pricesbb_ubb_mbb_ls                 r   compute_all_indicatorsz$GPUBacktester.compute_all_indicators  s    ==!3!34t'9'9:d&8&89d&8&89t'9'9:d&8&89
 t~~& 	:A''*FBFF4??1#567I1}%jy10=0E0ElT^0_q*9*}-6C6K6KLZc6d$Q

]35B5J5J<Ya5b
#Az	zM2#0#>#>|YX^#_ dD59
#Az	zM26:$Q

]359
#Az	zM2	:  r   params_listrH   r   c                 h   g }|D ]  }|j                  dd      }|j                  dd      }|j                  dd      }|j                  dd      }| j                  |j                  d	d
      |j                  dd      |j                  dd      |j                  dd      |j                  dd            }	d}
d}d}t        | j                        D ]  }t	        t        t        j                  | j                  |                     }|dk  r>t        | j                  |d|f         }t        |	d   |d|f         }t        |	d   |d|f         }t        |	d   |d|f         }t        |	d   |d|f         }t        |	d   |d|f         }d}d}t        d|      D ]  }t        j                  ||         st        j                  ||         r4||   }|r.||z
  |z  dz  }|| k  s||k\  sR|
dz  }
||z  }|dkD  r|dz  }d}id}||   |k  r|dz  }||   ||   kD  r|dz  }t        j                  ||         s	|||   k  rnn|dz  }||k\  sd}|}  |
dkD  r||
z  dz  nd}|
dkD  r||
z  nd}d}|
dk\  r|dz  |dz  z   |
d z  z   }|j                  ||
|||||d!        |S )"u   
        Teste un batch de paramètres en parallèle sur GPU
        
        params_list: Liste de dicts avec rsi_oversold, rsi_overbought, stop_loss, take_profit
        
        Retourne: Liste de résultats de backtest
        r+   r   r-   r_   r;   r4   r=   r   r)   r(   r/   rB  r1   r   r3   r2   r5   )r)   r/   r1   r3   r5   r   r,  rX   Nr
  r[  rY  Fr   r   TrD   r   r   )r   r   r   r   r   avg_pnlfitness)r   rc  r  rM  r   r    r  r   rQ  rP  r   isnanappend)rs   rd  rH   r]  r   r+   r-   r;   r=   
indicatorsr   r   r   r  r^  r   r
  r/   r1   r[  rY  in_positionr   jcurrent_pricepnl_pctsignalsr   rf  rg  s                                 r   backtest_params_batchz#GPUBacktester.backtest_params_batch:  sN    ! R	F!::nb9L#ZZ(8"=N

;4I **]C8K 44!::lB7 **[!4J3 **["5zz(C0 5 J LNI4>>* +8rvvdooa.@'A BC	r> 2 21jyj= ABZ.q*9*}=>":k#:1jyj=#IJ	!*Z"8JYJ"GH!*Z"8JYJ"GH!*Z"8JYJ"GH#!r9- 8AxxA'288IaL+A $*1IM"#0;#>+"MPS"S"yj0G{4J(A-L%0I&{ .! 3*/K #$q6L0#qLG$Q<(1+5#qLG>@hhxPQ{>S=8A;6Y^#qLG"&66*.K*7K98+8\ AMq@P5;VWH2>2Bi,.G Gr!#c/HsN:lS>PQNN  ,"0&$"" UR	h r   N)r(   rB  r   r2   r4   )rG   )r   r   r   r   r	   r   r   r   rW  rc  r   r   rp  r   r   r   rD  rD     sL    \Dbjj$9 0>^d ^s ^[_`d[e ^r   rD  c                       e Zd ZdZddedefdZdefdZddede	d	e	d
e	def
dZ
eddee	   dedededeee	   ee	   ee	   f   f
d       Zeddee	   dee	   dee	   dedee	   f
d       Zy)ParticleSwarmOptimizeru;   Optimisation par essaim de particules (PSO) - GPU Accelerégpu_backtestern_particlesc           	         || _         || _        ddddddddd	| _        t        | j                  j	                               | _        t        | j
                        | _        t        j                  || j                  f      | _
        t        j                  || j                  f      | _        t        j                  || j                  f      | _        t        j                  |t        d
             | _        t        j                  | j                        | _        t        d
       | _        t%        | j
                        D ]  \  }}| j                  |   \  }}t        j&                  j)                  |||      | j                  d d |f<   t        j&                  j)                  ||z
   dz  ||z
  dz  |      | j                  d d |f<    | j                  j+                         | _        y )N)r2   re   )7   r   )r:   r   )r4   r   )r   rh   )rh   r6   )rD   r   )r8   rn   )r+   r-   r;   r=   r/   r1   r3   r5   infrD   )
backtesterrt  boundsrJ  rK  param_namesr   n_dimsr  r!  	positions
velocitiesbest_positionsr  r   best_scoresglobal_best_positionglobal_best_scorerR  r   r   copy)rs   rs  rt  r  r   lowhighs          r   rW  zParticleSwarmOptimizer.__init__  s   (& %&#&  ! 	
   0 0 23$**+ ;"<=((K#=> hhT[['AB77;u>$&HHT[[$9!"', !!1!12 	bGAtD)IC#%99#4#4S$#LDNN1a4 $&II$5$5Sk"ntCxQSmU`$aDOOAqD!	b
 #nn113r   r   c                     t        |      }i }t        | j                        D ]4  \  }}||   }|dv rt        t	        |            ||<   't        |      ||<   6 |S )u5   Convertit une position en dictionnaire de paramètres)r/   r1   r3   )r    rR  rz  r   roundr   )rs   positionposr   r  r   r   s          r   position_to_paramsz)ParticleSwarmOptimizer.position_to_params  sg    X !1!12 	,GAtFE=="5<0t$U|t	, r   n_iterationswc1c2c                 B   t        d| j                   d       t        d| d| j                  |z   d       t        j                  j	                          t        j
                         }t        |      D ]  }t        | j                        D cg c]   }| j                  | j                  |         " }}| j                  j                  |      }	t        |	      D ]  \  }}
|
d   }t        t        | j                  |               }||kD  r9|| j                  |<   | j                  |   j                         | j                   |<   || j"                  kD  sz|| _        | j                  |   j                         | _        |
d   }t        d|d	z    d
|dd|
d   dd|
d   dd	       t        j                  j	                           t&        j(                  j)                  | j                  | j*                  f      }t&        j(                  j)                  | j                  | j*                  f      }||z  | j                   | j                  z
  z  }||z  | j$                  | j                  z
  z  }|| j,                  z  |z   |z   | _        | j                  | j,                  z   | _        t        | j.                        D ]P  \  }}| j0                  |   \  }}t&        j3                  | j                  dd|f   ||      | j                  dd|f<   R |d	z   dz  dk(  st        j
                         |z
  }t        d|d	z    d| d|dd       t        j                  j	                           t        j
                         |z
  }| j                  | j$                        }t        d|dd       t        d| j"                  d       t        d|        t        j                  j	                          |t        | j"                        || j                  |dS c c}w )u   
        Exécute l'optimisation PSO
        
        w: inertie
        c1: coefficient cognitif (attraction vers meilleur personnel)
        c2: coefficient social (attraction vers meilleur global)
        z&[PSO] Demarrage optimisation PSO avec z particules[PSO] z iterations, z evaluations totalesrg  r   z[PSO] Iteration r   z: Nouveau meilleur! Score=.2fz
, WinRate=r   r   z%, PnL=r   %Nr   r   z[PSO] Progression: / (zs)z[PSO] Optimisation terminee en sz[PSO] Meilleur score: z[PSO] Meilleurs parametres: )best_params
best_score
iterations	particleselapsed_time)r   rt  rT  rU  rV  timer  r  r|  rx  rp  rR  r   r    r  r  r~  r  r  r  r   r{  r}  rz  ry  clip)rs   r  r  r  r  
start_time	iterationr  rd  r]  r%  r   best_score_ir  r1r2	cognitivesocialr   r  r  elapseds                         r   optimizezParticleSwarmOptimizer.optimize  s    	6t7G7G6HTU|nM$2B2B\2Q1RRfgh

YY[
|, (	#IOTUYUeUeOfg!4224>>!3DEgKgoo;;KHG 'w/ '	6y)$VD,<,<Q,?%@A<'*/D$$Q'-1^^A->-C-C-ED''*4111-2D*04q0A0F0F0HD-"("2K,Yq[M9STYZ]S^^hiopzi{|  iA  AH  IO  P[  I\  ]`  Ha  ab  c  dJJ$$&'  !!4#3#3T[["ABB!!4#3#3T[["ABBR4#6#6#GHI"W 9 9DNN JKF$//1I=FDO!^^doo=DN %T%5%56 P4 KK-	T')wwt~~ad/CS$'Oq!t$P
 A"a'))+
2+IaK=,r'RUVXYZ

  "Q(	#T ))+
*--d.G.GH/}A>?&t'='=c&BCD,[M:;

 ' 6 67&))#
 	
a hs   %Pr   r7  r8  r9  c                     t        |       ||z   k  ryt        j                  | |      }t        j                  | |      }||y||z
  }|d|fS )Nr  r   )r   r   r   )r   r7  r8  r9  r;  r<  r=  s          r   macdzParticleSwarmOptimizer.macd  s`    v;&#&**648&**648x/#x'	 !Y&&r   highslowsclosesr   c                 ,   t        |      |dz   k  ryg }t        dt        |            D ]W  }| |   ||   z
  }t        | |   ||dz
     z
        }t        ||   ||dz
     z
        }|j                  t	        |||             Y t        || d       |z  S )u*   Average True Range - mesure de volatilitér   N)r   r  absri  r   r   )	r  r  r  r   true_rangesr  high_low
high_close	low_closes	            r   atrzParticleSwarmOptimizer.atr&  s     v;!#q#f+& 	EAQx$q')HU1Xqs34JDGfQqSk12Is8ZCD		E ;wx()F22r   N)rX   )r   gffffff?r8   r8   rA  r  )r   r   r   r   rD  r   rW  r	   r  r   r  r  r   r
   r   r  r  r   r   r   rr  rr    s   E!4} !43 !4F
d 
F
S F
% F
5 F
TY F
dh F
P 'T%[ ' ' '# 'V[\dej\kmuv{m|  G  HM  N  ]N  WO ' '  34; 3d5k 34; 3PS 3]efk]l 3 3r   rr  )get_fetcherCryptoDataFetcherzA[WARN] Cache crypto non disponible, utilisation de Binance directcrypto_cachezcrypto_data.jsonhistorical_datac                      e Zd ZdZdZdZdZi Zedde	de	de
ee      fd       Zedde	de	de
ee      fd	       Zede
e   fd
       Zede	de
e   fd       Zedde	de	dededee   f
d       Zeddee	ee   f   de	fd       Zedde	dede
ee	ee   f      fd       Zeddee	   de	dededee	ee   f   f
d       Zy)DataFetcheruJ   Recuperation des donnees historiques (base de données locale prioritaire)zhttps://api.binance.com/api/v3NFr   intervalr   c                     	 |  d| }|t         j                  v rt         j                  |   S t        j                  j	                  t
        |  d      }t        j                  j                  |      rVt        |dd      5 }t        j                  |      }ddd       j                  di       }||v r||   j                  dg       }g }|D ]  }	|j                  t        |	j                  d	      t              rt        j                  |	d	         nt        j                   |	d
   dz        t#        |	d         t#        |	d         t#        |	d         t#        |	d         t#        |	d         d        |t         j                  |<   t%        d|  d| dt'        |       d       t(        j*                  j-                          |S y# 1 sw Y   5xY w# t.        $ r}
t%        d|  d|
        Y d}
~
yd}
~
ww xY w)u~   
        Charge les données depuis la base de données historical_data/
        Créée par fetch_historical_data.py
        _z_historical.jsonrr"   r$   N	intervalsklinesr   	timestamp  openr  r  closevolumer  r  r  r  r  r  [DB] r  z): z klines depuis historical_data/z)[DB] Erreur lecture historical_data pour : )r  _historical_dataospathjoinHISTORICAL_DATA_DIRexistsr  jsonloadr   ri  r   r   r   fromisoformatfromtimestampr   r   r   rT  rU  rV  r   )r   r  	cache_key	hist_filefdataintervals_data
raw_klinesr  kr   s              r   load_historical_dataz DataFetcher.load_historical_dataQ  s   $	!(!H:.IK888"33I>>%8VHDT:UVIww~~i()S7; (q99Q<D( "&+r!:~-!/!9!=!=h!KJF' MWXYX]X]^hXiknMoH$:$:1Z=$Iu}  vL  vL  MN  OZ  M[  ^b  Mb  vc$)!F)$4$)!F)$4#(5?%*1W:%6&+AhK&8'  ?EK00;E&H:SVEdefJJ$$&!M1( (4  	=fXRsKL	s6   +G AG GD1G GG 	G="G88G=c                   K   	 |  d| d}|t         j                  v rZt         j                  |   }|rEt        |      dkD  r7|d   d   }t        j                         |z
  j                         dz  }|dk  r|S t         j                  | |      }|rt        |      dk(  ry|t         j                  |<   |S # t        $ r1}t        d	|  d
|        t         j                  | |      cY d}~S d}~ww xY ww)ui   
        Charge les données historiques ET les complète avec les données récentes de Binance
        r  	_completer   r  rI   r   Nz#[DB] Erreur load_and_complete pour r  )	r  r  r   r   nowtotal_secondsr  r   r   )r   r  r  cached	last_timeage_minutesr  r   s           r   !load_and_complete_historical_dataz-DataFetcher.load_and_complete_historical_data}  s     
	F!(!H:Y7IK888$55i@c&kAo &r
6 2I#+<<>I#="L"L"NQS"SK"R'% 55fhGFS[A-6<K((3M 	F7xr!EF33FHEE	FsM   C1A3B4 7C18&B4 C1B4 3C14	C.=&C)#C.$C1)C..C1c                     	 t         j                  j                  t              rst	        t        dd      5 } t        j                  |       }|t        _        dt        _	        t        |j                  di             }t        d| d       |cddd       S 	 y# 1 sw Y   yxY w# t        $ r}t        d	|        Y d}~yd}~ww xY w)
u)   Charge les données depuis le cache localr  r"   r  TrL  u!   [CACHE] ✅ Cache local chargé:  cryptosNu%   [CACHE] ⚠️ Erreur lecture cache: )r  r  r  
CACHE_FILEr  r  r  r  _cache_data_cache_loadedr   r   r   r   )r  cachesymbols_countr   s       r   load_local_cachezDataFetcher.load_local_cache  s    
	?ww~~j)*cG< ! IIaLE.3K+04K-$'		)R(@$AM=m_HUV ! ! * !   	?9!=>>	?s5   5B& AB	B& B#B& #B& &	C/CCc                     t         j                  st         j                          t         j                  r1t         j                  j	                  di       }|j	                  |       S y)u8   Récupère les indicateurs précalculés depuis le cacherL  N)r  r  r  r  r   )r   rL  s     r   get_cached_indicatorsz!DataFetcher.get_cached_indicators  sL     ((((*""!--11)R@G;;v&&r   limitretriesc                 p  K   t         j                   d}| ||d}t        |      D ]K  }	 t        j                  d      }t        j
                  |      4 d{   }|j                  ||      4 d{   }	|	j                  dk(  r|	j                          d{   }
|
D cg c]`  }t        j                  |d	   d
z        t        |d         t        |d         t        |d         t        |d         t        |d         db c}cddd      d{    cddd      d{    c S t        d|  d|	j                          g cddd      d{    cddd      d{    c S  t        d|  d| d       g S 7 .7 7 c c}w 7 {7 l7 >7 /# 1 d{  7  sw Y   nxY wddd      d{  7   n# 1 d{  7  sw Y   nxY w# t        j                  $ r9 t        d|  d|dz    d|        t        j                  d       d{  7   Y t        j                   $ r@}t        d|  d|dz    d|        t        j                  d       d{  7   Y d}~Nd}~wt"        $ r2}t        d|  dt%        |      j&                          g cY d}~c S d}~ww xY ww)z6Recupere les donnees de bougies historiques avec retryz/klines)r   r  r  r   )total)timeoutN)r   rV   r   r  r   rG   rL   rN   r   r  z[ERROR] API z	: status z[RETRY] z timeout, attempt r  z connection error, attempt z[ERROR] r  z	[FAILED] z after z	 attempts)r  BASE_URLr  aiohttpClientTimeoutClientSessionr   statusr  r   r  r   r   asyncioTimeoutErrorsleepClientConnectorErrorr   typer   )r   r  r  r  urlr   attemptr  sessionresponser  r  r   s                r   fetch_klineszDataFetcher.fetch_klines  s     %%&g. 
 W~ 	G!//b9"00A & &W&{{3v{> & &(#??c1)1#8D *.
$ %& -5,B,B1Q4$;,O,1!A$K,1!A$K+01;-21Q4[.3AaDk!"
$& & && & &  "L	(//AR"ST#%!& & && & &	> 		&	;<	;&&#8
$&&&&& & && & & & &$ '' '(:7Q;-q	RSmmA&&&// '(CGaK=PQRYQZ[\mmA&&& 47+;+;*<=>	st  )J60GF
G G8F
9G<#FF
 F(A%F
FGF
G G,F-G1J64FGF
G!G-F.G2J6
GGFFGGGGF1%F(&F1-G4G?G GG	GG	GJ6AJ3H" J3%J6(J3:/I5)I,*I5/J65J3%J.&J3'J6.J33J6r  c                    	 t         j                  j                  t        d| d      }t        j                  t        d       i }| j                         D ]f  \  }}|D cg c]R  }i |dt        |j                  dd      d      r|d   j                         nt        |j                  dd            iT c}||<   h |t        j                         j                         |t        |      d}t        |d	d
      5 }t        j                  ||       ddd       t!        dt        |       d       yc c}w # 1 sw Y   'xY w# t"        $ r}	t!        d|	        Y d}	~	yd}	~	ww xY w)u=   Sauvegarde les klines dans le cache local pour réutilisationklines_cache_.jsonT)exist_okr   	isoformat)r  
updated_atr  countr  r"   r  Nu#   [CACHE] 💾 Klines sauvegardées: r  u)   [CACHE] ⚠️ Erreur sauvegarde klines: )r  r  r  	CACHE_DIRmakedirsr   r   r   r  r   r   r  r   r  r  dumpr   r   )
r  r  
cache_fileserializable_datar   r  r  cache_contentr  r   s
             r   save_klines_cachezDataFetcher.save_klines_cache  s_   	Ci=
%1PQJKK	D1 !#"&**,  $- @q&7155QSCTVa;b!F)"5"5"7hklmlqlqrxz|l}h~-!&) *&lln668$./	M j#8 ,A		-+, 7<M8N7OxXY-, ,  	C=aSABB	CsD   AE !AD68AE >D; E 6E ;E E 	E(E##E(max_age_minutesc                    	 t         j                  j                  t        d|  d      }t         j                  j	                  |      syt        |dd      5 }t        j                  |      }ddd       t        j                  j                  dd            }t        j                         |z
  }|j                         |d	z  kD  r"t        d
|j                         d	z  dd       yi }|j                  di       j                         D ]d  \  }}	|	D 
cg c]P  }
i |
dt        |
j                  d      t               rt        j                  |
d         n|
j                  d      iR c}
||<   f t        dt#        |       d|j                         d	z  dd       |S # 1 sw Y   6xY wc c}
w # t$        $ r}t        d|        Y d}~yd}~ww xY w)z9Charge les klines depuis le cache local si encore validesr   r  Nr  r"   r  r  z
2000-01-01rI   u%   [CACHE] ⚠️ Cache klines expiré (.0fz min)r  r  u+   [CACHE] ✅ Klines chargées depuis cache: z
 cryptos (u,   [CACHE] ⚠️ Erreur lecture cache klines: )r  r  r  r  r  r  r  r  r   r  r   r  r  r   r   r   r   r   r   )r  r  r
  r  r  r  ager  r   r  r  r   s               r   load_klines_cachezDataFetcher.load_klines_cache  s   	i=
%1PQJ77>>*-j#8 -A $		!- "//0A0A,P\0]^J,,.:-C  "_r%99=c>O>O>QSU>UVY=ZZ_`a D"/"3"3FB"?"E"E"G  $  zqy&zRSRWRWX^R_adGe("8"86"Cklkpkpqwkxy V ?D	{*UXUfUfUhjlUlmpTqqvwxK)- -   	@DE	sJ   AF4 
F4 F".A;F4 *,F4 AF/+6F4 "F,'F4 4	G=GGrL  	use_cachec           	        K   i }g }|re|dv r`t        d| d       t        j                  j                          | D cg c]  }t        j                  ||       }}t        j                  |  d{   }t        | |      D ]C  \  }	}
|
r+t        |
      |dz  k\  rt        |
      |kD  r|
| d n|
||	<   3|j                  |	       E |rft        d |j                         D              }t        dt        |       dt        |        d	|d
d       t        j                  j                          |s|S |} t        dt        |       d       t        j                  j                          |rt        j                  |d      }|r| D cg c]*  }||vs"t        |j                  |g             |dz  k  s)|, }}|s5t        d       |j                  | D ci c]  }||v s|||    c}       |S t        |      t        |       dz  k  r_t        dt        |       t        |      z
   dt        |        d       |j                  | D ci c]  }||v s||vs|||    c}       |} d}t!        dt        |       |      D ]  }| |||z    }|D cg c]  }t        j#                  |||       }}t        j                  |  d{   }t        ||      D ]
  \  }	}|||	<    ||z   t        |       k  stt        j$                  d       d{     |rt        j'                  ||       |S c c}w 7 c c}w c c}w c c}w c c}w 7 7 >w)uR   Recupere les donnees pour plusieurs symboles (base de données locale prioritaire))1h4h1dz4[DB] Chargement depuis historical_data/ (intervalle )...Nr<   c              3   2   K   | ]  }t        |        y wrr   r   )r  r  s     r   r  z5DataFetcher.fetch_multiple_symbols.<locals>.<genexpr>6  s     "Da3q6"DrH  r  r  z cryptos chargees (,z klines)z. cryptos manquantes, recherche en cache/API...r   )r  r   z8[CACHE] Toutes les donnees trouvees dans le cache local!r   z[CACHE] z cryptos depuis cacher   r   )r   rT  rU  rV  r  r  r  gatherzipr   ri  r   rN  r  r   updater  r  r  r  )rL  r  r  r  r]  missing_symbolsr  taskscompleted_datar   	hist_datatotal_klinesr  missing
batch_sizer  batchbatch_resultsr  s                      r   fetch_multiple_symbolsz"DataFetcher.fetch_multiple_symbols   sK      %77H
RVWXJJY`aTU[BB1hOaEa#*>>5#99N%(.%A 3!	Y53;!><?	NU<Ri&8XaGFO#**62	3 ""D7>>3C"DDc'l^1S\N:Ml[\M]]efg

  "")c/233abc

  "  228R2PF&-i&C

STVXHYDZ]beh]hDh1iiTVNN'#QQQ&[AvayL#QR"N\CL3$66HS\CL%@$A3w<.PefgNN'#fQQ&[UV^eUeAvayL#fg%G 
q#g,
3 		)AAa*n-EKPQa[--a5AQEQ")..%"88M #E= 9 '"&' :~G,mmC(((		) ))'8<m b90 j $R $g R8 )s   >M L4M4L95DM*L<9L<=M	M%M-A"M	MMM&0MM4MM.M;MM&M<MM)r  )5mr  rL   )r(  )r(  r   )r(  r  T)r   r   r   r   r  r  r  r  r  r   r   r   r	   r  r  r  r  r   r  r  r  r   r'  r   r   r   r  r  I  s   T/HKM)S )C )8DQUJCW ) )V F Fs FV^_cdh_iVj F F6 htn   c htn   )3 )# )S )Z] )fjkofp ) )V CS$t*_ 5 C C C8  C    hW[\_aefjak\kWlNm    D Ad3i A3 AVY Amq A  ~B  CF  HL  MQ  HR  CR  ~S A Ar   r  c            	           e Zd ZdZdeeee   f   defdZdedee	   de
defd	Zded
e	dedee   fdZdefdZdede	defdZdede	dedefdZdede	fdZdefdZde	fdZddee	   de	de	fdZy)
BacktesterzMoteur de backtestingr  r   c                     || _         || _        i | _        g | _        g | _        d| _        | j
                  | _        d| _        y )Ni'  r   )r  r   r|  r   equity_curveinitial_capitalcapitalposition_size)rs   r  r   s      r   rW  zBacktester.__init__l  sC    	)+$++ r   r   r   current_idxr   c                    || j                   j                  dz   k  ry|d|dz    }|d   }g }t        j                  || j                   j                        }|U|| j                   j
                  k  r|j                  d       n*|| j                   j                  kD  r|j                  d       t        j                  || j                   j                        }t        j                  || j                   j                        }	|*|	(||	kD  r|j                  d       n|j                  d       t        j                  || j                   j                  | j                   j                        \  }
}}|/|
-||k  r|j                  d       n||
kD  r|j                  d       |j                  d      }|j                  d      }|| j                   j                  k\  ry|dk\  ryy)	u"   Génère les signaux d'achat/venterD   HOLDNr   r  BUYSELLrG   )r   r1   r   r
  r)   r+   ri  r-   r   r/   r  r3   r5   r  rH   )rs   r   r   r0  price_slicerm  ro  r
  r/   r1   rY  bb_midr[  	buy_count
sell_counts                  r   generate_signalszBacktester.generate_signalsv  s   --22-kAo.#B "%%k4;;3I3IJ?T[[---u%t{{111v& (++K9N9NO	&**;8L8LM X%98#u%v& &9%B%B..0B0B&
"&( H$8x'u%)v& MM%(	]]6*
4441_r   rm  current_timec                     || j                   vry| j                   |   }|d   }|d| j                  j                  dz  z
  z  }||k  ry|d| j                  j                  dz  z   z  }||k\  ryy)u)   Vérifie les conditions de sortie (SL/TP)Nr   r   r   	STOP_LOSSTAKE_PROFIT)r|  r   r;   r=   )rs   r   rm  r:  r  r   sl_pricetp_prices           r   check_exit_conditionsz Backtester.check_exit_conditions  s    'nnV$-( !dkk&;&;c&A"ABH$ !dkk&=&=&C"CDH$ r   c           
         | j                   j                         D ]"  \  }}t        |      dk  r|D cg c]  }|d   	 }}t        dt        |            D ]  }||   }|d   }|d   }| j	                  |||      }	|	r| j                  ||||	       | j                  |||      }
|
dk(  r:|| j                  vr,t        | j                        dk  r| j                  |||       n'|
dk(  r"|| j                  v r| j                  |||d       | j                  j                  | j                  |d	|d
z                  % | j                         S c c}w )u   Exécute le backtest completr   r  rX   r  r3  r   r4  SIGNALNr   )r  r   r   r  r@  _close_positionr9  r|  _open_positionr,  ri  _calculate_equity_generate_result)rs   r   candlescr   r  current_candlerm  r:  exit_reasonr9  s              r   runzBacktester.run  sf     $yy0 	OOFG7|c!*12Qaj2F22s7|, O!( .w 7-f5 #88P\]((kZ ..vvqA U?vT^^'CDNNH[^_H_''|Lv%&DNN*B((hW !!(()?)?t!)MN)O	O8 $$&&1 3s   Er   r  c                 H    | j                   |z  }|||d| j                  |<   y)zOuvre une position)r   quantityr   N)r/  r|  )rs   r   r   r  rM  s        r   rD  zBacktester._open_position  s+    %%-  "
vr   r   c           
      $   || j                   vry| j                   |   }||d   z
  |d   z  }||d   z  dz
  dz  }| xj                  |z  c_        t        ||d   ||d   ||||      }| j                  j	                  |       | j                   |= y)zFerme une positionNr   rM  r   r   r   )r   r   r   r   r   r   r   r   )r|  r.  r   r   ri  )	rs   r   r   r  r   r  r   r   trades	            r   rC  zBacktester._close_position  s    'nnV$s=))S_<M 22a73>M*<(#	
 	5!NN6"r   current_pricesc                     | j                   }|S )u   Calcule l'équité courante)r.  )rs   rP  equitys      r   rE  zBacktester._calculate_equity  s    r   c                    | j                   s!t        | j                  ddddddddddg       S | j                   D cg c]  }|j                  dkD  s| }}| j                   D cg c]  }|j                  dk  s| }}t	        d | j                   D              }| j                   r$t        |      t        | j                         z  dz  nd}|rt	        d |D              t        |      z  nd}|rt	        d |D              t        |      z  nd}t	        d |D              }t        t	        d |D                    }	|	dkD  r||	z  n
t        d	      }
| j                         }| j                   D cg c]  }|j                   }}| j                  |      }t        | j                  t        | j                         t        |      t        |      |||||
||| j                         S c c}w c c}w c c}w )
u!   Génère le résultat du backtestr   )r   r   r   r   r   r   r   r   r   r   r   r   c              3   4   K   | ]  }|j                     y wrr   r   r  ts     r   r  z.Backtester._generate_result.<locals>.<genexpr>  s     3!3   r   c              3   4   K   | ]  }|j                     y wrr   rU  rV  s     r   r  z.Backtester._generate_result.<locals>.<genexpr>  s     -aee-rX  c              3   4   K   | ]  }|j                     y wrr   rU  rV  s     r   r  z.Backtester._generate_result.<locals>.<genexpr>  s     -quu-rX  c              3   4   K   | ]  }|j                     y wrr   rU  rV  s     r   r  z.Backtester._generate_result.<locals>.<genexpr>  s     010rX  c              3   4   K   | ]  }|j                     y wrr   rU  rV  s     r   r  z.Backtester._generate_result.<locals>.<genexpr>  s     5quu5rX  rw  )r   r   r   r   r   r   r  r   _calculate_max_drawdownr   _calculate_sharpe)rs   rW  winninglosingr   r   r   r   
total_winstotal_lossesr   r   returnsr   s                 r   rF  zBacktester._generate_result  s   {{!{{   #kk7QUUQY177![[7AEEQJ!773t{{33	<@KK3w<#dkk"22S8Q@G#-W--G<Q?E3-f--F;1000
35f5565AA5E
\15QV< 335 +/++6Q1==66--g6;;T[[)w<f+'%%;;
 	
' 87 7s   G(G(%G-:G-2G2c                     | j                   sy| j                   d   }d}| j                   D ]'  }||kD  r|}|dkD  r||z
  |z  dz  nd}t        ||      }) |S )zCalcule le drawdown maximumr   r   )r,  r   )rs   peakmax_ddr   dds        r   r]  z"Backtester._calculate_max_drawdown8  sq        #&& 	%Et|04q$,$&,aB_F		% r   rc  risk_free_ratec                     t        |      dk  ryt        |      t        |      z  t        fd|D              t        |      z  dz  }|dk(  ry|z
  |z  S )zCalcule le ratio de SharperG   r   c              3   .   K   | ]  }|z
  d z    ywr  r   )r  r  
avg_returns     r   r  z/Backtester._calculate_sharpe.<locals>.<genexpr>N  s     AA1z>a/Ar  r<   r   )rs   rc  rh  
std_returnrk  s       @r   r^  zBacktester._calculate_sharpeH  s]    w<!\CL0
AAACLPUXX
?^+z99r   N)r   )r   r   r   r   r	   r   r   r'   rW  r   r   r9  r   r   r@  r   rK  rD  rC  rE  rF  r]  r^  r   r   r   r*  r*  i  s	   !T#tDz/2 !M !.s .DK .c .VY .`C  U] bjknbo ( '^  'D
S 
 
h 
#c #% #x #QT #2  2
. 2
h  :e :e :TY :r   r*  c                       e Zd ZdZddeeee   f   dedefdZd Z	de
defd	Zd
eee
ef      dee
   fdZde
de
de
fdZde
fdZy)GeneticOptimizeru'   Optimisation par algorithme génétiquer  population_sizegenerationsc                 x    || _         || _        || _        g | _        d | _        t        d      | _        g | _        y )Nz-inf)r  ro  rp  
populationr  r   r  history)rs   r  ro  rp  s       r   rW  zGeneticOptimizer.__init__]  s:    	.&/148!&v#%r   c                     t        | j                        D cg c]  }t        j                          c}| _        t               | j                  d<   yc c}w )u9   Initialise la population avec des paramètres aléatoiresr   N)r  ro  r'   r   rr  )rs   r  s     r   initialize_populationz&GeneticOptimizer.initialize_populationf  s@    ;@AUAU;VWa=//1W +_ Xs   Ar   r   c                 n    t        | j                  |      }|j                         }|j                         S )u/   Évalue la fitness d'un ensemble de paramètres)r*  r  rK  r   )rs   r   rx  r%  s       r   evaluate_fitnessz!GeneticOptimizer.evaluate_fitnessm  s-    		62
!##%%r   fitness_scoresc           
          g }d}t        | j                        D ]M  }t        j                  |t	        |t        |                  }t        |d       }|j                  |d          O |S )u   Sélection par tournoir   c                     | d   S Nr   r   xs    r   <lambda>z1GeneticOptimizer.select_parents.<locals>.<lambda>z  s
    1Q4 r   r   r   )r  ro  r   sampleminr   r   ri  )rs   rx  parentstournament_sizer  
tournamentwinners          r   select_parentszGeneticOptimizer.select_parentss  sf    t++, 	&A~s?CP^L_7`aJ8FNN6!9%	&
 r   parent1parent2c                     |j                         }|j                         }i }|D ]&  }t        j                         dk  r||   n||   ||<   ( t        di |S )zCroisement de deux parentsr<   r   )rt   r   r'   )rs   r  r  p1_dictp2_dict
child_dictr   s          r   	crossoverzGeneticOptimizer.crossover  sa    //#//#
 	VC.4mmo.CgclQTJsO	V *z**r   c           	      >   t        d       t        d       | j                          t        | j                        D ]*  }t        d|dz    d| j                          g }t	        | j
                        D ]T  \  }}| j                  |      }|j                  ||f       |dz   dz  dk(  s6t        d|dz    d| j                   d	       V |j                  d
 d       |d   d   | j                  kD  r|d   d   | _
        |d   d   | _        t        d |D              t        |      z  }t        d|d   d   d       t        d|d       | j                  j                  |dz   |d   d   ||d   d   j                         d       || j                  dz
  k  sf| j!                  |      }t#        d| j                  dz        }|d| D 	cg c]  }	|	d   	 }
}	t        |
      | j                  k  rgt%        j&                  |d      \  }}| j)                  ||      }|j+                  d      }|
j                  |       t        |
      | j                  k  rg|
| _        - t        d       t        d| j                  d       | j                  S c c}	w )u!   Exécute l'algorithme génétiqueu   
🧬 OPTIMISATION GÉNÉTIQUE<============================================================z
[GEN] Generation r   r  rD   r   u      Évalué ...c                     | d   S r{  r   r|  s    r   r~  z)GeneticOptimizer.evolve.<locals>.<lambda>  s
    ad r   Tr   reversec              3   &   K   | ]	  }|d      yw)r   Nr   )r  r  s     r   r  z*GeneticOptimizer.evolve.<locals>.<genexpr>  s     ;qad;s   z   [BEST] Meilleur score: r  z   [AVG] Score moyen: )
generationr  	avg_scorer  rG   Ng333333?)r   z
[OK] Optimisation terminee !)r   ru  r  rp  rR  rr  rw  ri  ro  sortr  r  r   r   rs  rt   r  r   r   r  r  r   )rs   genrx  r  r   r   avg_fitnessr  
elite_sizer  new_populationp1p2childs                 r   evolvezGeneticOptimizer.evolve  s   /0h""$))* /	1C'ay$2B2B1CDE  N&t7 L	6--f5%%vuo6ER<1$LQq1E1E0FcJKL NDA a #doo5"0"3A"6#1!#4Q#7  ;N;;c.>QQK.~a/@/CC.HIJ*;s*;<=LL!Ag,Q/2(-a03;;=	!  T%%))--n= !D$8$8B$>?
0>{
0K!L1!A$!L!L .)D,@,@@#]]7A6FB NN2r2E!LLtL<E"))%0	 .)D,@,@@ #1_/	1b 	.0*4??3*?@A "Ms   JN)rX   r2   )r   r   r   r   r	   r   r   r   rW  ru  r'   r   rw  r
   r  r  r  r   r   r   rn  rn  Z  s    1&T#tDz/2 &S &\_ &-&} & &
T%u8L2M-N 
SWXeSf 
	+ 	+ 	+= 	+;  ; r   rn  c                   >    e Zd ZdZdeeee   f   fdZdee   fdZ	y)GridSearchOptimizeru$   Exploration systématique par griller  c                      || _         g | _        y rr   )r  r]  )rs   r  s     r   rW  zGridSearchOptimizer.__init__  s    	-/r   r   c                    t        d       t        d       g dg dg dg dg dd}d	d
lm} t        |j	                               }t        |j                               }t         ||       }t        dt        |       d       t        |      D ]  \  }}t        t        ||            }t        d$i |}	t        | j                  |	      }
|
j                         }| j                  j                  |       |dz   dz  d	k(  sst        d|dz    dt        |       d        | j                  j!                  d d       t        d       t        d       t        | j                  dd       D ]  \  }}t        d|dz    d|j#                         d       t        d|j$                   d|j&                  dd       t        d |j(                  dd!|j*                  d       t        d"|j,                  j.                   d|j,                  j0                   d#|j,                  j2                   d|j,                  j4                           | j                  S )%u!   Explore une grille de paramètresu   
🔍 EXPLORATION PAR GRILLEr  )   r   r   r6   re   )rv  rI   A   r_   r   )r8   r4   g      @rn   )rn   r   r   g      @)r   rG   rL   r+   r-   r;   r=   rH   r   )productz[GRID] z combinaisons a tester...r   rX   u
      Testé r  r  c                 "    | j                         S rr   )r   r|  s    r   r~  z-GridSearchOptimizer.explore.<locals>.<lambda>  s    (9 r   Tr  z
[OK] Exploration terminee !z
[TOP] TOP 5 STRATEGIES:Nr   z
   #z Score: r  z      Trades: z | Win Rate: r   r        P&L: z | Profit Factor: z      Params: RSI z	 | SL/TP r   )r   	itertoolsr  rJ  rK  rN  r   rR  dictr  r'   r*  r  rK  r]  ri  r  r   r   r   r   r   r   r+   r-   r;   r=   )rs   
param_gridr  rK  rN  combinationsr  comboparams_dictr   rx  r%  s               r   explorezGridSearchOptimizer.explore  sg   -.h 12-/ )

 	&JOO%&j'')*GV,-L)**CDE!,/ 		CHAus4/0K"1[1F#DIIv6J^^%FLL'A|q 
1q5'3|+<*=SAB		C 	94H-/)+"4<<#34 	bIAvF1Q3%x(<(<(>s'CDEN6#6#6"7}V__UXDYYZ[\K 0 055GH\H\]`Gabc&v}}'A'A&B!FMMD`D`Caajkqkxkx  lC  lC  kD  DE  FL  FS  FS  F_  F_  E`  a  b		b ||r   N)
r   r   r   r   r	   r   r   rW  r   r  r   r   r   r  r    s/    .0T#tDz/2 0-n- -r   r  c                   H    e Zd ZdZdee   fdZd Zdee   dee   defdZ	y	)
CorrelationAnalyzeru:   Analyse les corrélations entre indicateurs et performancer]  c                     || _         y rr   )r]  )rs   r]  s     r   rW  zCorrelationAnalyzer.__init__
  s	    r   c                    t        d       t        d       t        | j                        dk  rt        d       y| j                  D cg c]  }|j                  j                   c}| j                  D cg c]  }|j                  j
                   c}| j                  D cg c]  }|j                  j                   c}| j                  D cg c]  }|j                  j                   c}| j                  D cg c]  }|j                  j                   c}| j                  D cg c]  }|j                   c}| j                  D cg c]  }|j                   c}| j                  D cg c]  }|j                   c}d}t        d       |d   }d	D ][  }| j                  ||   |      }|d
kD  rdnd}t        |      dkD  rdnt        |      dkD  rdnd}t        d| d| d|dd| d	       ] t        d       t        | j                  d d      dd }t        d |D              t        |      z  }	t        d |D              t        |      z  }
t        d |D              t        |      z  }t        d |D              t        |      z  }t        d |	d!d"|
d!       t        d#|d$d%       t        d&|d$d%       yc c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )'zAnalyse les correlationsz 
[CORR] ANALYSE DES CORRELATIONSr  rD   z-[ERROR] Pas assez de resultats pour l'analyseN)r+   r-   r;   r=   rH   r   r   r   z'
[CORR] Correlations avec le P&L total:r   r  r   z[+]z[-]r<   FORTEr   MOYENNEFAIBLE    r  z+.3fr  )z
[TIP] RECOMMANDATIONS:c                     | j                   S rr   )r   r|  s    r   r~  z-CorrelationAnalyzer.analyze.<locals>.<lambda>0  s
     r   Tr  c              3   H   K   | ]  }|j                   j                    y wrr   )r   r+   r  r  s     r   r  z.CorrelationAnalyzer.analyze.<locals>.<genexpr>2  s     EA!((//E    "c              3   H   K   | ]  }|j                   j                    y wrr   )r   r-   r  s     r   r  z.CorrelationAnalyzer.analyze.<locals>.<genexpr>3  s     Hq18822Hr  c              3   H   K   | ]  }|j                   j                    y wrr   )r   r;   r  s     r   r  z.CorrelationAnalyzer.analyze.<locals>.<genexpr>4  s     =AQXX''=r  c              3   H   K   | ]  }|j                   j                    y wrr   )r   r=   r  s     r   r  z.CorrelationAnalyzer.analyze.<locals>.<genexpr>5  s     ?aQXX))?r  z   [RSI] RSI optimal: r  z / z   [SL] Stop Loss optimal: r   r  z   [TP] Take Profit optimal: )r   r   r]  r   r+   r-   r;   r=   rH   r   r   r   _pearson_correlationr  sortedr   )rs   r  r  r   paramcorr	directionstrengthtop_resultsavg_rsi_lowavg_rsi_highavg_slavg_tps                r   analyzezCorrelationAnalyzer.analyze  s   12ht||r!AB =ALLIqQXX22I@DM1qxx66M6:llC!((,,C:>,,GQAHH00GDHLL Qq!:!: Q-1\\::7;||D!aooD/3||<!!++<	
 	89;g 	GE,,T%[#>D!%uI"%d)c/wCIPSOyYaHC	{!E7"T$Kr(1EF		G 	() T\\/DdSTWUWXEEEKHXXHKHH3{K[[===K@PP?;??#kBRR&{3&7s<:LMN+F3<q9:-fS\;<C JMCG Q:D<s0   	K6K#KK
=K*K$K)0K.r}  yr   c                    t              }|dk  ryt              |z  t              |z  t        fdt        |      D              }t        fdD              dz  t        fdD              dz  z  }|dkD  r||z  S dS )u"   Calcule la corrélation de PearsonrG   r   c              3   @   K   | ]  }|   z
  |   z
  z    y wrr   r   )r  r  mean_xmean_yr}  r  s     r   r  z;CorrelationAnalyzer._pearson_correlation.<locals>.<genexpr>D  s&     La11Q4&=9Ls   c              3   .   K   | ]  }|z
  d z    ywr  r   )r  xir  s     r   r  z;CorrelationAnalyzer._pearson_correlation.<locals>.<genexpr>F       /rf"/r  r<   c              3   .   K   | ]  }|z
  d z    ywr  r   )r  yir  s     r   r  z;CorrelationAnalyzer._pearson_correlation.<locals>.<genexpr>G  r  r  )r   r   r  )rs   r}  r  r#  	numeratordenominatorr  r  s    ``   @@r   r  z(CorrelationAnalyzer._pearson_correlation;  s    Fq5Q!Q!L58LL	/Q//36/Q//367 	
 +6/y;&@q@r   N)
r   r   r   r   r   r   rW  r  r   r  r   r   r   r  r    sB    D^ 4 ,=\Ad5k Ad5k Ae Ar   r  c                       e Zd ZdZeddedefd       Zeddedefd       Z	eddedefd       Z
edded	efd
       Zy)ReportGeneratoru$   Génère des rapports de performancer%  filenamec                    t        j                         j                         | j                  j	                         | j
                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  d
| j                         d}t!        |dd      5 }t#        j$                  ||dd       d	d	d	       t'        d
|        |S # 1 sw Y   xY w)u   Génère un rapport JSON)
r   r   r   r   r   r   r   r   r   r   )r  
parametersperformancer   r  r"   r  rG   Findentensure_asciiNz[SAVED] Rapport sauvegarde: )r   r  r  r   rt   r   r   r   r   r   r   r   r   r   r   r   r  r  r	  r   )r%  r  reportr  s       r   generate_json_reportz$ReportGenerator.generate_json_reportT  s     "113 --//1 & 3 3"("7"7!'!5!5"OO#--!'!5!5 & 3 3 & 3 3!>>"OO $113
$ (C'2 	?aIIfa>	? 	,XJ78		? 	?s   C==Dr   c                    dj                  g dt        j                         j                  d       d| j                   d| j
                  dd| j                  dd| j                   d	| j                   d
| j                   d| j                  dd| j                   d| j                  dd| j                  dd| j                  dd| j                   d| j                   dd| j"                  dd| j$                   d| j&                   d| j(                   d| j*                   d| j,                   d| j.                   d| j0                   d| j2                   d| j4                   d| j6                   d| j8                  dd| j:                   d| j<                   d | j>                   d!| j@                   d"| jB                   d#| jD                   d$| jF                  d%d&| jH                   d'| jJ                   d(| jL                   d)| jN                   d*| jP                   d+| jR                  dd,| jT                   d-| jV                   d.| jX                   d/| jZ                   d0| j\                  dd1| j^                   d2| j`                   d3| jb                  dd4| jd                  dd5      }tg        |d6d78      5 }|ji                  |       d9d9d9       tk        d:|        |S # 1 sw Y   xY w);u9   Génère un fichier de configuration optimisée COMPLÈTEr  uy   """
Configuration Optimisée par IA - VERSION COMPLÈTE
==================================================
Généré le: z%Y-%m-%d %H:%M:%SuM  
Ce fichier contient TOUS les paramètres optimisés.
"""

# ═══════════════════════════════════════════════════════════════════════════════
# INDICATEURS TECHNIQUES OPTIMISÉS
# ═══════════════════════════════════════════════════════════════════════════════

RSI_PERIOD = z
RSI_OVERSOLD = r   z
RSI_OVERBOUGHT = z

EMA_SHORT = z
EMA_LONG = z

BB_PERIOD = z

BB_STD = u  

# ═══════════════════════════════════════════════════════════════════════════════
# TREND FOLLOWING
# ═══════════════════════════════════════════════════════════════════════════════

TREND_STRENGTH_THRESHOLD = z
MOMENTUM_THRESHOLD = u  

# ═══════════════════════════════════════════════════════════════════════════════
# GESTION DU RISQUE
# ═══════════════════════════════════════════════════════════════════════════════

STOP_LOSS_PERCENT = z
TAKE_PROFIT_PERCENT = u
  

# ═══════════════════════════════════════════════════════════════════════════════
# TRAILING STOP
# ═══════════════════════════════════════════════════════════════════════════════

ENABLE_TRAILING_STOP = z
TRAILING_STOP_DISTANCE = z
TRAILING_STOP_ACTIVATION = u   

# ═══════════════════════════════════════════════════════════════════════════════
# POSITIONS
# ═══════════════════════════════════════════════════════════════════════════════

MAX_ORDER_SIZE = z
MAX_OPEN_POSITIONS = z
MIN_ORDER_SIZE = z
MAX_RISK_PER_TRADE = u  

# ═══════════════════════════════════════════════════════════════════════════════
# SIGNAUX ET FILTRES
# ═══════════════════════════════════════════════════════════════════════════════

REQUIRED_SIGNALS = z
MIN_AI_SCORE_FOR_BUY = z
BLOCK_BUY_ON_BEARISH = z
MIN_BUY_SIGNALS = z
MIN_SELL_SIGNALS = u  

# ═══════════════════════════════════════════════════════════════════════════════
# BREAKOUT DETECTION
# ═══════════════════════════════════════════════════════════════════════════════

ENABLE_BREAKOUT_DETECTION = z
MIN_BREAKOUT_STRENGTH = z
BREAKOUT_SIGNAL_BONUS = u  

# ═══════════════════════════════════════════════════════════════════════════════
# STRATÉGIES AVANCÉES
# ═══════════════════════════════════════════════════════════════════════════════

ENABLE_ADVANCED_STRATEGIES = z 
STRATEGY_CONSENSUS_THRESHOLD = u  

# ═══════════════════════════════════════════════════════════════════════════════
# MACHINE LEARNING ENSEMBLE
# ═══════════════════════════════════════════════════════════════════════════════

ENABLE_ENSEMBLE_ML = z
ML_MIN_TRAINING_SAMPLES = z
ML_RETRAIN_INTERVAL = z
ML_CONFIDENCE_THRESHOLD = r  u  

# ═══════════════════════════════════════════════════════════════════════════════
# FEATURE ENGINEERING
# ═══════════════════════════════════════════════════════════════════════════════

ENABLE_ADVANCED_FEATURES = u  

# ═══════════════════════════════════════════════════════════════════════════════
# ROTATION INTELLIGENTE
# ═══════════════════════════════════════════════════════════════════════════════

ENABLE_SMART_ROTATION = z 
ROTATION_MIN_CYCLE_END_SCORE = z"
ROTATION_MIN_OPPORTUNITY_SCORE = z 
ROTATION_MIN_SCORE_ADVANTAGE = z
ROTATION_MIN_PROFIT = z
ROTATION_MIN_HOLD_TIME = z
ROTATION_COOLDOWN = z
ROTATION_MAX_PER_HOUR = u  

# ═══════════════════════════════════════════════════════════════════════════════
# EXPOSITION AU MARCHÉ
# ═══════════════════════════════════════════════════════════════════════════════

MAX_TOTAL_EXPOSURE_PERCENT = z
MAX_EXPOSURE_PER_CRYPTO = z
MAX_TRADES_PER_HOUR = z
ENABLE_CONSERVATIVE_MODE = z
BTC_VOLATILITY_THRESHOLD = z
CONSERVATIVE_FACTOR = 
r  r"   r  Nz6[SAVED] Configuration optimisee COMPLETE sauvegardee: )6r  r   r  strftimer)   r+   r-   r/   r1   r3   r5   r7   r9   r;   r=   r>   r?   rA   rB   rC   rE   rF   rH   rJ   rK   rM   rO   rP   rQ   rR   rS   rT   rU   rW   rY   r[   r\   r]   r^   r`   ra   rc   rd   rf   rg   ri   rj   rl   rm   ro   rp   r  writer   )r   r  contentr  s       r   generate_config_updatez&ReportGenerator.generate_config_updateo  s   s s  s ||~&&':;<s=s  s!s ##C(s)s '',s-s ss  OO!s !s$ %s$
%s& --	's&'s2 #;;<3s2=3s4 //45s455s@ %%c*As@+AsB ))#.CsB/CsN 334OsN5OsP !77<QsP=QsR #;;C@SsRASs^ ''(_s^)_s` //0as`1asb ''(csb)csd //0esd1esp ++,qsp-qsr 334ssr5sst 334ust5usv ))*wsv+wsx ++,ysx-ysD $==>EsD?EsF  55c:GsF;GsH  556IsH7IsT %??@UsTA UsV !' C CDWsVEWsb //0csb1csd "99:esd;esf 112gsf3gsh "99#>ish?ist #;;<ust=us@  556As@7 AsB !' C CDCsBE"CsD #)"G"G!HEsDI EsF !' C CDGsFEGsH 11#6IsH7IsJ !778KsJ9KsL --.MsL/MsN  556OsN7OsZ %??@[sZA[s\ "99#>]s\?]s^ 112_s^3_s` #;;<as`=asb #;;C@csbAcsd 11#6esd7esj (C'2 	aGGG	 	FxjQR		 	s   MM
config_filec                 ^   ddl }i ddd fddd fd	d
d fddd fddd fddd fddd fddd fddd fddd  fd!d"d# fd$d%d& fd'd(d) fd*d+d, fd-d.d/ fd0d1d2 fd3d4d5 fi d6d7d8 fd9d:d; fd<d=d> fd?d@dA fdBdCdD fdEdFdG fdHdIdJ fdKdLdM fdNdOdP fdQdRdS fdTdUdV fdWdXdY fdZd[d\ fd]d^d_ fd`dadb fdcddde fdfdgdh fdidj fdkdl fdmdn fdodp fdqdr fdsdt fdudv fdwdx fdydz fd{d| fd}d~ fdd fdd fd}	 t        |dd      5 }|j                         }ddd       |j                  ddt	        j
                         j                  d       d      }t        |dd      5 }|j                         ddd       t        d|        | j                         }d}|j                         D ]e  \  }	\  }
}|	|v s||	   } ||      d|
 d}fd}|j                  |||j                        \  }}|dkD  sN|}|dz  }t        d|
 d        g t        |dd      5 }|j                         ddd       t        d| d|        y# 1 sw Y   ;xY w# 1 sw Y   xY w# 1 sw Y   4xY w# t        $ r}t        d|        Y d}~yd}~ww xY w)uB   Applique automatiquement les paramètres optimisés dans config.pyr   Nr)   rv   c                     t        |       S rr   r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    3q6 r   r+   rw   c                 d    t        |       j                         rt        t        |             S | dS Nr   r   
is_integerr   r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s(    eAhFYFYF[s3q6{ deficj r   r-   rx   c                 d    t        |       j                         rt        t        |             S | dS r  r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s)    %PQ(J]J]J_3s1v; hijmgn r   r/   ry   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    Q r   r1   rz   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    s1v r   r3   r{   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r5   r|   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    aW r   r7   r}   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>      sSTv r   r9   r~   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    aW r   r;   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    Ac7 r   r=   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    #w r   r>   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    s1v r   r?   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>   s    aPSW r   rA   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>      RSTWQX r   rB   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    3q6 r   rC   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    3q6 r   rE   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   rF   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   rH   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    s1v r   rJ   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   rK   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   rM   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>	  s
    SV r   rO   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>
  r
  r   rP   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s    QTUVQW r   rQ   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    Ac7 r   rR   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    Q r   rS   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>      SVWXSY r   rT   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>      WZ[\W] r   rU   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   rW   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s    SQRV r   rY   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    SV r   r[   r   c                 
    | dS )Nr  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>      PQRUw r   r\   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r]   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s    [^_`[a r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  
    #w r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    3q6 r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  s
    Q r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>  r  r   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>   r  r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>!  r  r   r   c                     t        |       S rr   r  r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>"  r  r   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>#  r  r   r   c                 
    | dS r  r   r|  s    r   r~  z1ReportGenerator.apply_to_config.<locals>.<lambda>$  r#  r   r^   r`   ra   rc   rd   rf   rg   ri   rj   rl   rm   ro   rp   r  r"   r  z.py_backup_z%Y%m%d_%H%M%Sr  z[BACKUP] Sauvegarde creee: z^(z\s*=\s*)([^#\n]+)(.*?)$c                 ~    | j                  d      }| j                  d      r| j                  d      nd}|  | S )Nr   rL   r  )group)matchprefixcommentformatted_values      r   replacerz1ReportGenerator.apply_to_config.<locals>.replacer?  s=    !&Q49KKN%++a."(/):7)DDr   )flagsr   z   [UPDATE]  = z
[SUCCESS] z parametres mis a jour dans Tz&[ERROR] Erreur lors de l'application: F)rer  readr#   r   r  r  r  r   rt   r   subn	MULTILINEr   )r   r  r8  param_mappingr  r  backup_filer  updates_count	param_keyconfig_name	formatterr   patternr5  new_contentr  r   r4  s                     @r   apply_to_configzReportGenerator.apply_to_config  s    	2
<)9:2
^-kl2
 /1op2
 +'78	2

 %562
 +'782
 x!562
 ')CEU(V2
 !#79M"N2
 -/CD2
 13GH2
 #%;=M$N2
 %'?AU&V2
 ')CEY(Z2
 /1AB2
  !#79I"J!2
" /1AB#2
$ !#79I"J%2
& !35E F'2
( #%;=M$N)2
* #%;=M$N+2
,  13CD-2
. !35E F/2
0 (*EGW)X12
2 $&=?S%T32
4 $&=?O%P52
6 )+GIY*Z72
8 +-KM],^92
: !#79I"J;2
< &(ACS'T=2
> "$9;K#L?2
@ &(ACW'XA2
B ')CEU(VC2
F $&=?O%PG2
H .LM],^/OQa.b-KM],^$9;O#P'?AQ&R"57G!H&=?O%P+GIY*Z(ACW'X$9;K#L)CEU(V)CEY(Z$9;O#Pc2
h,	k39 #Q&&(# &--ex@W@WXg@h?iil5mnKk39 !Q !/}=> !..*KM7D7J7J7L P3	3K+'	2E&/&6O "$K=0GHGE
 *,(GSUS_S_)`&Kqy"-%*[M_<MNO%P* k39 !Q ! L/KK=YZM# #
! !:! !  	:1#>?	sn   J I&-AJ :I3AJ ?J (J :I?J &I0+J 3I<8J ?JJ 	J,J''J,modec                 r
   t        j                         j                         |i d| j                  j                  d| j                  j
                  d| j                  j                  d| j                  j                  d| j                  j                  d| j                  j                  d| j                  j                  d| j                  j                  d	| j                  j                  d
| j                  j                  d| j                  j                  d| j                  j                  d| j                  j                   d| j                  j"                  d| j                  j$                  d| j                  j&                  d| j                  j(                  i d| j                  j*                  d| j                  j,                  d| j                  j.                  d| j                  j0                  d| j                  j2                  d| j                  j4                  d| j                  j6                  d| j                  j8                  d| j                  j:                  d| j                  j<                  d| j                  j>                  d| j                  j@                  d| j                  jB                  d| j                  jD                  d | j                  jF                  d!| j                  jH                  d"| j                  jJ                  | j                  jL                  | j                  jN                  | j                  jP                  | j                  jR                  | j                  jT                  | j                  jV                  | j                  jX                  | j                  jZ                  | j                  j\                  | j                  j^                  | j                  j`                  | j                  jb                  | j                  jd                  d#| jf                  | jh                  | jj                  tm        | jn                  d$      tm        | jp                  d$      tm        | jr                  d$      tm        | jt                  d$      tm        | jv                  d$      d%tm        | jy                         d&      d'}t{        d(d)d*+      5 }t}        j~                  ||d$d,-       d.d.d.       t        d/       |S # 1 sw Y   xY w)0uL   Sauvegarde les résultats COMPLETS dans optimization_results.json pour l'APIr)   r+   r-   r/   r1   r3   r5   r7   r9   r;   r=   r>   r?   rA   rB   rC   rE   rF   rH   rJ   rK   rM   rO   rP   rQ   rR   rS   rT   rU   rW   rY   r[   r\   r]   r-  rG   )r   r   r   r   r   r   r   r   rN   )r  rE  r  metricsr   zoptimization_results.jsonr  r"   r  Fr  NzA[SAVED] Resultats COMPLETS sauvegardes: optimization_results.json)Ar   r  r  r   r)   r+   r-   r/   r1   r3   r5   r7   r9   r;   r=   r>   r?   rA   rB   rC   rE   rF   rH   rJ   rK   rM   rO   rP   rQ   rR   rS   rT   rU   rW   rY   r[   r\   r]   r^   r`   ra   rc   rd   rf   rg   ri   rj   rl   rm   ro   rp   r   r   r   r  r   r   r   r   r   r   r  r  r	  r   )r%  rE  outputr  s       r   save_optimization_resultsz)ReportGenerator.save_optimization_resultsU  s    "113<fmm66<  : :< !&--">">	<
 V]]44< FMM22< V]]44< &--..< +FMM,R,R< %fmm&F&F< V]]44< v}}88<  '(J(J!<" )&--*N*N#<$ +FMM,R,R%<( !&--">">)<* %fmm&F&F+<, !&--">">-<. %fmm&F&F/<2 #FMM$B$B3<4 '(J(J5<6 '(J(J7<8 "6==#@#@9<: #FMM$B$B;<> ,V]]-T-T?<@ ()L)LA<B ()L)LC<F -fmm.V.VG<H /0Z0ZI<L %fmm&F&FM<N *6==+P+PO<P &v}}'H'HQ<R *6==+P+PS<V +FMM,R,RW<Z ()L)L[<\ 170Z0Z28--2^2^060Z0Z'-}}'H'H*0--*N*N%+]]%D%D)/)L)L.4mm.V.V+1==+P+P'-}}'H'H,2MM,R,R,2MM,R,R'-}}'H'Hw<| !' 3 3"("7"7!'!5!5!&//15"6#3#3Q7!&v';';Q!? %f&9&91 = %f&9&91 =	 #6#7#7#91=UK
Z -sWE 	?IIfa>	? 	QS		? 	?s   >T--T6N)zoptimization_report.json)zoptimized_config.py)z	config.py)backtest)r   r   r   r   r  r   r   r  r'   r  rD  rI  r   r   r   r  r  Q  s    .^ s  4 {} { { {z e eC e eN S. S S Sr   r  )
BTCUSDTETHUSDTBNBUSDTXRPUSDTSOLUSDTADAUSDTDOGEUSDTAVAXUSDTDOTUSDTLINKUSDT)POLUSDTATOMUSDTLTCUSDTETCUSDTXLMUSDTNEARUSDTAPTUSDTARBUSDTOPUSDTINJUSDTUNIUSDTAAVEUSDTFILUSDTTIAUSDTICPUSDT)"SUIUSDTSEIUSDTFTMUSDTALGOUSDTEGLDUSDTMKRUSDTGRTUSDTRUNEUSDTLDOUSDTCRVUSDTSANDUSDTMANAUSDTAXSUSDTGALAUSDTAPEUSDTENJUSDTFLOWUSDTCHZUSDTIMXUSDTKAVAUSDTROSEUSDTZILUSDTQNTUSDTHBARUSDTVETUSDTXTZUSDTEOSUSDT	THETAUSDTIOTAUSDTSHIBUSDTPEPEUSDT	FLOKIUSDTBONKUSDTWIFUSDTc                  $  K   t        d       d} d}d}d}d}t        j                  dd }d	}|t        |      k  r||   d
k(  r|dz   t        |      k  r||dz      } |dz  }n||   dk(  r|dz   t        |      k  r||dz      }|dz  }nl||   dk(  r(|dz   t        |      k  rt	        ||dz            }|dz  }n<||   dk(  r|dz   t        |      k  r||dz      }|dz  }n||   dk(  rd}|dz  }n|dz  }|t        |      k  rt        d| j                                 t        d|        |rt        d       t        j                  j                          |dk(  rt        }n|dk(  rt        }n|dk(  rt        }nd|v r|j                  d      D cg c]n  }|j                         j                         j                  d      s!|j                         j                         dz   n|j                         j                         p }}nt        }t        dt        |       d       t        d|        t        j                  j                          t        d       t        j                         }	d}
|	r|	j!                  d      rt#        |	d   j%                               }|D cg c]	  }||v s| }}t        dt        |       dt        |       d       t        |      t        |      d z  k\  rd}
t        d!       nt        d"       nt        d#       t        d$| d%       t        j                  j                          t        |      d&k  r<t        d'd(j'                  |D cg c]  }|j)                  dd)       c}              nKt        d*t        |       d+d(j'                  |dd, D cg c]  }|j)                  dd)       c}       d-       t        j                  j                          t+        j*                         }t        j-                  |||.       d{   }t+        j*                         |z
  }t/        d/ |j1                         D              }t        d|dd0|d1d2       t        j                  j                          |
r|	rt        d3       d	}|D ]  }t        j3                  |      }|sd4|v s ||v s%||   s+|d4   }|j!                  d5d6      ||   d7   d8<   |j!                  d9d	      ||   d7   d:<   |j!                  d;d	      ||   d7   d<<   |j!                  d=i       ||   d7   d><   |dz  } t        d| d?       t        d@       | dAk(  r t        dB       t5               }t7        ||      }|j9                         }t        dC       t        dD|j:                          t        dE|j<                  d1dF       t        dG|j>                  dHdI       t        dJ|j@                  dH       t        dK|jB                  d1dF       t        dL|jD                  dH       tF        jI                  |       tF        jK                  |dA       y| dMk(  rtM        |      }|jO                         }|rtF        jI                  |d	   dN       tF        jQ                  |d	   jR                         tF        jK                  |d	   dM       |r.t        dO       tF        jU                  |d	   jR                         yyy| dPk(  rtW        |dQd&R      }|jY                         }|rt7        ||      }|j9                         }t        dS       t        dD|j:                          t        dE|j<                  d1dF       t        dG|j>                  dHdI       tF        jI                  |dT       tF        jQ                  |       tF        jK                  |dP       |r!t        dO       tF        jU                  |       yyy| dk(  rt        dU       t        dV       t        dW       tM        |      }|jO                         }tW        |dQd,R      }|jY                         }t[        |      }|j]                          t        dU       t        dX       t        dW       t7        ||      }|j9                         } t        dY       t        dZ       t        d[|d	   j_                         dH       t        d\|d	   j>                  dHd]|d	   j<                  d1dF       t        d^       t        d[| j_                         dH       t        d\| j>                  dHd]| j<                  d1dF       | j_                         |d	   j_                         kD  r| }!|}t        d_       n|d	   }!|d	   jR                  }t        d`       tF        jI                  |!da       tF        jQ                  |db       tF        jK                  |!d       |r t        dO       tF        jU                  |       t        dU       t        dc       t        dW       t        dd       t        de       t        df       t        dg       |rt        dh       t        di       yt        dj       t        dk       y| dlk(  rt        dU       t        dm       t        dW       t`        rt        dntb                nt        do       i }"|je                         D ]>  \  }}#t        |#      d6k\  s|#D $cg c]  }$|$dp   	 }%}$tg        jh                  |%      |"|<   @ t        dqt        |"       dr       t        j                  j                          tk        |"      }&tm        |&d6s      }'|'jo                  dQt      }(|(du   }t5        dv|j!                  dwdQ      |j!                  dxdy      |j!                  d9dz      |j!                  d;d{      |j!                  d|d}      |j!                  d~d      |j!                  dd      |j!                  dd      d
      })t7        ||)      }|j9                         }t        d       t        dD|j:                          t        dE|j<                  d1dF       t        dG|j>                  dHdI       t        d|(d   d1d2       t        d|(d    d|(d    d|(d   |(d   z          t        j                  j                          tF        jI                  |d       tF        jQ                  |)d       tF        jK                  |dl       |r!t        dO       tF        jU                  |)       yy| dk(  rt        dU       t        d       t        dW       t`        rt        dntb                nt        d       i }"|je                         D ]>  \  }}#t        |#      d6k\  s|#D $cg c]  }$|$dp   	 }%}$tg        jh                  |%      |"|<   @ t        dt        |"       d       t        j                  j                          t        d       tk        |"      }&tm        |&d6s      }'|'jo                  dQt      }(t        d       tM        |      }|jO                         }t        d       tW        |d}d,R      }|jY                         }t7        ||      }*|*j9                         } t        dU       t        d       t        dW       t5        |(du   j!                  dwdQ      |(du   j!                  dxdy      |(du   j!                  d9dz      |(du   j!                  d;d{      |(du   j!                  d|d}      |(du   j!                  d~d      |(du   j!                  dd      |(du   j!                  dd            }+t7        ||+      },|,j9                         }-t        d|(d   d1d       t        d[|-j_                         dH       t        d\|-j>                  dHd]|-j<                  d1dF       t        d       t        d[|d	   j_                         dH       t        d\|d	   j>                  dHd]|d	   j<                  d1dF       t        d^       t        d[| j_                         dH       t        d\| j>                  dHd]| j<                  d1dF       d|-j_                         |+|-fd|d	   j_                         |d	   jR                  |d	   fd| j_                         || fg}.tq        |.d       }/t        d|/d	    d|/d   dHd       tF        jI                  |/d   d       tF        jQ                  |/d   d       tF        jK                  |/d   d       |r#t        dO       tF        jU                  |/d          t        dU       t        d       t        dW       |rt        d       t        j                  j                          yt        d|         t        d       yc c}w c c}w c c}w c c}w 7 c c}$w c c}$w w)zPoint d'entree principala*  
+======================================================================+
|          AI TRADING OPTIMIZER - v3.0 GPU ACCELERATED                 |
|          Optimisation des strategies de trading par IA               |
+======================================================================+
|  Modes disponibles:                                                  |
|    1. backtest   - Test des parametres actuels                       |
|    2. grid       - Exploration par grille                            |
|    3. genetic    - Optimisation genetique                            |
|    4. pso        - [GPU] Particle Swarm Optimization (rapide!)       |
|    5. gpu_full   - [GPU] Analyse complete PSO + grid + genetic       |
|    6. full       - Analyse complete (grid + genetic + correlation)   |
|                                                                      |
|  Options:                                                            |
|    --symbols top10|top25|all|BTC,ETH,SOL  (defaut: top10)            |
|    --candles 1000-10000                   (defaut: 2000)             |
|    --interval 1h|4h|1d|5m                 (defaut: 1h)               |
|    --apply                                 Applique auto dans config.py |
+======================================================================+
    r  top10i  r  Fr   Nr   z--moderG   z	--symbolsz	--candlesz
--intervalz--applyTz[MODE] Mode selectionne: z[INTERVAL] Intervalle: zO[AUTO-APPLY] Les optimisations seront appliquees automatiquement dans config.pytop25allr  USDTz
[SYMBOLS] z cryptos selectionneesz[DATA] Bougies par crypto: u(   
[CACHE] Vérification du cache local...rL  z   [OK] r  u     cryptos trouvées dans le cacher   u;      [✓] Utilisation des indicateurs précalculés du cacheu<      [!] Cache incomplet, téléchargement Binance nécessairez   [!] Pas de cache disponiblez;
[FETCH] Recuperation des donnees historiques (intervalle: r  rh   z   Symboles: z, r  r  z cryptos (Top: rD   z...))r  r  c              3   2   K   | ]  }t        |        y wrr   r   )r  r  s     r   r  zmain.<locals>.<genexpr><  s     61A6rH  z bougies chargees en r   r  u9   
[CACHE] Enrichissement avec indicateurs précalculés...rj  r
  rX   r  
cached_rsir/   cached_ema_shortr1   cached_ema_longr  	cached_bbz) cryptos enrichies avec indicateurs cachez&   [GPU] Pret pour calculs GPU massifsrJ  z(
[TEST] BACKTEST AVEC PARAMETRES ACTUELSz
[RESULTS] RESULTATS:z   Trades: z   Win Rate: r  z   P&L Total: r  z EURz   Profit Factor: z   Max Drawdown: z   Sharpe Ratio: gridzgrid_best_result.jsonz7
[AUTO-APPLY] Application automatique dans config.py...geneticr   )ro  rp  z
[RESULTS] RESULTATS FINAUX:zgenetic_best_result.jsonzG
======================================================================z&[RUNNING] ANALYSE COMPLETE EN COURS...zF======================================================================z[TROPHY] SYNTHESE FINALEz
[COMPARE] Comparaison:z
   Grid Search (meilleur):z      Score: r  z EUR | Win Rate: z
   Algorithme Genetique:z,
   [WINNER] Vainqueur: Algorithme Genetiquez#
   [WINNER] Vainqueur: Grid Searchzai_optimization_report.jsonzai_optimized_config.pyz![SUCCESS] OPTIMISATION TERMINEE !z
[FILES] Fichiers generes:z2   - ai_optimization_report.json (rapport complet)z4   - ai_optimized_config.py (nouvelle configuration)z+   - optimization_results.json (pour l'API)z+   - config.py (MIS A JOUR AUTOMATIQUEMENT)z>
[APPLIED] Les optimisations ont ete appliquees dans config.pyzI
[TIP] Pour appliquer les optimisations automatiquement, utilisez --applyzD   ou copiez les parametres de ai_optimized_config.py dans config.pypsoz$[PSO] OPTIMISATION PSO GPU-ACCELEREEz[GPU] Utilisation de z0[CPU] Mode CPU (installez cupy-cuda12x pour GPU)r  r  z# cryptos chargees pour optimisation)rt  )r  r  r(   r+   r-   r_   rB  r   r3   r2   r5   r4   r;   r=   r   )
r)   r+   r-   r/   r1   r3   r5   r;   r=   rH   z 
[RESULTS] RESULTATS FINAUX PSO:z   Temps d'optimisation: r  z   Evaluations: r  z x r  r7  zpso_best_result.jsonzpso_optimized_config.pygpu_fullz$[GPU] ANALYSE COMPLETE GPU-ACCELEREEz#[CPU] Mode CPU (GPU non disponible)z[GPU] z cryptos chargeesz
[1/3] Optimisation PSO...z#
[2/3] Grid Search (comparaison)...z
[3/3] Algorithme Genetique...z"[COMPARE] COMPARAISON DES METHODES)r+   r-   r/   r1   r3   r5   r;   r=   z
   PSO GPU (zs):z
   Grid Search:zPSO GPUzGrid SearchGeneticc                     | d   S r{  r   r|  s    r   r~  zmain.<locals>.<lambda>`	  s
    AaD r   r  z
   [TROPHY] Vainqueur: z	 (Score: r  rL   zgpu_full_best_result.jsonzgpu_optimized_config.pyz%[SUCCESS] OPTIMISATION GPU TERMINEE !z=[APPLIED] Les optimisations ont ete appliquees dans config.pyz[ERROR] Mode inconnu: z>   Modes valides: backtest, grid, genetic, pso, gpu_full, full)9r   rT  argvr   r   r4  rU  rV  TOP_10_SYMBOLSTOP_25_SYMBOLSALL_SYMBOLSsplitstripendswithr  r  r   rJ  rK  r  r#   r  r'  r   rN  r  r'   r*  rK  r   r   r   r   r   r   r  r  rI  r  r  r  r   rD  rn  r  r  r  r   r   GPU_NAMEr   r   rS  rD  rr  r  r   )0rE  symbols_presetcandle_limitr  
auto_applyargsr  rL  r  
cache_datause_cache_indicatorscached_symbolsmatchingr  r  
fetch_timetotal_candlesenriched_countr   r  rj  r   rx  r%  	optimizerr]  r  grid_optimizergrid_resultsgenetic_optimizerbest_geneticanalyzergenetic_resultbest_resultrE  rG  rH  r   rs  pso_optimizer
pso_resultoptimized_paramsgenetic_backtester
pso_paramspso_backtesterpso_final_resultresults_comparer  s0                                                   r   mainr    s~     
  	, DNLHJ88AB<D	A
c$i-7h1q53t9#4A;DFA!W#AD	(9!!a%[NFA!W#AD	(9tAE{+LFA!W$QT):AE{HFA!W	!JFAFA# c$i-& 
%djjl^
45	#H:
./_aJJ   	7	" 	5	 		 +0057 67WWY__5F5O5OPV5W1779??$v-]^]d]d]f]l]l]nn 7 7 !	Js7|n$:
;<	'~
67JJ 
57--/J jnnY/j388:;&>!!~*=A>>XqW6VWXx=CL3..#' OQPR.0 
H
RV
WXJJ
7|rdii(P162)>(PQRSTCL>[bcfdf[g;hVWAIIfb<Q;h1i0jjnopJJ J33GhVb3ccDz)J666M	H]1%%::c:J!
LMJJ 
JL 	(F 66v>F,&0T>d6l!'!5J5?^^E25NDL$\2;E>>+WX;YDL$%78:D..UV:WDL$%674>NN;PR4SDL$[1"a'N	( 	((QRS	24z9:f-
!&(F//012fooc2!45v//4D9:"6#7#7"<=>!&"5"5c!:!<=!&"5"5c!:;<,,V411&*E	'-	##%00=TU2271:3D3DE55gaj&I PQ//
0A0AB   
	$T22N	&&(#D+6J^^%F13K 3 3456M&//#!6a89N6#3#3C"8=>009ST22;?55fiH PQ//<  & 
o67h -T2%--/ -T2SUV(//1 '|4 	o()h  l3
#)(),.l1o;;=cBCDLO55c::KLYZOLdLdehKiijkl*,n::<SABCN44S99J>KbKbcfJgghij '')LO,I,I,KK(K&KAB&q/K&q/00K89 	,,[:WX..{<TU11+vF LM++K8o12h+,BCDE;<?@ST^_XY	o45h)(45DE #zz| 	7OFG7|r!.56!G*66&(hhv&6F#	7
 	s;'((KLM

 '{3.~2N #+++<
 / )$<&??+;R@!ook15 __Z4!ook26??8S1!ook37#s;
  &67
!13F//012fooc2!45v//4D9:)*^*DS)IKL K!8 9Z=U<VVYZdepZqt~  @L  uM  [M  ZN  O  	P

,,V5KL../?AZ[11&%@ LM++,<=  
	o45h)(4578 #zz| 	7OFG7|r!.56!G*66&(hhv&6F#	7
 	s;'((9:;

 	+,&{3.~2N"+++<
 	45,T2%--/ 	/0,T2SUV(//1'l;+//1 	o23h"#M266~rJ%m4889I2N /33KC.22:rB /33KDm,003? /33KE"=155mSI	

 $D*5)--/z.9#>cBC.<<>sCDE,66s;;LM]MfMfgjLkklmn!#l1o;;=cBCDLO55c::KLYZOLdLdehKiijkl*,n::<SABCN44S99J>KbKbcfJgghij (668*FVWLO99;\!_=S=SUabcUde446nU
 _.9)&)IfQi_ANO,,VAY8ST..vay:ST11&)ZH LM++F1I6o56hQR

 	&tf-.NOE7  ? )Q;h
 dR 7B 7s   DAIBAIA3AH"B!AI(	AH'2AH'6B5AI+AH,2AI6AH1AAI*AH6+BAIAIAIAIYAI&AI*AH96J4AI+AI/AH>;P<AIH9
AI__main__)Rr   r  rT  r  r  r   r  r  numpyr   r   r   collectionsr   dataclassesr   r   typingr   r	   r
   r   warningsfilterwarningsr   r  r  cupyr   cudaruntimegetDeviceCountgetDevicePropertiespropsr   bytesdecoder   r   ImportErrorr   r   r   r    platformioTextIOWrapperrU  bufferr  dirnameabspath__file__
SCRIPT_DIRchdirr'   r   r   r   r  rD  rr  crypto_data_fetcherr  r  CACHE_AVAILABLEr  r  r  r  r  r*  rn  r  r  r  r  r  r  r  r   rK  r   r   r   <module>r     s=  . 
 
       (  ) . .     ! 4	ww%%'!+33A6-7fu-M5='')SVW\]cWdSe'z23#E*:$;g$Ec#J#NO	
||w%R%%cjj&7&7'R[\

 WW__RWW__X67
   N' N' N'b 	 	 	   H/= /=dm1 m1`X XvX3 X3@OBO GGLL^4	WW\\)%78
 ggll:/@A Y Y@	j: j:bk  k d4 4vCA CATX X@L   #     (ePP zGKK I  R	
PQ 4	.qc
2334(	\  OO	
MNOs>   "BJ/ AK "
K$ /K?KKKK!$K76K7