
    'iث                         d Z ddlZddlZddlZddlmZmZmZm	Z	 ddl
m
Z
  ej                  e      ZdZdZ	 ddlZddlmZ  ej&                  d       	  ej(                  d       d	Zej,                  j/                         r1d
Zej1                  dej,                  j3                  d       d       nej1                  d        G d d      ZdaddefdZy# e$ r Y yw xY w# e$ r ej7                  d       Y 7w xY w)u+  
═══════════════════════════════════════════════════════════════════════════════
 AI SELL PREDICTOR - Prédiction IA pour les décisions de vente
═══════════════════════════════════════════════════════════════════════════════
 
 Ce module utilise le modèle LSTM + analyse technique avancée pour prédire
 le meilleur moment de vendre une position ouverte.
 
 PRIORITÉ IA sur les règles fixes:
 - L'IA peut déclencher une vente AVANT que le SL fixe soit touché
 - L'IA peut empêcher une vente prématurée si elle prédit une continuation
 - L'IA ajuste dynamiquement les niveaux SL/TP selon les conditions du marché
 
 SÉCURITÉS MAINTENUES:
 - Stop-loss d'urgence -5% → TOUJOURS prioritaire (safety net absolu)
 - L'IA ne peut pas empêcher un SL d'urgence
═══════════════════════════════════════════════════════════════════════════════
    N)DictListOptionalTuple)datetimeFcpu      Tcudau*   🔥 AISellPredictor: GPU CUDA détecté ()u2   ⚠️ AISellPredictor: Mode CPU (pas de GPU CUDA)uM   ⚠️ PyTorch non disponible - AISellPredictor en mode rule-based uniquementc                      e Zd ZdZd#dZd Z	 d#dedee   de	dee   d	e	f
d
Z
dee   d	e	fdZdee   d	e	fdZdee   d	e	fdZdee   d	e	fdZd#dee   dee   d	e	fdZde	deded	e	fdZde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e   de	dedede	de	ded	eee   ee   f   fdZdeded	e	fdZed        Zed$d       Zdeded efd!Zd	e	fd"Zy)%AISellPredictoru  
    IA prédictive pour les décisions de vente.
    
    Combine:
    1. Modèle LSTM (prédiction directionnelle court terme)
    2. Analyse technique multi-indicateurs avancée
    3. Contexte de position (P&L, durée, drawdown depuis peak)
    4. Détection de patterns de retournement
    
    Produit une recommandation: HOLD / SELL / STRONG_SELL / EXTEND_TP
    avec un score de confiance et des niveaux SL/TP dynamiques.
    Nc                 (   || _         d| _        | j                          i | _        d| _        g | _        d| _        d| _        ddddddd| _        d| _	        d| _
        d| _        t        j                  d	| j                  rd
nd dt         d       y)ui   
        Args:
            ai_predictor: Instance de AIPredictor (pour accéder au modèle LSTM)
        N   r   
         )lstm_directionmomentum_reversalrsi_divergencevolume_exhaustiondrawdown_from_peakpattern_detectionFu&   ✅ AISellPredictor initialisé (LSTM=OuiNonz	, Device=r   )ai_predictormodel_load_model_prediction_cache
_cache_ttl_prediction_history_correct_predictions_total_predictionsweights_lstm_up_count_lstm_total_count_lstm_is_biasedloggerinfoDEVICE)selfr   s     ai_sell_predictor.py__init__zAISellPredictor.__init__D   s    
 )
 "$ $& $%!"#
 !!# !#"$!#
  !"$<djjUV[<\\eflemmnop    c                     | j                   r]t        | j                   d      rG| j                   j                  r1| j                   j                  | _        t        j	                  d       yt        j	                  d       y)u5   Charge le modèle LSTM depuis le AIPredictor existantr   u<   🧠 AISellPredictor: Modèle LSTM partagé avec AIPredictoruI   ℹ️ AISellPredictor: Pas de modèle LSTM - mode analyse technique pureN)r   hasattrr   r(   r)   )r+   s    r,   r   zAISellPredictor._load_modelh   sU    ):):G!DIZIZI`I`**00DJKKVWKKcdr.   symbolpricespositionvolumesreturnc                    | dt        |       }t        j                         }t        | d      sd| _        || j                  z
  dkD  r|| _        | j                  j                         D 	cg c]   \  }\  }}	||z
  | j                  dz  kD  s|" }
}}}	|
D ]  }| j                  |=  t        | j                        dkD  r| j                  dd | _        || j                  v r&| j                  |   \  }}||z
  | j                  k  r|S t        |      d	k  r| j                  |d
      S |d   }|j                  d|      }|dkD  r||z  dz
  dz  nd}| j                  |||      }i }g }| j                  |      }||d<   | xj                  dz  c_        |j                  d      dk(  r| xj                  dz  c_        | j                  dk\  r#| j                  | j                  z  }|dkD  | _        | j                  r1| j                  |      }|d   |d   k7  r|d   |d   |d   |d   ddd}| j!                  |      }||d<   | j#                  |      }||d<   | j%                  ||      }||d<   | j'                  |||      }||d<   | j)                  |      }||d<   d}d}|d   dk(  r5|| j*                  d   |d   z  dz  z  }|j-                  d |d   d!d"       nD|d   dk(  r<|| j*                  d   |d   z  dz  z  }|d   d#kD  r|j-                  d$|d   d!d"       |d%   r4|| j*                  d&   |d'   z  dz  z  }|j-                  d(|d)    d*       n |d+   r|| j*                  d&   |d'   z  dz  z  }|d,   r4|| j*                  d-   |d'   z  dz  z  }|j-                  d.|d   d!d*       |d/   r|d0z  }|j-                  d1|d   d!d*       |d2   r|d3z  }|j-                  d4|d   d!d*       |d5   r,|| j*                  d6   |d'   z  dz  z  }|j-                  d7       |d8   r4|| j*                  d9   |d'   z  dz  z  }|j-                  d:|d;   d<d=       |d>   r3|| j*                  d?   |d'   z  dz  z  }|j-                  d@|dA           n |dB   r|| j*                  d?   |d'   z  dz  z  }|dCk\  r|dDz  }|j-                  dE|d<dF       n
|dGk\  r|dHz  }|dIk  r
|dJk  r|dKz  }|dL   }|dMkD  r)t/        |      dNk  r|d3z  }|j-                  dO|d!dP       t1        dt3        d|            }t1        dt3        d|            }||z
  }| j5                  |      }||dQz   k\  rdR} t1        dSdT|dUz  z         }!no||k\  rdV} t1        dWd	|dXz  z         }!nU||dz   kD  r<|j                  d%      s+dY} ||z
  }"t1        dZd[|"dGz  z         }!|j-                  d\       nd]} t3        dd|z
        }!| j7                  |||||||       \  }#}$|d   }%| t9        |!d      t9        |d      t9        |d      t9        |d      ||%|#|$|dd0 ||||||d^t9        |d_      t9        |dL   d      d`}&||&f| j                  |<   | d]k7  rBt:        j=                  da| db|  dc|d!dd| de|!d!df|% dg|dhdidjj?                  |ddk               |&S c c}	}}w )lu  
        Analyse prédictive complète pour décider de vendre ou garder une position.
        
        Args:
            symbol: Symbole de la crypto (ex: BTCUSDT)
            prices: Liste des prix récents (min 50 valeurs)
            position: Données de la position {entry_price, quantity, stop_loss, take_profit, 
                       timestamp, max_price, max_pnl, ...}
            volumes: Liste des volumes récents (optionnel)
        
        Returns:
            Dict avec:
                action: 'HOLD' | 'SELL' | 'STRONG_SELL' | 'EXTEND_TP'
                confidence: 0-100
                sell_score: 0-100 (urgence de vente)
                predicted_direction: 'up' | 'down' | 'neutral'
                ai_stop_loss: float or None (suggestion SL dynamique)
                ai_take_profit: float or None (suggestion TP dynamique)
                reasons: [str]
                details: Dict (détails des composants de score)
        __last_cache_purger   i,  r   i  iN2   u"   Données insuffisantes (< 50 prix)entry_pricer
   d   lstm	directionupg?
confidencedown_probabilityup_probabilityFT)r>   r@   rA   rB   
model_usedbias_correctedmomentumrsivolumedrawdownpatterndownr   u   LSTM prédit baisse (z.0f%)A   u   LSTM prédit hausse (reversing_downr   strengthzMomentum retourne (detailr   accelerating_upbearish_divergencer   u   Divergence RSI baissière (RSI=rsi_overbought   zRSI en surachat (rsi_oversold   u   RSI effondré (
exhaustionr   u   Volume en épuisementsignificant_drawdownr   zChute drawdown_pct.1fz% depuis le picbearish_patternr   z	Pattern: pattern_namebullish_continuation      @g?zProtection profit +%      ?gffffff?      <   g?time_held_minutesx         ?zPosition stagnante (z min)r   STRONG_SELL_   7   g?SELLZ   gffffff?	EXTEND_TPU   (   u"   IA prédit continuation haussièreHOLD)r=   rE   rF   rH   rI   position_contextr	   actionr@   
sell_score
hold_score	net_score	thresholdpredicted_directionai_stop_lossai_take_profitreasonsdetailscurrent_pnl_pcttime_held_minu   🤖 AI_SELL z: z (score=z
 vs seuil=z, conf=z%, dir=z) | P&L=+.2fz% | z,    ) lentimer0   r8   r   itemsr    r!   _default_holdget_analyze_position_context_lstm_predictr&   r%   r'   _simple_direction_predict_analyze_momentum_reversal_analyze_rsi_divergence_analyze_volume_analyze_drawdown_detect_reversal_patternsr$   appendabsminmax_get_dynamic_threshold_compute_dynamic_levelsroundr(   r)   join)'r+   r1   r2   r3   r4   	cache_keynowktr7   expiredcached_timecached_resultcurrent_pricer;   rz   rn   
componentsrx   lstm_resultup_ratiotech_directionmomentum_result
rsi_resultvolume_resultdrawdown_resultpattern_resultrq   rr   	time_heldrs   sell_thresholdrp   r@   hold_dominanceai_slai_tpru   results'                                          r,   predict_sellzAISellPredictor.predict_sellt   s   2 haF}-	iik t01%&D"'''#-%(D"*.*@*@*F*F*HkkYQACRSGVZVeVehjVjLjqkGk .**1-.4++,s2+/+C+CDE+J(...)-)?)?	)J&K[ 4??2$$ v;%%f.RSSr
ll=-@GRUVMK71<C\]
  99(MSbc
 
 ((0(
6 	!#??;'4/1$!!R'**T-C-CCH#+d?D  !;;FCNk*k+.FF!/!<"0">(67I(J&45E&F"'&* 99&A!0
: 11&9
&
5 ,,VW=,
8 00=/Z!0
: 77? .
9
 

 {#v-$,,'78;|;TTWZZZJNN2;|3LS2QQSTU%-$,,'78;|;TTWZZZJ<(2-!6{<7PQT6UUWXY +,$,,':;oj>YY\___JNN01J0K1MN./$,,':;oj>YY\___J *+$,,'78:j;QQTWWWJNN<Z=Ns<SSTUV&'!OJNN.z%/@.EQGHn%!OJNN_Z->s,C1EF &$,,':;mJ>WWZ]]]JNN24 12$,,';<z?ZZ]```JNNVON$CC#HXY +,$,,':;nZ>XX[^^^JNNY~n'E&FGH23$,,':;nZ>XX[^^^J c!#JNN00EQGH#$J T!j2o#J %%89	s?s?3c9!OJNN1)CFG
 c!Z01
c!Z01
+	 44_E++"FRj3&6!67J.(FRj4&7!78J*r/)/2E2EFV2W !F'*4NRns&:!:;JNN?AFQi0J 33Hm_&
u
 *+6 
A.
A.
A.y!,'#6!#r{#+!+)$4  %_a8"#34G#H!L)
0 .1&My) VKKxr&*S9ITbSc d"3'w/B.C D&t,D72A;1G0HJ s ls   / [[c                    | j                   rt        rt        |      dk  r| j                  |      S 	 t	        j
                  |dd t        j                        }|t	        j                  |      z
  t	        j                  |      dz   z  }t	        j                  dt        j                        }||ddddf<   t        d      D ]  }|dk\  r||   ||dz
     z
  dz  |d|d	f<   |d
k\  r||   ||d
z
     z
  d
z  |d|df<   |dk\  r||   ||dz
     z
  dz  |d|df<   |d	k\  r||   ||d	z
     z
  |d|df<   |dk\  sv||   t	        j                  ||dz
  |       z
  t	        j                  ||dz
  |       dz   z  |d|df<    t        j                  |      j                  t              }| j                   j                          t        j                          5  | j                  |      }t        j"                  |d	      j%                         j'                         d   }ddd       t	        j(                        }	g d|	   }
t+        ||	   dz        }t+        |d   dz        }t+        |d   dz        }|
|t-        |d	      t-        |d	      ddS # 1 sw Y   txY w# t.        $ r3}t0        j3                  d|        | j                  |      cY d}~S d}~ww xY w)u@   Prédiction LSTM directionnelle (réutilise le modèle existant)r9   iN)dtypeg:0yE>)r
   r9   r   r   rS   r
   r   r	   r}      r   )dim)rJ   neutralr?   r<   Tr>   r@   rA   rB   rC   u   ⚠️ LSTM prediction error: )r   TORCH_AVAILABLEr~   r   nparrayfloat32meanstdzerosrangetorchtensortor*   evalno_gradsoftmaxr   numpyargmaxfloatr   	Exceptionr(   warning)r+   r2   
prices_arrprices_normXiX_tensor
predictionprobsdirection_idxr>   r@   
down_scoreup_scorees                  r,   r   zAISellPredictor._lstm_predictt  s    zzCK"4D11&99/	:&,bjjAJ%
(;;z@RUY@YZK BJJ7A$AaAgJ2Y x6"-a.;qs3C"Cq!HAaAgJ7"-a.;qt3D"D!JAaAgJ6"-a.;qs3C"Cq!HAaAgJ6!,Q+ac2B!BAaAgJ7"-a.277;qtA;N3O"OTVTZTZ[fghikgklm[nTorvTv!wAaAgJx ||A))&1HJJOO J!ZZ1
ja8<<>DDFqIJ
 IIe,M1-@Iu]3c9:J uQx#~.JU1X^,H '($)*a$8"'!"4" J J*  	:NN;A3?@11&99	:s?   DJ! <BJ! AJ"A2J! JJ! !	K*(KKKc                 ^   t        |      dk  rddddddS |d   |d   z
  |d   z  d	z  }|d   |d
   z
  |d
   z  d	z  }|d   |d   z
  |d   z  d	z  }| j                  |d      }| j                  |d      }||z
  |z  d	z  }t        ||||fD cg c]
  }|dkD  s	d c}      }	t        ||||fD cg c]
  }|dk  s	d c}      }
|
dk\  rd}t        dd|
dz  z         }n|	dk\  rd}t        dd|	dz  z         }nd}d}|||dk(  r|nd	|z
  dz  |dk(  r|ddS d	|z
  dz  ddS c c}w c c}w )u?   Fallback: prédiction sans LSTM basée sur la tendance récenter   r      !   Fr   r:   r<   	      皙?r
   gr}   rJ   K   rl   r   r?   r	   )r~   _emasumr   )r+   r2   mom3mom5mom10ema9ema21ema_gapx
up_signalsdown_signalsr>   r@   s                r,   r   z)AISellPredictor._simple_direction_predict  s   v;!*"(*bPUW W r
VBZ'6":5;r
VBZ'6":5;fSk)VC[83> yy#		&"%%<5(3. dD%%AMQW!MN
dE7'CP!q4xAPQ1IRlR&7!78J1_IRj2o!56J!IJ #*.76.A
jHX\]G],5,=j	
 	
 EH*DTXYCY	
 	
 NPs   
D%D%2
D*=D*c           	      $   t        |      dk  rdddddS |d   |d   z
  |d   z  dz  }|d   |d	   z
  |d	   z  dz  }|d   |d
   z
  |d
   z  dz  }|d   |d   z
  |d   z  dz  }t        |      dk\  r|d	   |d   z
  |d   z  dz  nd}||z
  }t        |      dk\  r|d
   |d   z
  |d   z  dz  nd}d}	d}
d}d}|dk  r9|dkD  r4d}	t        dt        |      dz  t        |      dz  z         }d|dd|dd}|dk  r0|dkD  r+d}	t        |t        dt        |      dz              }d|dd}|dk  r+d}	t        |t        dt        |      dz              }d|dd}|dkD  r|d kD  r|d kD  rd}
t        d|dz        }|	|
t        d|      ||||d!S )"uA   Détecte les retournements de momentum (signal précoce de vente)r   Fr    )rM   rP   rN   rO   r:   r<   r   r   r      ir   gٿ333333?TP   rl   zmom3=r|   z% (prev_mom5=rK   g333333F   u   décélération=r^   r`   rc   zcrash mom3=g?r   )rM   rP   rN   rO   r   r   acceleration)r~   r   r   r   )r+   r2   mom1r   r   r   	mom3_prevmom_acceleration	mom5_prevrM   rP   rN   rO   s                r,   r   z*AISellPredictor._analyze_momentum_reversal  sH   v;&+ST`bccr
VBZ'6":5;r
VBZ'6":5;r
VBZ'6":5;fSk)VC[83> EHKSTDTVBZ&*,r
:S@Z[	)+ GJ&kUWFWVBZ&+-<sB]^	 $;9s?!N3D	B5E1F1K KLHT$K}Yt4DBGF d"tax!N8SS1A-BR-G%HIH'(8'>a@F $;!N8Sc$i#o%>?H"4+Q/F c!dSjTCZ"O2/#56H -.C*,
 	
r.   c           	         t        |      dk  rddddddS | j                  |      }t        |      dk\  r| j                  |dd       n|}|d	   |d   z
  |d   z  d
z  }||z
  }d}d}|dkD  r%|dk  r d}t        d
t        |      dz  |dz  z         }|dk  r$d}t	        |t        d
t        |      dz              }||dkD  |dk  ||||dS )uN   Détecte divergences RSI (prix monte mais RSI descend = retournement imminent)r   Fr9   r   )rQ   rR   rT   rF   rN   rl   Nr   r:   r<   r   r   TrS   r   ir   r   r   )rQ   rR   rT   rF   rsi_prev
rsi_changerN   )r~   _rsir   r   r   )r+   r2   rF   r   price_change_10r   rQ   rN   s           r,   r   z'AISellPredictor._analyze_rsi_divergence  s   v;*/5$)"!E E ii /2&kR.?499VDS\*S "":s3vc{BSH8^
" S Z"_!%3J! 3o6J JKH !%8Sc*o.A%BCH #5!Bh"H $ 
 	
r.   c                 N   |rt        |      dk  rdddS t        j                  |dd       }t        j                  |dd       }|dkD  r||z
  |z  dz  nd}t        |      d	k\  r|d
   |d   kD  nd}|dk  }|xr |}|rt        dt	        |            nd}	||	t        |d      dS )uK   Analyse l'épuisement de volume (volume décroissant en hausse = faiblesse)r   Fr   )rV   rN   r   Nr   r<   rS   r:   r   ir   r
   )rV   rN   vol_change_pct)r~   r   r   r   r   r   )
r+   r2   r4   
recent_volprev_vol
vol_changeprice_upvol_decliningrV   rN   s
             r,   r   zAISellPredictor._analyze_volume1  s    #g,+"'Q77WWWRS\*
7773r?+AIAj8+x7#=ST
 /2&kQ.>6":r
*E"S(/-
/93r3z?+q % #J2
 	
r.   r   rz   c           	         |j                  d|      }|j                  d|      }|j                  d|      }|dkD  r||z  dz
  dz  nd}||kD  r||z
  nd}d}	d}
|dkD  r||d	z  kD  rd
}	t        d||z  dz        }
|dk  r$d
}	t        |
t        dt        |      dz              }
|dk  r|d	kD  rt        |
d      }
|	t	        |d      t	        |d      t	        |d      |
dS )zBAnalyse la chute depuis le pic (drawdown = perte de profit acquis)	max_pricemax_pnlr;   r   r
   r<   F      ?rd   Tg      rl   g       rk   r	   )rW   rX   profit_lost_pctr   rN   )r   r   r   r   r   )r+   r3   r   rz   r   r   r;   r   profit_lostsignificantrN   s              r,   r   z!AISellPredictor._analyze_drawdownH  s   LLm<	,,y/:ll=-@HQTU}y8A=D[\3:_3Lg/RS S=[7S=8K3g 5 ;<H $K8Sc2D.E.J%KLH $38R(H %0!"4a8$[!4Wa( 
 	
r.   c                    t        |      dk  rdddddS t        j                  |dd       }d}d}d}d}g }t        dt        |      dz
        D ]T  }||   ||d	z
     kD  s||   ||dz
     kD  s!||   ||d	z      kD  s0||   ||dz      kD  s?|j	                  |||   f       V t        |      dk\  r=|d
d }	|	d   d	   |	d	   d	   }}
t        |
|z
        |
z  dz  dk  r|d   |dz  k  rd}d}d}t        |      dk\  rJ|d
   |d   z
  }|d   |d
   z
  }|dkD  r/|dk  r*t        |      t        |      dz  kD  rd}d}t        |d      }t        |      dk\  rP|d   |d   z
  }t        |d
   |d   z
        }|d   |d
   z
  }|dkD  r!||dz  k  r|| dz  k  rd}d}t        |d      }| j                  |d      }| j                  |d      }| j                  |dd d      }| j                  |dd d      }||kD  r||k  rd}d}t        |d      }||z
  |z  dz  }|dkD  r||z
  |z  dz  nd}t        |      d k\  r|d   |d!   z
  |d!   z  dz  nd}|d"kD  r%||kD  r |d"kD  rd}|sd#}t        d|d$z  |dz  z         }||xr | ||dS )%u0   Détecte les patterns techniques de retournementr   Fr   r   )rZ   r\   r[   rN   iNr	   r
   r   r<   rd   r:   ףp=
?Tz
Double Topr   r}   r   r_   zBearish Engulfingra   r   r   zEvening Starr   r   r   zDeath Cross EMArL   rS   r   r   zBullish Continuationr9   )	r~   r   r   r   r   r   r   r   r   )r+   r2   r   bearishbullishr[   rN   highsr   last_twopeak1peak2	prev_body	curr_bodybody1body2body3r   r   	ema9_prev
ema21_prevr   ema_gap_prevr   s                           r,   r   z)AISellPredictor._detect_reversal_patternsj  sX   v;',e$&A7 7 XXfSTl+
 q#j/A-. 	1A!}z!A#.:a=:aPQc?3R!}z!A#.:a=:aPQc?3RaA/0	1
 u:?RSzH#A;q>8A;q>5E55=!E)C/#5b>EEM1"G#/L!H z?a"2B7I"2B7I1}Q3y>C	NUXDX3X2x, z?arNZ^3E
2B78ErNZ^3EqyUUS[0UeVc\5I-x, yy#		&"%IIfSbk1-	YYvcr{B/
 z!dUlG,L8R(H %<5(3.FPSTn	J.*<sBZ[?B6{a?Or
VBZ'6":5;UVS=W|3s
G5r7R<$)#;<  '$+$;G( 	
 	
r.   c                 l   |j                  dd      }d}|r>	 t        j                  |      }t        j                         |j	                         z
  dz  }|j                  d|      }|j                  d|      }|j                  d|      }	|||||kD  r||z
  nd|	dkD  r||	z  dz
  d	z  d
S dd
S #  Y ^xY w)u;   Analyse le contexte de la position (durée, drawdown, etc.)	timestampr   r   ra   r   r   r;   r
   r<   )rb   rz   max_pnl_pctdrawdown_from_peak_pctprice_vs_entry)r   r   fromisoformatr   r  )
r+   r3   r   rz   timestamp_strrb   entry_dtr   r   r;   s
             r,   r   z)AISellPredictor._analyze_position_context  s     !["5#11-@%)YY[83E3E3G%G2$M! LLm<	,,y/:ll=-@ "3."CJ_C\g&?bcITWX}{:Q>#E
 	

 _`
 	
s   =B/ /B3pnl_pctc                 X    |dk\  ry|dk\  ry|dk\  ry|dk\  ry|d	k\  ry
|dk\  ry|dk\  ry
y)u'  
        Seuil dynamique de vente selon le P&L.
        Plus on est en profit, plus le seuil est BAS (on protège les gains).
        En perte, seuil moyen (le SL gère, mais l'IA peut aider).
        🔧 FIX 16/03: Seuils relevés — trop de sorties prématurées en marché haussier
        g      @#   r]   *          @r9   r   rg   rd   ra   r   rL   r`    )r+   r  s     r,   r   z&AISellPredictor._get_dynamic_threshold  sM     c>^^^^\_r.   r   r   rp   c                    |j                  d|      }|j                  d|dz        }	|j                  d|dz        }
d}d}|j                  d      r7|j                  dd	      d
kD  r"|dkD  r|dz  }n|dkD  r|dz  }n|dz  }||	kD  r|}|j                  d      dk(  r0|j                  dd	      dkD  r|dz  }|rt        ||      }n||	kD  r|}|dk\  r|dz  }|rt        ||      }n(||	kD  r#|}n |dk\  r|dz  }|rt        ||      }n||	kD  r|}|dv r |d	kD  r|dz  }|rt        ||      }n||	kD  r|}|dk(  r|dz  }||
kD  r|}||fS )u   
        Calcule des niveaux SL/TP dynamiques suggérés par l'IA.
        
        Returns: (ai_stop_loss, ai_take_profit)
        r;   	stop_lossg333333?take_profitgffffff?NrM   rN   r   rl   r   gX9v?r   gQ?g\(\?r>   rJ   r@   rg   r   gGz?rh   re   r  rj   )r   r   )r+   r2   r3   r   rz   r   r   rp   r;   
current_sl
current_tpr   r   
protect_sl
tighter_sltight_slaggressive_slextended_tps                     r,   r   z'AISellPredictor._compute_dynamic_levels  s    ll=-@\\+{U/BC
\\-u1DE

 /0_5H5HUV5WZ\5\$*U2
 3&*U2
*T1
J&" ??;'61koolTU6VY[6[&.JE:.j(" c!$t+HE8,J& #$u,HE8,J&  ,,11D)E1ME=1+% [ '%/KZ'#e|r.   reasonc                 $    ddddddddd|gi dddS )u   Recommandation HOLD par défautrm   r9   r   rg   r   Nro   r!  )r+   r1   r-  s      r,   r   zAISellPredictor._default_hold7  s7     #, "x 
 	
r.   c                     t        |       |k  r	| r| d   S dS t        j                  |       }d|dz   z  }|d   }|dd D ]  }||z
  |z  |z   } t        |      S )z
Calcul EMAr:   r   r	   r
   N)r~   r   r   r   )r2   periodr   
multiplieremaps         r,   r   zAISellPredictor._emaM  sx     v;!'6":.Q.XXf%
&1*%
mAB 	/As7j(3.C	/Szr.   c                    t        |       |dz   k  ryt        j                  |       }t        j                  |      }t        j                  |d      }t        j
                  t        j                  |d            }t        j                  || d       }t        j                  || d       }|dk(  ry||z  }ddd|z   z  z
  S )z
Calcul RSIr
   r9   r   Nr<   )r~   r   r   diffmaximumr   minimumr   )	r2   r0  r   deltasgainslossesavg_gainavg_lossrss	            r,   r   zAISellPredictor._rsiY  s     v;!#XXf%
$

61%

61-.775&?+7766'(+,q= cQVn%%r.   prediction_actionactual_pnl_changec           	         | xj                   dz  c_         |dv r|dk  r| xj                  dz  c_        n|dv r|dkD  r| xj                  dz  c_        | j                   dkD  r| j                  | j                   z  dz  nd}| j                   dz  dk(  r5t        j                  d|dd	| j                   d
| j                    d       yy)u   
        Enregistre le résultat réel pour auto-évaluer les prédictions.
        Appelé quand une position est effectivement fermée.
        r
   r%  r   )rm   rj   r<   r   u!   📊 AI Sell Predictor accuracy: rY   z% (/r   N)r#   r"   r(   r)   )r+   r1   r>  r?  accuracys        r,   record_outcomezAISellPredictor.record_outcomeo  s     	1$  77<MPQ<Q%%*%"77<MPQ<Q%%*% --1 --0G0GG#M78 	 ""R'1,KK;HS> J445Qt7N7N6OqR S -r.   c                     | j                   dkD  r| j                  | j                   z  dz  nd}| j                   | j                  t        |d      | j                  dut        dS )z(Retourne les statistiques de performancer   r<   r
   N)total_predictionscorrect_predictionsaccuracy_pctlstm_availabledevice)r#   r"   r   r   r*   )r+   rB  s     r,   	get_statszAISellPredictor.get_stats  sl     --1 --0G0GG#M78 	 "&!8!8#'#<#<!(A."jj4
 	
r.   N)   )__name__
__module____qualname____doc__r-   r   strr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   rC  rJ  r!  r.   r,   r   r   6   s!   "qHe =Az3 zU z#z.25kzEIz@6:DK 6:D 6:p#
U #
 #
J8
e 8
 8
t$
d5k $
d $
L
d5k 
DK 
SW 
. 
$  
u  
W\  
ae  
DQ
U Q
 Q
n
$ 
u 
49
>B
2e  0Cd5k CT C05CHMC.2CEIC *-C 27xQV7W1XCJ
C 
 
 
, 	 	 & &*SS SS S*/S,

4 

r.   r   r5   c                 0    t         t        |       a t         S )z0Retourne l'instance singleton du AISellPredictor)_sell_predictor_instancer   )r   s    r,   get_sell_predictorrU    s      '#2<#@ ##r.   rK  )rP  r   loggingr   r   typingr   r   r   r   r   	getLoggerrM  r(   r   r*   r   torch.nnnnset_num_threadsset_num_interop_threadsRuntimeErrorr   is_availabler)   get_device_nameImportErrorr   r   rT  rU  r!  r.   r,   <module>ra     s  &    . . 			8	$ 	dE!%%%a( Ozz @A[A[\]A^@__`abHI
Y
 Y
@   $_ $]    d
NNbcds6   C$ C 'AC$ C!C$  C!!C$ $C=<C=