# MetaQuotes Language MQL4/MQL5

MQL4 (MetaQuotes Language 4) e MQL5 (MetaQuotes Language 5) são linguagens de programação integradas projetadas para o desenvolvimento de robôs de negociação, indicadores técnicos, scripts e bibliotecas de funções dentro do programa MetaTrader.
O objetivo principal das linguagens MQL4 e MQL5 consiste na automação da negociação e simplificação da análise operacional. MQL4 e MQL5 contam com uma extensa biblioteca de códigos-fonte de programação para desenvolver robôs de negociação.

## História

Em 1º de julho de 2005, a empresa MetaQuotes Software lançou o MetaTrader 4, uma plataforma para operar em mercados financeiros. A linguagem de programação MQL4 foi projetada especificamente para trabalhar com esta plataforma. Inicialmente, sua sintaxe era baseada em C. A nova versão da plataforma, MetaTrader 5, foi lançada em 2010 junto com a MQL5, isto é, uma nova linguagem criada exclusivamente para ela.
A linguagem MQL4 seria significativamente atualizada com o lançamento do MetaTrader 4 build 600 em 2014, o que a levaria ao nível da mais moderna MQL5. O ambiente de desenvolvimento MetaEditor tornar-se-ia unificado para ambas as línguas.
A MQL4 atualizada apresentava novos objetos gráficos e novas funções, emprestadas da MQL5 e usadas para análise de gráficos. O sistema de proteção para os arquivos executáveis ​​EX4 foi completamente modificado. A Biblioteca padrão MQL5 foi transferida quase que inteiramente com a única exceção do subsistema de negociação, que exigia uma adaptação. Foram adicionados novos tipos de dados e foi estendido o sistema de micro substituição (compilação condicional #ifdef, #ifndef, #else, #endif), que permitia usar código de outras linguagens com base em С/C++. Também foram adicionadas estruturas, classes e ponteiros para o objeto (ponteiros de MQL4/MQL5 não são iguais em todos os aspectos aos de С++). O MQL4 atualizado possui o modo de compilação rigorosa, o que impede muitos possíveis erros de programação. Na MQL5 este modo é padrão e não pode ser desativado.
Ambos os idiomas suportam quase todos os padrões da programação orientada a objetos, com exceção da herança múltipla: encapsulamento e extensibilidade de tipos, herança, polimorfismo, sobrecarga, funções virtuais.

## Compilador

Para criar programas em MQL4 e MQL5, foi criado um compilador embutido no ambiente de desenvolvimento do MetaEditor. Ele está integrado nos terminais MetaTrader 4/MetaTrader 5. O MetaEditor permite uma edição conveniente do código-fonte do programa, gerando projetos automaticamente por modelos, analisando dinamicamente códigos e desenvolvendo remotamente aplicativos em conjunto com outras pessoas.

## Diferenças entre MQL4 e MQL5

Uma das principais diferenças é a configuração do sistema de negociação. MQL4 é usada para desenvolver programas de negociação com base no sistema de ordens, enquanto a MQL5 é utilizada para implementar sistemas de posicionamento. No terminal de negociação MetaTrader 5, há uma clara distinção entre os conceitos de posição, ordem e transação. Uma ordem é um pedido para executar uma operação de negociação, o que pode resultar numa transação. Uma posição é o conjunto de transações de acordo com um determinado instrumento financeiro.
MQL5 conta com uma lista expandida de função de negociação para trabalhar com ordens abertas, uma lista de posições abertas, histórico de ordens e histórico de transações. Em MQL4, diferentes funções como OrderSend, OrderClose, OrderCloseBy, OrderModify, OrderDelete foram originalmente incluídas para executar cada operação de negociação. Estas funções podem ser usadas para abrir/fechar e eliminar as ordens pendentes.
Em MQL5, todas as operações de negociação são realizadas enviando pedidos de negociação através da função OrderSend. Como parâmetro, a função envia um pedido ora para colocar uma ordem pendente, ora para abrir segundo o mercado, ora para cancelar uma ordem já colocada. A introdução da nova função OrderSendAsync em MQL5 permitiu o uso de operações de negociação assíncronas.
Algumas novidades importantes em MQL5 são o Livro de Ofertas [Depth of Market] e um novo tipo de evento para processamento de informações do Livro de Ofertas.

## Funcionalidades

Os recursos de MQL4/MQL5 visam atender diretamente as necessidades e exigências dos traders. Essas linguagens foram desenvolvidas para criar programas de negociação e são usadas apenas para esse propósito. As funções para executar operações de negociação OrderSend, OrderClose, OrderCloseBy, OrderModify, OrderDelete, inicialmente incorporadas na linguagem, são usadas para alterar o estado de uma conta de negociação.
Existem quatro tipos de programas que podem ser escritos em MQL4/MQL5.
* Expert Advisor. Sistemas de negociação que operam automaticamente, segundo uma série de parâmetros predeterminados, e que agem de acordo com um algoritmo incorporado. Quando ocorre um evento previamente especificado (como a entrada de um novo tick, um alerta sobre uma nova operação de negociação ou até mesmo o pressionamento de tecla ou um clique), o Expert Advisor é ativado, executando a ação programada.
* Indicadores Personalizados. Eles são escritos por usuários e complementam os indicadores embutidos e prontos para serem usados, no terminal. Sua função é puramente analítica. Os indicadores não podem negociar e executar operações que diminuem o fluxo da interface (envio de e-mails, atraso arbitrário no trabalho do programa, etc.). A principal tarefa dos indicadores consiste em monitorar a situação, refleti-la, interpretá-la e depois enviá-la ao trader para análise.
* Scripts. Um script é um programa destinado a uma única execução de certa ação. O único tipo de evento processado pelo script é o evento de inicialização.
* Bibliotecas de Funções Personalizadas. Além disso, é possível criar arquivos anexados (#include). Os arquivos anexados permitem que você inclua as funções e classes mais utilizadas, sem a necessidade de colar diretamente seu código-fonte no programa. O uso de funções e classes simplifica o desenvolvimento, depuração e compilação, porque, ao usar bibliotecas dinâmicas, as funções são carregadas somente quando são chamadas diretamente.

## Sintaxe de MQL4 e MQL5, e a diferença entre ela e a de С++

A sintaxe das linguagens é semelhante à de C ++, porém há exceções. MQL4 e MQL5 não dispõem de operações aritméticas com ponteiros. Além disso, nas linguagens MQL, não existe operador goto, nem a possibilidade de declarar enumeração anônima e heranças múltiplas.
* Formatação de texto. A fim de tornar o código mais legível e fácil de trabalhar, é possível utilizar livremente qualquer número espaços em branco, isto é, espaços, tabulações, cadeias vazias. No entanto, há exceções. É restrito o uso do caractere de mudança de linha após a cerquilha; não se deve usar espaços em branco dentro de uma constante, identificadores e palavras-chaves.
* Comentários. Tal como acontece com C/C ++, os comentários de MQL4/MQL5 podem ser de uma única linha e de várias linhas. Um comentário de linha única começa com // e termina com o caractere de nova linha. Os comentários de várias linhas começam com /* e terminam com */. Eles não podem ser aninhados.
* Identificadores. Identificadores são usados ​​como nomes para variáveis ​​e funções. O comprimento de um identificador não pode exceder 63 caracteres. Os seguintes caracteres podem ser usados ​​na escrita de um identificador: números 0-9, letras maiúsculas e minúsculas latinas Z, reconhecidas como caracteres diferentes e o caractere de sublinhado (_). O primeiro caractere não pode ser um número.

## Tipos de dados

Principais tipos de dados usados em MQL4/MQL5:
* inteiros (char, short, int, long, uchar, ushort, uint, ulong);
* boolianos ou lógicos (bool);
* literais (ushort);
* cadeias de caracteres (string);
* ponto flutuante (double, float);
* cor (color);
* data e hora (datetime);
* enumeração (enum).
Estruturas e classes são um tipo de dados complexo (abstrato) que pode funcionar em MQL4/MQL5. As classes diferem das estruturas nas seguintes características:
* a palavra-chave class na declaração;
* todos os membros de classe têm um especificador de acesso private, por padrão, enquanto que os membros de estrutura são declarados com o tipo de acesso public, por padrão;
* os objetos de classe sempre têm uma tabela de funções virtuais, enquanto as estruturas não podem tê-la;
* o operador new pode ser aplicado apenas a objetos de classe. Não pode ser aplicado às estruturas;
* natureza da herança, quer dizer, uma classe só pode ser herdada de uma classe, e uma estrutura, só de uma estrutura.

## Operações e expressões

Em MQL4/MQL5, estão presentes todas as operações convencionais, isto é, aritméticas, lógicas, binárias, e assim por diante. A precedência das operações corresponde à precedência adotada em C ++.

## Crítica

A principal desvantagem das linguagens da família MQL é que não se pode criar aplicativos independentes à medida que cada linguagem é anexada à plataforma correspondente, seja ela, MetaTrader 4, MetaTrader 5, além disso, os programas EX4/EX5 só funcionam nelas.