scrypto-1v1 / app.py
tahatehrani's picture
Create app.py
65b8e1f verified
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()