importMetaTrader5asmt5importpandasaspdfromdatetimeimportdatetime,timedeltaimportosimportsys# Parâmetros de login
login=1520378657# Substitua pelo seu número de login
senha="AA6=J?j67mU"# Substitua pela sua senha
servidor="FTMO-Demo2"# Substitua pelo nome do servidor
mt5_path=r"C:\Program Files\FTMO MetaTrader 5\terminal64.exe"# Caminho do MetaTrader 5
# Inicializa a conexão com o MetaTrader 5
ifnotmt5.initialize(path=mt5_path):print("Falha ao inicializar o MetaTrader 5")mt5.shutdown()exit()# Tenta fazer login na conta específica
ifnotmt5.login(login,password=senha,server=servidor):print("Falha ao fazer login no MetaTrader 5")print("Erro:",mt5.last_error())mt5.shutdown()exit()# Verifica as informações da conta
conta_info=mt5.account_info()ifconta_infoisNone:print("Falha ao obter informações da conta")mt5.shutdown()exit()print("Conectado à conta:",conta_info.login)print("Nome do servidor:",conta_info.server)# Define o ativo e o período de análise
ativo="US30.cash"# Nome do ativo (Dow Jones)
periodo=mt5.TIMEFRAME_M1# Timeframe de 1 minuto
data_inicio=datetime(2024,7,15)# Data inicial
data_fim=datetime.now()# Data final (hoje)
# Pega os dados históricos de candles entre as datas especificadas
dados_candles=mt5.copy_rates_range(ativo,periodo,data_inicio,data_fim)# Converte os dados para um DataFrame para melhor visualização
df=pd.DataFrame(dados_candles)# Verifica se o DataFrame está vazio
ifdf.empty:print("Nenhum dado foi retornado. Verifique a conexão com o MetaTrader 5 e a disponibilidade do ativo.")mt5.shutdown()exit()# Exibe informações sobre o DataFrame
print("Formato do DataFrame:",df.shape)print("Colunas do DataFrame:",df.columns)print("Tipos de dados das colunas:")print(df.dtypes)# Salva o DataFrame como CSV para inspeção
df.to_csv('dados_us30_1629_1630.csv',index=False)print("Dados salvos em 'dados_us30_1629_1630.csv'")# Verifica se a coluna 'time' existe
if'time'notindf.columns:print("A coluna 'time' não foi encontrada. Verifique o nome correto da coluna de tempo.")# Tenta encontrar uma coluna que possa ser a de tempo
time_columns=df.select_dtypes(include=['int64','float64']).columnsiflen(time_columns)>0:time_column=time_columns[0]print(f"Usando a coluna '{time_column}' como coluna de tempo.")df['time']=pd.to_datetime(df[time_column],unit='s')else:print("Nenhuma coluna numérica encontrada para usar como tempo.")mt5.shutdown()exit()else:df['time']=pd.to_datetime(df['time'],unit='s')# Filtra os candles das 16:29 e 16:30 (horário MT5)
df_1629=df[df['time'].dt.time==datetime.strptime("16:29","%H:%M").time()]df_1630=df[df['time'].dt.time==datetime.strptime("16:30","%H:%M").time()]# Exibe os resultados filtrados
print("\nCandle das 16:29:")print(df_1629)print("\nCandle das 16:30:")print(df_1630)# Inicializa contadores para as estatísticas
stats={'0':0,'0-500':0,'500-1000':0,'1000-1500':0,'1500-2000':0,'2000-2500':0,'2500-3000':0,'3000-3500':0,'3500-4000':0,'4000-4500':0,'4500-5000':0,'5000-5500':0,'5500-6000':0,'6000-6500':0,'6500-7000':0,'7000-7500':0,'7500-8000':0,'8000-8500':0,'8500-9000':0,'9000-9500':0,'9500-10000':0,'10000+':0}# Inicializa contadores para as novas estatísticas
rompimentos_um_lado=0rompimentos_dois_lados=0sem_rompimentos=0# Inicializa uma lista para armazenar os detalhes dos rompimentos
detalhes_rompimentos=[]# Calcula os rompimentos do candle das 16:30 em relação ao das 16:29
foriinrange(min(len(df_1629),len(df_1630))):data=df_1629.iloc[i]['time'].date()max_1629=df_1629.iloc[i]['high']min_1629=df_1629.iloc[i]['low']max_1630=df_1630.iloc[i]['high']min_1630=df_1630.iloc[i]['low']volume_1629=df_1629.iloc[i]['tick_volume']volume_1630=df_1630.iloc[i]['tick_volume']tamanho_1629=(max_1629-min_1629)*100# Multiplicado por 100
tamanho_1630=(max_1630-min_1630)*100# Multiplicado por 100
rompimento_baixo=(min_1629-min_1630)*100ifmin_1630<min_1629else0rompimento_cima=(max_1630-max_1629)*100ifmax_1630>max_1629else0# Adiciona os detalhes à lista
detalhes_rompimentos.append({'DT':data,'RBaixo':rompimento_baixo,'RCima':rompimento_cima,'V29':volume_1629,'V30':volume_1630,'T29':tamanho_1629,'T30':tamanho_1630})# Atualiza as estatísticas para rompimento baixo e cima
forrompimentoin[rompimento_baixo,rompimento_cima]:ifrompimento==0:stats['0']+=1elif0<rompimento<=500:stats['0-500']+=1elif500<rompimento<=1000:stats['500-1000']+=1elif1000<rompimento<=1500:stats['1000-1500']+=1elif1500<rompimento<=2000:stats['1500-2000']+=1elif2000<rompimento<=2500:stats['2000-2500']+=1elif2500<rompimento<=3000:stats['2500-3000']+=1elif3000<rompimento<=3500:stats['3000-3500']+=1elif3500<rompimento<=4000:stats['3500-4000']+=1# Continue a adicionar as condições conforme necessário
# Aqui você pode adicionar mais lógica para análise ou visualização dos resultados