Este código realiza uma análise de rompimentos de preços de um ativo em duas timeframes usando a API MetaTrader 5 (MT5). Ele coleta dados históricos de candles, calcula rompimentos de preços e gera estatísticas em formato texto e Excel. Vamos revisar o código linha por linha:
Importações:
import MetaTrader5 as mt5 import pandas as pd from datetime import datetime import os import sys from openpyxl import Workbook from openpyxl.styles import PatternFill import numpy as np - MetaTrader5 (mt5): Biblioteca para interagir com o MetaTrader 5 e acessar dados financeiros.
- pandas (pd): Usada para manipulação de dados em DataFrames.
- datetime: Manipula e formata datas e horas.
- os, sys: Usadas para manipulação de caminhos de arquivos e argumentos do sistema.
- openpyxl: Para criar e manipular arquivos Excel.
- numpy (np): Para operações numéricas, como calcular médias e medianas.
Parâmetros de login e configurações:
login = 1510028989 # Substitua pelo seu número de login senha = "w2@138y5$QjHD" # Substitua pela sua senha servidor = "FTMO-Demo" # Substitua pelo nome do servidor mt5_path = r"C:\Program Files\FTMO MetaTrader 5\terminal64.exe" # Caminho do MetaTrader 5 - Define as credenciais de login para o MetaTrader 5 e o caminho do aplicativo MT5.
Configurações de análise:
ativo = "US30.cash" # Nome do ativo timeframe_menor = mt5.TIMEFRAME_M1 # Timeframe menor (ex: 1 minuto) timeframe_maior = mt5.TIMEFRAME_M1 # Timeframe maior (ex: 1 minuto) hora_candle_menor = "16:29" # Hora do candle menor hora_candle_maior = "16:30" # Hora do candle maior data_inicio = datetime(2024, 9, 1) # Data inicial data_fim = datetime.now() # Data final (hoje) - Define o ativo financeiro (ex: "US30"), timeframes para as velas, hora específica dos candles e intervalo de datas.
Dicionário de timeframes:
timeframe_dict = { mt5.TIMEFRAME_M1: "1 Minuto", mt5.TIMEFRAME_M5: "5 Minutos", mt5.TIMEFRAME_M15: "15 Minutos", mt5.TIMEFRAME_M30: "30 Minutos", mt5.TIMEFRAME_H1: "1 Hora", mt5.TIMEFRAME_H4: "4 Horas", mt5.TIMEFRAME_D1: "Diário", mt5.TIMEFRAME_W1: "Semanal", mt5.TIMEFRAME_MN1: "Mensal" } - Dicionário para converter os códigos de timeframe do MT5 para nomes legíveis.
Inicialização e login no MetaTrader 5:
if not mt5.initialize(path=mt5_path): print("Falha ao inicializar o MetaTrader 5") mt5.shutdown() exit() if not mt5.login(login, password=senha, server=servidor): print("Falha ao fazer login no MetaTrader 5") print("Erro:", mt5.last_error()) mt5.shutdown() exit() - Inicializa a conexão com o MetaTrader 5 e tenta fazer login usando as credenciais fornecidas. Se falhar, o script termina.
Pega informações da conta:
conta_info = mt5.account_info() if conta_info is None: print("Falha ao obter informações da conta") mt5.shutdown() exit() print("Conectado à conta:", conta_info.login) print("Nome do servidor:", conta_info.server) - Obtém e exibe as informações da conta, como número de login e servidor.
Coleta de dados históricos:
dados_candles_menor = mt5.copy_rates_range(ativo, timeframe_menor, data_inicio, data_fim) dados_candles_maior = mt5.copy_rates_range(ativo, timeframe_maior, data_inicio, data_fim) - Coleta dados históricos dos candles no intervalo de tempo especificado para os timeframes menor e maior.
Conversão dos dados para DataFrames:
df_menor = pd.DataFrame(dados_candles_menor) df_maior = pd.DataFrame(dados_candles_maior) - Converte os dados de candles para DataFrames do pandas para facilitar a análise.
Verificação de dados vazios:
if df_menor.empty or df_maior.empty: print("Nenhum dado foi retornado. Verifique a conexão com o MetaTrader 5 e a disponibilidade do ativo.") mt5.shutdown() exit() - Verifica se os DataFrames estão vazios. Se estiverem, o script termina.
Conversão de tempo:
df_menor['time'] = pd.to_datetime(df_menor['time'], unit='s') df_maior['time'] = pd.to_datetime(df_maior['time'], unit='s') - Converte a coluna de timestamps para o formato datetime legível.
Filtragem dos candles:
df_candle_menor = df_menor[df_menor['time'].dt.time == datetime.strptime(hora_candle_menor, "%H:%M").time()] df_candle_maior = df_maior[df_maior['time'].dt.time == datetime.strptime(hora_candle_maior, "%H:%M").time()] - Filtra os candles para obter apenas os que correspondem às horas especificadas.
Exibição dos resultados filtrados:
print(f"\nCandle das {hora_candle_menor}:") print(df_candle_menor) print(f"\nCandle das {hora_candle_maior}:") print(df_candle_maior) - Exibe os candles filtrados.
Inicialização de contadores para estatísticas:
stats = { '0': 0, '0-500': 0, '500-1000': 0, '1000-1500': 0, ... } - Inicializa um dicionário para contar os rompimentos em diferentes faixas de valor.
Loop para calcular rompimentos:
for i in range(min(len(df_candle_menor), len(df_candle_maior))): data = df_candle_menor.iloc[i]['time'].date() max_menor = df_candle_menor.iloc[i]['high'] min_menor = df_candle_menor.iloc[i]['low'] max_maior = df_candle_maior.iloc[i]['high'] min_maior = df_candle_maior.iloc[i]['low'] volume_menor = df_candle_menor.iloc[i]['tick_volume'] volume_maior = df_candle_maior.iloc[i]['tick_volume'] tamanho_menor = (max_menor - min_menor) * 100 tamanho_maior = (max_maior - min_maior) * 100 rompimento_baixo = (min_menor - min_maior) * 100 if min_maior < min_menor else 0 rompimento_cima = (max_maior - max_menor) * 100 if max_maior > max_menor else 0 ... - Itera sobre os dados para calcular os rompimentos entre os candles de timeframe menor e maior. Calcula o tamanho dos candles e o rompimento em cima e embaixo.
Cálculo de médias e medianas:
media_rompimento_baixo = total_rompimento_baixo / len(df_candle_menor) if len(df_candle_menor) > 0 else 0 media_rompimento_cima = total_rompimento_cima / len(df_candle_menor) if len(df_candle_menor) > 0 else 0 media_volume_menor = total_volume_menor / len(df_candle_menor) if len(df_candle_menor) > 0 else 0 ... - Calcula as médias e medianas dos dados coletados.
Geração de relatórios:
estatisticas = f""" Total de dias analisados: {len(df_candle_menor)} ... """ - Cria um relatório em formato de string com as estatísticas e detalhes dos rompimentos.
Salvando resultados em arquivo:
with open(nome_arquivo_txt, 'w') as arquivo: arquivo.write(estatisticas) - Salva o relatório em um arquivo de texto.
Salvando em Excel:
wb = Workbook() ws = wb.active ... wb.save(nome_arquivo_excel) - Salva os detalhes dos rompimentos em um arquivo Excel, aplicando cores para distinguir os dias da semana.
Desconexão do MetaTrader 5:
mt5.shutdown() - Finaliza a conexão com o MetaTrader 5.
Este código é uma análise detalhada
python import MetaTrader5 as mt5 import pandas as pd from datetime import datetime import os import sys from openpyxl import Workbook from openpyxl.styles import PatternFill import numpy as np # Parâmetros de login login = 1510028989 # Substitua pelo seu número de login senha = "w2@138y5$QjHD" # Substitua pela sua senha servidor = "FTMO-Demo" # Substitua pelo nome do servidor mt5_path = r"C:\Program Files\FTMO MetaTrader 5\terminal64.exe" # Caminho do MetaTrader 5 # Configurações de análise ativo = "US30.cash" # Nome do ativo timeframe_menor = mt5.TIMEFRAME_M1 # Timeframe menor (ex: 5 minutos) timeframe_maior = mt5.TIMEFRAME_M1 # Timeframe maior (ex: 4 horas) hora_candle_menor = "16:29" # Hora do candle menor hora_candle_maior = "16:30" # Hora do candle maior data_inicio = datetime(2024, 9, 1) # Data inicial data_fim = datetime.now() # Data final (hoje) # Dicionário para converter timeframes para strings legíveis timeframe_dict = { mt5.TIMEFRAME_M1: "1 Minuto", mt5.TIMEFRAME_M5: "5 Minutos", mt5.TIMEFRAME_M15: "15 Minutos", mt5.TIMEFRAME_M30: "30 Minutos", mt5.TIMEFRAME_H1: "1 Hora", mt5.TIMEFRAME_H4: "4 Horas", mt5.TIMEFRAME_D1: "Diário", mt5.TIMEFRAME_W1: "Semanal", mt5.TIMEFRAME_MN1: "Mensal" } # Inicializa a conexão com o MetaTrader 5 if not mt5.initialize(path=mt5_path): print("Falha ao inicializar o MetaTrader 5") mt5.shutdown() exit() # Tenta fazer login na conta específica if not mt5.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() if conta_info is None: print("Falha ao obter informações da conta") mt5.shutdown() exit() print("Conectado à conta:", conta_info.login) print("Nome do servidor:", conta_info.server) # Pega os dados históricos de candles dados_candles_menor = mt5.copy_rates_range(ativo, timeframe_menor, data_inicio, data_fim) dados_candles_maior = mt5.copy_rates_range(ativo, timeframe_maior, data_inicio, data_fim) # Converte os dados para DataFrames para melhor visualização df_menor = pd.DataFrame(dados_candles_menor) df_maior = pd.DataFrame(dados_candles_maior) # Verifica se os DataFrames estão vazios if df_menor.empty or df_maior.empty: print("Nenhum dado foi retornado. Verifique a conexão com o MetaTrader 5 e a disponibilidade do ativo.") mt5.shutdown() exit() # Converte a coluna 'time' para datetime df_menor['time'] = pd.to_datetime(df_menor['time'], unit='s') df_maior['time'] = pd.to_datetime(df_maior['time'], unit='s') # Filtra os candles de acordo com as horas especificadas df_candle_menor = df_menor[df_menor['time'].dt.time == datetime.strptime(hora_candle_menor, "%H:%M").time()] df_candle_maior = df_maior[df_maior['time'].dt.time == datetime.strptime(hora_candle_maior, "%H:%M").time()] # Exibe os resultados filtrados print(f"\nCandle das {hora_candle_menor}:") print(df_candle_menor) print(f"\nCandle das {hora_candle_maior}:") print(df_candle_maior) # 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 = 0 rompimentos_dois_lados = 0 sem_rompimentos = 0 # Inicializa uma lista para armazenar os detalhes dos rompimentos detalhes_rompimentos = [] # Variáveis para calcular médias total_rompimento_baixo = 0 total_rompimento_cima = 0 total_volume_menor = 0 total_volume_maior = 0 tamanhos_menor = [] tamanhos_maior = [] # Calcula os rompimentos do candle maior em relação ao menor for i in range(min(len(df_candle_menor), len(df_candle_maior))): data = df_candle_menor.iloc[i]['time'].date() max_menor = df_candle_menor.iloc[i]['high'] min_menor = df_candle_menor.iloc[i]['low'] max_maior = df_candle_maior.iloc[i]['high'] min_maior = df_candle_maior.iloc[i]['low'] volume_menor = df_candle_menor.iloc[i]['tick_volume'] volume_maior = df_candle_maior.iloc[i]['tick_volume'] tamanho_menor = (max_menor - min_menor) * 100 # Multiplicado por 100 tamanho_maior = (max_maior - min_maior) * 100 # Multiplicado por 100 rompimento_baixo = (min_menor - min_maior) * 100 if min_maior < min_menor else 0 rompimento_cima = (max_maior - max_menor) * 100 if max_maior > max_menor else 0 # Atualiza totais para cálculo de médias total_rompimento_baixo += rompimento_baixo total_rompimento_cima += rompimento_cima total_volume_menor += volume_menor total_volume_maior += volume_maior tamanhos_menor.append(tamanho_menor) tamanhos_maior.append(tamanho_maior) # Adiciona os detalhes à lista detalhes_rompimentos.append({ 'DT': data, 'RBaixo': rompimento_baixo, 'RCima': rompimento_cima, 'VMenor': volume_menor, 'VMaior': volume_maior, 'TMenor': tamanho_menor, 'TMaior': tamanho_maior }) # Atualiza as estatísticas para rompimento baixo e cima for rompimento in [rompimento_baixo, rompimento_cima]: if rompimento == 0: stats['0'] += 1 elif 0 < rompimento <= 500: stats['0-500'] += 1 elif 500 < rompimento <= 1000: stats['500-1000'] += 1 elif 1000 < rompimento <= 1500: stats['1000-1500'] += 1 elif 1500 < rompimento <= 2000: stats['1500-2000'] += 1 elif 2000 < rompimento <= 2500: stats['2000-2500'] += 1 elif 2500 < rompimento <= 3000: stats['2500-3000'] += 1 elif 3000 < rompimento <= 3500: stats['3000-3500'] += 1 elif 3500 < rompimento <= 4000: stats['3500-4000'] += 1 elif 4000 < rompimento <= 4500: stats['4000-4500'] += 1 elif 4500 < rompimento <= 5000: stats
Top comments (0)