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