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()