trading-bot / app.py
GingerBreadXD's picture
Update app.py
0d87c9e
import yfinance as yf
import pandas as pd
import streamlit as st
import numpy as np
import plotly.graph_objs as go
import plotly.offline as pyo
import pandas_ta as ta
st.header("Enter Market/Stock Ticker")
symbol = st.text_input('Enter Symbol', "ADANIENT.NS")
period = st.text_input('Enter Time Period', "60d")
"""(use *"60d"* for min intervals and date(MM-DD-YYY) for other intervals)"""
interval = st.text_input('Enter Time Interval', "30m")
def get_data():
df = yf.download(symbol, period=period, interval=interval)
#'2021-03-01', '2023-03-01'
#df = yf.download(symbol, period, interval)
df = df.drop(columns=['Volume', 'Adj Close'], axis=1)
df.reset_index(inplace=True)
return(df)
data = get_data()
def movingAvgs(mov1: int, mov2: int):
data["sma100"] = ta.ema(data["Close"], length=mov1)
data["sma21"] = ta.ema(data["Close"], length=mov2)
for i in range(len(data)):
# ! BULLISH
data.loc[data['sma21'] >= data["sma100"], 'movAvgSignal'] = 1
# ! BEARISH
data.loc[data['sma21'] <= data["sma100"], 'movAvgSignal'] = -1
def iMACD():
data['ema5'] = data['Close'].rolling(window=5).mean()
data['ema13'] = data['Close'].rolling(window=13).mean()
data['i_macd'] = data['ema5'] - data['ema13']
return data
def plot_iMACD():
dfpl = data[5500:]
fig = go.Figure()
fig.add_trace(go.Scatter(x=data.index, y=data.ema5,
mode='lines', line_color='red', name='5-day EMA'))
fig.add_trace(go.Scatter(x=data.index, y=data.ema13,
mode='lines', line_color='green', name='13-day EMA'))
fig.update_layout(title='IMPulse MACD Chart',
xaxis_title='Date',
yaxis_title='IMPulse MACD')
fig.show()
return data
def ene_iMACD( diff: int ):
data['ptc_change'] = (data['ema13'] - data['ema5']).pct_change(periods=1)
data['short_long'] = 0
# SHORT == -1
# LONG == 1
# Default ptc_change difference == 0.037
data.loc[data['ptc_change'] >= diff, 'short_long'] = 1
data.loc[(data['ptc_change'] <= diff) & (data['ptc_change'] >= -diff), 'short_long'] = -1
data.loc[data['ptc_change'] <= -diff, 'short_long'] = 1
#counts = data['short_long'].value_counts()
#print(counts)
return data
def ene_SMI( n: int ): # n = number of lookback days (default = 20)
# BOLLINGER BANDS
std_20d = data['Close'].rolling(n).std()
data['m_bband'] = data['Close'].rolling(n).mean()
data['u_bband'] = data['m_bband'] + std_20d * 1.5
data['l_bband'] = data['m_bband'] - std_20d * 1.5
#KELTNER CHANNELS
atr_20d = ta.atr(data["High"], data["Low"], data["Close"], length=n)
data['m_keltb'] = ta.ema(data['Close'], length = n)
data['u_keltb'] = data['m_keltb'] + (1.5 * atr_20d)
data['l_keltb'] = data['m_keltb'] - (1.5 * atr_20d)
high_h = data['High'].rolling(n).max()
low_l = data['Low'].rolling(n).min()
hl_avg = (high_h + low_l) / 2
hl_mean = (data['m_bband'] + hl_avg) / 2
delta = data.Close - hl_mean
data['delta'] = delta.rolling(n).mean()
return data
def squeeze():
data['sqz'] = 0
#sqzOn = (lowerBB > lowerKC) & (upperBB < upperKC)
data.loc[(data.l_bband > data.l_keltb) & (data.u_bband < data.u_keltb), 'sqz'] = 1
#sqzOff = (lowerBB < lowerKC) & (upperBB > upperKC)
data.loc[(data.l_bband < data.l_keltb) & (data.u_bband > data.u_keltb), 'sqz'] = -1
#noSqz = (sqzOn == False) & (sqzOff == False)
last_squeeze = 0
for i in range(len(data)):
# check for bullish signal
if data.loc[i, 'sqz'] == 1:
if last_squeeze == 0 or last_squeeze == -1:
data.loc[i, 'sqz'] = 1
last_squeeze = 1
elif last_squeeze == 1 and i < len(data) - 1 and data.loc[i+1, 'sqz'] != data.loc[i, 'sqz']:
data.loc[i, 'sqz'] = 0
else:
data.loc[i, 'sqz'] = 0
# check for bearish signal
elif data.loc[i, 'sqz'] == -1:
if last_squeeze == 0 or last_squeeze == 1:
data.loc[i, 'sqz'] = -1
last_squeeze = -1
elif last_squeeze == -1 and i < len(data) - 1 and data.loc[i+1, 'sqz'] != data.loc[i, 'sqz']:
data.loc[i, 'sqz'] = 0
else:
data.loc[i, 'sqz'] = 0
else:
data.loc[i, 'sqz'] = 0
data['sqz_label'] = np.where(data.sqz == 1, 'ON', np.where(data.sqz == -1, 'OFF', ''))
return data
def TSI(n1, n2):
ap = (data['High'] + data['Low'] + data['Close']) / 3
esa = ap.ewm(span=n1, min_periods=n1).mean()
d = abs(ap - esa).ewm(span=n1, min_periods=n1).mean()
ci = (ap - esa) / (0.015 * d)
tci = ci.ewm(span=n2, min_periods=n2).mean()
data['TSI'] = tci
return data
def signals(delta_h: int, delta_l: int):
last_signal = 0
for i in range(len(data)):
# check for bullish signal
if data.loc[i, 'delta'] >= delta_h:
#if last_signal == 0 or last_signal == -1:
data.loc[i, 'signal'] = 1
# last_signal = 1
#elif last_signal == 1 and i < len(data) - 1 and data.loc[i+1, 'delta'] != data.loc[i, 'delta']:
# data.loc[i, 'signal'] = 0
#else:
# data.loc[i, 'signal'] = 0
# check for bearish signal
elif data.loc[i, 'delta'] <= delta_l:
#if last_signal == 0 or last_signal == 1:
data.loc[i, 'signal'] = -1
# last_signal = -1
#elif last_signal == -1 and i < len(data) - 1 and data.loc[i+1, 'delta'] != data.loc[i, 'delta']:
# data.loc[i, 'signal'] = 0
#else:
# data.loc[i, 'signal'] = 0
else:
data.loc[i, 'signal'] = 0
return data
def plot_SMI(data):
fig = go.Figure()
fig.add_trace(go.Scatter(x=data.index, y=data.u_bband,
mode='lines', line_color='red', name='Upper Bollinger Band'))
fig.add_trace(go.Scatter(x=data.index, y=data.l_bband,
mode='lines', line_color='red', name='Lower Bollinger Band'))
#fig.add_trace(go.Scatter(x=data.index, y=data.m_keltb,
# mode='lines', line_color='green', name='Middle Kelter Channel'))
fig.add_trace(go.Scatter(x=data.index, y=data.u_keltb,
mode='lines', line_color='green', name='Upper Kelter Channel'))
fig.add_trace(go.Scatter(x=data.index, y=data.l_keltb,
mode='lines', line_color='green', name='Lower Kelter Channel'))
fig.update_layout(title='SMI Chart',
xaxis_title='Date',
yaxis_title='SMI')
return fig.show()
#fig, ax = plt.subplots(figsize=(20,5))
#ax.plot(data.loc[data['signal'] == 1].index, data['Close'][data['signal'] == 1], '^', markersize=10, color='g', label='Buy Signal')
#ax.plot(data.loc[data['signal'] == -1].index, data['Close'][data['signal'] == -1], 'v', markersize=10, color='r', label='Sell Signal')
#plt.show()
def plot_Signals(data):
linechart = go.Scatter(x=data.index,
y=data['Close'],
mode='lines',
name='Closing Prices')
buy_signals = data[data['signal'] == 1]
sell_signals = data[data['signal'] == -1]
buy_trace = go.Scatter(x=buy_signals.index,
y=buy_signals['Close'],
mode='markers',
marker=dict(symbol='triangle-up', size=10, color='green'),
name='Buy Signal')
sell_trace = go.Scatter(x=sell_signals.index,
y=sell_signals['Close'],
mode='markers',
marker=dict(symbol='triangle-down', size=10, color='red'),
name='Sell Signal')
#annot_trace = go.Scatter(x=data.index, y=data.Close, mode='text', name='Squeeze Status',
# text=data.sqz_label, textposition='bottom center', showlegend=False)
data = [linechart, buy_trace, sell_trace]#, annot_trace]
fig = go.Figure(data=data)
#fig.show()
return fig
def plot_TSI(data):
data['above_zero'] = data['TSI'] > 0
# Create traces for above and below zero
trace_above = go.Scatter(x=data.index,
y=data['TSI'],
mode='lines',
name='TSI line above 0',
fill='tozeroy', # fill above the line
fillcolor='green',
line=dict(color='green'),
opacity=0.5, # set the opacity to 0.5 to see the line
visible='legendonly', # only show in legend
showlegend=True # show in legend
)
trace_below = go.Scatter(x=data.index,
y=data['TSI'],
mode='lines',
name='TSI line below 0',
fill='tozeroy', # fill below the line
fillcolor='red',
line=dict(color='red'),
opacity=0.5, # set the opacity to 0.5 to see the line
visible='legendonly', # only show in legend
showlegend=True # show in legend
)
fig = go.Figure()
fig.add_trace(trace_above)
fig.add_trace(trace_below)
# Update the layout
fig.update_layout(
title='TSI line',
xaxis_title='Date',
yaxis_title='TSI',
legend=dict(
title='TSI lines',
orientation='h',
yanchor='bottom',
y=1.02,
xanchor='right',
x=1
),
)
return fig
def refresh_page():
st.experimental_rerun()
if __name__ == '__main__':
st.header("Calculate the Simple Moving Averages (Moving Average Crossovers)")
#st.subheader("movingAvgs( 1st Moving Average Period, 2nd Moving Average Period)")
#movAvg1 = st.text_input('Enter SMA 1 period: ', 21)
#movAvg2 = st.text_input('Enter SMA 2 period: ', 7)
#movAvg1 = int(movAvg1)
#movAvg2 = int(movAvg2)
#movingAvgs(movAvg1,movAvg2)
movingAvgs(21, 7)
iMACD()
#ene_iMACD(0.035)
#st.header("Calculate the Squeeze Momentum Indicator values")
#smi_timef = st.text_input('Enter SMI lookback period ', 7)
#smi_timef = int(smi_timef)
#ene_SMI(smi_timef)
ene_SMI(7)
squeeze()
st.header("Calculate the BUY/SELL Signals")
signals_b = st.text_input('Enter BUY threshold (positive)', 30)
signals_s = st.text_input('Enter SELL threshold (negative)', -32)
signals_b = int(signals_b)
signals_s = int(signals_s)
signals(signals_b, signals_s)
#st.dataframe(signals(signals_b, signals_s))
#plot_SMI(data)
TSI(10,21)
if st.button('Refresh'):
refresh_page()
st.header("Visualize the BUY/SELL Signals")
#st.plotly_chart(plot_Signals(data))
fig = plot_Signals(data)
st.plotly_chart(fig)
#fig2 = plot_TSI(data)
#st.plotly_chart(fig2)