tahatehrani commited on
Commit
65b8e1f
·
verified ·
1 Parent(s): 8e7eb9e

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +130 -0
app.py ADDED
@@ -0,0 +1,130 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ import ta
4
+ import requests
5
+ import json
6
+
7
+ def load_data(file_path):
8
+ data = pd.read_csv(file_path)
9
+ return data
10
+
11
+ def calculate_indicators(data):
12
+ if len(data) > 0:
13
+ data['RSI'] = ta.momentum.rsi(data['Close'], window=14)
14
+ data['Stochastic'] = ta.momentum.stoch(data['High'], data['Low'], data['Close'], k=14, d=3)['STOCHk_14_3_3']
15
+ macd = ta.trend.macd(data['Close'], window_slow=26, window_fast=12, window_sign=9)
16
+ data['MACD'] = macd['MACD_12_26_9']
17
+ data['SMA'] = ta.trend.sma_indicator(data['Close'], window=50)
18
+ data['EMA'] = ta.trend.ema_indicator(data['Close'], window=50)
19
+ else:
20
+ data['RSI'] = pd.Series([None]*len(data))
21
+ data['Stochastic'] = pd.Series([None]*len(data))
22
+ data['MACD'] = pd.Series([None]*len(data))
23
+ data['SMA'] = pd.Series([None]*len(data))
24
+ data['EMA'] = pd.Series([None]*len(data))
25
+ return data
26
+
27
+ def generate_signals(data):
28
+ buy_signal = None
29
+ sell_signal = None
30
+ if len(data) < 1:
31
+ return buy_signal, sell_signal
32
+ latest_data = data.iloc[-1]
33
+ if latest_data['RSI'] < 30 and latest_data['Stochastic'] < 20:
34
+ buy_signal = (latest_data.name, latest_data['Close'], latest_data['Close'] * 0.95, "High Risk", 3)
35
+ elif latest_data['RSI'] > 70 and latest_data['Stochastic'] > 80:
36
+ sell_signal = (latest_data.name, latest_data['Close'], latest_data['Close'] * 1.05, "High Risk", 3)
37
+ return buy_signal, sell_signal
38
+
39
+ def get_fear_and_greed_index():
40
+ response = requests.get("https://api.alternative.me/fng/?limit=1")
41
+ if response.status_code == 200:
42
+ return response.json()["data"][0]["value"]
43
+ else:
44
+ return None
45
+
46
+ def get_crypto_data_from_coinmarketcap(api_key, crypto_symbol):
47
+ url = "https://pro-api.coinmarketcap.com/v1/cryptocurrency/quotes/latest"
48
+ parameters = {'symbol': crypto_symbol, 'convert': 'USD'}
49
+ headers = {'Accepts': 'application/json', 'X-CMC_PRO_API_KEY': api_key}
50
+ response = requests.get(url, headers=headers, params=parameters)
51
+ data = response.json()
52
+ return data['data'][crypto_symbol]['quote']['USD']
53
+
54
+ def get_crypto_news(api_key, crypto_symbol):
55
+ url = f"https://newsapi.org/v2/everything?q={crypto_symbol}&apiKey={api_key}"
56
+ response = requests.get(url)
57
+ return response.json().get('articles', [])
58
+
59
+ def analyze_news_sentiment(news):
60
+ for article in news:
61
+ article['sentiment'] = 'Neutral' # Placeholder for sentiment analysis
62
+ return news
63
+
64
+ def load_api_keys():
65
+ with open("api_keys.json", "r") as file:
66
+ return json.load(file)
67
+
68
+ def main():
69
+ st.title("Cryptocurrency Dashboard")
70
+
71
+ menu = ["Home", "News"]
72
+ choice = st.sidebar.selectbox("Menu", menu)
73
+ language = st.sidebar.selectbox("Language", ["English", "Farsi"])
74
+
75
+ if choice == "Home":
76
+ if language == "English":
77
+ st.subheader("Cryptocurrency Data")
78
+ else:
79
+ st.subheader("داده‌های ارز دیجیتال")
80
+
81
+ data_file = st.file_uploader("Upload CSV", type=["csv"])
82
+ if data_file is not None:
83
+ data = load_data(data_file)
84
+ data = calculate_indicators(data)
85
+ st.dataframe(data)
86
+
87
+ buy_signal, sell_signal = generate_signals(data)
88
+ if buy_signal:
89
+ st.success(f"Buy Signal: {buy_signal}")
90
+ if sell_signal:
91
+ st.error(f"Sell Signal: {sell_signal}")
92
+
93
+ elif choice == "News":
94
+ if language == "English":
95
+ st.subheader("Cryptocurrency News")
96
+ else:
97
+ st.subheader("اخبار ارز دیجیتال")
98
+
99
+ crypto_symbol = st.selectbox("Cryptocurrency Symbol", ["BTC", "ETH", "LTC", "BCH"])
100
+ api_keys = load_api_keys()
101
+ if 'newsapi_key' in api_keys and api_keys['newsapi_key']:
102
+ news = get_crypto_news(api_keys['newsapi_key'], crypto_symbol)
103
+ news = analyze_news_sentiment(news)
104
+
105
+ sort_by = st.radio("Sort News By", ("publishedAt", "relevancy", "popularity"), index=0)
106
+ news = sorted(news, key=lambda x: x[sort_by])
107
+
108
+ if language == "English":
109
+ st.subheader(f"News for {crypto_symbol}")
110
+ else:
111
+ st.subheader(f"اخبار برای {crypto_symbol}")
112
+
113
+ page = st.slider("Select page", min_value=1, max_value=(len(news) // 5) + 1)
114
+ news_to_display = news[(page - 1) * 5: page * 5]
115
+
116
+ for article in news_to_display:
117
+ st.write(f"Title: {article['title']}")
118
+ st.write(f"Description: {article['description']}")
119
+ st.write(f"Sentiment: {article['sentiment']}")
120
+ st.write(f"Published At: {article['publishedAt']}")
121
+ st.write(f"Read more: [Link]({article['url']})")
122
+ else:
123
+ if language == "English":
124
+ st.warning("API key for NewsAPI is not set. Please contact the admin.")
125
+ else:
126
+ st.warning("کلید API برای NewsAPI تنظیم نشده است. لطفاً با مدیر تماس بگیرید.")
127
+
128
+ if __name__ == '__main__':
129
+ main()
130
+