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)