使用 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