|
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
|
|
|
|
|
|
symbols = pd.read_csv('data/Ticker_List_NSE_India.csv')
|
|
|
|
|
|
app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP])
|
|
|
|
|
|
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 = "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="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(
|
|
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
|
|
|
|
|
|
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__":
|
|
|
|
open('assets/backtest_results.html', 'w').close()
|
|
open('assets/SMC.html', 'w').close()
|
|
|
|
app.run(debug=True) |