DEV Community

Cover image for Este código realiza uma análise de rompimentos de preços de um ativo em duas timeframes usando a API MetaTrader 5 (MT5)
Henrique Vital
Henrique Vital

Posted on

Este código realiza uma análise de rompimentos de preços de um ativo em duas timeframes usando a API MetaTrader 5 (MT5)

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
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode
  • 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"
}
Enter fullscreen mode Exit fullscreen mode
  • 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()
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode
  • 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()
Enter fullscreen mode Exit fullscreen mode
  • 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')
Enter fullscreen mode Exit fullscreen mode
  • 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()]
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode
  • Exibe os candles filtrados.

Inicialização de contadores para estatísticas:

stats = {
    '0': 0,
    '0-500': 0,
    '500-1000': 0,
    '1000-1500': 0,
    ...
}
Enter fullscreen mode Exit fullscreen mode
  • 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
    ...
Enter fullscreen mode Exit fullscreen mode
  • 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
...
Enter fullscreen mode Exit fullscreen mode
  • Calcula as médias e medianas dos dados coletados.

Geração de relatórios:

estatisticas = f"""
Total de dias analisados: {len(df_candle_menor)}
...
"""
Enter fullscreen mode Exit fullscreen mode
  • 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)
Enter fullscreen mode Exit fullscreen mode
  • Salva o relatório em um arquivo de texto.

Salvando em Excel:

wb = Workbook()
ws = wb.active
...
wb.save(nome_arquivo_excel)
Enter fullscreen mode Exit fullscreen mode
  • Salva os detalhes dos rompimentos em um arquivo Excel, aplicando cores para distinguir os dias da semana.

Desconexão do MetaTrader 5:

mt5.shutdown()
Enter fullscreen mode Exit fullscreen mode
  • 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
Enter fullscreen mode Exit fullscreen mode

Top comments (0)