使用 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
  • MetaTrader5 (mt5):MetaTrader 5 的内部图书馆和金融服务。
  • pandas (pd):Usada para manipulação de bados em DataFrames。
  • 日期时间:操作符和数据格式和时间。
  • os、sys:用于处理文件和系统参数的操作。
  • openpyxl:用于 Excel 的文件和操作。
  • numpy (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
  • 定义为 MetaTrader 5 或 MT5 应用程序的登录凭据。
  • 分析配置:

    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)
  • 定义金融(例如:“US30”)、时间框架、蜡烛图特定时间和数据间隔。
  • 时间框架词典:

    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"
    }
  • MT5 法律规定时间范围转换器词典。
  • 初始登录 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()
  • 登录 MetaTrader 5 并以凭证身份登录。 Se falhar,o 脚本终端。
  • 请参阅以下详细信息:

    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)
  • Coleta 历史上的蜡烛没有特定的时间间隔,主要是在时间范围内。
  • DataFrame 的对话:

    df_menor = pd.DataFrame(dados_candles_menor)
    df_maior = pd.DataFrame(dados_candles_maior)
  • 将蜡烛转换为 DataFrame 以便于分析 pandas。
  • 验证数据:

    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()
  • 验证 DataFrames 是这样的。 Se estiverem,o 脚本终点。
  • 对话节奏:

    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)
  • Exibe os 蜡烛过滤。
  • 统计信息联系人姓名:

    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
    ...
  • 计算作为媒体和媒体的dados coletados。
  • 相关问题:

    estatisticas = f"""
    Total de dias analisados: {len(df_candle_menor)}
    ...
    """
  • Cria um 与字符串格式有关,作为统计数据和详细信息。
  • Salvando 结果如下:

    with open(nome_arquivo_txt, 'w') as arquivo:
        arquivo.write(estatisticas)
  • 请参阅文本文档中的相关内容。
  • 在 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.
  • MetaTrader 5 描述:

    mt5.shutdown()
  • 完成与 MetaTrader 5 的连接。
  • 详细分析

    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