Invicto69's picture
Upload 6 files
7d8ad6e verified
raw
history blame
4.66 kB
from dash import Dash, Input, Output, State, callback, dcc, html
import dash_bootstrap_components as dbc
import pandas as pd
from indicators import SMC
from data_fetcher import fetch
from strategies import smc_plot_backtest, smc_ema_plot_backtest
# Load symbols data
symbols = pd.read_csv('data/Ticker_List_NSE_India.csv')
# Initialize the app with a Bootstrap theme
app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
# Function to create the layout
app.layout = dbc.Container([
dbc.Row([
html.H1("Algorithmic Trading Dashboard", className="text-center mb-4")
]),
dbc.Row([
html.Label("Select Company Name", className="form-label"),
dcc.Dropdown(
id="name",
options=[{"label": name, "value": name} for name in symbols['NAME OF COMPANY'].unique()],
value='',
placeholder="Select a company",
className="mb-3"
),
html.Label("Select Strategy", className="form-label"),
dcc.Dropdown(
id="strategy",
options=['SMC', 'SMC with EMA'],
value='',
placeholder="Select Strategy",
className="mb-3"
),
html.Label("Swing High/Low Window Size", className="form-label"),
dcc.Input(
id="window",
type="number",
value=10,
placeholder="Enter window size",
className="form-control mb-3"
),
]),
html.Div([
dbc.Row([
dbc.Col([
html.Label("Fast EMA Length: ", className="form-label"),
dcc.Input(
id="ema1",
type="number",
value=9,
placeholder="Enter EMA Length",
# className="form-control mb-3"
className = "text-nowrap"
),
], md=8),
dbc.Col([
html.Label("Slow EMA Length: ", className="form-label"),
dcc.Input(
id="ema2",
type="number",
value=21,
placeholder="Enter EMA size",
# className="form-control mb-3"
className="text-nowrap"
),
dbc.Col([dcc.Checklist(['Close on EMA crossover'], id='closecross', className="text-nowrap")]),
]),
]),
], style={'display': 'block'}, id='smc_ema'
),
dbc.Button("Run", id="submit-button", color="primary", className="w-100 mb-4"),
dbc.Row([
html.H5("Order Block Chart", className="text-center mb-3"),
html.Iframe(
src="assets/SMC.html",
style={"height": "450px", "width": "95%", "border": "none"},
className="mb-4"
),
html.H5("Backtest Results", className="text-center mb-3"),
html.Iframe(
src="assets/backtest_results.html",
style={"height": "1067px", "width": "95%", "border": "none"}
),
])
], fluid=True)
@callback(
Output("smc_ema", 'style'),
Input("strategy", 'value')
)
def update_layout(strategy):
if strategy=='SMC with EMA':
return {'display':'block'}
else:
return {'display':'none'}
# Callback for updating the visualizations
@callback(
Input("submit-button", "n_clicks"),
State("name", "value"),
State("window", "value"),
State("strategy", "value"),
State("ema1", "value"),
State("ema2", "value"),
State("closecross", "value")
)
def update_visuals(n_clicks, name, window, strategy, ema1, ema2, closecross):
if n_clicks <= 0 or not name:
return
# Clear existing files
open('assets/backtest_results.html', 'w').close()
open('assets/SMC.html', 'w').close()
ticker = symbols[symbols['NAME OF COMPANY'] == name]['YahooEquiv'].values[0]
data = fetch(ticker, '1mo', '15m')
fig = SMC(data=data, swing_hl_window_sz=window).plot(show=False).update_layout(title=dict(text=ticker))
print(strategy)
if strategy=='SMC':
smc_plot_backtest(data, 'assets/backtest_results.html', swing_hl=window)
elif strategy=='SMC with EMA':
smc_ema_plot_backtest(data, 'assets/backtest_results.html', ema1, ema2, closecross)
fig.write_html('assets/SMC.html')
if __name__ == "__main__":
# Clear initial files
open('assets/backtest_results.html', 'w').close()
open('assets/SMC.html', 'w').close()
app.run(debug=True)