使用 API MetaTrader 5 (MT5) 可以实现对时间范围内的预付款和时间框架的分析
我们可以使用 API MetaTrader 5 (MT5) 来实现对时间范围内的预付款的分析。蜡烛历史记录、预计算和统计数据以文本格式和 Excel 格式提供。 Vamos 修订了以下代码:
导入内容:
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
登录和配置参数:
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
分析配置:
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)
时间框架词典:
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"
}初始登录 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()请参阅以下详细信息:
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)历史铭牌系列:
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)
DataFrame 的对话:
df_menor = pd.DataFrame(dados_candles_menor) df_maior = pd.DataFrame(dados_candles_maior)
验证数据:
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()对话节奏:
df_menor['time'] = pd.to_datetime(df_menor['time'], unit='s') df_maior['time'] = pd.to_datetime(df_maior['time'], unit='s')
Filtragem dos 蜡烛:
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()]
过滤结果如下:
print(f"\nCandle das {hora_candle_menor}:")
print(df_candle_menor)
print(f"\nCandle das {hora_candle_maior}:")
print(df_candle_maior)统计信息联系人姓名:
stats = {
'0': 0,
'0-500': 0,
'500-1000': 0,
'1000-1500': 0,
...
}循环计算 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
...媒体和媒体计算:
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 ...
相关问题:
estatisticas = f"""
Total de dias analisados: {len(df_candle_menor)}
...
"""Salvando 结果如下:
with open(nome_arquivo_txt, 'w') as arquivo:
arquivo.write(estatisticas)在 Excel 中复制:
wb = Workbook() ws = wb.active ... wb.save(nome_arquivo_excel)
MetaTrader 5 描述:
mt5.shutdown()
详细分析
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