File size: 2,424 Bytes
a227866
25397f0
 
d65815d
0b0540e
d65815d
25397f0
d65815d
0b0540e
d65815d
 
 
 
 
 
25397f0
d65815d
 
 
25397f0
d65815d
25397f0
 
 
d65815d
 
25397f0
d65815d
 
 
25397f0
d65815d
25397f0
0b0540e
d65815d
25397f0
d65815d
25397f0
a227866
d65815d
25397f0
0b0540e
d65815d
0b0540e
d65815d
 
 
a227866
25397f0
 
d65815d
 
 
25397f0
a227866
 
d65815d
a227866
d65815d
 
 
25397f0
d65815d
a227866
 
d65815d
 
25397f0
d65815d
 
 
 
 
 
 
 
 
 
 
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
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)