gbestenheider commited on
Commit
6ab75d3
·
verified ·
1 Parent(s): ae7a494

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -0
app.py CHANGED
@@ -6,6 +6,9 @@ import yaml
6
  from tools.final_answer import FinalAnswerTool
7
 
8
  from Gradio_UI import GradioUI
 
 
 
9
 
10
  # Below is an example of a tool that does nothing. Amaze us with your creativity !
11
  @tool
@@ -33,6 +36,80 @@ def get_current_time_in_timezone(timezone: str) -> str:
33
  except Exception as e:
34
  return f"Error fetching time for timezone '{timezone}': {str(e)}"
35
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
  final_answer = FinalAnswerTool()
38
 
 
6
  from tools.final_answer import FinalAnswerTool
7
 
8
  from Gradio_UI import GradioUI
9
+ import requests
10
+ import pandas as pd
11
+ from datetime import datetime, timedelta
12
 
13
  # Below is an example of a tool that does nothing. Amaze us with your creativity !
14
  @tool
 
36
  except Exception as e:
37
  return f"Error fetching time for timezone '{timezone}': {str(e)}"
38
 
39
+ @tool
40
+ def predict_crypto_price_binance(crypto_symbol: str = "BTC", vs_currency: str = "USDT") -> str:
41
+ """
42
+ Prédit l'évolution du prix d'une cryptomonnaie en se basant sur la SMA sur 9 et 20 jours et le RSI,
43
+ en utilisant les données historiques issues de Binance.
44
+
45
+ Args:
46
+ crypto_symbol: Le symbole de la cryptomonnaie (ex: 'BTC').
47
+ vs_currency: La devise de cotation (ex: 'USDT'). Pour 'USD', Binance utilise généralement 'USDT'.
48
+
49
+ Returns:
50
+ Un message indiquant le signal d'achat, de vente ou une analyse basée sur le RSI.
51
+ """
52
+ try:
53
+ # Si l'utilisateur fournit 'usd', on le convertit en 'USDT' pour correspondre à Binance
54
+ if vs_currency.lower() == "usd":
55
+ vs_currency = "USDT"
56
+ symbol = crypto_symbol.upper() + vs_currency.upper()
57
+
58
+ # Récupération des données de 30 jours (bougies journalières) via l'API de Binance
59
+ url = "https://api.binance.com/api/v3/klines"
60
+ params = {
61
+ "symbol": symbol,
62
+ "interval": "1d",
63
+ "limit": 30 # 30 jours de données
64
+ }
65
+ response = requests.get(url, params=params, timeout=10)
66
+ response.raise_for_status()
67
+ data = response.json()
68
+
69
+ # Extraction des prix de clôture et des timestamps
70
+ # Chaque kline (bougie) est une liste dont les éléments importants sont :
71
+ # index 0: temps d'ouverture (en ms)
72
+ # index 4: prix de clôture
73
+ rows = []
74
+ for kline in data:
75
+ timestamp = kline[0]
76
+ close_price = float(kline[4])
77
+ rows.append([timestamp, close_price])
78
+
79
+ df = pd.DataFrame(rows, columns=['timestamp', 'price'])
80
+ df['date'] = pd.to_datetime(df['timestamp'], unit='ms')
81
+ df.set_index('date', inplace=True)
82
+ df.drop(columns=['timestamp'], inplace=True)
83
+
84
+ # Calcul des moyennes mobiles simples sur 9 jours et 20 jours
85
+ df['SMA_9'] = df['price'].rolling(window=9).mean()
86
+ df['SMA_20'] = df['price'].rolling(window=20).mean()
87
+
88
+ # Calcul du RSI sur une fenêtre de 14 jours
89
+ delta = df['price'].diff()
90
+ gain = delta.where(delta > 0, 0).rolling(window=14).mean()
91
+ loss = -delta.where(delta < 0, 0).rolling(window=14).mean()
92
+ rs = gain / loss
93
+ df['RSI'] = 100 - (100 / (1 + rs))
94
+
95
+ # Détection des signaux de croisement SMA
96
+ if df['SMA_9'].iloc[-1] > df['SMA_20'].iloc[-1] and df['SMA_9'].iloc[-2] <= df['SMA_20'].iloc[-2]:
97
+ return f"Signal d'achat : la SMA sur 9 jours a croisé au-dessus de la SMA sur 20 jours pour {symbol}."
98
+ elif df['SMA_9'].iloc[-1] < df['SMA_20'].iloc[-1] and df['SMA_9'].iloc[-2] >= df['SMA_20'].iloc[-2]:
99
+ return f"Signal de vente : la SMA sur 9 jours a croisé en dessous de la SMA sur 20 jours pour {symbol}."
100
+ else:
101
+ # Analyse du RSI si aucun croisement clair n'est détecté
102
+ rsi_latest = df['RSI'].iloc[-1]
103
+ if rsi_latest > 70:
104
+ return f"Aucun croisement clair. Toutefois, le RSI est {rsi_latest:.2f}, indiquant des conditions de surachat (risque de correction)."
105
+ elif rsi_latest < 30:
106
+ return f"Aucun croisement clair. Toutefois, le RSI est {rsi_latest:.2f}, indiquant des conditions de survente (potentiel rebond)."
107
+ else:
108
+ return f"Aucun croisement clair. Le RSI est de {rsi_latest:.2f}, indiquant des conditions neutres."
109
+
110
+ except Exception as e:
111
+ return f"Une erreur s'est produite : {str(e)}"
112
+
113
 
114
  final_answer = FinalAnswerTool()
115