Dmtlant commited on
Commit
7be0742
·
verified ·
1 Parent(s): 4615036

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +52 -85
app.py CHANGED
@@ -1,86 +1,53 @@
1
- import asyncio
2
- import websockets
3
- import json
4
- import matplotlib.pyplot as plt
5
- import pandas as pd
6
- from datetime import datetime
7
  import streamlit as st
8
-
9
- # Список криптовалют для отслеживания
10
- cryptos = ['BTCUSDT', 'ETHUSDT', 'LTCUSDT']
11
-
12
- # Словарь для хранения данных
13
- data = {crypto: {'prices': [], 'times': []} for crypto in cryptos}
14
-
15
- # Инициализация Streamlit
16
- st.title('Crypto Advisor')
17
-
18
- # Создание пустых мест для графиков и советов
19
- charts = {crypto: st.empty() for crypto in cryptos}
20
- advice_boxes = {crypto: st.empty() for crypto in cryptos}
21
-
22
- # Функция для подключения к веб-сокету Binance и получения данных
23
- async def get_crypto_data():
24
- uri = 'wss://stream.binance.com:9443/stream'
25
- stream = '/'.join([f'{crypto.lower()}@trade' for crypto in cryptos])
26
- url = f'{uri}?streams={stream}'
27
-
28
- async with websockets.connect(url) as websocket:
29
- while True:
30
- response = await websocket.recv()
31
- data_dict = json.loads(response)['data']
32
- symbol = data_dict['s']
33
- price = float(data_dict['p'])
34
- time = datetime.fromtimestamp(data_dict['T'] / 1000)
35
-
36
- if symbol in data:
37
- # Обновление данных
38
- data[symbol]['prices'].append(price)
39
- data[symbol]['times'].append(time)
40
-
41
- # Ограничение длины списка до 100 последних значений
42
- if len(data[symbol]['prices']) > 100:
43
- data[symbol]['prices'].pop(0)
44
- data[symbol]['times'].pop(0)
45
-
46
- # Обновление графика и советов
47
- update_chart(symbol)
48
- give_advice(symbol, price)
49
-
50
- # Функция для обновления графика
51
- def update_chart(symbol):
52
- fig, ax = plt.subplots()
53
- ax.plot(data[symbol]['times'], data[symbol]['prices'], label=symbol)
54
- ax.set_xlabel('Time')
55
- ax.set_ylabel('Price (USDT)')
56
- ax.set_title(f'{symbol} Price')
57
- ax.legend()
58
- charts[symbol].pyplot(fig)
59
-
60
- # Функция для выдачи советов
61
- def give_advice(symbol, price):
62
- if len(data[symbol]['prices']) < 2:
63
- advice = f'{symbol}: Not enough data yet.'
64
- else:
65
- last_price = data[symbol]['prices'][-2]
66
- current_price = price
67
-
68
- if current_price > last_price:
69
- advice = f'{symbol}: Price is increasing. Consider buying.'
70
- elif current_price < last_price:
71
- advice = f'{symbol}: Price is decreasing. Consider selling.'
72
- else:
73
- advice = f'{symbol}: Price is stable. Hold for now.'
74
-
75
- advice_boxes[symbol].text(advice)
76
-
77
- # Функция для запуска асинхронного цикла
78
- async def main():
79
- st.write('Connecting to Binance...')
80
- st.write('Please wait for the data to start streaming.')
81
- task = asyncio.create_task(get_crypto_data())
82
- await task
83
-
84
- # Запуск приложения
85
- if __name__ == '__main__':
86
- asyncio.run(main())
 
 
 
 
 
 
 
1
  import streamlit as st
2
+ import requests
3
+ import plotly.graph_objects as go
4
+ from datetime import datetime
5
+ import time
6
+
7
+ # Заголовок приложения
8
+ st.title("График криптовалют в реальном времени")
9
+
10
+ # Выбор криптовалюты
11
+ crypto_options = ["bitcoin", "ethereum", "litecoin", "dogecoin"]
12
+ selected_crypto = st.selectbox("Выберите криптовалюту", crypto_options)
13
+
14
+ # Функция для получения данных о цене криптовалюты
15
+ def get_crypto_price(crypto):
16
+ url = f"https://api.coingecko.com/api/v3/simple/price?ids={crypto}&vs_currencies=usd"
17
+ response = requests.get(url)
18
+ data = response.json()
19
+ return data[crypto]['usd']
20
+
21
+ # Инициализация данных для графика
22
+ prices = []
23
+ times = []
24
+
25
+ # Создание графика
26
+ fig = go.Figure()
27
+
28
+ # Обновление графика в реальном времени
29
+ placeholder = st.empty()
30
+
31
+ while True:
32
+ # Получение текущей цены
33
+ price = get_crypto_price(selected_crypto)
34
+ current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
35
+
36
+ # Добавление данных в списки
37
+ prices.append(price)
38
+ times.append(current_time)
39
+
40
+ # Обновление графика
41
+ fig.add_trace(go.Scatter(x=times, y=prices, mode='lines', name=selected_crypto))
42
+ fig.update_layout(title=f"Цена {selected_crypto.capitalize()} в USD",
43
+ xaxis_title="Время",
44
+ yaxis_title="Цена в USD")
45
+
46
+ # Отображение графика
47
+ placeholder.plotly_chart(fig, use_container_width=True)
48
+
49
+ # Очистка трейсов, чтобы не накапливать старые данные
50
+ fig.data = []
51
+
52
+ # Пауза на 10 секунд перед следующим обновлением
53
+ time.sleep(10)