
    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mZ ddlm	Z	m
Z
mZmZ ddlmZ ddlZ ej                   ej"                          ej$                  d      Z	 ddlmZmZ d	Zej4                  j7                  ej4                  j9                  e            Z G d d      Z G d d      Z da!de fdZ"d)de
e#   de fdZ$e%dk(  rddl&Z&d Z' e$       Z(e(jS                  e'        e*d        e*d        e*d        e*d       	 	  ejV                  d       e(jY                         Z-e(j]                         Z/ e*de-d    de-d    d e0e/              e/r, e*d        e/dd! D ]  Z1 e*d"e1d#    d$e1d%    d&e1d'            ~y# e$ r d
Zej3                  d       Y <w xY w# e2$ r e(jg                           e*d(       Y yw xY w)*u   
Service IA Temps Réel - Analyse en streaming via WebSockets Binance
Utilise le GPU pour des prédictions instantanées à chaque nouvelle bougie
    N)datetime)DictListCallableOptional)deque)levelAI_Realtime)AIPredictorget_ai_predictorTFz"Module AI Predictor non disponiblec                   R    e Zd ZdZddedefdZdefdZde	e
   fdZde	e
   fd	Zy
)RealtimeKlineBufferu/   Buffer de klines en temps réel pour un symbolesymbolmax_sizec                 P    || _         t        |      | _        d | _        d | _        y )Nmaxlen)r   r   klinescurrent_klinelast_update)selfr   r   s      6/home/ubuntu/crypto_trading_bot/ai_realtime_service.py__init__zRealtimeKlineBuffer.__init__%   s%    8,!    
kline_datac           	      >   |d   }|d   t        |d         t        |d         t        |d         t        |d         t        |d         |d   |d	   d
}|d	   r#| j                  j                  |       d| _        n|| _        t	        j
                         | _        y)u-   Met à jour avec une nouvelle kline WebSocketktohlcvTx	open_timeopenhighlowclosevolume
close_time	is_closedN)floatr   appendr   r   nowr   )r   r   r   klines       r   updatezRealtimeKlineBuffer.update+   s    sO 3!C&M!C&M3=1S6]AcFmC&3	
 S6KKu%!%D!&D#<<>r   returnc                     | j                   D cg c]  }|d   	 }}| j                  r|j                  | j                  d          |S c c}w )u   Retourne les prix de clôturer+   r   r   r0   )r   r   pricess      r   
get_priceszRealtimeKlineBuffer.get_pricesB   sG    &*kk2!G*22MM$,,W56 3   A	c                     | j                   D cg c]  }|d   	 }}| j                  r|j                  | j                  d          |S c c}w )zRetourne les volumesr,   r6   )r   r   volumess      r   get_volumeszRealtimeKlineBuffer.get_volumesI   sG    (,411X;44NN4--h78 5r9   N)d   )__name__
__module____qualname____doc__strintr   dictr3   r   r/   r8   r<    r   r   r   r   "   sD    9 s  c  * *.DK T%[ r   r   c                       e Zd ZdZd Zdee   fdZdefdZ	defdZ
defd	Zd
 ZdefdZdefdZd Zd Zd Zd ZdefdZddedee   fdZdee   fdZy)AIRealtimeServiceu?  
    Service d'analyse IA en temps réel via WebSockets Binance
    
    Fonctionnement:
    1. Connexion WebSocket aux streams kline de tous les symboles
    2. À chaque nouvelle bougie fermée → Analyse IA GPU
    3. Mise à jour instantanée des opportunités
    4. Notification callback si signal détecté
    c                 J   t         r
t               nd | _        g | _        i | _        d| _        d | _        d | _        d | _        d | _	        d | _
        d| _        d| _        d| _        d| _        dddd ddd| _        t!        d      | _        t%        j&                         | _        y )	NF5mTg      ?r   )	connectedsymbols_streaminganalyses_per_minutelast_analysissignals_detectedws_messages_received<   r   )AI_AVAILABLEr   	predictorsymbolsbuffers
is_runningws_taskloop_threadon_signal_callbackon_update_callbackintervalanalysis_on_closeanalysis_on_tickmin_analysis_intervalstatsr   _analysis_times	threadingLock_lockr   s    r   r   zAIRealtimeService.__init__\   s    /;)+"$79	 7;6: !% %%(" !"#$! !$%

  %B/ ^^%
r   rS   c                     |D cg c]  }|j                          c}| _        | j                  D ci c]  }|t        |       c}| _        t        j                  dt        |       d       yc c}w c c}w )u#   Définit les symboles à surveilleru   📊 u$    symboles configurés pour streamingN)upperrS   r   rT   loggerinfolen)r   rS   ss      r   set_symbolszAIRealtimeService.set_symbols}   s]    +23a	3;?<<Ha.q11HeCL>)MNO 4Hs
   A0A5callbackc                     || _         y)u6   Callback appelé quand un signal d'achat est détectéN)rY   r   rl   s     r   set_on_signalzAIRealtimeService.set_on_signal   
    "*r   c                     || _         y)u'   Callback appelé à chaque mise à jourN)rZ   rn   s     r   set_on_updatezAIRealtimeService.set_on_update   rp   r   r   c                 x  K   ddl }d}|| j                  dd}	 |j                         4 d{   }|j                  ||      4 d{   }|j                  dk(  r|j                          d{   }| j                  j                  |      }|rp|dd D ]h  }	|j                  j                  |	d   t        |	d	         t        |	d
         t        |	d         t        |	d         t        |	d         |	d   dd       j t        j                  d| dt        |j                         d       ddd      d{    ddd      d{    y7 %7 7 7 # 1 d{  7  sw Y   -xY w7 $# 1 d{  7  sw Y   yxY w# t        $ r%}
t        j                  d| d|
        Y d}
~
yd}
~
ww xY ww)u<   Récupère les klines historiques pour initialiser le bufferr   Nz%https://api.binance.com/api/v3/klinesr=   )r   r[   limit)params                     Tr&   u   ✓ : u    klines chargéeszErreur chargement klines )aiohttpr[   ClientSessiongetstatusjsonrT   r   r0   r/   rg   debugri   	Exceptionwarning)r   r   r   urlru   sessionresponser   bufferr   es              r   _fetch_initial_klinesz'AIRealtimeService._fetch_initial_klines   s    5"L	F,,. ] ]'";;s6;: ] ]h#-'/}}!6!%!1!1&!9!%+CR[ 
# & 4 4121,1!A$K,1!A$K+01;-21Q4[.3AaDk23A$15	6" 	!#
# tF82c&--6H5IIZ%[\!] ]] ] ]]!6] ] ] ]] ] ] ]$  	FNN6vhbDEE	Fs   F:F	 EF	 E4
EE4#E1E2C E2E4=E>E4F	 E2F	 F:F	 E4EE4E/	#E&$E/	+E42F	 4F:E=;FF	 F:F	 		F7F2-F:2F77F:c                   K   | j                   st        j                  d       yt        j                  d       | j                   D cg c]  }| j	                  |       }}t        j                  |ddi d{    t        j                  dt        | j                          d       | j                   D cg c]!  }|j                          d| j                   # }}d	}t        d
t        |      |      D cg c]
  }||||z     }}| j                  r	 ddj                  |d
          }t        j                  d       t        j                  |dd      4 d{   }d| j                  d<   t        | j                         | j                  d<   | j!                          t        j                  dt        | j                          d       | j                  r	 t        j"                  |j%                         d       d{   }	t'        j(                  |	      }
| j                  dxx   dz  cc<   d|
v r| j+                  |
d          d{    | j                  rddd      d{    | j                  r2t        j                  d       t        j4                  d       d{    | j                  ryyc c}w 7 Pc c}w c c}w 7 u7 7 # t
        j,                  $ r Y  t        j.                  $ r t        j                  d       Y w xY w7 # 1 d{  7  sw Y   xY w# t0        $ r1}t        j3                  d|        d| j                  d<   Y d}~d}~ww xY w7 ĭw)u&   Gère la connexion WebSocket combinéeu   Aucun symbole configuréNu+   📥 Chargement des données historiques...return_exceptionsTu(   ✅ Données historiques chargées pour z	 symbolesz@kline_rv   r   z-wss://stream.binance.com:9443/stream?streams=/u#   🔌 Connexion WebSocket Binance...   
   )ping_intervalping_timeoutrJ   rK   u   ✅ WebSocket connecté - z symboles en streaming   timeoutrO   rx   datau-   ⚠️ WebSocket déconnecté, reconnexion...zErreur WebSocket: Fu#   🔄 Reconnexion dans 5 secondes...r|   )rS   rg   r   rh   r   asynciogatherri   lowerr[   rangerU   join
websocketsconnectr_   _save_statuswait_forrecvr   loads_process_kline_messageTimeoutErrorConnectionClosedr   errorsleep)r   rj   tasksstreams
chunk_sizeistream_chunksws_urlwsmsgr   r   s               r   _ws_handlerzAIRealtimeService._ws_handler   s    ||NN56 	AB8<E1++A.EEnne<t<<<>s4<<?P>QQZ[\ BFNAaggi[7NN 
:?3w<Q[:\]Q1Z<0]]oo0HR_`aRbIcHdeAC%--fBUWX " "\^.2DJJ{+69$,,6GDJJ23%%'KK"<S=N<OOe fg//"(/(8(8B(O"OC#'::c?D JJ'=>!C>%~&*&A&A$v,&O O O //" "6 ABmmA&&&I oo F< O ^" #P !P&33 %$):: ""NN+Z[!"'" " " ".  01!56*/

;'0 's  AM7K M7:K
;>M79&KM7;K
M7AL8 "K#L8 &A:L#!(K	K
AKKKL#'L8 2L!3L8 79M70M51M7M7
M7L8 KKL1L#4'LL#LL#!L8 #L5)L,*L51L8 8	M2'M-(M7-M22M7r   c                   K   |j                  d      dk7  ry|d   }|d   }| j                  j                  |      }|sy|j                  |       d}|d   r| j                  rd}nr| j                  rft        j
                         }t        | d	      si | _        | j                  j                  |d
      }||z
  | j                  k\  rd}|| j                  |<   |r| j                  |       d{    yy7 w)z!Traite un message kline WebSocketr   r2   Nrj   r   Fr%   T_last_tick_analysisr   )
r   rT   r3   r\   r]   timehasattrr   r^   _analyze_symbol)r   r   r   r2   r   should_analyzer1   lasts           r   r   z(AIRealtimeService._process_kline_message   s     88C=G#cS	!!&) 	d :$00!N""))+C4!67+-(++//:DTzT777!%36((0&&v... .s   C-C8/C60C8c                 4  K   | j                   sy| j                  j                  |      }|rt        |j	                               dk  ry	 |j	                         }|j                         }| j                   j                  |||      }| j                   j                  ||       | j                  j                  t        j                                t        j                         j                         | j                  d<   t        | j                  D cg c]  }t        j                         |z
  dk  s|! c}      | j                  d<   | j                  r| j                  ||       |j                   dk(  ri| j                  dxx   dz  cc<   t"        j%                  d	| d
|j&                   d|j(                          | j*                  r| j+                  ||       yyyc c}w # t,        $ r%}t"        j/                  d| d|        Y d}~yd}~ww xY ww)zAnalyse un symbole avec l'IAN2   rM   rP   rL   readyrN   rx   u   🎯 SIGNAL: z	 - Score:z	 Pattern:zErreur analyse r~   )rR   rT   r   ri   r8   r<   analyze_symbolupdate_watchlistr`   r0   r   r   r1   	isoformatr_   rZ   r   rg   rh   scorepatternrY   r   r   )r   r   r   r7   r;   itemr   r   s           r   r   z!AIRealtimeService._analyze_symbol   s    ~~!!&)V..01B6	<&&(F((*G >>00IDNN++FD9   ''		4*2,,.*B*B*DDJJ'03@T@T4m1X\XaXaXcfgXgjlXlQ4m0nDJJ,- &&''5 {{g%

-.!3.mF89TZZL	RVR^R^Q_`a**++FD9 + & 5n  	<NN_VHBqc:;;	<sJ   AHCG' G"3G"7B(G' H"G' '	H0HHHHc                    t        j                         | _        t        j                  | j                         	 | j                  j	                  | j                                | j                  j                          y# t        $ r"}t        j                  d|        Y d}~Ad}~ww xY w# | j                  j                          w xY w)u)   Exécute la boucle asyncio dans un threadzErreur loop: N)
r   new_event_looprW   set_event_looprun_until_completer   r   rg   r   r+   )r   r   s     r   	_run_loopzAIRealtimeService._run_loop$  s    **,	tyy)	II(()9)9);< IIOO  	.LL=,--	. IIOOs)   )A> >	B)B$B, $B))B, ,Cc                 .   | j                   ryt        st        j                  d       yd| _         t	        j
                  | j                  d      | _        | j                  j                          | j                          t        j                  d       y)u"   Démarre le service en temps réelNu   ❌ Module IA non disponibleT)targetdaemonu%   🚀 Service IA Temps Réel démarré)rU   rQ   rg   r   ra   Threadr   rX   startr   rh   rd   s    r   r   zAIRealtimeService.start0  sg    ??LL78 ''t~~dK;<r   c                     d| _         d| j                  d<   | j                          | j                  r| j                  j	                  d       t
        j                  d       y)u   Arrête le serviceFrJ   r|   r   u&   ⏹️ Service IA Temps Réel arrêtéN)rU   r_   r   rX   r   rg   rh   rd   s    r   stopzAIRealtimeService.stop?  sL    "'

;<<LLa(<=r   c                     t         j                  j                  t        d      }	 | j                  | j                  rdnd| j
                  j                  dd      | j
                  j                  dd      t        j                         j                         d}t        |d	      5 }t        j                  ||       d
d
d
       y
# 1 sw Y   y
xY w# t        $ r"}t        j                  d|        Y d
}~y
d
}~ww xY w)zASauvegarde le statut dans un fichier pour partage inter-processuszai_realtime_status.jsonrealtime_websocketstoppedrJ   FrK   r   )rU   moderJ   rK   r   wNzErreur sauvegarde statut: )ospathr   
SCRIPT_DIRrU   r_   r   r   r1   r   r(   r   dumpr   rg   r   )r   status_filer   fr   s        r   r   zAIRealtimeService._save_statusH  s    ggll:/HI	="oo04,Y!ZZ^^K?%)ZZ^^4G%K'||~779F k3' %1		&!$% % % 	=NN7s;<<	=s6   B C &C=C CC C 	C=C88C=r4   c                     | j                   d| j                  d| j                  d| j                  r!t	        | j                  j
                        iS diS )zRetourne le statut du servicer   )rU   r   r[   watchlist_countr   )rU   r[   r_   rR   ri   	watchlistrd   s    r   
get_statuszAIRealtimeService.get_statusX  s_     //(
 jj	

 s4>>#;#;<
 	

 UV
 	
r   	min_scorec                     | j                   sg S | j                   j                         }|D cg c]  }|d   |k\  s| c}S c c}w )u$   Retourne les opportunités actuellesr   )rR   get_watchlist)r   r   r   r   s       r   get_opportunitiesz#AIRealtimeService.get_opportunitiesb  s?    ~~INN002	$@a'
i(?@@@s
   AAc                     | j                   sg S | j                   j                         }|D cg c]#  }|d   dk(  s|j                  dd      dk(  s"|% c}S c c}w )u<   Retourne les signaux prêts à acheter (doublement validés)r   r   smart_eligibleFT)rR   r   r   )r   r   r   s      r   get_ready_signalsz#AIRealtimeService.get_ready_signalsj  sV    ~~INN002	 %ja(w(>155IY[`CaeiCijjjs   AAAN)r   )r>   r?   r@   rA   r   r   rB   rk   r   ro   rr   r   r   rD   r   r   r   r   r   r   r   r   rC   r   r   rE   r   r   rG   rG   Q   s    &BP49 P+h ++h +F# F87'r/ /@"<C "<H
=>= 
D 
A3 AT
 Ak4: kr   rG   r4   c                  .    t         
t               a t         S )u2   Retourne l'instance globale du service temps réel)_realtime_servicerG   rE   r   r   get_realtime_servicer   x  s      -/r   rS   c                 n   t               }| t        j                  j                  t        d      }t        j                  j                  |      rt        |d      5 }t        j                  |      }|j                  dg       }t        |j                  di       j                               }t        |j                  di       j                               }t        t        j                  ||z   |z               } ddd       | sg d} |j                  |        |j                          |S # 1 sw Y   2xY w)u-   Démarre le service avec les symboles donnésNzwatchlist.jsonrrS   
auto_addedspy_injected)BTCUSDTETHUSDTBNBUSDTSOLUSDTXRPUSDT)r   r   r   r   r   existsr(   r   loadr   listkeysrD   fromkeysrk   r   )rS   servicewatchlist_filer   r   manualr   spy_injs           r   start_realtime_servicer     s    "$Gj2BC77>>.)nc* Mayy|)R0!$((<"<"A"A"CD
txx;@@BCt}}Vj-@7-JKLM I MMONM Ms   BD++D4__main__c                     t        d|         t        d|j                   d|j                          t        d|j                  dd       y )Nu   🎯 SIGNAL DÉTECTÉ: z
   Score: z, Pattern: u      Gain prédit: z.2f%)printr   r   predicted_gain)r   r   s     r   	on_signalr     sJ    'x01
4::,k$,,@A!$"5"5c!:!<=r   z3
==================================================u'   🧠 Service IA Temps Réel - Test Modez2==================================================u!   Appuyez sur Ctrl+C pour arrêter
r   u   
📊 Status: Connected=rJ   z, Analyses/min=rL   z
, Signaux=u   🎯 Signaux actifs:r|   u      • r   z: Score=r   z
, Pattern=r   u   
✅ Service arrêté)N)4rA   r   ra   r   loggingr   r   r   typingr   r   r   r   collectionsr   r   basicConfigINFO	getLoggerrg   ai_predictorr   r   rQ   ImportErrorr   r   dirnameabspath__file__r   r   rG   r   r   rB   r   r>   signalr   r   ro   r   r   r   r   r   signalsri   rj   KeyboardInterruptr   rE   r   r   <module>r     s  
        1 1  	   ',, '			=	)9:L WW__RWW__X67
, ,^ak akJ	  / DI 9J . z>
 %&G)$	-	
34	&M	
./(DJJrN'')F//1G-f[.A-B C""()>"?!@ A \N, - ,- ! _AGAhK=7JqQZ|n]^_ % {  9L
NN789x  (&'(s%   '
F A?F1 F.-F.1GG