
    ݮiH              	       "   % S SK JrJrJrJrJr  S SKJr  S SKJ	r	  S SK
Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKJrJr  S SKJr  S SKJr  S S	KJr  \R8                  R;                  S
S5      r\R8                  R;                  SS5      r\R8                  R;                  SS5      RA                  5       r!\" \\5      r"\!(       a  \" \!S9OSr#\" 5       r$\RJ                  \RL                  \RN                  \RP                  \RR                  \RT                  \RV                  \RX                  S.r-\." \-R_                  5       5      r0Sr1Sr2\" S5      r3\" S5      r4\$Rk                  S\	" SS9SS9   " S S5      r6\6" 5       r7SSSSSS.r8/ S Qr9S!S"S#S$.r:S%r;Sq<\=\>\4   S-  \?S&'   S'\>S(\>4S) jr@S*\=\>\4   S(\>4S+ jrAS,\=4S- jrBS. rCS/ rDS,\=4S0 jrE\D" 5       q<S1 rFS2\>4S3 jrGS4 rHS5 rIS6 rJ\$R                  S75      S8 5       rL\$R;                  S9\S:9S; 5       rM\$R;                  S<5      S= 5       rN\$R;                  S>5      S? 5       rO\$R;                  S@5      SA 5       rP\$R                  SB5      SC\4SD j5       rR\$R                  SE5      SF\4SG j5       rTg)H    )FastAPI	WebSocketWebSocketDisconnectRequestHTTPException)HTMLResponse)StaticFiles)ClientN)datetimetimezone)Path)Any)OpenAIbinance_api binance_secretOPENAI_API_KEY)api_key)1m3m5m15m1h4h1d1w  d   zdata/ai_analysis_history.jsonlzdata/last_analysis.jsonz/staticstatic)	directory)namec                   V    \ rS rSrS rS\4S jrS\4S jrS\S\4S jr	S\4S jr
S	rg
)ConnectionManager.   c                     / U l         g Nactive_connections)selfs    0/var/www/html/BTCUSD/btcusdt_trading_app/main.py__init__ConnectionManager.__init__/   s
    35    	websocketc                 v   #    UR                  5       I S h  vN   U R                  R                  U5        g  N 7fr&   )acceptr(   appendr)   r.   s     r*   connectConnectionManager.connect2   s0        &&y1 	!s   97!9c                 Z    XR                   ;   a  U R                   R                  U5        g g r&   )r(   remover2   s     r*   
disconnectConnectionManager.disconnect6   s'    ///##**95 0r-   messagec                 B   #    UR                  U5      I S h  vN   g  N7fr&   )	send_text)r)   r9   r.   s      r*   send_personal_message'ConnectionManager.send_personal_message:   s     !!'***s   c                 h   #    U R                    H  nUR                  U5      I S h  vN   M     g  N	7fr&   )r(   r;   )r)   r9   
connections      r*   	broadcastConnectionManager.broadcast=   s,     11J&&w/// 2/s   $20
2r'   N)__name__
__module____qualname____firstlineno__r+   r   r3   r7   strr<   r@   __static_attributes__ r-   r*   r#   r#   .   s>    62y 26I 6+3 +9 +0s 0r-   r#   zEMA 20/50/200 (Trendrichtung)zRSI 14 (Momentum)z"MACD 12/26/9 (Signal & Histogramm)zVWAP (durchschnittlicher Preis)z#Volumen, Quote-Volumen & Taker Flow)emarsimacdvwapvolume)rI   rJ   rK   zGPT-4ozGPT-4o MinizGPT-4.1 Mini)gpt-4ozgpt-4o-minizgpt-4.1-minirN   last_analysis_cachetextreturnc                 `   [        U [        5      (       d  gU R                  [        R                  SSS5      5      n/ nUR	                  5        HL  nUR                  5       nUR                  S5      R                  5       nU(       d  M;  UR                  U5        MN     SR                  U5      $ )Nr   z*#u   -• 

)	
isinstancerF   	translate	maketrans
splitlinesstriplstripr1   join)rP   cleanedlinesraw_linelines        r*   sanitize_analysis_textr_   U   s    dC  nnS]]2r489GE&&(~~{{7#))+4LL	 )
 ;;ur-   sectionsc                    [        U [        5      (       d  g/ nU R                  S5      n[        U[        5      (       a  UR                  S5      =(       d    UR                  S5      nUR                  S5      =(       d    UR                  S5      n/ nU(       a  UR                  SU 35        U(       a  UR                  SU 35        U(       a   UR                  S	R	                  U5      5        O)[        U[
        5      (       a  UR                  S
U 35        U R                  S5      n[        U[        5      (       Ga  / nU H  n[        U[        5      (       a  UR                  S5      =(       d    UR                  S5      n	UR                  S5      =(       d    UR                  S5      n
U	(       a  U
(       a  UR                  U	 SU
 35        M  U
(       a  UR                  U
5        M  M  [        U[
        5      (       d  M  UR                  U5        M     U(       a#  UR                  SS	R	                  U5      -   5        U R                  S5      n[        U[
        5      (       a  UR                  SU 35        U R                  S5      n[        U[
        5      (       a  UR                  SU 35        U R                  S5      =(       d    U R                  S5      nUb  UR                  SU S35        SR	                  U5      $ )Nr   trendkurzfristigkurzmittelfristigmittelzKurzer Trend: zMittel- bis Langfristig: 
zTrend: indikatorenr!   	indikatoraussage	bewertungz: z	Signale:
risikenz	Risiken: hinweisez
Hinweise: 
sicherheitsicherheit_prozentu   Eingeschätzte Sicherheit: %rS   )rT   dictgetr1   rZ   rF   list)r`   partsrb   shortmidsegmentrh   
statementsitemr!   noteriskshintssecuritys                 r*   format_sections_textr~   b   sV   h%%ELL!E%		-(=EIIf,=ii(?EIIh,?NN^E734NN6se<=LL7+,	E3		wug&',,}-K+t$$
D$%%xx'@488K+@xx	*Cdhh{.CD%%b&78%%d+ D#&&!!$'   LL		*(==>LL#E%y()LL$E%z%)*||L)OX\\:N-OH28*A>?;;ur-   entryc                 P    [         R                  R                  SSS9  [         R                  SSS9 nUR	                  [
        R                  " U SS9S-   5        S S S 5        U q	[        U 5        g ! , (       d  f       N= f! [         a  n[        S	U 35         S nAN<S nAff = f)
NTparentsexist_okautf-8encodingFensure_asciirg   zAnalysis log error: )ANALYSIS_LOG_PATHparentmkdiropenwritejsondumps	ExceptionprintrO   save_last_analysis_file)r   log_fileexcs      r*   append_analysis_logr      s    ,  &&td&C##C'#:hNN4::e%@4GH ;  E" ;: ,$SE*++,s4   2B (A2B 2
B <B  B 
B%B  B%c                     [         R                  5       (       d  g  [         R                  SSS9 n U R                  5       R	                  5       nS S S 5        [        W5       H3  nUR                  5       nU(       d  M   [        R                  " U5      s  $    g ! , (       d  f       NQ= f! [        R                   a     M`  f = f! [         a  n[        SU 35         S nAg S nAff = f)Nrr   r   zAnalysis read error: )r   existsr   readrW   reversedrX   r   loadsJSONDecodeErrorr   r   )r   r\   r]   r   s       r*   read_last_analysis_entryr      s    ##%%-##C'#:hMMO..0E ; H~~'Hzz(++ (  ;: ''  -%cU+,,-sX   C B/C ?B+C C 
B($C +C?C CC 
C(C##C(c                     [         R                  5       (       d  g  [         R                  SSS9 n [        R                  " U 5      sS S S 5        $ ! , (       d  f       g = f! [
         a  n[        SU 35         S nAg S nAff = f)Nr   r   r   zLoad last analysis error: )LAST_ANALYSIS_FILEr   r   r   loadr   r   )sourcer   s     r*   load_last_analysis_from_filer      sh    $$&&$$S7$;v99V$ <;; *3%01s4   A! A	A! 
AA! A! !
B+A>>Bc                     [         R                  R                  SSS9  [         R                  SSS9 n[        R
                  " XSSS9  S S S 5        g ! , (       d  f       g = f! [         a  n[        S	U 35         S nAg S nAff = f)
NTr   wr   r   F   )r   indentzSave last analysis error: )r   r   r   r   r   dumpr   r   )r   targetr   s      r*   r   r      ss    2!!''t'D$$S7$;vIIe%B <;; 2*3%0112s4   2A% AA% 
A"A% "A% %
B/BBc                    [         R                  " U / SQS9nUS   R                  [        5      US'   U/ SQ   R                  [        5      U/ SQ'   U/ SQ   R                  [        5      U/ SQ'   US   R                  [        5      US'   US   US   -   US	   -   S
-  US'   US   US   -  US'   US   R                  5       US'   US   R                  5       US'   US   US   R                  SS05      -  US'   UR                  R                  SS9  UR                  R                  SS9  UR                  R                  SSS9  UR                  R                  SSS9  UR                  R                  SSS9  U/ SQ   R                  [        5      nUR                  SS9nU HT  nUR                  5        H=  u  pV[        U[        5      (       d  M  [         R"                  " U5      (       d  M9  SXE'   M?     MV     U$ )z3
Binance-Klines -> Indicators + bereinigte Records
)	open_timer   highlowcloserM   
close_timequote_asset_volumenumber_of_tradestaker_buy_base_asset_volumetaker_buy_quote_asset_volumeignore)columnsr   )r   r   r   r   rM   )r   r   r   r   r   r   r      typical_pricerM   tpvcum_tpv
cum_volumer   NVWAPT)r1      )lengthr1   2      )r   r   r   r   r   rM   RSI_14MACD_12_26_9MACDh_12_26_9MACDs_12_26_9EMA_20EMA_50EMA_200r   r   r   r   r   records)orient)pd	DataFrameastypeintfloatcumsumreplacetarJ   rK   rI   tailDISPLAY_ROWSto_dictitemsrT   mathisnan)klinesdf	output_dfr   rowkeyvalues          r*   _process_klinesr      s    
f ' 
B o,,S1B{O578b5c5j5jkp5qB12`b  dy  az  aA  aA  BG  aHB\] 23::3?B f:5	1BwK?1DB?#bl2BuIuI$$&ByM(|**,B|IL!1!9!91d)!DDBvJ EEIITIEEJJdJEEIIRI%EEIIRI%EEIISI&   tL  y1G))+JC%''DJJu,=,= & 
 Nr-   	timeframec                 X    [         R                  S[        U    [        S9n[	        U5      $ )NBTCUSDT)symbolintervallimit)client
get_klinesTIMEFRAME_INTERVALSFETCH_LIMITr   )r   r   s     r*   _fetch_timeframe_recordsr      s+    i:Mi:X`klF6""r-   c                  ,  #    [          V s/ s H  n [        R                  " [        U 5      PM      nn [        R                  " U6 I Sh  vN n[        [         U5       V Vs0 s H  u  pX_M	     nn n[        R                  " U5      $ s  sn f  NCs  snn f 7f)u=   
Holt alle Timeframes parallel und gibt JSON-String zurück.
N)
TIMEFRAMESasyncio	to_threadr   gatherzipr   r   )tftasksall_recordsrecpayloads        r*   get_latest_datar      sx      HRRzW7<zER..K&)*k&BC&B72rw&BGC::g S.Cs-   	B%BBB	B B.BBc                    #    [         R                  " [        R                  SS9I S h  vN n U R	                  S5      nU R	                  S5      nU R	                  S5      nS nSU" U5      U" U5      U" U5      S.$  NS7f)Nr   )r   	lastPricepriceChangepriceChangePercentc                 F     [        U 5      $ ! [        [        4 a     g f = fr&   )r   	TypeError
ValueError)r   s    r*   to_float#get_current_price.<locals>.to_float  s(    	<:& 		s   
   )r   pricer   r   )r   r   r   
get_tickerrr   )ticker
last_priceprice_changeprice_change_percentr   s        r*   get_current_pricer    s     $$V%6%6yIIFK(J::m,L!::&:; *%-&';<	  Js   'A?A=AA?c                    #      [        5       I Sh  vN n [        R                  U 5      I Sh  vN   [
        R                  " S5      I Sh  vN   MP   NA N&! [         a  n[	        SU 35         SnANASnAff = f N/7f)u8   
Holt periodisch Daten und broadcastet über WebSocket.
NzError in data_broadcaster: <   )r   managerr@   r   r   r   sleep)r9   es     r*   data_broadcasterr
    su      	5+--G##G,,, mmB -, 	5/s344	5 	 sY   A?A AA AA A?A=A?A A 
A:"A50A?5A::A?startupc                  H   #    [         R                  " [        5       5        g 7fr&   )r   create_taskr
  rH   r-   r*   startup_eventr  *  s     (*+s    "/)response_classc                     #    [        SS5       n [        U R                  5       S9sS S S 5        $ ! , (       d  f       g = f7f)Nzstatic/index.htmlr   )content)r   r   r   )fs    r*   	read_rootr  /  s+     	!3	'1AFFH- 
(	'	's   A0
A
>Az/datac                  ^   #    [        5       I S h  vN n [        R                  " U 5      $  N7fr&   )r   r   r   )	data_jsons    r*   get_data_endpointr  5  s$     %''I::i   (s   -+-z/pricec                  2   #    [        5       I S h  vN $  N7fr&   )r  rH   r-   r*   price_endpointr  ;  s     "$$$$s   z/analysis/lastc                  r   #    [         (       a  [         $ [        5       n U (       d
  [        SSS9eU q [         $ 7f)N  zNo cached analysis available.status_codedetail)rO   r   r   )r   s    r*   last_analysis_endpointr  @  s8      ""$&E4STTs   57z/analyzerequestc                 Z  #    [         (       d
  [        SSS9eU R                  5       I S h  vN nUR                  S5      nU(       d  UR                  SS5      nU/nU H  nU[        ;  d  M  [        SSU 3S9e   UR                  S	5      n/ n[        U[        5      (       aT  U HN  n[        U[        5      (       d  M  UR                  5       nU[        ;   d  M6  Xu;  d  M=  UR                  U5        MP     U(       d  [        R                  5       nUR                  S
[        5      nU[        ;   a  UO[        n	UR                  SS5      n
 [        U
5      n
[%        S['        U
S5      5      n
UR                  SS5      n[        U[        5      (       a"  UR)                  5       R                  5       S;   nO[+        U5      n[-        5       I S h  vN n[        R.                  " U5      n0 nU GH~  nUR                  U/ 5      nU(       d  M  UU
* S  n/ nU GHL  nUS   US   US   US   US   US   S.nSU;   aB  UR1                  UR                  S5      UR                  S5      UR                  S5      S.5        SU;   a  UR                  S5      US'   S U;   aB  UR1                  UR                  S!5      UR                  S"5      UR                  S#5      S$.5        S%U;   a  UR                  S&5      US%'   SU;   aR  UR1                  UR                  S'5      UR                  S(5      UR                  S)5      UR                  S*5      S+.5        UR                  U5        GMO     UX'   GM     U(       d
  [        S,S-S9eS.R3                  U5      nS.R3                  S/ U 5       5      nU(       d  S0nS1U
 S23nU(       a  S3OS4nS5U S6U S7U S6U S83	nU[        R4                  " U5      -   n [         R6                  R9                  U	USS99n[=        US<S 5      nS nU(       a   [        R.                  " U5      nU(       a3  [A        U5      nU=(       d    [C        [        R4                  " USS=95      n O:Un!U!(       d&   URE                  5       n"[        R4                  " U"S>S?9n![C        U!5      n [=        USAS 5      n#U#(       a  [=        U#SBS 5      OS n$U#(       a  [=        U#SCS 5      OS n%[F        RH                  " [J        RL                  5      RO                  5       UUU
UU	U UU$U%SD.SE.	n&[Q        U&5        U U	UU$U%SD.SF.$  GN! [         ["        4 a    Sn
 GNf = f GN! [:         a  n[        S:S;U 3S9eS nAff = f! [        R>                   a    S n GNXf = f! [:         a    S@n! GNf = f7f)GNi  z"OpenAI API key nicht konfiguriert.r  
timeframesr   r   i  zInvalid timeframe: 
indicatorsmodeldepthr      r   
news_focusF>   1onyestruer   r   r   r   r   rM   )timer   r   r   r   rM   rI   r   r   r   )ema20ema50ema200rJ   r   rK   r   r   r   )rK   macd_signal	macd_histrL   r   r   r   r   r   )quote_volumetaker_buy_basetaker_buy_quotetradesr  zNo data to analyze.z, c              3   J   #    U  H  o[         ;   d  M  [         U   v   M     g 7fr&   )ALLOWED_INDICATORS).0inds     r*   	<genexpr>#analyze_endpoint.<locals>.<genexpr>  s!     sBU3`rYr61#6BUs   ##z>Standard-Kerzeninformationen (Open, High, Low, Close, Volumen)z.Die Daten enthalten pro Timeframe die letzten z Kerzen.u   Füge außerdem eine kurze Einordnung hinzu, ob aktuelle Makro-, On-Chain- oder News-Impulse die kurzfristige Kursreaktion beeinflussen könnten. Wenn du keine Fakten hast, schreibe explizit, dass dir dazu keine sicheren Hinweise vorliegen.r   u   Du bist ein technischer Analyst für Bitcoin (BTCUSDT). Andere Coins oder Märkte dürfen nicht erwähnt werden.
Arbeite ausschließlich mit den folgenden Timeframes: z.
u6   
Berücksichtige für deine Signale diese Kennzahlen: u1  
Strukturiere deine Antwort logisch.
Liefere deine Antwort ausschließlich als JSON mit exakt folgendem Schema (keine zusätzliche Erklärung oder Text außerhalb des JSON):
{
  "trend": {
    "kurzfristig": "Beschreibung des kurzfristigen Trends",
    "mittelfristig": "Beschreibung des mittelfristigen Trends"
  },
  "indikatoren": [
    {"name": "EMA", "aussage": "Kernaussage zu diesem Indikator"},
    {"name": "RSI", "aussage": "Kernaussage"}
  ],
  "risiken": "Entscheidende Risiken oder kritische Preiszonen",
  "hinweise": "Makro-/News-/On-Chain-Hinweise oder leer, falls keine",
  "sicherheit": 72
}
Nutze die verfügbaren Daten, um jede Eigenschaft informativ zu füllen. Abschliessend teilst du deine eigene Handelempfehlung mit Confidece einschätzung und grund warum [bullish|neutral|bearisch].

Daten:
)r$  inputmax_output_tokensr   zOpenAI Fehler: output_textr   r   )r   zKeine lesbare Analyse erzeugt.usageinput_tokensoutput_tokens)r@  rA  )		timestampr"  r#  r%  r'  r$  analysisr`   r?  )rC  r$  r`   r?  ))openai_clientr   r   rr   r   rT   rs   rF   lowerr7  r1   DEFAULT_INDICATORScopyDEFAULT_MODELALLOWED_MODELSr   r   r   maxminrX   boolr   r   updaterZ   r   	responsescreater   getattrr   r~   r_   
model_dumpr   nowr   utc	isoformatr   )'r   bodyr"  r   raw_indicatorsselected_indicatorsry   r   requested_modelr$  depth_valueraw_news_focusr'  r  all_datacombineddatarecentrowsr   r   timeframe_textindicator_text
depth_textnews_clauseprompt
input_textresponser	  
raw_outputstructured_sections	formattedanalysis_textfallback_textdumpedr?  r@  rA  	log_entrys'                                          r*   analyze_endpointrn  L  s     =4XYYD ,'JXXk4(T
 ZC:MbT8RSS  XXl+N%'.$''"DdC((**,C((S-K#**3/ # 0557hhw6O..@OmE((7B'K+& a[#./KXXlE2N.#&&#))+1137QQ
.)
%''Izz)$HH||B#{lm$CK(FF5zWh-E ++ WWX. WWX.!ggi0 
 ++"wwx0e,,GGN3#&77?#;!$!9 
 ,, #f..$'GG,@$A&)gg.K&L'*ww/M'N!gg&89	  KKA D S V 4IJJYYz*NYYsBUssNYA+hWJ 
	i 	AAO@PPS, @@N?Os- 		 2 $**X..JK **11! 2 
 =$7J15	'"&**Z"8 ()<=	!p%;DJJGZin<o%p"A!,,. $

6! < /}= Hgt,E;@75.$7dL=BGE?D9M \\(,,/99; ) !'(*
I 	" "'(*
	 k  > z"  (|  KoaS4IJJK ## 	'"&	'  A @As   )V+T=>V+.A+V+V+$A*V+U  A7V+UHV+0U V+&U; <AV+ %V %BV+ UV+UV+
U8&U33U88V+;VV+VV+V($V+'V((V+z/wsr.   c                   #    [         R                  U 5      I S h  vN    [        5       I S h  vN n[         R                  X5      I S h  vN    U R	                  5       I S h  vN   M   NO N> N# N! [
         a    [         R                  U 5         g [         a-  n[        SU 35        [         R                  U 5         S nAg S nAff = f7f)NzWebSocket error: )	r  r3   r   r<   receive_textr   r7   r   r   )r.   initial_datar	  s      r*   websocket_endpointrr    s     
//)
$$$&,..++LDDD ((***  % /D + &9% &!!%&9%%&sx   CA+CA3 A-A3 A/A3 $A1%A3 +C-A3 /A3 1A3 3C
C	C
#C CC

C)Ufastapir   r   r   r   r   fastapi.responsesr   fastapi.staticfilesr	   binance.clientr
   ospandasr   	pandas_tar   r   r   r   r   r   pathlibr   typingr   openair   environrr   r   
api_secretrX   openai_api_keyr   rD  appKLINE_INTERVAL_1MINUTEKLINE_INTERVAL_3MINUTEKLINE_INTERVAL_5MINUTEKLINE_INTERVAL_15MINUTEKLINE_INTERVAL_1HOURKLINE_INTERVAL_4HOURKLINE_INTERVAL_1DAYKLINE_INTERVAL_1WEEKr   rs   keysr   r   r   r   r   mountr#   r  r7  rF  rI  rH  rO   rq   rF   __annotations__r_   r~   r   r   r   r   r   r   r   r  r
  on_eventr  r  r  r  r  postrn  r.   rr  rH   r-   r*   <module>r     s   S S * + ! 	      '    **..
+ZZ^^,b1
 0"5;;=		$2@~.di 
'
'

'
'

'
'))

%
%

%
%

$
$

%
%	  %**,-
9: 34  		)[848	 D0 0( 
 +0-3  ,  "
 -1 T#s(^d* 1
 
 
.4S> .c .b	#t 	#&24 2 34 -`# #
(  i, , \*. +.
 ! !
 % % 	  *BG B BJ u&	 & &r-   