import matplotlib matplotlib.use('Agg') import streamlit as st import pandas as pd import datetime as dt from yahooquery import Ticker import plotly.graph_objects as go from collections import OrderedDict import matplotlib import scrap as scraping def flatten(d): ''' Flatten an OrderedDict object ''' result = OrderedDict() for k, v in d.items(): if isinstance(v, dict): result.update(flatten(v)) else: result[k] = v return result def rastreador(): #código para ativar bootstrap css st.markdown( """ """,unsafe_allow_html=True ) col1, col2,col3 = st.columns([0.1,0.4,0.1]) with col2: st.title('Rastreador de oportunidades por setup') st.expander('Este rastreador identifica oportunidades para swing trade vasculhando as principais ações listadas na B3, o filtro consiste em encontrar ativos que tenham médias móveis exponenciais de 9 e 72 cruzadas para cima') st.subheader('Aplique alguns filtros para acelerar o rastreador') st.write('Serão rastreadas apenas as ações listadas na tabela filtrada abaixo') PVP_máximo = float(st.number_input(label='PVP máximo',value=1.0)) Patr_liq_min = int(st.number_input(label='Patrimônio líquido mínimo',value=1000000000)) cotacao_max = float(st.number_input(label='Cotação máxima',value=100)) lista = scraping.get_data() todos = pd.DataFrame(flatten(lista).keys()).transpose() todos.columns = todos.iloc[0] for i in range(len(lista)): todos = pd.concat([todos,pd.DataFrame(lista[i]).transpose()]) todos = todos.iloc[1:] todos = todos.replace(',','.', regex=True) todos = todos.apply(pd.to_numeric,errors='ignore').round(2) todos['Pat.Liq'] = todos['Pat.Liq'].str.replace(r"[^0-9]+", '').replace('.','').replace(',','').replace('-','').astype(float) todos = todos.loc[(todos['P/VP']<= PVP_máximo) & (todos['Pat.Liq']>= Patr_liq_min) & (todos['cotacao']<= cotacao_max)] show = todos.reset_index() st.dataframe(show) st.subheader('Setup') col1, col2,col3 = st.columns([0.1,0.4,0.1]) with col2: st.checkbox('Médias móveis exponenciais de 9 e 72 cruzadas para cima') if st.button("Iniciar rastreador"): # lista = scraping.get_data() # todos = pd.DataFrame(flatten(lista).keys()).transpose() # todos.columns = todos.iloc[0] # for i in range(len(lista)): # todos = pd.concat([todos,pd.DataFrame(lista[i]).transpose()]) # todos = todos.iloc[1:] # todos = todos.replace(',','.', regex=True) # todos = todos.apply(pd.to_numeric,errors='ignore').round(2) # todos['Pat.Liq'] = todos['Pat.Liq'].str.replace(r"[^0-9]+", '').replace('.','').replace(',','').replace('-','').astype(float) # todos = todos.loc[(todos['P/VP']<= PVP_máximo) & (todos['Pat.Liq']>= Patr_liq_min) & (todos['cotacao']<= cotacao_max)] start = (dt.datetime.today() + dt.timedelta(days=-300)).strftime(format='20%y-%m-%d') dia_limite = (dt.datetime.today() + dt.timedelta(days=-30)).strftime(format='20%y-%m-%d') with st.expander("Aguarde estamos vasculhando todas as ações da bolsa (Mantenha esta barra minimizada)!"): save = [] #for i in range(len(tudo)): for i in range(len(todos)): try: #nome_do_ativo = str(tudo.iloc[i][0] + '.SA') nome_do_ativo = str(todos.index[i] + '.SA') #filtra todos que cruzaram média nos últimos 50 dias pelo menos try: df = Ticker(nome_do_ativo ,country='Brazil') time = df.history( start= start ) rolling_9 = time['close'].rolling(window=9) rolling_mean_9 = rolling_9.mean().round(1) rolling_72 = time['close'].rolling(window=72) rolling_mean_72 = rolling_72.mean().round(1) time['MM9'] = rolling_mean_9.fillna(0) time['MM72'] = rolling_mean_72.fillna(0) time['cruzamento'] = time['MM9'] - time['MM72'] buy = time.tail(50).loc[(time.tail(50)['cruzamento']==0)] except: exit except: exit if buy.empty == False: try: #filtra todo mundo que tem a MM 72 > que a MM 9 e quem tem volume do último dia > 5000 if time['MM72'].iloc[-1] < time['MM9'].iloc[-1] and time.tail(1)['volume'][0] > 10000: save.append(buy.index[0][0]) print(buy.index[0][0]) #layout = go.Layout(title="Resultados",xaxis=dict(title="Data"), yaxis=dict(title="Preço R$")) #fig = go.Figure(layout = layout) #fig.add_trace(go.Candlestick(x=time.reset_index()['date'][-50:], open=time['open'][-50:],high=time['high'][-50:],low=time['low'][-50:],close=time['close'][-50:])) #fig.update_layout(autosize=False,width=1000,height=800,) #fig.show() #print() else: continue except: exit else: exit st.dataframe(save) save = pd.DataFrame(save) from plotly.subplots import make_subplots for i in range(len(save)): df = Ticker(save.iloc[i] ,country='Brazil') time = df.history( start= start ) fig = make_subplots(rows=2, cols=1, shared_xaxes=True, vertical_spacing=0.03, subplot_titles=(st.write(save.iloc[i]), 'Volume'), row_width=[0.2, 0.7]) # Plot OHLC on 1st row fig.add_trace(go.Candlestick(x=time.reset_index()['date'][-90:], open=time['open'][-90:], high=time['high'][-90:], low=time['low'][-90:], close=time['close'][-90:], name="OHLC"), row=1, col=1) # Bar trace for volumes on 2nd row without legend fig.add_trace(go.Bar(x=time.reset_index()['date'][-90:], y=time['volume'][-90:], showlegend=False), row=2, col=1) # Do not show OHLC's rangeslider plot fig.update(layout_xaxis_rangeslider_visible=False) #fig.update_layout(autosize=False,width=800,height=800, paper_bgcolor='rgba(0,0,0,0)', plot_bgcolor='rgba(0,0,0,0)') fig.update_layout(height=600, showlegend=False, paper_bgcolor='rgba(255,255,255,0.9)', plot_bgcolor='rgba(255,255,255,0.9)') #width=800 , fig.update_yaxes(showgrid=True, gridwidth=0.1, gridcolor = 'rgb(240,238,238)') st.plotly_chart(fig,use_container_width=True)