poc / gradio_app.py
ryanrahmadifa
Updated technical anlysis
ffe3438
import gradio as gr
import pandas as pd
import pandas_ta as ta
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# Sample OHLCV data (replace this with actual data)
data = pd.read_csv('data/brent_futures.csv')
data['Date'] = pd.to_datetime(data['Date'])
data.set_index('Date', inplace=True)
data.sort_index(inplace=True)
def plot_chart(ma_length, draw_mode):
# Calculate Moving Average and Bollinger Bands
data['MA'] = ta.sma(data['Close'], length=ma_length)
bbands = ta.bbands(data['Close'], length=20)
data['BB_upper'], data['BB_middle'], data['BB_lower'] = bbands.iloc[:, 2], bbands.iloc[:, 1], bbands.iloc[:, 0]
# Create a subplot figure with 2 rows: OHLC and Volume
fig = make_subplots(
rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.05,
row_heights=[0.7, 0.3], subplot_titles=('OHLC with Moving Average and Bollinger Bands', 'Volume')
)
# Plot OHLC candlestick
fig.add_trace(go.Candlestick(
x=data.index, open=data['Open'], high=data['High'], low=data['Low'], close=data['Close'], name="OHLC"), row=1, col=1)
# Add Moving Average and Bollinger Bands
fig.add_trace(go.Scatter(x=data.index, y=data['MA'], mode='lines', name=f'MA {ma_length}', line=dict(color='blue')), row=1, col=1)
fig.add_trace(go.Scatter(x=data.index, y=data['BB_upper'], mode='lines', name='BB Upper', line=dict(color='purple')), row=1, col=1)
fig.add_trace(go.Scatter(x=data.index, y=data['BB_middle'], mode='lines', name='BB Middle', line=dict(color='gray')), row=1, col=1)
fig.add_trace(go.Scatter(x=data.index, y=data['BB_lower'], mode='lines', name='BB Lower', line=dict(color='purple')), row=1, col=1)
# Plot Volume
fig.add_trace(go.Bar(x=data.index, y=data['Volume'], name='Volume', marker=dict(color='green')), row=2, col=1)
# Customize layout
fig.update_layout(
height=700, showlegend=True,
legend=dict(orientation='h', yanchor='bottom', y=-0.15, xanchor='center', x=0.5),
xaxis_rangeslider_visible=False, dragmode='drawline' if draw_mode else 'zoom'
)
# Enable dynamic y-axis range
fig.update_yaxes(autorange=True)
return fig
# Gradio UI
def update_chart(ma_length, drawline_button):
draw_mode = True if drawline_button == 'Draw Line' else False
return plot_chart(ma_length, draw_mode)
ma_length_input = gr.Number(value=10, label="Moving Average Length", interactive=True, step=1, minimum=1)
drawline_button = gr.Button("Draw Line")
chart_output = gr.Plot()
gr.Interface(
fn=update_chart,
inputs=[ma_length_input, drawline_button],
outputs=[chart_output],
title="Interactive Technical Analysis Dashboard",
description="Choose moving average length and toggle line drawing mode."
).launch()