from dash import Dash, dcc, html, Input, Output from analysis import calc_emas, find_intersections, interpolate_intersection, calculate_profit import plotly.graph_objects as go import json import datetime app = Dash(__name__) # pull stock data from json files timestamps_file = open('timestamps.json', 'r') timestamps_file_data = timestamps_file.read() timestamps_raw = json.loads(timestamps_file_data) timestamps = [datetime.datetime.fromtimestamp(t) for t in timestamps_raw] prices_file = open('close_prices.json', 'r') prices = json.loads(prices_file.read()) ema_5 = calc_emas(5, prices) ema_13 = calc_emas(13, prices) intersection_indices = find_intersections(ema_5, ema_13, offset=13) # offset so don't calculate the SMA days interpolated_intersections = [interpolate_intersection(indices, timestamps, ema_5, ema_13) for indices in intersection_indices] intersected_x = [] intersected_y = [] for x,y in interpolated_intersections: intersected_x.append(x) intersected_y.append(y) profit = calculate_profit(ema_5, ema_13, prices, timestamps, 13) buy_info = profit[-2] buy_x = [] buy_y = [] for x,y,_ in buy_info: buy_x.append(x) buy_y.append(y) sell_info = profit[-1] sell_x = [] sell_y = [] for x,y,_ in sell_info: sell_x.append(x) sell_y.append(y) print("Result Analysis:\n", "Percent gain/loss:\t", profit[0]) percent_gain = profit[0] * 100 app.layout = html.Div([ html.H4('Interactive color selection with simple Dash example'), html.P("Select color:"), dcc.Dropdown( id="dropdown", options=['Gold', 'MediumTurquoise', 'LightGreen'], value='Gold', clearable=False, ), dcc.Graph(id="graph"), html.P("If bought and sold on these signals, the percent gain/loss would be: " + str(round(percent_gain, 4))) ]) @app.callback( Output("graph", "figure"), Input("dropdown", "value")) def display_color(color): fig = go.Figure( [ go.Scatter(name='Price', x=timestamps, y=prices, line=dict(color='rgb(0, 255, 0)'), mode='lines'), # go.Scatter(name='5 day EMA', x=timestamps, y=ema_5, line=dict(color='rgb(0, 255, 0)'), mode='lines'), # go.Scatter(name='13 day EMA', x=timestamps, y=ema_13, line=dict(color='rgb(0, 0, 255)'), mode='lines'), # go.Scatter(name='EMA Intersections', x=intersected_x, y=intersected_y, line=dict(color='rgb(255, 0, 0)'), mode='markers') go.Scatter(name='Buys', x=buy_x, y=buy_y, line=dict(color='rgb(0, 0, 255)'), mode='markers', marker_size=10), go.Scatter(name='Sells', x=sell_x, y=sell_y, line=dict(color='rgb(255, 255, 0)'), mode='markers', marker_size=10), ] ) return fig app.run(debug=True)