Introdução ao MetaTrader 5 e programação com MQL5 Crie seu 1º Robô de Investimentos com MQL5, passo a passo do ZERO.
Todos os direitos reservados. Este e-book ou qualquer parte dele não pode ser reproduzido ou usado de forma alguma sem autorização expressa, por escrito, do autor ou editor, exceto pelo uso uso de citações breves breves em uma resenha do ebook. Primeira edição, 2018.
(
[email protected])) Autor: Rafael F. V. C. Santos (
[email protected] Especialista em gestão estratégica de riscos aplicados ao mercado financeiro. Trabalha com o desenvolvimento de estratégias automatizadas de investimentos (Robôs de investimentos - Expert Advisor) utilizando machine learning learning e estatística espacial. Formado em Engenharia Química pela Universidade Federal de Pernambuco (UFPE). Possui mestrado e doutorado em Engenharia Civil (UFPE) nas áreas de caracterização, modelagem e simulação estatística, aplicadas a poços e reservatórios de petróleo. Possui diversos artigos, com o tema de estatística aplicada, publicados em revistas e congressos nacionais e internacionais.
Copyright©2018 de Rafael F. V. C. Santos.
Introdução ao MetaTrader 5 e programação com MQL5 Crie seu 1º Robô de Investimentos com MQL5, passo a passo do ZERO.
Todos os direitos reservados. Este e-book ou qualquer parte dele não pode ser reproduzido ou usado de forma alguma sem autorização expressa, por escrito, do autor ou editor, exceto pelo uso uso de citações breves breves em uma resenha do ebook. Primeira edição, 2018.
(
[email protected])) Autor: Rafael F. V. C. Santos (
[email protected] Especialista em gestão estratégica de riscos aplicados ao mercado financeiro. Trabalha com o desenvolvimento de estratégias automatizadas de investimentos (Robôs de investimentos - Expert Advisor) utilizando machine learning learning e estatística espacial. Formado em Engenharia Química pela Universidade Federal de Pernambuco (UFPE). Possui mestrado e doutorado em Engenharia Civil (UFPE) nas áreas de caracterização, modelagem e simulação estatística, aplicadas a poços e reservatórios de petróleo. Possui diversos artigos, com o tema de estatística aplicada, publicados em revistas e congressos nacionais e internacionais.
Copyright©2018 de Rafael F. V. C. Santos.
Sumário Sumário 1. Introdução 1.1. Era Di Digital gital 1.2. 1. 2. In Inte teli ligê gênc ncia ia Arti Artifi fici cial al 1.3. Robôs de de Alta Frequência - HFT 1.4. Program amaação de Computadores 1.5. 1. 5. O que que ir irem emos os ap apre rend nder er?? 1.6. Por que o MetaTrader 5? 1.7. Estratég tégia ia do do Robô 1.8. 1. 8. Va Vant ntag agen enss de Util Utiliz izar ar Robô Robôss 1.9. Resumo mo d doo E-book 2. MetaTrad adeer 5 2.1.. Bai 2.1 Baixan xando do e ins instal taland andoo o Meta MetaTra Trader der 5 2.2. Principa ipais is elementos elementos do MetaTrader 5 2.3. Campo Navegador 2.4. 2. 4. Ca Camp mpoo Caix Caixaa de Ferr Ferram amen enta tass 2.5. Visualiz alizaando Velas de Preços 2.6. Salvand ndoo Templates Templates de de Visualizações Visualizações 2.7. 2. 7. De Dese senh nhan ando do Ob Obje jeto toss 2.8. Transição nsição entre entre Tempos Gráficos 2.9. 2. 9. Ad Adiç ição ão de In Indi dica cado dore ress 2.10.
Janela de de Da Dados
3. Comu muni niddad adee MQ MQL5 4. Met etaE aEdi dito torr MQL MQL55 4.1. MetaEditor 4.2. 4. 2. Cr Cria iand ndoo um um nov novoo Pro Proje jeto to 4.3. OnInit() 4.4. OnDeinit()
4.5. OnTick() 4.6. Elementos Acessórios de Programação 4.6.1. Comentários 4.7. Propriedades do Robô 4.8. Tipos de Arquivos MetaTrader e MetaEditor 4.9. Adicionando Bibliotecas 5. Lógica Básica de Programação com MQL5 5.1. Tipos de Variáveis 5.2. Declaração de Variáveis 5.2.1. Tipo Inteiro 5.2.2. Tipo Double 5.2.3. Tipo String 5.2.4. Tipo bool 5.2.5. Tipo Datetime 5.3. Declarando Constantes 5.4. Vetores de Variáveis: Arrays 5.5. Laço de Repetição For 5.6. Enum 5.7. Variáveis do Tipo Input 5.8. Variáveis Locais e Globais 5.8.1. Variáveis locais 5.8.2. Variáveis Globais 5.9. Variáveis Predefinidas pelo MQL5 5.10.
Operações Matemáticas
5.11.
Relações Lógicas e Condicionais
5.12.
Operador Ternário
5.13.
Métodos ou Funções
5.14.
Variáveis de Candles e Tick
5.15.
Funções Comment() e Alert()
5.15.1. Comment() 5.15.2. Alert() 5.16.
Adicionando Indicadores MQL5
6. Programando o Robô de Investimentos 6.1. Descrição geral da Estratégia 6.1.1. Médias Móveis 6.1.2. Índice de Força Relativa (IFR) 6.2. Criando o EA 6.3. Declaração de Variáveis Globais 6.3.1. Variáveis para o Usuário 6.3.2. Variáveis Gerais 6.4. Seção de Inicialização: OnInit() 6.5. Seção de desinicialização: OnDeinit() 6.6. Funções Do Expert Advisor 6.6.1. Tratamento de Erros 6.7. Seção de OnTick() 7. Backtests 7.1. Backtest no MetaTrader 5 7.2. Analisando o Backtest 7.3. Gráficos de Desempenho
Capítulo 1 1. Introdução 1.1.
Era Digital
Estamos vivendo na era digital. Hoje em dia, as informações e conhecimentos trafegam através das fibras óticas. Tudo está em constante desenvolvimento e crescimento acelerado. Essa dinâmica evolutiva é sem precedentes na história da humanidade. Os dispositivos e objetos estão se tornando cada vez mais inteligentes e independentes. Atualmente, já é possível encontrar, à venda, celulares e relógios inteligentes que carregam com até mesmo a temperatura do corpo humano. Pesquisas mostram que até 2025, pelo menos, metade da frota de veículos dos EUA estarão trafegando de maneira completamente autônoma. Isso mesmo a profissão de motorista, taxista e muitas outras, estão com seus dias contados. E para o mercado financeiro isso não é diferente. Traders profissionais estão sendo substituídos por algoritmos. Estes são apenas pequenos exemplos da avalanche de modificações e benefícios trazidos a partir do mundo que grita por mudanças. Estamos mudando o mundo e o mundo nos obrigando a mudar em um círculo virtuoso de prosperidade. 1.2.
Inteligência Artificial
Os sistemas embarcados aos poucos estão dominando nosso cotidiano. As pessoas e coisas estão se tornando cada vez mais conectadas à internet. Uma nova inteligência é criada a partir desse novo cosmo. Estamos abrindo as portas para a Inteligência Artificial (IA). Praticamente todos se beneficiam (ou se beneficiarão) de alguma forma das maravilhas trazidas pela IA. Muitos dizem que essa nova geração poderá nos trazer problemas, mas devemos ser otimistas diante das incertezas, pois estamos indo rumo a um caminho inevitável e sem volta. Atualmente, diversas empresas e fundos de investimentos trabalham
massivamente com a utilização de inteligência artificial para a tomada de decisão de seus investimentos. A partir da IA, podemos filtrar e agrupar informações e conhecimentos escondidos em dados numéricos aparentemente sem sentido e conexão. Nessa corrida, leva vantagem quem dominar assuntos e conhecimentos relacionados à matemática, estatística e programação de computadores. 1.3.
Robôs de Alta Frequência - HFT
Os investidores e especuladores do mercado financeiro sabem que o principal inimigo para se ganhar dinheiro nesse mundo é justamente o fator emocional. Seres humanos possuem desejos, vontades, ganâncias, receios e medos que tornam a atividade de decidir o melhor momento de comprar e/ou vender um verdadeiro desafio. Quando estamos trabalhando com Robôs de Investimentos estamos deliberando uma estratégia previamente definida e estruturada para que seja executada em um momento oportuno. Felizmente, robôs não se cansam, estressam ou possuem algum sentimento que possibilite equívocos e/ou vieses na hora de comprar ou vender. As fibras óticas permitiram uma revolução na comunicação. No mundo dos investimentos, por exemplo, cada milésimo de segundo pode custar milhões de dólares. Os chamados robôs de alta frequência (HFTs High Frequency Traders) que operam nas principais bolsas de valores do mundo tomam decisões em velocidades infinitesimais e assim estão ameaçando muitos Brokers e Traders profissionais. A decisão dos HFTs de comprar e/ou vender é tomada em milésimos de segundo, chegando a ser de dez a cinquenta vezes mais rápida do que uma simples piscada do olho humano (que dura aproximadamente 300 milissegundos). É praticamente inviável e injusta a comparação operacional de qualquer sistema computacional dessa categoria com um ser humano normal. Dados recentes (ano de 2018) mostram que mais de 50% das operações financeiras dos EUA são efetuadas por robôs de investimentos. E os resultados mostram que esses robôs podem aumentar os retornos financeiros em até 15%[1]. Existem algumas bolsas de valores onde mais de 90% das
operações são realizadas por robôs de investimentos. 1.4. Programação de Computadores A maioria das pessoas têm as seguintes objeções quando o assunto é programação: é muito difícil, precisa de muita prática, tem que saber muita matemática, nunca fui bom com números. Todavia, muitas dessas objeções não passam de um desconhecimento desta atividade de programar, a qual é tão trivial como contar uma breve história com início meio e fim. O interessante é que qualquer um capaz de escrever os passos de execução de uma receita de bolo em uma folha de papel é capaz de criar um programa de computador. Programar é comunicar-se com o exterior, com o outro, a fim de conduzir ações. Para o nosso caso, esse outro é a máquina. Temos uma estrutura de atividades a ser seguida e precisamos, para uma boa realização da mesma, de uma adequada sequência de ordem de execução. Programar é dominar uma linguagem que a máquina entenda e saber posicionar nossas necessidades deliberativas no tempo e espaço, para que sejam executadas corretamente. Portanto, cabe para todo e qualquer investidor curioso e com paciência de aprender algo novo se debruçar no mundo da programação. Isso porque programar computadores é uma atividade muito mais simples do que muitos imaginam. 1.5.
O que iremos aprender?
Neste e-book iremos aprender como criar, passo a passo, uma estratégia de investimentos automatizada. Iremos criar um Robô de Investimentos completamente do zero utilizando a linguagem de programação MQL5 do MetaTrader 5. Assim, de posse de um programa escrito numa linguagem (MQL5) de alto nível (aquelas mais próximas do entendimento dos humanos, linguagens de baixo nível são mais próximas ao entendimento das máquinas) seremos capazes de deixar o trabalho árduo e cansativo de monitorar gatilhos de compra e venda de um ativo financeiro na bolsa de valores para o robô. Iremos gastar algumas horas para programar um robô conhecido como Expert
dvisor e passar o restante do tempo monitorando a execução da estratégia de uma maneira muito mais tranquila e segura. Assim sobra mais tempo para uma vida contemplativa e prazerosa. 1.6. Por que o MetaTrader 5? O MetaTrader 5 é uma poderosa plataforma de visualização, operação e programação de estratégias de investimentos para os diversos tipos de mercado financeiro. Foi criada no ano de 2005 e continua sendo melhorada e distribuída pela empresa MetaQuotes (https://www.metaquotes.net). Podemos utilizar o MetaTrader 5 para operar mercados à vista, futuros, opções, pares de moedas (FOREX) dentre outros. O MetaTrader 5 foi escolhido, para construir nosso primeiro Robô, por ser uma ferramenta ‘gratuita’, bastante poderosa e completa sob o ponto de vista das principais funcionalidades que uma plataforma de trader deve possuir. Dentro do MetaTrader 5 temos a opção de poder criar scripts, indicadores e, claro, robôs de investimentos utilizando a linguagem de programação MQL5. Essa linguagem é muito semelhante a C++, Java e C#. Portanto, quem já souber alguma delas sentirá extrema facilidade ao aprender MQL5. 1.7.
Estratégia do Robô
Iremos desenvolver, do zero, uma estratégia de cruzamento de duas médias móveis (uma rápida e outra lenta) com a possibilidade de um filtro de entrada no trader com o indicador bastante popular IFR (Índice de força relativa). Nosso robô será multiestratégia. Ele poderá trabalhar, utilizando como gatilho de entrada nas operações, apenas o cruzamento das médias móveis, apenas o IFR ou ambos (cruzamento de médias mais IFR). Iremos aprender também como fazer backtests do robô criado. Assim seremos capazes de testar diversos setups em dados históricos de diversos ativos financeiros. O livro é repleto de orientações, com capturas de telas, de uso dos principais dos campos do MetaTrader 5 e MetaEditor. Vamos aprender a sintaxe de programação no MetaEditor. Temos várias facilidades ao programar com a MQL5. Ela já apresenta um conjunto,
bastante significativo, de bibliotecas para trabalhar com manipulação gráfica, operações matemáticas, estatísticas, com as estruturas de preços e controle de envios de ordens de compra/venda. 1.8.
Vantagens de Utilizar Robôs
Vamos às vantagens por trás da utilização de robôs de investimentos. Elas são muitas, mas vamos às principais: -
1.9.
Elimina todo o lado emocional; Testar estratégias prontas com backtests; Simular situações adversas de mercado; Robôs são livres de cansaço, estresse, perder a atenção, ou deixar de executar a estratégia; Podemos otimizar a estratégia a partir de um Robô; Robôs são infinitamente disciplinados e velozes comparados a nós; É possível fazer validações estatísticas. Robôs estatisticamente validados são vencedores e consistentes no médio e longo prazo. Robôs têm um único mindset que é executar a estratégia programada; Robôs funcionam desde o primeiro segundo de abertura do mercado até o último segundo antes do fechamento sem trégua e desvios de conduta. Resumo do E-book
Então para alcançar o objetivo de criar nosso primeiro Robô de Investimentos, este e-book organiza e simplifica de maneira didática, os passos necessários com os conhecimentos e informações de uso do MetaTrader 5 e de sua linguagem de programação MQL5. Veja um resumo do que você irá aprender com a leitura deste livro: -
Aprender a instalar o MetaTrader 5; Conhecer os principais benefícios do portal online do MetaTrader; Entender as principais funcionalidades e diferenças entre o MetaTrader e MQL5: Aprender a adicionar indicadores e robôs;
-
Conhecer o MetaEditor e alguns dos principais atalhos para facilitar a programação; Aprender a sintaxe de programação do MQL5; Conhecer as principais funções das bibliotecas de desenvolvimento do MQL5. Criar uma estratégia utilizando indicadores de tendência (cruzamento de médias móveis) e de mercado consolidado (Índice de Força Relativa - IFR ); Programar passo a passo um Robô multiestratégia; Fazer backtests do Robô criado; Conhecer as estatísticas dos backtests; E muito mais.
Agora vamos em frente rumo ao futuro dos investimentos. Parabéns pela decisão de entrar nesse grandioso e fascinante mundo dos investimentos automatizados. Obrigado pela confiança na compra deste material. O futuro é por aqui e vamos construí-lo juntos. A todos uma ótima leitura!
Nota Importante[2].
Capítulo 2 2. MetaTrader 5 O MetaTrader é uma plataforma desenvolvida para auxiliar na visualização de preços de ativos financeiros e execução de ordens de compra e venda na bolsa de valores. Também é possível criar scripts (algoritmos destinados a ações específicas), indicadores e robôs de investimentos. É uma ferramenta gratuita desenvolvida e distribuída pela empresa MetaQuotes Softwares (https://www.metaquotes.net/). Inicialmente, foi desenvolvida pensando no mercado de Forex. No entanto, diversas corretoras vêm permitindo o uso em mercado de ações, opções e futuros.
Precisamos de uma empresa (corretora) que forneça o roteamento dos dados de preços para a plataforma. Muitas empresas no mercado brasileiro oferecem esse serviço de maneira gratuita. Algumas oferecem até uma conta demo onde podemos simular operações de compra e venda no mercado financeiro com dinheiro fictício. Também, na conta demo, podemos colocar nossos robôs para testar em tempo real antes de utilizá-los numa conta real. O MetaTrader 4 foi criado em 2005 e desde então vem passando por grande
transformação de melhorias em suas funcionalidades de sistema e segurança. Atualmente, está na sua segunda grande versão chamada de MetaTrader 5 que foi lançado no ano de 2010. Podemos utilizar o MetaTrader tanto em desktop quanto em smartphones. Ele está disponível para trabalhar na Web, nos sistemas Mac, Linux, Windows e Android. Os principais navegadores do mercado suportam o MetaTrader 5 online.
O MetaTrader 5 não é apenas uma ferramenta de visualização e roteamento de ordens de compra e venda de ativos financeiros, mas também uma excelente plataforma de desenvolvimento de estratégias de investimentos a partir de scripts, indicadores e robôs (Experts Advisors). Para isso conta com o ambiente de desenvolvimento para a linguagem MQL5 (MetaQuotes Language) que apresenta grandes semelhanças com o C++, Java e C#. Portanto, aqueles que já tiveram algum conhecimento em alguma dessas linguagens de programação se sentirão bem à vontade com a sintaxe do MQL5. Em comparação ao MetaTrader 4, o MetaTrader 5 permite desenvolver estratégias utilizando o paradigma de programação orientada a objetos (POO).
2.1.
Baixando e instalando o MetaTrader 5
No Brasil diversas corretoras oferecem o uso gratuito do MetaTrader 5. Basta apenas que sejamos um cliente da corretora. No caso da corretora XP Investimentos, podemos ir ao portal de investidor e procurar pelas ferramentas de serviço disponíveis. Lá encontraremos um link para baixar o MetaTrader 5 já com a configuração de roteamento básica necessitada pela plataforma. Precisamos, após o download da plataforma, fazer um pedido de liberação de uma conta demo e/ou real para podermos ter acesso ao roteamento dos dados dos ativos da Bovespa. Outras corretoras como a Rico, Clear, Ágora, Modal permitem procedimentos semelhantes. Caso você não tenha conta em nenhuma dessas corretoras, pode optar pelo download direto da plataforma pelo site: https://www.metaquotes.net/en/metatrader5/mobile-trading. Diversas corretoras pelo mundo oferecem roteamento gratuitos, mas muitas para o mercado de Forex. Algumas corretoras de Forex necessitam apenas de um número de telefone válido para liberar uma conta demo. Neste e-book iremos utilizar o sistemas com os preços de ativos financeiros presentes na bolsa de valores de São Paulo BM&FBovespa. Você, para acompanhar os estudos do livro, não precisa, necessariamente, ter uma conta numa corretora brasileira. O processo de instalação é bem simples e direto. Após dois cliques no arquivo um assistente de instalação irá nos orientar/conduzir com os passos necessários.
Basta ir avançando até o término da instalação. No final será pedida uma conta com login e senha. Ela é necessária para que possamos utilizar os dados de preços dos ativos financeiros. Neste e-book iremos utilizar uma
conta demo da corretora XP Investimentos. Veja abaixo o programa aberto requisitando o login, senha e tipo de servidor (se real ou demo).
2.2.
Principais elementos do MetaTrader 5
Um dos nossos principais interesses é visualizar os preços de ativos a partir das velas (candles sticks). Assim, vamos conhecer as principais funcionalidades de visualização da plataforma MetaTrader 5. No menu: Exibir -> Ativos , temos a opção de escolher os ativos financeiros que desejamos trabalhar.
Podemos escolher entre Ativos da Bovespa e BMF (séries contínuas). Nos ativos da Bovespa temos as OPÇÕES (calls e puts), as ações no A VISTA e os ÍNDICES (mercado futuro) negociados no mercado brasileiro. É importante destacar que cada corretora irá fornecer roteamento de dados distintos. Umas com mais dados e outras com menos. Por exemplo, se estivéssemos com alguma corretora que trabalha com o mercado de Forex, as opções que apareceriam nessa janela de Ativos seria completamente diferente. A adição de um símbolo que representa uma empresa SA, que estamos querendo visualizar os preços, pode ser executada na aba de Observação do Mercado.
Neste campo de Observação do Mercado podemos adicionar os ativos referentes às empresas negociadas na bolsa em que a corretora está liberada a
operar. As empresas SA, para o mercado brasileiro, com seus respectivos símbolos de negociação, podem ser encontradas no site: http://www.bmfbovespa.com.br/pt_br/produtos/listados-a-vista-ederivativos/renda-variavel/empresas-listadas.htm Ainda dentro do campo Observação do Mercado temos a aba Detalhes que oferece informações adicionais com respeito ao ativo financeiro que está sendo avaliado. Abaixo, por exemplo, podemos ver as informações presentes nessa aba para as ações preferenciais da empresa Petrobras. Na aba Negociação temos várias boletas onde podemos efetuar compras e vendas com apenas um clique.
2.3.
Campo Navegador
O campo Navegador é onde contém as informações referentes ao tipo de conta do usuário se demo ou real, bem como os indicadores e robôs de
investimentos disponíveis pela plataforma e os que foram desenvolvidos por nós mesmos. Podemos, ainda nesse campo, escolher o tipo de indicador, script ou robô e arrastá-lo diretamente para o gráfico do ativo financeiro de interesse.
Outra maneira de adicionar indicadores ou robôs de investimentos é a partir do menu Inserir -> indicadores, Inserir -> Expert Advisor (Robôs).
Na figura acima, é possível observar que os indicadores estão separados por indicadores de tendência, osciladores, volumes, Bill Williams e Personalizados. Os indicadores de Tendência, como o próprio nome já diz, são mais indicados para alertar quando o mercado está dentro de algum
comportamento direcional bem definido. Por outro lado, os indicadores Osciladores são mais adequados para avisar oportunidades dentro de um mercado lateralizado, um mercado em consolidação. Bill Williams[3] é um trader muito popular que desenvolveu vários indicadores importantes e bastante utilizados. Por isso, foi criada uma seção específica para os indicadores criados por ele. É interessante a possibilidade que temos de utilizar indicadores e Robôs nativos do próprio MetaTrader e indicadores e Robôs criados por nós ou até mesmo oferecidos na aba Mercado do campo Caixa de Ferramentas . 2.4.
Campo Caixa de Ferramentas
No campo Caixa de Ferramentas podemos encontrar diversas informações importantes com respeito à venda dos principais indicadores e robôs de investimentos desenvolvidos para plataforma MetaTrader. Também podemos baixar os fornecidos gratuitamente (aba Biblioteca). Podemos visualizar as principais noticias (aba Notícias) em tempo real de pregão como mercado em leilão e saída de notícias relevantes para o mercado.
Na aba Experts, podemos visualizar os principais logs de informações com respeito ao operacional dos nossos robôs. Nesse local, ficamos informados sobre o envio e execução das ordens, problemas com variáveis, erros de execução e funcionamentos. Agora que já conhecemos, no geral, os principais campos do MetaTrader 5, vamos para o campo gráfico principal, que é a janela de visualização das velas de preços (candles).
2.5.
Visualizando Velas de Preços
A plataforma MetaTrader 5 permite customizar de diversas formas a maneira como nós visualizamos os preços. Por exemplo, podemos mudar o fundo da tela, as cores dos contornos e preenchimento das velas de alta/baixa/doji, as linhas de separação de períodos, grades, dentre várias outras propriedades. Com um clique com o botão direito em cima do campo gráfico podemos escolher Propriedades e fazer as devidas configurações de cores ao nosso gosto.
Podemos alternar entre três tipos de visualização de preços dos ativos financeiros. Esses tipos visuais se dão através de velas, linhas ou bastões.
2.6.
Salvando Templates de Visualizações
É importante notar que cada vez que um novo gráfico for pedido para ser aberto no MetaTrader ele vai aparecer na tela com as configurações padrão. No entanto, existe uma maneira de salvarmos nossa customização de visualização de tela a partir da criação de um template. Por exemplo, vamos configurar um template. Para isso devemos fazer nossas customizações.
Vamos considerar as seguintes alterações:
Logo em seguida devemos clicar em cima da tela gráfica com o botão direito e ir em Template -> Salvar Templates. Escolhemos um nome e pronto.
Assim, basta apenas carregar o template salvo, a um novo gráfico, para que as configurações sejam imediatamente aplicadas. Desse modo, temos uma ampla flexibilidade para podermos configurar templates de visualizações para setups de estratégias distintas. 2.7.
Desenhando Objetos
É possível desenhar diversos objetos nos gráficos dos preços. Podemos
adicionar canais, linhas de suporte e resistência, Fibonacci, setas para cima/baixo etc. Desse modo, é possível fazer uma análise técnica visual bem completa com os principais objetos gráficos presentes na plataforma.
Com o botão direito em cima do gráfico podemos observar a lista de objetos e fazer diversos tipos de edições como modificar legendas, cores etc.
Vale a pena gastar um tempinho se familiarizando com o uso dos gráficos e objetos. 2.8.
Transição entre Tempos Gráficos
A transição entre a escala gráfica de observação de formação das velas é bastante simples e rápida. Basta um clique com o botão direito em cima do gráfico, ir em Timeframes e escolher o tempo de formação das velas.
Podemos, também, alterar o tempo das velas a partir da barra de atalhos, como mostra abaixo:
2.9.
Adição de Indicadores
Os indicadores, para muitos traders, são os principais norteadores para a tomada de decisão. São os indicadores que, muitas vezes, nos alertam para entrar e sair de uma operação em situações oportunas. E, quando se fala de indicadores, o MetaTrader não deixa a desejar. Atualmente, a plataforma conta com mais de 2 mil indicadores disponíveis gratuitamente para download. Esse download pode ser feito tanto pelo próprio site quando pela plataforma no campo Caixa de Ferramentas na aba
Biblioteca. Vamos, por exemplo, adicionar médias móveis ao gráfico. Podemos fazer isso ou pelo menu Inserir -> Indicadores ou diretamente clicando no campo Navegador -> indicadores, clicar e segurar o indicador escolhido e arrastar para a janela gráfica. Como exemplo, vamos inserir um indicador de Média Móvel:
Agora, vamos adicionar duas médias móveis. Nossas médias devem ter períodos de 72 e 32 com deslocamento zero, métodos exponenciais e aplicados aos preços de fechamentos (close):
Após clicar em ok, temos a adição imediata ao gráfico do ativo escolhido.
Vamos adicionar agora o IFR (Índice de força Relativa) que no MetaTrader está em inglês ( Relative Strength Index). Este indicador é interessante, pois é desenhado em uma janela separada da janela principal dos preços das velas (ver figuras abaixo).
Vamos deixar um período de 9 aplicado ao preço de fechamento:
O IFR é um indicador utilizado para avisar sobrecompra e/ou sobrevenda. Basicamente, temos dois níveis de referência que devemos escolher para o gatilho de ativação da sobrecompra ou sobrevenda. Podemos escolher os níveis de 30 (sobrevenda) e 70 (sobrecompra). Por exemplo, valores de IFR acima de 70 estão indicando que o preço está sobrecomprado, ou seja, a qualquer momento, em um mercado consolidado, podemos começar a presenciar uma queda nos preços. Por outro lado, se o valor do IFR está abaixo de 30 podemos dizer que o preço está sobrevendido e uma alta repentina nos preços é eminente. Esses dois indicadores foram apresentados, pois serão utilizados para a criação do nosso robô de investimentos. Adiantando, iremos utilizar três estratégias: uma apenas com o cruzamento de médias móveis, outra apenas com o IFR e mais uma com ambos os indicadores. 2.10. Janela de Dados
Um campo muito importante, que facilita bastante a visualização dos preços e valores dos indicadores, é a Janela de Dados. Para abri-la podemos: ir ao menu Exibir -> Janela de Dados ou utilizar o atalho do teclado Ctrl+D.
Essa ação irá abrir, para nós, um novo campo: Janela de Dados . Agora podemos posicionar o cursor do mouse em cima de qualquer vela do gráfico para obtermos informações detalhadas de preços e indicadores no local escolhido.
Veja o exemplo abaixo, onde colocamos o mouse em cima da vela destacada em verde e a janela de dados nos fornece às informações detalhadas:
Capítulo 3 3. Comunidade MQL5 Como já discutido, no Capítulo 2, MQL5 é uma linguagem de programação oferecida dentro do MetaTrader 5. Programadores costumam compartilhar códigos e dúvidas em torno de problemas específicos de uma linguagem de programação. É muito importante a participação em comunidades de desenvolvedores, pois com isso nosso aprendizado e o lado motivacional são potencializados. O compartilhamento de conhecimentos e dúvidas gera uma sustentabilidade no nosso desenvolvimento e crescimento como programador e usuário da linguagem. É sempre bom ter um local para trocar conhecimentos, tirar dúvidas e discutir ideias de projetos. Quanto mais utilizada e documentada for uma linguagem de programação, melhor será a curva de aprendizado para os marinheiros de primeira viagem. Por isso, um ambiente comum onde todos estão destinados a um mesmo fim é bastante válido. Nesse sentido, para a linguagem MQL5 estamos bem acobertados, pois estamos diante uma ferramenta madura, com bastante desenvolvedores e uma comunidade muito ativa e generosa que oferece artigos e tira dúvidas com agilidade nos fóruns. Podemos ter acesso à comunidade a partir do site: https://www.mql5.com/pt. Após a leitura deste e-book e/ou até mesmo logo agora, o leitor, está convidado a fazer um registro e começar a adicionar seus conhecimentos e tirar dúvidas a partir do portal.
Logo depois do cadastro teremos acesso a um conjunto muito interessante de funcionalidades. Por exemplo, podemos ter acesso ao terminal Web do MetaTrader 5, a documentação que é bastante extensa e atualizada, principais informações do mercado financeiro mundial, dentre outros benefícios.
Algo muito importante para quem está iniciando com a linguagem MQL5 são os exemplos de códigos abertos disponíveis no CodeBase. Nesse local teremos acesso a códigos tanto para a linguagem MQL4 quando MQL5. É de extrema valia passar um tempo com pesquisas e estudos desses códigos.
Temos, também, a parte de Artigos onde são adicionados tutoriais com uma excelente didática e bem completos. Este é um dos campos indispensáveis para qualquer com a pretensão de dominar a linguagem MQL5.
Quem desejar construir um robô com uma estratégia mais robusta e complexa pode contratar programadores MQL5 a partir de encomendas no portal de Freelance. Também, para aqueles que começaram a dominar a ferramenta e desejam uma renda extra, podem aceitar projetos e oferecer seus serviços de produção de robôs, indicadores e scripts de investimentos.
No campo Mercado podemos comprar indicadores e Robôs oferecidos por pessoas físicas e empresas especializadas.
Temos um campo bem interessante que é o de Sinais de investimentos. Por ele podemos acompanhar às entradas e saídas de operações de traders. Temos a evolução dos rendimentos, o nível de confiabilidade, lucro máximo, dentre outras informações, para cada um dos traders que se dispuseram a fornecer os sinais de suas operações. Alguns serviços de sinais podem ser contratados (pagos) e a execução automática pode ser sincronizada com nossas contas.
Após encontrar uma estratégia e setups consistentes e comprovar a validade através de teste na conta demo, um passo importante é contratar um serviço de máquina virtual. Esse tipo de serviço irá nos deixar mais seguros e protegidos com relação à falta de energia e internet. Sabemos que no Brasil existe muita oscilação na rede de internet e esse tipo de problema pode comprometer o funcionamento adequado de nossos robôs de investimentos. Uma alternativa para resolver esse problema é contratando uma máquina virtual VPS (Virtual Private Server). O próprio portal MQL5 fornece esse tipo de serviço.
Existe a possibilidade de contratar o serviço de máquina virtual VPS por outras empresas como, por exemplo, a Amazon AWS (https://aws.amazon.com/pt/vpc/) que inclusive oferece gratuitamente um ano de uso.
Temos o campo Fórum que é onde provavelmente passaremos boa parte de nossa jornada de aprendizado respondendo e colocando nossas dúvidas com relação aos códigos MQL5. Este é um local propício para trocar experiências, fazer amizades e parcerias.
Capítulo 4 4. MetaEditor MQL5 A linguagem MQL5 ( MetaQuotes Language 5) possui um grande número de funções úteis para analisar as cotações dos preços dos ativos financeiros. Precisamos conhecer essas funções para não ficarmos recriando a roda. Mas antes é importante conhecer ao máximo possível do nosso ambiente (MetaEditor) de programação da linguagem. 4.1.
MetaEditor
O MetaEditor é uma IDE ( Integrated Development Environment ) para a linguagem MQL5 que está incluído no MetaTrader 5. Vamos agora conhecer as principais funcionalidades de desenvolvimentos oferecidos pelo MetaEditor. Para abrir o MetaEditor devemos clicar no ícone destacado na imagem abaixo ou apertar o atalho F4.
Após clicar no ícone para o MetaEditor teremos um ambiente de desenvolvimento com três principais áreas que irão nos auxiliar no desenvolvimento dos nossos códigos.
Área 1: Navegador - local onde iremos fazer nosso gerenciamento dos arquivos de códigos e bibliotecas de desenvolvimento. Área 2: Janela onde os códigos são propriamente digitados. Área 3: Caixa de Ferramentas - aqui é onde iremos acompanhar o desenvolvimento dos nossos testes de compilação e debug. Temos 6 abas (Erros, Pesquisa, Artigos, CodeBase, Projetos públicos e Diário). Basicamente, para a criação de nossos algoritmos iremos utilizar apenas às abas de Erros e Diário.
4.2.
Criando um novo Projeto
Vamos clicar no ícone Novo e logo em seguida escolher a partir do assistente MQL5 o tipo de projeto que queremos criar.
Podemos notar que temos várias opções de projetos. Esse assistente permite até que possamos criar robôs de investimentos sem conhecimentos de programação. Claro que nesse caso ficaremos cegos com relação à maioria das etapas e dificilmente iremos fazer algo com confiança e segurança devida. Como este e-book pretende fornecer os primeiros passos com a ferramenta MQL5 iremos nos deter apenas a primeira opção Expert Advisor (modelo) . Existem dois[4] outros e-books do mesmo autor que mostram como desenvolver códigos de Indicadores e Scripts. Vamos primeiro dar um nome ao nosso robô de investimentos ( Expert dvisor). Iremos chamá-lo de EA_MA_Cros_IFR ( Expert Advisor de Cruzamento de médias móveis com IFR). Esse é apenas um nome provisório para apresentação do MetaEditor.
Após clicar em concluir o assistente MQL5 cria para nós o corpo básico necessário para o desenvolvimento de qualquer robô de investimento. Portanto, já temos uma estrutura dividida com os principais métodos para o funcionamento de um robô.
A estrutura de um robô, para seu adequado funcionamento, sempre irá conter pelo menos essas três funções ou métodos: OnInit(), OnDeinit() e OnTick().
4.3.
OnInit()
A primeira função executada em um robô é a OnInit(). Ela é acionada apenas quando inicializamos o robô. Utilizamos essa função para inicializar ponteiros ( Handles) de indicadores, variáveis, bem como fazer configurações e carregamentos prévios de variáveis e templates.
4.4.
OnDeinit()
A função OnDeinit() é chamada quando o robô é removido do MetaTrader. Por exemplo, utilizamos essa função para limpar handles de indicadores, variáveis, remover objetos gráficos e textuais da tela, dentre outros.
4.5.
OnTick()
Uma das mais importantes é a função OnTick() pois é nela onde muito de nossa lógica de programação está rodando. Essa função é uma das mais requisitadas pelo nosso robô, uma vez que é chamada toda vez que uma operação de mercado acontecer. Em cada nova venda, compra, lançamento e cancelamento de ordem essa função é chamada. Vale ressaltar que essa função é apenas chamada quando estamos com o robô dentro do horário de pregão. Isso porque apenas com o pregão em andamento é que temos operações de mercado ocorrendo. Caso estejamos trabalhando no desenvolvimento de um robô e não estamos no horário de pregão não iremos ver chamada alguma dessa função. Como alternativa, podemos utilizar a função OnTimer() para minimizar esse problemas e fazer testes e debugs através dela (usando a função Print()). Mais a frente no Capítulo 5 iremos ver um exemplo da utilização da função OnTimer(). É bom destacar que existem várias outras funções predefinidas como: OnChartEvent(), OnTrader(), OnTester(), dentre outras. No entanto, iremos estudar apenas as principais. Mais detalhes a respeito dessas outras funções podem ser encontrados na documentação do MetaTrader 5. 4.6.
Elementos Acessórios de Programação
Temos alguns elementos que nos auxiliam na legibilidade e organização dos códigos de nosso robô. 4.6.1.Comentários
Comentar nossos algoritmos é de extrema importância para legibilidade e entendimento de etapas principais. Por exemplo, temos o elemento de comentário que podemos representar por // ou /* */
Este tipo de estrutura (//) faz com que o compilador não interprete os caracteres que viram logo em seguida. Assim, podemos fazer pequenos lembretes e comentários explicativos para tornar o código claro e legível para a edição de outros desenvolvedores e até mesmo nós. O segundo tipo de comentário /* */ permite escrever parágrafos inteiros entre eles.
Temos alguns atalhos para os comentários. Por exemplo, se quisermos comentar várias linhas podemos fazer a seleção das mesmas e apertar (Ctrl+~). Para retirar os comentários basta novamente selecionar e apertar (Ctrl+Ç).
O atalho (Ctrl+.) permite criar a seguinte cadeia de caracteres comentados. Isso é útil para fazermos separações de grandes seções de códigos.
O atalho (Ctrl+;) permite criar uma pequena separação com as seguintes cadeias de caracteres:
4.7.
Propriedades do Robô
É sempre bom informar detalhes de desenvolvimento do robô. Assim, diretiva #property: serve para descrever informações básicas sobre o robô. No exemplo abaixo, onde temos a diretiva property, podemos observar informações com relação aos direitos autorais, link direcionado para algum site e versão do robô.
Após apertar no botão de compilação.
Podemos notar que no campo de Caixa de Ferramentas na aba Erros o compilador não acusou problema algum.
Assim automaticamente na Plataforma MetaTrader no campo Navegador -> clicando no mais de Consultor expert podemos encontrar nosso robô compilado (.exe5). Agora é possível clicar, segurar e arrastar para o gráfico de velas e observar às informações presentes do #property.
Como ainda não temos praticamente nada programado do robô estas as informações na aba Comum acima, são as únicas disponíveis até o momento. Então, a cada nova modificação feita no código com o MetaEditor podemos ir observando às alterações no campo Navegador na parte de experts. 4.8.
Tipos de Arquivos MetaTrader e MetaEditor
O tipo de arquivo gerado com o MetaEditor tem a extensão ‘.mql’ . Podemos comprovar isso no campo Navegador do MetaEditor onde temos nosso arquivo de edição do robô chamado de EA_MA_Cros_IFR.mql5. Após apertar no botão de Compilar um arquivo com a extensão ‘EA_MA_Cros_IFR.exe5’ é criado automaticamente no campo Navegador > Consultor expert do MetaTrader. É importante notar a diferença entre o MetaTrader e o MetaEditor. No
MetaEditor temos arquivos com extensão ‘.mql5’ e no MetaTrader temos os arquivos ‘.exe5’. 4.9.
Adicionando Bibliotecas
Podemos adicionar bibliotecas especiais fornecidas pela própria MQL5. Para isso basta que saibamos o nome da biblioteca com a seguinte estrutura de códigos:
O exemplo acima adiciona um conjunto de classes e métodos prontos para gerar figuras Fibonacci no primeiro include
, e trabalhar com o envio e gerenciamento de ordens de compra e venda no segundo include . Note que a extensão desses arquivos include é do tipo ‘.mqh’. O MetaEditor também permite a criação desse tipo de arquivo. A partir disso podemos criar algoritmos complexos que trabalham com a parte gráfica e até mesmo animações visuais. Podemos pesquisar e estudar às principais bibliotecas MQL5 a partir do site:
No Capítulo 5 iremos conhecer e estudar melhor outras funcionalidade do
MetaEditor a partir do estudo da sintaxe da linguagem MQL5.
Capítulo 5 5. Lógica Básica de Programação com MQL5 Como já dito antes, a linguagem MQL5 apresenta grandes semelhanças com a linguagem C++, Java e C#. Portanto, quem tiver algum conhecimento dessas linguagens irá ter grande facilidade no entendimento da sintaxe de funcionamento da MQL5. Todo algoritmo, toda receita de bolo, começa com a descrição dos ingredientes. Portanto, vamos fazer uma analogia e começar a estudar os ingredientes do nosso robô, o nosso bolo. Vamos primeiro entender os principais tipos das variáveis presentes na MQL5. Logo em seguida precisamos saber como essa linguagem declara e atribui valores às variáveis. 5.1.
Tipos de Variáveis
A variável é a unidade básica de armazenamento de dados em qualquer linguagem de programação. Praticamente todo algoritmo precisa de variáveis. Na linguagem MQL5 precisamos declarar uma variável sempre com algum tipo. Os principais tipos de variáveis mais utilizados para a criação dos robôs são: Inteiro (int ), ponto flutuante - valores decimais (float e double), caracteres alfanuméricos (string), lógicos (bool) e datas (datetime). Diferente da MQL5 existem algumas linguagens que possuem tipagem automática com, por exemplo, Python. Ter que declarar explicitamente o tipo de variável tem vantagens práticas de segurança e facilita encontrar erros de compilação. Quando estamos limitando o tipo da variável passamos a protegê-la de possíveis erros de cálculos aritméticos, erros de atribuições e lógica de programação.
5.2.
Declaração de Variáveis
Toda variável MQL5 deve possuir um tipo e um nome. O tipo dessa variável deve sempre vir especificado antes do nome. Logo em seguida podemos atribuir valores correspondentes ao tipo da variável. Vamos estudar os principais mais utilizados e que farão parte da estrutura do nosso robô. 5.2.1.Tipo Inteiro
Temos algumas peculiaridades com relação ao consumo de memória necessária para guardar uma variável. Na maioria dos robôs isso não é um problema, mas iremos discutir essas questões caso você queira deixar seu robô otimizado quanto ao requisito de consumo de memória de processamento. Por exemplo, temos os tipo de variáveis char, short, int, uchar, ushort, uint que servem para variáveis de números inteiros.
char - consome apenas 1 byte de memória. Pode admitir valores no intervalo de -128 até 127. short - consome 2 bytes de memória. Pode admitir valores no intervalo de -32.768 até 32.767 int - consome 4 bytes de memória . Pode admitir valores no intervalo de -2.147.48.648 até 2.147.483.647. uchar - consome 1 byte de memória. Admite valores no intervalo de 0 a 255. ushort - consome 2 bytes de memória. Admite valores de 0 a 65.535. uint - consome 4 bytes de memória. Admite valores no intervalo de 0 a 4.294.967.295. Por exemplo, veja o exemplo abaixo:
Temos nesse caso uma variável com o nome de ‘periodoMediaMovel’ que aceita valores inteiros (int). Podemos ver que já temos uma atribuição de valor igual a 24. Caso não seja atribuído valor algum a variável a MQL5 atribui imediatamente zero. 5.2.2.Tipo Double
Quando estamos interessados em armazenar variáveis com números decimais o mais indicado é utilizar o tipo double. double. O tipo double consome 8 bytes de memória. Mais econômico, temos o tipo que consome a metade 4 bytes chamado float . A diferença principal entre esses dois tipos (float e double) é que a acurácia de algarismos significativos é maior para o tipo double (15 dígitos significativos) enquanto que o float temos apenas 7 dígitos significativos. Como a diferença de consumo de memória para nossos robôs será irrelevante iremos utilizar apenas o tipo double que é mais preciso. Por exemplo, a divisão, na figura abaixo, não envolve muito algarismos. Portanto, o tipo double ou float não faz diferença. Por outro lado, se tivéssemos um problema onde o resultado fosse alguma dízima periódica multiplicada por algum número ou outra dízima, os erros acumulados de arredondamento poderiam interferir na precisão dos resultados.
Até o presente momento não se preocupe por não está observando os resultados das operações. Faremos isso mais a frente com o uso da função Print(). Por hora, vamos nos deter a estrutura de formação da declaração das variáveis.
5.2.3.Tipo String
Variáveis de caracteres textuais são tipadas com string. string. A linguagem MQL5 permite concatenação das strings de maneira bastante simplificada como mostra abaixo.
Para uma string caso não seja atribuído nenhum valor será admitido uma string vazia (NULL). 5.2.4.Tipo bool
Quando o interesse é ter uma variável com características booleanas, isto é, que admitem apenas valores verdadeiros (true (true)) ou falso (false (false)) podemos utilizar o tipo bool: bool:
Vale ressaltar que no caso a variável ‘bool resposta’ foi declarada sem valor inicial, assim de imediato é atribuída para ela o valor de (false ( false). ). Só em seguida, ver figura acima, que temos uma mudança de valor para true, true, pois x é menor do que y. 5.2.5.Tipo Datetime
Este é um dos tipos bastante utilizados, pois os dados de preços dos ativos são coletados no decorrer de alguma escala temporal. Estaremos sempre que possível fazendo avaliações de horários e dias para às operações. Portanto, devemos conhecer bem a utilização desse tipo de variável. O formato de data e hora para a MQL5 é definido da seguinte maneira:
{D’aaaa.mm.dd hh:mm:ss’} ou seja {ano.mês.dia horas:minutos:segundos} A letra D maiúscula colocada no início da data faz com que a variável fique com o datetime constante.
5.3.
Declarando Constantes
Temos uma maneira de criar constantes a partir de declarações globais no início de nosso código a partir da diretiva #define.
Vale ressaltar que, claro, os valores das constantes não podem ser alterados. Caso haja alguma tentativa de mudança de valor teremos um erro de compilação. É padrão considerar os nomes das constantes com caracteres maiúsculos. 5.4.
Vetores de Variáveis: Arrays
Um array é uma variável que admite múltiplos valores dentro dela. Podemos pensar que um array é algo semelhante a uma lista de valores com determinado tipo. No decorrer dessa lista podemos fazer iterações percorrendo cada um de seus valores. Iremos utilizar, com bastante frequência, arrays de variáveis para armazenar, principalmente, informações de preços dos ativos financeiros e variáveis de indicadores. Vamos a um exemplo de declaração de um array com três posições para armazenar números inteiro:
Se tentarmos fazer:
Esse erro de compilação acontece, pois fizemos uma declaração inicial (meuArray[3]) para alocar apenas 3 posições de memória e estamos tentando adicionar uma quarta posição. Podemos fazer do nosso array uma lista do tipo de variável que desejamos. Todavia, de antemão, a MQL5 precisa saber o tamanho da lista de valores que precisamos para o vetor array. Por isso colocar algum valor entre colchetes logo em seguida do nome da variável é obrigatório. Outra maneira de declarar arrays é já ir atribuindo valores para o mesmo. Devemos fazer isso da seguinte maneira:
5.5.
Laço de Repetição For
Iremos agora estudar um laço de repetição bastante importante e utilizado nos desenvolvimentos de robôs de investimentos. Quando queremos que o computador execute atividades repetitivas dentro de certos limites previamente especificados uma maneira prática de informar isso a máquina é através do laço de repetição for . Quando digitamos a palavra for no MetaEditor teremos uma setinha como mostrado abaixo:
Ao apertarmos a tecla Tab o editor irá autocompletar toda a estrutura de repetição do laço for .
Essa estrutura significa que iremos iterar do inteiro 0 (zero) até o inteiro total-1 com um acréscimo de iterando i de uma unidade (i++ é o mesmo que i = i+1, bem como i-- é o mesmo que i = i-1 ). Assim se quisermos fazer uma varredura dentro dos elementos de um array podemos fazer a partir do laço for da seguinte maneira:
5.6.
Enum
A estrutura enum é um tipo especial de número inteiro onde podemos definir, através de uma lista, constantes de atribuições. Com enum podemos customizar tipos de variáveis que melhor se adequem a nosso problema. Por exemplo, vamos criar um enum para representar as estações do ano. Sabemos que existem apenas 4 estações do ano: primavera, verão, outono e inverno. Ao digitar a palavra enum temos mais uma vez um setinha apontando para a direita, como mostra abaixo: , Mais um Tab, temos o autocomplete. O nosso enum deve ficar da seguinte
maneira:
Podemos agora utilizar ‘ESTACOES_ANO’ como um tipo de variável a ser declarada. Em várias situações, isso é muito útil para deixar nosso código mais intuitivo e organizado.
O valor da saída foi de 1 (um) porque o enum considera a ordenação dos inteiros a partir do zero. No nosso caso temos que primavera vale (0), verao (1), outono (2), inverno (3). Interessante e bastante útil o enum, né verdade? 5.7.
Variáveis do Tipo Input
Às variáveis do tipo input são as únicas que permite ao usuário dos indicadores ou robôs atribuir valores às mesmas. Essas variáveis são utilizadas para fornecer ao usuário a possibilidade de alterar setups dos indicadores, stop loss, alvos de ganhos (take profit ), nº de lotes etc. Às variáveis input podem ser de qualquer tipo incluindo os tipos enum. Vamos a um exemplo para facilitar o entendimento.
Após compilar o código acima teremos no MetaTrader a seguinte possibilidade de configuração do robô:
Portanto, a diretiva input nos permite dialogar com o usuário na aba Parâmetros de Entrada do nosso robô de investimentos.
5.8.
Variáveis Locais e Globais
É muito importante saber a distinção entre variáveis locais e variáveis globais. A confusão entre esses dois tipos de variáveis leva a muitos erros de compilação e execução do robô. Portanto, devemos ter bastante cuidado e prestar muita atenção onde estamos fazendo a declaração das variáveis.
5.8.1.Variáveis locais Vamos criar uma função para mostrar um exemplo de variáveis locais. Quando às variáveis são declaradas dentro de uma função/métodos elas com seus respectivos valores atribuídos serão apenas utilizadas dentro das funções. Temos assim variáveis locais, pois estão declaradas dentro de um método ou função.
5.8.2.Variáveis Globais Quando queremos que uma variável possa ser utilizada por qualquer função/método em qualquer local do nosso algoritmo, devemos declará-la de maneira global como mostra o exemplo abaixo. Preste bastante atenção neste exemplo, pois é muito importante para entender a diferença entre as variáveis.
Vamos a outro exemplo importante, agora com o encadeamento de uma
estrutura com o if - condicional booleano . Avalie com cuidado esse exemplo.
5.9.
Variáveis Predefinidas pelo MQL5
A linguagem MQL5 possui várias variáveis predefinidas de uso rotineiro nos códigos para desenvolvimentos das estratégias. Essas variáveis possuem uma notação própria e vêm precedidas com um underscore (_). Às principais variáveis mais utilizadas e que iremos aplicar para criar nosso primeiro robô de investimento são:
_Symbol: representa o símbolo do ativo financeiro presente no gráfico atual mostrado na tela. _Period: faz referência ao período, em minutos, do gráfico de velas (candle) atual. _Point: representa o tipo de tamanho de pontos que caracteriza o ativo financeiro. _Digits: representa o número de dígitos de pontos decimais do ativo atual. 5.10. Operações Matemáticas
Já vimos várias operações matemáticas até o presente momento. Vamos estudar mais algumas delas. A linguagem MQL5 nos fornece uma estrutura bem intuitiva e simples para trabalhar com as operações matemáticas
A própria linguagem já vem com um conjunto de funções matemáticas e estatísticas para trabalhar conectadas com as mais diversas operações. Temos as funções com radical MathXXX bastante úteis:
5.11. Relações Lógicas e Condicionais Na estrutura dos nossos algoritmos comumente utilizamos relações lógicas que retornam valores de verdadeiro ou falso. Às principais relações que estaremos trabalhando são representadas da seguinte maneira pela MQL5:
Veja o uso da condicional if mais os conectivos lógicos && e || :
Vamos agora à estrutura condicional do tipo else. O else é ativado caso o condicional if não seja verdadeiro. Portanto, o if sendo falso automaticamente o else passa a ser verdadeiro e tudo dentro das chaves dessa estrutura é executado.
A estrutura else if é muito útil em vários casos. Quando a cadeia de condições é extensa podemos utilizar essa estrutura. Caso nenhuma estrutura else if for verdadeira else é executada automaticamente.
5.12. Operador Ternário O operador ternário existe em diversas linguagens de programação de alto nível e na MQL5 não é diferente. Esse é um operador bastante útil para simplificar estruturas condicionais que poderiam utilizar o if e else. O operador ternário apresenta a seguinte estrutura de funcionamento: (condicional) ? (alternativa 1 se verdadeira) : (alternativa 2 se falsa) Vamos a um exemplo:
No local onde utilizamos a variável condicional poderíamos fazer qualquer estrutura utilizando os avaliadores lógicos (>= , <=, &&, ||). 5.13. Métodos ou Funções Quando estamos trabalhando com programação orientada a objetos (POO) fazemos o uso constante das classes. Classes são os planos diretores da arquitetura dos objetos. Não se preocupe se isso parece complicado, pois não utilizaremos POO. Dentre das classes geralmente encontramos métodos e atributos. O termo função é mais utilizado quando estamos trabalhando com programação procedural. A linguagem MQL5 nos permite programar tanto no paradigma orientado a objetos quanto procedural. Este livro está voltado para
programação procedural, assim iremos falar de métodos e funções como se fossem a mesma coisa. Mas afinal o que são métodos ou funções? Eles são blocos de códigos que permite executar uma tarefa específica. Geralmente às funções apresentam parâmetros de entrada e de retorno. Em outras palavras às funções processam as entradas de parâmetros segundo uma lógica bem definida e retorna um resultado.
Segue um exemplo para esclarecer melhor tudo isso:
Numa função podemos ter vários tipos de retornos e de parâmetros de entrada. O processamento efetuado dependerá da lógica do problema. Vamos a mais um exemplo onde temos funções utilizadas para calcular a soma, multiplicação e a divisão de dois números:
Funções que não retornam valores possuem a declaração do tipo void. Todavia, se a função tiver algum tipo de retorno somos obrigados a retornar algo relativo ao tipo de retorno.
5.14. Variáveis de Candles e Tick A linguagem MQL5 possui um conjunto de bibliotecas preparadas para trabalhar com a aquisição e manipulação dos preços de velas (candles). Temos a estrutura MqlRates que armazena as informações de preços de abertura, fechamento, máxima, mínima, volume, spread e tempo. Às informações de Tick referem-se aquelas coletadas do book de ofertas como, por exemplo: ask (compra), bid (venda), último negócio etc. Essas informações podem ser acessadas a partir da estrutura MqlTick. Vamos ver como declarar uma variável de vela e tick. Temos que ficar atentos, pois devemos primeiro declarar a variável depois fazer o devido carregamento dos dados na variável declarada a partir de outras funções específicas. Para fazer o carregamento devemos especificar o ativo financeiro (que pode ser o atual do gráfico utilizando o _Symbol) e o período das velas (para utilizar o atual do gráfico colocamos _Period). Para um exemplo, vamos criar um novo Expert Advisor com o nome de
Estudo_Var (estudo de variáveis). No assistente agora vamos adicionar a opção OnTimer.
Decidimos adicionar a função OnTimer(), pois com ela podemos trabalhar e visualizar nossos códigos (debug) fora do horário de pregão. Como vimos no Capítulo 4, a função OnTick() é chamada toda vez que uma nova operação no mercado é efetuada, e como, provavelmente, estamos programando fora do horário de pregão nenhuma chamada a essa função será efetuada. Assim vamos utilizar a função OnTimer() para fazer chamadas temporalizadas e poder visualizar o desenvolvimento dos nossos códigos. Vamos pedir para ela ser chamada a cada 2 segundo a partir da função EventSetTimer(2) (ver exemplo abaixo).
As funções CopyRates() e SymbolInfoTick() foram preenchidas seguindo as seguintes estruturas:
Podemos entender melhor sobre as estruturas e principais funções da biblioteca MQL5 utilizando a tecla F1. Para isso basta que coloquemos o cursor do mouse em cima da estrutura de interesse e apertemos F1. Por exemplo, vamos fazer isso para a MqlRates:
A partir da tecla F1 temos acesso a uma documentação bem completa da linguagem MQL5. Assim devemos utilizá-la sempre quando uma dúvida surgir. Como já discutido, nem sempre estamos desenvolvendo os robôs no horário de pregão e mesmo assim precisamos fazer alguns debugs no código, por isso estamos utilizando o OnTimer(). Contudo, dentro da função OnTimer() vamos adicionar o seguinte código:
Vamos pedir para compilar. Agora vamos ao MetaTrader e arrastar o EA ‘Estudo_Var.exe5’ para o gráfico. Depois na Caixa de Ferramentas (se não tiver a mostrar ir ao menu exibir e pedir para abrir) e ativar a aba Experts. Uma vez adicionado o robô ao gráfico podemos notar que nesta aba a cada 2 segundos temos uma atualização da função OnTimer() e o que está dentro dela é executado. No nosso caso vemos os preços de open, max, close e min.
Estamos pegando os preços da vela na posição ‘0’, ou seja, coletando os valores da vela mais atual. A vela pode representar qualquer tempo gráfico, o que realmente importa é a sua posição. Podemos escolher qualquer posição desejada, basta só que entendamos o ordenamento do vetor. Abaixo temos uma ilustração para facilitar esse entendimento (vale deixar claro que essa ilustração é válida apenas após utilizar o ArraySetAsSeries() que ordena o vetor da maneira mostrada).
Nosso vetor de velas tem apenas 10 posições, pois utilizamos a função CopyRates(_Symbo, _Period,0,10,velas). Podemos deixar nosso código mais passível de ser escolhido facilmente a posição das velas e, em complemento, adicionar informações de tick, ver abaixo:
Vamos testar agora o caso da variável (pos = 10). Escolhemos para velas um vetor com apenas 10 posições de preços, mas estamos tentando acessar a posição de número 11 (lembrando que a contagem começa com zero). Assim o código irá compilar normalmente , porém quando executado no MetaTrader iremos ter a seguinte mensagem de erro:
Temos um erro de array fora do limite (array out of range). O MetaTrader informa também a linha de código no arquivo .mql onde encontramos a violação (linha 59). Devemos ficar alertas pois esse tipo de erro é bastante
frequente nas nossas criações de robôs. Portanto, bastante cuidado com os tamanhos e rastreio de posições dos arrays. 5.15. Funções Comment() e Alert() Utilizando algumas funções úteis podemos criar elementos de aviso e alertas para oferecer maior segurança de uso e melhor entendimento do que está acontecendo com os nossos robôs. 5.15.1.
Comment()
Comentários sempre são bem vindos. Vamos fazer um exemplo ilustrativo:
Estamos utilizando a função DoubleToString() para fazermos a mudança do tipo double para o string. Se não tivermos o cuidado em usar essa função não teremos um erro de compilação, mas na aba Erros da Caixa de Ferramentas do MetaEditor iremos observar a seguinte composição de avisos:
5.15.2.
Alert()
A função Alert() exibe uma caixa de alerta, no centro da tela, com as informações solicitadas. Quem se interessar pode pesquisar por alertas sonoros, pois, também, é possível adicioná-los a nossos robôs.
5.16. Adicionando Indicadores MQL5
Vamos agora a um das práticas mais comuns e importantes quando o objetivo é programar uma estratégia de investimentos. É muito provável que sua estratégia de investimentos faça uso de algum indicador, por isso vamos aprender como chamar indicadores a partir da linguagem MQL5. Inicialmente, precisamos declarar às variáveis para o nosso indicador. O modo como iremos declarar as variáveis vai depender muito do tipo e funcionamento do indicador. Existem indicadores que fornecem apenas uma saída de informação como, por exemplo, uma média móvel. Da média móvel temos apenas uma saída de informação que é o valor da média móvel calculada para um ponto específico do gráfico. Nesse caso dizemos que a média móvel possui apenas um Buffer de memória. Todo indicador precisa de pelo menos um Handle (manipulador) e este deve ser do tipo inteiro.
A declaração do indicador de média móvel é dada por uma função própria da MQL5 (iMA) dando um F1 nesta função obtemos:
No nosso caso estamos utilizando um período da média móvel de 7 com o
tipo de suavização simples (MODE_SMA) aplicado ao preço de fechamento (PRICE_CLOSE). É bom evidenciar, mais uma vez, que cada indicador possui uma estrutura própria de parâmetros necessários para seu devido funcionamento. É sempre bom colocar códigos para avaliar possíveis erros de carregamento de variáveis. No nosso caso adicionamos um Alert() caso tenhamos problemas com a variável ‘mm_Handle’. Fizemos isso porque o funcionamento correto dessa variável é de extrema importância para a estratégia do nosso robô. Contudo, a prática de avaliar o carregamento das variáveis é sempre bem vinda. O mesmo procedimento pode ser feito para o indicador IFR que nesse caso é chamado de iRSI(). Fizemos a declaração inicial e adição do indicador no gráfico com a função Agora devemos apontar ChartIndicatorAdd(0,0,mm_Handle). ‘mm_Handle’ para o vetor de mm_Buffer[] que é onde iremos acessar os valores da nossa média móvel. Para isso devemos em algum lugar do código chamar a função CopyBuffer().
Podemos entender a estrutura da CopyBuffer() da seguinte forma:
Vamos agora adicionar o indicador oscilador IFR. Esse indicador possui
também apenas um único Buffer. Caso fique na dúvida com respeito ao número de Buffers de cada indicador basta ir à documentação a partir da tecla F1 e procurar por #property indicator_buffers:
Segue o código com a adição dos dois indicadores (média móvel e IFR). Perceba que a função (iRSI()) do indicador IFR possui parâmetros de entrada bem distintos da função iMA():
Finalmente, estamos devidamente munidos das informações mínimas necessárias para dar início à programação do nosso robô de investimentos. Vamos ao próximo Capítulo!
Capítulo 6 6. Programando o Robô de Investimentos Agora que já conhecemos as principais funcionalidade do MetaTrader, já entendemos o básico das funcionalidades da linguagem MQL5 e da utilização do MetaEditor estamos minimamente preparados para começar a desenvolver nosso robô de investimentos ( Expert Advisor - EA). Antes de começar a programar vamos conhecer e entender detalhes da estratégia do nosso EA. 6.1.
Descrição geral da Estratégia
Nosso EA irá possuir duas médias móveis e o indicador IFR . O cruzamento de duas Médias móveis funciona bem quando o mercado encontra-se em tendência. Por outro lado, em mercados paralelizados ou em consolidação o indicador IFR tem um melhor desempenho. Existem vários indicadores que oferecem indicativos de que o mercado encontra-se em tendência como é o caso do indicador ADX. Decidimos escolher o IFR por motivos de fazer uma alternativa entre a possibilidade de escolha do mercado em tendência e/ou mercado lateralizado. Para as entradas nas operações de compra e venda, nosso EA irá ter a possibilidade de escolher apenas um dos indicadores (cruzamento de médias ou IFR) ou ambos ao mesmo tempo. Assim, teremos um EA que vai rastrear os gatilhos de entradas baseados em dois indicadores: cruzamento de médias móveis e IFR. Vamos entender como se dará os gatilhos de entrada nas operações para cada um desses indicadores.
6.1.1.Médias Móveis
Primeiro vamos ao gatilho para o cruzamento de médias móveis. Teremos duas médias móveis e o tipo, se exponencial ou aritmética, dessas médias poderá ser alterado como veremos a seguir. Uma das médias móvel será chamada de média rápida e a outra média lenta. A média rápida é aquela que possui o menor período, por outro lado a média lenta deve sempre possuir o maior período. Damos esses nomes, às médias, pelo fato de médias rápidas serem aquelas de menor período e estarem mais aderentes ao preço, portanto se movem mais rapidamente do que aquelas médias de períodos maiores onde possuem um comportamento direcional mais lento. Vamos a um diagrama ilustrativo de como funcionará esses gatilhos de entrada nas operações de compra e venda:
6.1.2.Índice de Força Relativa (IFR) O indicador IFR ou RSI ( Relative Strength Index) dentro da plataforma MetaTrader se refere a um Oscilador, ou seja, é útil para indicar posições de sobrecompra e sobrevenda em mercado lateralizado (consolidado). Não iremos entrar em detalhes a respeito dos cálculos por trás do IFR, porque não é o objetivo no momento. Mas vamos entender os gatinhos de entradas de compra e venda desse indicador A Figura abaixo mostra o IFR e dois principais níveis (linhas contínuas em vermelho) em 30 e 70. Cada uma dessas linhas representa os níveis para admitir a sobrecompra (linha 70) e sobrevenda (linha 30). Em outras palavras, em mercado consolidado, quando o IFR for igual ou maior que a
linha 70 pode ser um aviso de reversão avisando uma sobrecompra, ou seja, pode ser uma boa hora de efetuar uma venda. Por outro lado, se o IFR, mais uma vez em mercado consolidado, estiver menor ou igual que a linha 30, estamos numa região de sobrevenda nos indicando uma boa hora de comprar.
No nosso EA iremos deixar esses níveis de 70 (sobrecompra) e 30 (sobrevenda) possíveis de serem alterados pelo usuário. Assim será possível escolher níveis mais folgados ou restritivos para os gatinhos de compra e venda. Vamos agora a um exemplo onde os níveis de gatilho de compra estão na linha 30 e o de venda está na linha 70:
Vamos, portanto, a um resumo da estratégia com os elementos que precisaremos programar para o funcionamento adequado do nosso EA: 1 - Devemos adicionar duas médias móveis (rápida e lenta) ambas com possibilidade de escolher o período, o preço de aplicação da média e o
método da média utilizado. 2 - Devemos adicionar o indicador IFR com possibilidade de escolha de período, preço aplicado, e níveis de sobrecompra e sobrevenda. 3 - O usuário poderá escolher entre às opções para o gatilho de entrada nas operações ser provenientes das médias móveis mais do IFR, apenas médias móveis ou apenas do IFR. Agora que sabemos o funcionamento dos gatinhos tanto de compra quanto de venda para nossos dois indicadores (cruzamento de médias e IFR) estamos prontos para começar a desenvolver o algoritmo com a estratégia apresentada. 6.2.
Criando o EA
Vamos abrir o MetaEditor e pedir para o assistente criar um novo Expert Advisor. Vamos dar o seguinte nome para ele: MM_CROS_IFR .mql5. Caso queira obter o código fonte completo do robô pode acessar a seguinte página no github https://github.com/rafaelfvcs ou mandar um e-mail para [email protected]. No entanto, é extremamente recomendado que você digite os códigos apresentados para ir memorizando aos poucos a utilização das funções e funcionalidades do MetaEditor. Temos aqui o esqueleto do nosso EA:
6.3.
Declaração de Variáveis Globais
Vamos começar declarando nossas variáveis globais. Iremos separar aquelas variáveis que o usuário vai ter acesso para modificar e às que serão utilizadas para a estrutura do algoritmo do EA. 6.3.1.Variáveis para o Usuário Iremos fornecer as seguintes opções de escolha (parâmetros de input ): alvos de lucros, stop loss, número de lotes negociados, tempo gráfico das velas, períodos das médias, período do IFR, aplicação dos métodos nos preços (abertura, fechamento, max, min) tanto para as médias quanto para o IFR, possibilidade de escolha na estratégia de gatilhos de entrada nas operações (Cruzamento de médias móveis mais IFR, apenas cruzamentos, apenas IFR) e horário limite para fechar as operações abertas. Abaixo como fica o código de tudo isso:
Para a variável ‘estrategia’ foi escolhido criar um enum (este deve ser declarado no topo do algoritmo. acima das variáveis de Input):
6.3.2.Variáveis Gerais Devemos agora declarar as variáveis globais que serão utilizadas pelas funções do nosso algoritmo. Ver abaixo:
6.4.
Seção de Inicialização: OnInit()
Na função OnInit() vamos adicionar às variáveis de inicialização para os indicadores e adicioná-los ao gráfico com a função ChartIndicatorAdd(). Segue o código:
Perceba, acima, que a função ChartIndicatorAdd(0,0,mm_rapida_Handle) e ChartIndicatorAdd(0,0,mm_lenta_Handle) tem a mesma referência de adição gráfica (0 zero) isso representa que ambos os indicadores estarão na tela principal onde se encontram às velas. Não obstante, ChartIndicatorAdd(0, 1, ifr_Handle) termos a referência (1 um) ou seja, o indicador será adicionado a outra caixa gráfica. 6.5.
Seção de desinicialização: OnDeinit()
Quanto o robô for removido precisamos fazer a retirada dos indicadores e se for o caso limpar variáveis e parâmetros. A Função OnDeinit() é chamada quando o robô é removido. Assim, dentro dessa função podemos escrever nossas atividades de desinicialização dos parâmetros:
À medida que vamos escrevendo esses códigos é aconselhável compilar e ir
testando o robô no MetaTrader. Até o presente momento, se arrastarmos o arquivo: MM_CROS_IFR.exe5 no MetaTrader para algum ativo financeiro PETR4, por exemplo, teremos o seguinte:
Ao clicarmos em ok os indicadores serão adicionados ao gráfico e o robô aparecerá no canto superior direito ativado ou não caso o botão de negociação automatizada esteja ligado. Veja o exemplo abaixo:
6.6.
Funções Do Expert Advisor
Vamos agora criar algumas funções úteis e importantes para o funcionamento do nosso robô. Podemos utilizar o atalho (Ctrl+.) para criar seções para um conjunto de funções que iremos criar para o nosso EA.
Primeiro, vamos precisar de uma função que informe o surgimento de uma nova vela (candle) independentemente do tempo gráfico. Ainda, não temos uma função nativa na MQL5 que nos permita avaliar com precisão a mudança de candle e por isso devemos criá-la. A função deve retornar true caso uma nova vela suja ao gráfico. Abaixo segue o código bastante utilizado nos tutoriais no portal de artigos:
Vamos fazer uma função para auxiliar na visualização dos pontos de entradas das nossas estratégias. Essa função, basicamente, vai construir um objeto gráfico (linha vertical). Toda vez que nosso robô apresentar condições lógicas (o gatilho de entrada for ativado) uma linha vertical irá ser desenhada no gráfico com um nome e cor referente ao tipo de aviso.
A função desenhaLinhaVertical() possui quatro variáveis de entrada. A MQL5 permite que às últimas variáveis de entrada de uma função já venham com um valor predefinido. Veja o caso da variável ‘cor = clrAliceBlue’. Isso significa que quando o usuário não definir uma cor específica a ‘clrAliceBlue’ será automaticamente atribuída a variável. Portanto, o usuário não tem a obrigação de atribuir valores a esse tipo de variáveis. No entanto é obrigado a entrar com valores para as outras variáveis. Agora vamos criar uma das funções mais importantes para nosso EA. São às funções de envio de ordens. Precisamos enviar ordens de compra ou venda toda vez que um gatilho de entrada em operação for acionado. Na MQL5 podemos fazer esse tipo de envio por diversos caminhos. Podemos utilizar uma classe específica chamada CTrade para trabalhar com a manipulação e envio de ordens. Porém, aqui escolhemos utilizar as estruturas de montagem de requisição (MqlTradeRequest) e resposta de envio ( MqlTradeResult). A partir dessas estruturas podemos delimitar o tipo de ordem que estamos interessados, especificando detalhes da mesma. Às variáveis de requisição e resposta devem ser utilizadas numa função de envio de ordem chamada OrderSend(). Abaixo temos uma função criada para enviar uma ordem de compra a mercado com tipo de preenchimento FOK (fill or kill - ou preenche o tamanho de lotes da ordem ou não executa). Essa ordem, executada a mercado, já entra com o stop loss e alvo de ganhos (take profit ) definidos. Em todo e qualquer mercado existem ofertas dos melhores compradores e melhores vendedores. Portanto, precisamos acessar o book de ofertas para saber esses preços. Como vimos, no Capítulo 5, podemos acessar informações de book a partir da estrutura MqlTick. Por isso criamos uma variável chamada ‘tick’ para armazenar essas informações. Com ela podemos acessar o melhor vendedor ‘tick.bid’ e o melhor comprador ‘tick.ask’.
Temos o bid = (venda, oferta) e ask = (compra, demanda).
O tipo de ação a ser escolhido é a primeira requisição que devemos atribuir:
Temos vários tipos de ordens. Podemos escolher a partir da estrutura type:
A função NormalizeDouble() é utilizada para fazer arredondamentos de variáveis. Precisamos utilizá-la, pois alguns ativos financeiros possuem o número de dígitos de preços diferentes de outros. Temos ativos que são quantificados por pontos (como é o caso dos contratos futuros de índice e dólar) outros são quantificados por preço e até pips (mercado de Forex). No Capítulo 5 discutimos a utilização do _Point e _Digits. Os valores das variáveis SL e TK devem ser escolhidos pelo usuário em
forma de pontos. Perceba que para o preço de stop loss fizemos: NormalizeDouble(tick.ask - SL*_Point,_Digits), pois estamos comprando e nosso ponto de stop loss precisa ficar abaixo do (ask). Já o alvo do ganho (take profit ) naturalmente para uma compra deverá estar acima de TK pontos do ask. É com a requisição ‘requisicao.type_filling = ORDER_FILLING_FOK’ que escolhemos o tipo de preenchimento da ordem. Temos, basicamente, três tipos de preenchimento de ordens:
Vejamos o caso de venda:
Temos como nível de stop loss um valor acima do ponto de venda (bid) NormalizeDouble(tick.bid + SL*_Point,_Digits) e o alvo de ganho naturalmente abaixo NormalizeDouble(tick.bid - TK*_Point,_Digits). Precisamos criar também duas funções para fechar ordens abertas caso chegue ao limite de horário escolhido pelo usuário. Isso porque nosso robô é de daytrader, não queremos dormir posicionados. Lembrando que para garantir o fechamento de ordens abertas temos a variável ‘Horário Limite Fechar Posição’ escolhida pelo usuário. Assim para fechar uma venda devemos comprar, e para fechar uma compra devemos vender.
Podemos notar que para a função FecharCompra() a ‘requisicao.type_filling =ORDER_FILLING_RETURN’, isso porque queremos fechar a ordem independente de termos liquidez ou não. Como sabemos esse tipo de
preenchimento (ORDER_FILLING_RETURN) executa a ordem em cascata até atingir o limite de lotes.
6.6.1.Tratamento de Erros É sempre bom tratar os retornos das ordens enviadas. Isso porque podemos minimizar problemas e avaliar erros de execução. Nas nossas funções fizemos isso a partir de resposta.retcode que retorna um código (com 5 dígitos) proveniente do servidor da corretora que estamos utilizando. Abaixo temos uma janela mostrando detalhes a respeito desses códigos. Você pode chegar a essa janela apertando a tecla F1 no número 10008 ou 10009 do código.
6.7.
Seção de OnTick()
O objetivo agora é criar toda a lógica da estratégia para o nosso EA. Já temos prontas as funções necessárias para o seu funcionamento. É dentro da função OnTick(), chamada a cada novo negócio realizado na bolsa, que iremos escrever o corpo estratégico. Primeiro, devemos alimentar com dados nossas variáveis de velas, ticks e indicadores. Também não podemos esquecer-nos de ordená-las de maneira adequada com a função ArraySetAsSeries():
Após isso, podemos fazer uso dessas variáveis para construção da lógica de ação de compra e venda do nosso robô. Seguem às condições de cruzamentos:
Na linguagem MQL5 fica:
enum Temos que criar uma lógica para utilizar o (ESTRATEGIA_ENTRADA). Precisamos que os gatilhos de compra e vendas estejam orientados com as opções de: APENAS_MM (apenas médias móveis), APENAS_IFR (apenas IFR) e MM_E_IFR (Médias móveis mais IFR), descritas neste enum. Vamos a uma possível solução para esse problema:
Agora podemos organizar nossas funções para que o EA possa tomar decisões de compra e venda. É importante sabermos quando uma nova barra (vela) é criada para que o algoritmo possa rastrear, sem muito esforço computacional, um possível cruzamento de médias e IFR na região desejada. Vamos pedir para desenhar uma linha vertical quando os gatilhos de compra/venda forem ativados.
A função ‘PositionSelect(_Symbol)’ retorna um booleano. Caso exista alguma posição em andamento ela retorna true, caso contrário false. Assim só queremos entrar numa operação se o EA não tiver posição aberta. Finalmente, para terminar nosso tão esperado EA precisamos de um código para fechar alguma posição aberta no horário limite, ou seja, aquela posição que não foi atingido o alvo de ganho ou o stop loss.
A função PositionGetInteger(POSITION_TYPE) retorna o tipo de posição aberta. Caso seja uma posição de compra temos POSITION_TYPE_BUY no caso de uma venda temos POSITION_TYPE_SELL. Mais uma vez caso queira ter acesso ao código completo deste EA o mesmo pode ser baixado em: https://github.com/rafaelfvcs. Ou se preferir pode mandar um e-mail para [email protected] que terei o prazer em enviá-lo! Vamos agora fazer backtests com nosso mais novo robô de investimentos multiestratégia.
Capítulo 7 7. Backtests Ter uma estratégia vencedora no longo prazo é o principal interesse de quem programa robôs de investimentos. Existe aquela famosa frase: que no mercado financeiro ninguém possui bola de cristal. Não adianta ficar tentando prever o futuro do mercado, porque isso, infelizmente, é impossível até o presente momento. Precisamos ser realista para aceitar que nossa estratégia vai ter altos e baixos com relação aos retornos financeiros. A estratégia 100% vencedora é uma utopia. Entretanto, é importante sabermos o quão boa é nossa estratégia. Nada melhor do que utilizar os dados do passado para avaliar como ela performou em diversas condições de mercado. Assim testar nossa estratégia em períodos de tempo passados é chamado de backtest . Felizmente, quando se trata de backtest o MetaTrader 5 fornece uma apanhado de funcionalidades simples e úteis para extrair o máximo possível de informações do desempenho do nosso Expert Advisor (EA). Agora que já possuímos um robô (MM_CROS_IFR.exe5) multiestratégia programado e funcionando adequadamente, vamos fazer os backtests. 7.1.
Backtest no MetaTrader 5
Vamos abrir o MetaTrader e ir no campo Navegador -> Consultor expert e procurar pelo nosso mais novo EA. Uma vez encontrado devemos clicar com o botão direito em cima dele e depois em Teste.
Isso irá nos fornecer um novo campo no MetaTrader chamado de Testador de Estratégia, na aba configurações temos o seguinte painel de possibilidades:
Com isso seremos capazes de escolher o ativo financeiro para o backtest :
O tempo gráfico:
Temos a opção de escolher como a formação das nossas velas (candles) são simuladas pelo MetaTrader.
Para esse modo de geração de preços em velas, vamos às principais opções mais utilizadas:
Cada tick ou baseado em tick real: o MetaTrader tenta simular ticks reais de preços na formação das velas. Essa opção deixa o backtests mais preciso, porém exige mais recursos computacional uma vez de dentro de uma vela o MetaTrader tenta reproduzir a formação de ticks reais. Vale ressaltar que não são ticks reais são apenas uma simulação (uma representação possível da realidade). Este artigo esclarece o funcionamento dessa simulação: https://www.mql5.com/pt/articles/75. OHLC por 1 minuto : nesse tipo de formação de vela o MetaTrader gera apenas 4 valores de preços: O - open, H - High, L - Low, C - Close. Essa opção exige bem menos recurso computacional comparada com a opção cada tick. Somente a Abertura de Preços: está é a opção menos custosa computacionalmente, pois utiliza apenas um preço para representar uma vela.
Nos nossos backtests iremos sempre deixar a opção Para frente marcada como No (ver figura abaixo). Essa opção é útil quando estamos fazendo otimizações de estratégias e queremos utilizar métodos de otimização como o WFA (Walk Forward Analysis ). Este tipo de estudo foge do escopo deste livro. Se quiser saber mais a respeito, pode compra o outro e-book (Como Otimizar Corretamente Robôs de investimentos no MetaTrader 5 [5]).
O tipo de execução com ou sem latência é interessante para podermos simular as condições em que se encontram os servidores e a velocidade de nossa internet. A latência refere-se ao tempo necessário para o roteamento das ordens serem devidamente executadas.
Temos a possibilidade de escolher o financeiro do depósito inicial bem como a possibilidade de alavancagem (no caso da figura abaixo 1:1 – sem alavancagem).
Para os nossos backtests o campo Otimização deve ficar Desabilitado:
Devemos escolher o período dos dados para o backtest .
E marcar a opção de visualizar o backtest :
Vamos agora para a aba Parâmetros de entrada do Testador de Estratégia.
Neste campo podemos colocar o setup necessário para a realização de nossos backtests. No momento, o que nos interessa é apenas a coluna Valor, destacada em vermelho baixo. Às demais colunas (destacadas em verde) são utilizadas como parâmetros para a otimização do EA.
Na aba Agentes temos informações com relação ao poder computacional da máquina que estamos utilizando para fazer os backtests e otimizações. Um backtest apenas costuma ser pouco custoso computacionalmente. No entanto, quando estamos fazendo otimizações (são requisitados muitos backtests) iremos precisar de bastante recurso e, portanto, essa aba Agentes nos será importante. Podemos fazer um registro para utilizar vários núcleos de processamento na nuvem e aumentar assim nosso poder computacional. A utilização desses núcleos extras tem um custo bem acessível. Com alguns poucos dólares podemos fazer centenas de milhares de otimizações.
Com isso após definir corretamente os parâmetros para o backtest basta voltar para a aba Configuração e apertar no botão Iniciar.
7.2.
Analisando o Backtest
Logo depois de apertar o botão iniciar nos aparece a seguinte janela:
Temos assim uma tela para visualizar o que está acontecendo com o backtest . Podemos controlar a velocidade com que novas velas (candles (candles)) vão aparecendo, a partir dos botões em destaque (vermelho) da figura acima. É possível, também, ter os preços de cada vela e indicador (área verde em destaque), basta colocar o mouse em cima do elemento desejado na tela. Na Caixa de Ferramentas temos quatro abas (Negociação, Histórico, Operações e Diário) onde podemos acompanhar registros com relação às operações de trades do nosso EA.
Na Caixa de Ferramentas na aba Operações podemos ir acompanhando os registros com cada uma das operações de venda e compra. Algo muito útil é que podemos dar dois cliques em cima de alguma dessa operação e o gráfico mostrará automaticamente a operação em questão.
A aba Histórico da Caixa de Ferramentas mostra um pouco mais de detalhes. Podemos observar rapidamente às operações lucrativas (verde) e com prejuízo (vermelho) a partir de destaques coloridos.
Por fim, a aba Negociação mostra o andamento de cada negociação em particular. Temos as informações com relação ao preço de entrada, nossa margem financeira disponível e como está o andamento do trade, trade, se com ganho ou perda.
7.3.
Gráficos de Desempenho
Durante o backtest ou após o término podemos acompanhar a evolução do nosso capital na aba Gráfico que surge no Testador de Estratégias .
Contudo, após o término do backtest surge uma nova aba chamada Test de Volta (Backtest (Backtest ). ). Está aba fornece um resumo das estatísticas operacionais da nossa estratégia. Nela podemos ver o Fator de lucro da operação (razão entre o lucro bruto e a perda bruta), fator de recuperação, drawdown ou rebaixamento, total de negociações, nº de posições vendidas e compradas com ganhos e perdas, índice sharp dentre outras.
Podemos visualizar gráficos de barras informando a respeito dos horários, os dias da semana e o mês onde temos mais entradas nos traders. traders. É possível acompanhar a frequência dos lucros e as perdas: por horário de operação do EA, dias da semana e meses do ano. Temos, também, informações com relação ao tempo máximo posicionado e duração mínima de uma posição. Contudo, como podemos ver o MetaTrader 5 nos fornece uma análise bastante completa do nosso backtest .
--==*__*==-Parabéns por ter chegado até aqui!! Obrigado pela confiança na leitura deste e-book. Agora que você conseguiu criar seu primeiro EA e fazer os backtests, significa que terá uma nova jornada de estudos rumo a estratégias mais complicadas e sofisticadas. Vale lembrar que o EA ensinado neste livro é puramente demonstrativo e não oferece meios para a utilização como sugestão de investimentos reais. Caso queira conhecer outros livros, com didática semelhante, vale a pena conferir os seguintes: Como criar um indicador no MQL5 (passo a passo do Zero). Como otimizar corretamente Robôs de Investimentos no MetaTrader 5 Caso se interesse por algum desses livros favor entrar em contato pelo e-mail: [email protected] Este material foi escrito pensando em você caro leitor. É bom lembrar que todos nós somos motivados por críticas ou elogios. Se esse livro foi útil para você de alguma forma, se gostou ou não da didática, favor deixar um comentário na loja da Amazon. Esse tipo de atitude é de extrema valia para que as próximas edições estejam ainda melhores. Bons estudos e vamos em frente!