MQL5 – Robôs de Investimentos

Um robô de investimento (ou Expert Advisor) é uma ferramenta que realiza negociações de ativos financeiros de forma automática, baseado numa estratégia/algoritmo programado, a técnica é chamada de algorithmic trading. Robôs apenas executam aquilo que foram programados para executar.

Tipos de Robôs

LFT (Low Frequency Taders) – Maior Latência
HFT (Hight Frequency Taders ) – Milissegundos

O LFT é o mais comum e acessível para pessoas físicas operarem, visto que o HFT exige uma infra-estrutura maior os tornando mais caros, geralmente usados por grandes empresas que atuam no mercado financeiro.

Linguagem e plataforma

A linguagem de programação utilizada para fazer robôs abordada nesse artigo é o MQL 5, uma linguagem próxima a Java, C# e C++, e a plataforma que executa nossos robôs é o MetaTrader 5.

O MetaTrader é uma plataforma de visualização de preços e negociação de ativos financeiros em bolsas de valores do mundo inteiro, inclusive podemos operar ela de forma manual, executando nossas ordens de compra e venda, mas também ela nos da a possibilidade de criarmos nossos robôs e deixa-los executando de forma automática no mercado.

Desenvolvido pela empresa MetaQuotes, uma empresa Russa, é distribuído de forma gratuita para nós Traders. Em 2005 surge a primeira versão já chamada de MetaTrader 4, e em 2010 a atualização para MetaTrader 5 que é uma versão mais madura da ferramenta utilizada até os dias atuais.

É preciso fazer o roteamento com uma corretora para que possamos ter acesso aos ativos financeiros que estão na bolsa, aqui no Brasil a maioria das corretoras já se integram com o MetaTrader de forma gratuita.

É possível criar contas Demo e testar o MetaTrader com dinheiro fictício, para estudar a própria ferramenta como para estudar o mercado financeiro.

O site do MetaTrader 5 é: https://www.metatrader5.com/pt

Existe uma vasta documentação, também em português, e um fórum de ajuda no site do MetaTrader.

Plataforma de Desenvolvimento

O MetaEditor é a IDE que é instalada em conjunto com o MetaTrader, e é nele que iremos escrever nossos códigos e estratégias para o robô.

Para criar um novo arquivo:

Menu Arquivo > Novo Arquivo (ou CTRL + N)

Escolhemos dentre as opções que aparecem, Expert Advisor (modelo).

Informar um nome para seu Robô.

É criado a estrutura básica do arquivo para iniciarmos o nosso robô, com pelo menos os 3 métodos obrigatórios que temos que ter: OnInit(), OnDeinit() e OnTick().

Nossos arquivos podem ter a extensão .ex5 que é o arquivo compilado, ou seja a caixa preta, e/ou a extensão .mq5 que é o aquivo que criamos e editamos nossas estratégias programadas para o robô executar.

Estrutura básica do Arquivo (Funções)

OnInit():

  • É a primeira função chamada no carregamento do robô ao gráfico.
  • É onde fazemos o carregamento dos indicadores, validação de conta de acesso com a corretora.
  • Configurações primárias, que bastam ser definidas uma única vez.

OnDeinit():

  • É executado ao remover o robô, as ações que devem ser executadas ao desligar o robô devem estar nessa função.

OnTick():

  • Toda vez que houver uma operação de compra ou venda, essa função é chamada.
  • Nessa função que iremos colocar a maior parte da nossa estratégia.

Função Extra

OnTimer():

  • É um temporizador, mas ele precisa de uma função auxiliar chamada EventSetTimer() que pode ficarno OnInit() por exemplo, e ser chamada de 10 em 10 segundos por exemplo, esse valor é configurável.
  • Então, a cada tantos segundos o EventSetTimer() chama a função OnTimer();
  • O EventKillTimer() mata essa execução do temporizador.

Dicas:

Coloque o curso em cima de qualquer método ou função e pressione F1 para ver a documentação do mesmo.

// representa o comentário.
/* */ representa comentário de várias linhas.
CTRL + ; – Gera um separador dessa forma – //—
CRTL + . – Gera um bloco de separação como abaixo:
CTRL + ~ – Comentário de um trecho de código selecionado.
CTRL + ç – Descomenta o passo anterior.

//+——————————————————————+
//| |
//+——————————————————————+

Includes de Bibliotecas de Terceiros:

As bibliotecas de terceiros devem estar na pasta include.

É praticamente um import em outras linguagens.

Colocar no topo do seu código antes da primeira função.

Exemplos:
#include <nome-da-biblioteca>
#include <VirtualKeys.mqh>
#include <Canvas/FlameCanvas.mqh>

Sintaxe da Linguagem

Tipos de Variáveis:

  • int, char, short, uchar, ushort, uint (u apenas para valores positivos)
  • float, double
  • string
  • bool (false is default)
  • datetime

Declaração das variáveis:

  • tipo nome_var = atribuição
  • int ano = 2019;
  • int var2;
  • ushort var3 = 100;
  • double preco = 41.55;
  • float preco2 = 5.61;
  • string alerta = “alerta de alvo”;
  • bool resultado = x > y;
  • datetime hoje;
  • datetime data = D’2019.01.20 10:00:00′;
  • datetime data2 = D’2019.01.20 10′;
  • datetime data3 = D’2019.01.20′;

Declaração de Constante:

  • #define PI 3.14.15
  • #define NOME_EMPRESA “Nome da empresa”
  • não precisa do ; no final nem do sinal de atribuição =

Vetores/Arrays:

  • int array1[3]; (Array de 3 posições de tamanho, de 0 a 2).
  • array1[0] = 44; (posição 1)
  • array1[1] = 95; (posição 2)
  • array1[2] = 78; (posição 3)
  • double array2[3] = {5.2, 4.6, 2.8};

Laços de Repetição (For)

  • Dica: Escreva for e tecle TAB que ele já monta a estrutura do for.

for(int i=0; i<10; i++) { }

Enum

  • Dica: Escreva enum e tecle TAB que ele monta a estrutura.

enum name { };

enum ESTACOES_ANO {
primavera, //0
verao, //1
outono, //2
inverno, //3
}

ESTACOES_ANO estacao;
estacao = verao; (estacao = 1)

Definindo os valores:

enum ESTACOES_ANO {
primavera = 44,
verao = 75,
outono = 66,
inverno = 25,
}

Variáveis do Tipo Input

  • Parâmetros que o usuário pode colocar.
  • Colocar no topo junto com as variáveis globais.
  • As frases nos comentários é como vão aparecer na aba parâmetros, caso queiramos customizar, ao invés de aparecer o nome exato da variável input.

input int numPeriodos = 11; // Nº de Períodos
input string comentario = ” “; // Comentários

Declaração de Funções

  • Sem retorno (void).

void minhaFuncao(double a, double b) {
double soma = a + b;
Print(“Soma = “, soma);
}

  • Com retorno.

double minhaFuncao2(double n, double m) {
double div = n / m;
return div;
}

Variáveis Locais e Globais

  • variáveis dentro de funções tem escopo local.
  • variáveis globais devem estar no topo do arquivo/classe, fora de qualquer método/função para estar acessível em qualquer parte do código.

Variáveis pré-definidas pelo MQL5

_Symbol = Nome do ativo financeiro. Ex: PETR4
_Period = Período na escala gráfica. EX: M1, M5, M15.
_Point = Pontos que oscilam no gráfico. Ex: 0.01
_Digits = Numero de dígitos de casas decimais do ativo atual. Ex.: 2

Operações Matemáticas e Relações lógicas

Atalhos interessantes:

CTRL + G: Retira a Grade.

Sobre Haylson Martins

Me chamo Haylson Martins, formado em Sistemas de Informação, trabalho com T.I de forma geral desde 2002 com suporte depois na área de negócio e treinamentos, e com Desenvolvimento para Sistemas Web desde 2010 com linguagem principal o Java. Amo tecnologia, amo aprender coisas novas, gosto de ensinar embora não seja essa a minha pretensão. Por meio desse blog pretendo reforçar o que ando aprendendo e estudando de outras linguagens e tecnologias, e principalmente como uma espécie de bloco de notas para consultas posteriores e quem sabe também ajude outras pessoas que estudam e têm as mesmas dúvidas que já tive ou que ainda tenho. Vamos começar?

2 comentários

  1. Parabéns pelo post Haylson, está muito interessante, sucesso!

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *