Spaces:
Sleeping
Sleeping
Update app/daily.py
Browse files- app/daily.py +9 -13
app/daily.py
CHANGED
|
@@ -6,8 +6,8 @@ import traceback
|
|
| 6 |
from . import persist
|
| 7 |
from .common import wrap_html
|
| 8 |
import plotly.graph_objects as go
|
| 9 |
-
import plotly.io as pio
|
| 10 |
import plotly.express as px
|
|
|
|
| 11 |
|
| 12 |
# ===========================================================
|
| 13 |
# RAW DAILY FETCHER
|
|
@@ -24,12 +24,11 @@ def daily(symbol, date_end, date_start):
|
|
| 24 |
return df
|
| 25 |
|
| 26 |
# ===========================================================
|
| 27 |
-
#
|
| 28 |
# ===========================================================
|
| 29 |
def plot_candlestick(df, symbol):
|
| 30 |
fig = go.Figure()
|
| 31 |
|
| 32 |
-
# Candlestick
|
| 33 |
fig.add_trace(go.Candlestick(
|
| 34 |
x=df['Date'],
|
| 35 |
open=df['Open'],
|
|
@@ -41,17 +40,15 @@ def plot_candlestick(df, symbol):
|
|
| 41 |
decreasing_line_color='red'
|
| 42 |
))
|
| 43 |
|
| 44 |
-
# Volume as bar
|
| 45 |
fig.add_trace(go.Bar(
|
| 46 |
x=df['Date'],
|
| 47 |
y=df['Volume'],
|
| 48 |
name='Volume',
|
| 49 |
-
marker_color='blue',
|
| 50 |
yaxis='y2',
|
|
|
|
| 51 |
opacity=0.3
|
| 52 |
))
|
| 53 |
|
| 54 |
-
# Layout
|
| 55 |
fig.update_layout(
|
| 56 |
title=f'{symbol} Daily Candlestick',
|
| 57 |
xaxis_rangeslider_visible=False,
|
|
@@ -62,33 +59,32 @@ def plot_candlestick(df, symbol):
|
|
| 62 |
|
| 63 |
return pio.to_html(fig, full_html=False, include_plotlyjs='cdn')
|
| 64 |
|
| 65 |
-
|
| 66 |
# ===========================================================
|
| 67 |
# ADDITIONAL ANALYSIS CHARTS
|
| 68 |
# ===========================================================
|
| 69 |
def plot_analysis_charts(df, symbol):
|
| 70 |
charts = ""
|
| 71 |
|
| 72 |
-
#
|
| 73 |
fig_line = px.line(df, x='Date', y=['Open','High','Low','Close'], title=f'{symbol} OHLC Line Chart')
|
| 74 |
charts += pio.to_html(fig_line, full_html=False, include_plotlyjs=False)
|
| 75 |
|
| 76 |
-
#
|
| 77 |
df['MA20'] = df['Close'].rolling(20).mean()
|
| 78 |
df['MA50'] = df['Close'].rolling(50).mean()
|
| 79 |
fig_ma = px.line(df, x='Date', y=['Close','MA20','MA50'], title=f'{symbol} 20 & 50 Day Moving Avg')
|
| 80 |
charts += pio.to_html(fig_ma, full_html=False, include_plotlyjs=False)
|
| 81 |
|
| 82 |
-
#
|
|
|
|
| 83 |
fig_change = px.bar(df, x='Date', y='Change %', color='Change %', title=f'{symbol} Daily % Change',
|
| 84 |
color_continuous_scale=['red','green'])
|
| 85 |
charts += pio.to_html(fig_change, full_html=False, include_plotlyjs=False)
|
| 86 |
|
| 87 |
return charts
|
| 88 |
|
| 89 |
-
|
| 90 |
# ===========================================================
|
| 91 |
-
# DAILY
|
| 92 |
# ===========================================================
|
| 93 |
def fetch_daily(symbol, date_end, date_start):
|
| 94 |
"""Return HTML table + candlestick + analysis charts."""
|
|
@@ -156,7 +152,7 @@ def fetch_daily(symbol, date_end, date_start):
|
|
| 156 |
# Additional analysis charts
|
| 157 |
analysis_html = plot_analysis_charts(df, symbol)
|
| 158 |
|
| 159 |
-
# Combine all
|
| 160 |
full_html = f'<div id="daily_dashboard">{html_table}{candlestick_html}{analysis_html}</div>'
|
| 161 |
|
| 162 |
persist.save(key, full_html, "html")
|
|
|
|
| 6 |
from . import persist
|
| 7 |
from .common import wrap_html
|
| 8 |
import plotly.graph_objects as go
|
|
|
|
| 9 |
import plotly.express as px
|
| 10 |
+
import plotly.io as pio
|
| 11 |
|
| 12 |
# ===========================================================
|
| 13 |
# RAW DAILY FETCHER
|
|
|
|
| 24 |
return df
|
| 25 |
|
| 26 |
# ===========================================================
|
| 27 |
+
# CANDLESTICK + VOLUME
|
| 28 |
# ===========================================================
|
| 29 |
def plot_candlestick(df, symbol):
|
| 30 |
fig = go.Figure()
|
| 31 |
|
|
|
|
| 32 |
fig.add_trace(go.Candlestick(
|
| 33 |
x=df['Date'],
|
| 34 |
open=df['Open'],
|
|
|
|
| 40 |
decreasing_line_color='red'
|
| 41 |
))
|
| 42 |
|
|
|
|
| 43 |
fig.add_trace(go.Bar(
|
| 44 |
x=df['Date'],
|
| 45 |
y=df['Volume'],
|
| 46 |
name='Volume',
|
|
|
|
| 47 |
yaxis='y2',
|
| 48 |
+
marker_color='blue',
|
| 49 |
opacity=0.3
|
| 50 |
))
|
| 51 |
|
|
|
|
| 52 |
fig.update_layout(
|
| 53 |
title=f'{symbol} Daily Candlestick',
|
| 54 |
xaxis_rangeslider_visible=False,
|
|
|
|
| 59 |
|
| 60 |
return pio.to_html(fig, full_html=False, include_plotlyjs='cdn')
|
| 61 |
|
|
|
|
| 62 |
# ===========================================================
|
| 63 |
# ADDITIONAL ANALYSIS CHARTS
|
| 64 |
# ===========================================================
|
| 65 |
def plot_analysis_charts(df, symbol):
|
| 66 |
charts = ""
|
| 67 |
|
| 68 |
+
# OHLC line chart
|
| 69 |
fig_line = px.line(df, x='Date', y=['Open','High','Low','Close'], title=f'{symbol} OHLC Line Chart')
|
| 70 |
charts += pio.to_html(fig_line, full_html=False, include_plotlyjs=False)
|
| 71 |
|
| 72 |
+
# 20 & 50-day moving averages
|
| 73 |
df['MA20'] = df['Close'].rolling(20).mean()
|
| 74 |
df['MA50'] = df['Close'].rolling(50).mean()
|
| 75 |
fig_ma = px.line(df, x='Date', y=['Close','MA20','MA50'], title=f'{symbol} 20 & 50 Day Moving Avg')
|
| 76 |
charts += pio.to_html(fig_ma, full_html=False, include_plotlyjs=False)
|
| 77 |
|
| 78 |
+
# Daily % change
|
| 79 |
+
df['Change %'] = ((df['Close'] - df['Open']) / df['Open'] * 100).round(2)
|
| 80 |
fig_change = px.bar(df, x='Date', y='Change %', color='Change %', title=f'{symbol} Daily % Change',
|
| 81 |
color_continuous_scale=['red','green'])
|
| 82 |
charts += pio.to_html(fig_change, full_html=False, include_plotlyjs=False)
|
| 83 |
|
| 84 |
return charts
|
| 85 |
|
|
|
|
| 86 |
# ===========================================================
|
| 87 |
+
# DAILY DASHBOARD
|
| 88 |
# ===========================================================
|
| 89 |
def fetch_daily(symbol, date_end, date_start):
|
| 90 |
"""Return HTML table + candlestick + analysis charts."""
|
|
|
|
| 152 |
# Additional analysis charts
|
| 153 |
analysis_html = plot_analysis_charts(df, symbol)
|
| 154 |
|
| 155 |
+
# Combine all in dashboard
|
| 156 |
full_html = f'<div id="daily_dashboard">{html_table}{candlestick_html}{analysis_html}</div>'
|
| 157 |
|
| 158 |
persist.save(key, full_html, "html")
|