Neo traderBot

Neo traderBot

Você sabia?

Abordamos o tema de automatização de estratégias em NTSL, MQL5 e NinjaScript!

Extraindo dados históricos da MetaTrader

Ter dados históricos é algo muito importante para realização de backtesting de estratégias automatizadas e robôs. Tê-los em alta frequência pode ser ainda mais interessante pois permitirá ampliar bastante o espectro de estratégias a serem desenvolvidas.

Sabemos, porém, da dificuldade de se obter os dados históricos e, neste artigo, eu vou mostrar o passo a passo para extrair dados da MetaTrader 5. Assim, você poderá começar a montar a sua própria base de dados!

Primeiramente, vou explicar como obter os dados pela interface gráfica. Em seguida, vou compartilhar um código em Python para que você extraia dados de tick dos ativos que desejar (disponíveis no servidor de dados de sua corretora) de forma automatizada!

Não é minha intenção ensinar como instalar a plataforma MetaTrader, pois acredito ser um processo bem tranquilo e com boas orientações pelas corretoras. Acesse o site de sua corretora e siga o passo-a-passo. A MetaTrader é geralmente disponibilizada gratuitamente.

Assista abaixo ao vídeo que fizemos explicando todo o processo de exportação. O roteiro também está descrito nas seções seguintes.

Reproduzir vídeo

Exportando dados com tempo gráfico maior que 1 minuto

1) Com a plataforma MetaTrader aberta e adequadamente conectada ao servidor de sua corretora, clique no menu superior na opção “Exibir”, em seguida “Ativos”.

2) Para exportar dados em tempo gráfico superior a 1 MINUTO, na janela que abrir, vá na aba “Barras”. Você poderá digitar qual ativo deseja obter os dados históricos, o tempo gráfico (onde M refere-se a minuto, H a hora), a data/hora início e data/hora fim que deseja.

3) O processo de download pode demorar alguns segundos dependendo do período selecionado, tempo gráfico e carga no servidor naquele momento. Caso haja dados para os filtros realizados, estes aparecerão em um formato de tabela, conforme figura abaixo.

4) Por fim, clique no botão no canto inferior esquerdo “Exportar barras” e exporte os dados para um arquivo csv na pasta que desejar.

Exportando dados de tick

1) Com a plataforma MetaTrader aberta e adequadamente conectada ao servidor de sua corretora, clique no menu superior na opção “Exibir”, em seguida “Ativos”.

2) Para exportar dados de tick, na janela que abrir, vá na aba “Ticks”. Você poderá digitar qual ativo deseja obter os dados históricos, se deseja todos os ticks (bid/ask/last e volume), bem como a data/hora início e data/hora fim que deseja. Recomenda-se puxar os dados por dia pois é um volume grande de informação e o intervalo de dados pode não ser apresentado em sua totalidade na tela.

3) O processo de download pode demorar alguns segundos dependendo do período selecionado e a carga no servidor naquele momento. Caso haja dados para os filtros realizados, estes aparecerão em um formato de tabela, conforme figura abaixo.

4) Por fim, clique no botão no canto inferior esquerdo “Exportar ticks” e exporte os dados para um arquivo csv na pasta que desejar.

Automatizando a exportação de tick com Python (API Mt5)

1) Com a plataforma MetaTrader aberta e adequadamente conectada ao servidor de sua corretora, certifique-se que a MetaTrader está com o “Algotrading habilitado”. Se aparecer o ícone de stop é porque o algotrading está habilitado, o que permitirá conexões ao MetaTrader pela API.

2) Para rodar o código abaixo, é necessário que tenha a versão 3.10 do Python, pois a API da MetaTrader não é compatível com versões mais recentes na data em que escreve esse documento (26-jan-2023).

3) Para instalar o Python, acesse esse link e busque pela versão mais adequada ao seu computador.

4) Instale o python, e em seguida em um terminal de comando (bash ou cmd). Já tendo configurado as variáveis de ambiente do sistema para localizar o comando “python”, instale o pip e as bibliotecas MetaTrader5, pandas, pytz. Utilizando o comando python -m pip install XXXX, onde XXXX é a biblioteca desejada.

5) Por fim, abra um editor de texto (ex: Notepad++) e copie/cole o código abaixo. Configure os valores das variáveis:

  • root_folder: Pasta de destino para salvar a exportação de dados da MetaTrader;
  • asset_list: array de string dos ativos que deseja obter dados históricos de ticks;
  • start_date: Data início do intervalo desejado;
  • end_date: Data fim do intervalo desejado.
				
					import MetaTrader5 as mt5
import pandas as pd
import datetime
import pytz
import os

# Configurando ambiente
timezone = pytz.timezone("Etc/UTC")
root_folder = 'C:/Users/BLA/Desktop/HIST_DATA/_Base_ticks/'

# Variáveis para obtenção de dados tick a tick
# Lista IBOV por ordem de participação do índice
asset_list = [
'VALE3',
'ITUB4',
'PETR4']


start_date = datetime.datetime(2020, 1, 1, tzinfo=timezone)
end_date = datetime.datetime.today().replace(tzinfo=timezone)

# Função que busca dados de ticks de determinado ativo em uma data e armazena em um arquivo csv
def getTickData(asset, date, filepath):
    utc_start = date + datetime.timedelta(hours=9)
    utc_end = date + datetime.timedelta(hours=20)

    tick_data = mt5.copy_ticks_range(asset, utc_start, utc_end, mt5.COPY_TICKS_INFO)
    if len(tick_data) != 0:
        print("Qtde de ticks: ",len(tick_data), "\t Arquivo: ", filepath)
    
        df = pd.DataFrame(tick_data)
        df['time']=pd.to_datetime(df['time_msc'], unit='ms')
        df.to_csv(filepath, sep=";", index=False)

# Testa se consegue conectar a aplicação do MT5
if not mt5.initialize():
    print('Conexão falhou. Código de erro: ', mt5.last_error())
    quit()
else:
    for asset in asset_list:
        # Criar pasta do ativo se não existir
        assetTickDataPath = root_folder + asset + '/'
        isExist = os.path.exists(assetTickDataPath)
        if not isExist:
            os.makedirs(assetTickDataPath)

        symbol_sel = mt5.symbol_select(asset,True)
        if not symbol_sel:
            print('Ativo não pode ser selecionado: ', asset)
            mt5.shutdown()
        else:
            hist_date = start_date
            # Percorre todos os dias desde a data início até a data fim, excluindo fim de semana
            while hist_date <= end_date:
                if hist_date.weekday() not in (5,6):
                    # Checa se já tem arquivo com dados, se não tiver contínua
                    file = str(hist_date.year) + "{:02d}".format(int(hist_date.month)) + "{:02d}".format(int(hist_date.day)) + '.csv'
                    if (not os.path.exists(assetTickDataPath + file)):
                        getTickData(asset,hist_date, assetTickDataPath + file)
                hist_date = hist_date + datetime.timedelta(days=1)

    mt5.shutdown()
				
			

6) Copie o código fonte que você configurou as variáveis, abra um terminal de comando (cmd ou bash) e abra o python.

7) Cole o código e aguarde a execução, pressione ENTER e aguarde a execução!

OBS: Os dados serão exportados em pastas separadas por ativo e arquivos separados por data. Caso não existam as pastas, elas serão criadas. Caso já exista um arquivo com a data para determinado ativo, os dados não serão exportados novamente. O código irá imprimir na tela um log para que você acompanhe se a exportação está ocorrendo conforme esperado.

Um Presente para Comunidade

Em breve, irei disponibilizar aqui um programa que realiza a exportação automatizada para que você apenas informe os filtros e execute todo o código Python sem ter que lidar com código fonte.

Para ser informado, quando o programa estiver diponibilizado, inscreva-se no Canal YouTube da Comunidade, pois irei informar por algum Short.

Espero que este conteúdo tenha sido útil para você e que permita começar a construir a sua própria base de dados, preparando-se para realizar backtesting em janela histórica com o devido rigor estatístico necessário para validar uma estratégia automatizada e um robô.

Até o próximo artigo!

2 Comments

  • Moito

    Setembro 24, 2023

    Excelente conteúdos dessa comunidade.
    Tks por compartilhar conhecimentos.
    forte abraço

    Reply
    • Johnathas

      Setembro 29, 2023

      TMJ!

      Reply

Leave a Comment