CryptoTrader / app.py
S-Dreamer's picture
Update app.py
d65815d verified
import panel as pn
import pandas as pd
import numpy as np
import hvplot.pandas
import asyncio
from datetime import datetime, timedelta
pn.extension('tabulator', 'plotly', sizing_mode="stretch_width")
# --- Dummy Data Generator ---
def generate_dummy_data(n=100):
start = datetime.now() - timedelta(minutes=n)
times = [start + timedelta(minutes=i) for i in range(n)]
prices = 100 + np.random.randn(n).cumsum()
return pd.DataFrame({'Time': times, 'Price': prices}).set_index('Time')
def generate_ai_signal(price):
mod = price % 10
if mod < 3:
return 'BUY', 'green'
elif mod > 7:
return 'SELL', 'red'
return 'HOLD', 'orange'
data = generate_dummy_data()
signal, color = generate_ai_signal(data['Price'].iloc[-1])
# --- Widgets ---
symbol_input = pn.widgets.TextInput(name='Stock Symbol', value='AI_STOCK')
interval_slider = pn.widgets.IntSlider(name='Update Interval (s)', start=1, end=10, step=1, value=2)
signal_display = pn.indicators.Number(
name='AI Signal',
value=0,
format=signal,
font_size='36pt',
colors=[(999, color)]
)
metrics_table = pn.widgets.Tabulator(pd.DataFrame({
'Metric': ['Win Rate', 'Profit Factor', 'Sharpe Ratio'],
'Value': ['62%', '1.85', '1.2']
}), disabled=True, selectable=False)
chart = data.hvplot.line(y='Price', title="πŸ“ˆ Live Stock Price", height=400, line_width=3).opts(yformatter="%.2f")
stream = hvplot.streams.Buffer(data, index=False, length=100)
chart.update(stream)
# --- Layout ---
sidebar = pn.Column(
"## βš™οΈ Controls", symbol_input, interval_slider,
"## πŸ€– AI Signal", signal_display,
"## πŸ“Š Metrics", metrics_table,
width=300
)
main_area = pn.Column(chart)
template = pn.template.FastListTemplate(
site="AI Trader",
title="πŸ“Š AI Trading Dashboard",
sidebar=[sidebar],
main=[main_area]
)
# --- Async Update Logic ---
async def updater():
while True:
await asyncio.sleep(interval_slider.value)
new_time = data.index[-1] + timedelta(seconds=10)
new_price = data['Price'].iloc[-1] + np.random.randn() * 0.5
new_df = pd.DataFrame([{'Time': new_time, 'Price': new_price}]).set_index('Time')
stream.send(new_df)
new_signal, new_color = generate_ai_signal(new_price)
signal_display.format = new_signal
signal_display.colors = [(999, new_color)]
template.servable()
pn.state.onload(updater)