Migrando da linguagem de programação MQL4 para MQL5

MQL5 é a evolução do seu antecessor - a linguagem de programação MQL4, onde inúmeros indicadores, scripts e Expert Advisors foram escritos. Apesar do fato de que a nova linguagem de programação é grandemente compatível com a linguagem da geração anterior, ainda existem algumas diferenças entre as linguagens. E quando migrar de programas, essas diferenças devem ser observadas.

Esta seção contém informações destinadas a facilitar a adaptação dos códigos para a nova linguagem MQL5 ao programadores que conhecem MQL4.

Em primeiro lugar, deve-se observar:

  • A nova linguagem não contém funções start(), init() e deinit().
  • Não há limite para o número de buffers de indicador.
  • DLLs são carregadas imediatamente após o carregamento de um Expert Advisor (ou qualquer outro programa MQL5).
  • Verificação das condições lógicas é reduzida.
  • Quando os limites de um matriz forem ultrapassados, o desempenho em curso é finalizado (criticamente - com a saída de um erro).
  • Originários de operadores em C++.
  • A linguagem oferece o tipo de conversão implícita (mesmo de string para um número).
  • As variáveis locais não são inicializados automaticamente (exceto para strings).
  • Matrizes de local comum são excluídas automaticamente.

Funções Especiais init, start e deinit

A linguagem MQL4 contém apenas estas três funções pré-definidas que são usadas no indicador, script ou Expert Advisor (não contando a inclusão dos arquivos *.mqh e dos arquivos de biblioteca). Em MQL5 não existem estas funções, mas foram criadas funções análogas. A tabela mostra a correspondência aproximada das funções.

MQL4

MQL5

init

OnInit

start

OnStart

deinit

OnDeinit

Funções OnInit e OnDeinit desempenham o mesmo papel que as funções init e deinit em MQL4 - elas são projetadas para encontrar o código, que será realizado durante a inicialização e finalização dos programas MQL5. Você pode simplesmente renomear estas funções em conformidade, ou deixá-las como estão, mas deve adicionar chamadas dessas funções em lugares correspondentes.

Exemplo:

void OnInit()
  {
//--- Função nomeada durante a inicialização
   init();
  }
void OnDeinit(const int reason)
  {
//--- Função nomeada durante a desinicialização
   deinit();
//---
  }

A função start é substituída por OnStart apenas em scripts. Em Expert Advisors e indicadores será renomeado para OnTick e OnCalculate, respectivamente. O código que está para ser executado durante a operação do programa MQL5 será centrado nestas três funções:

programa mql5

principal função

script

OnStart

indicador

OnCalculate

Expert Advisor

OnTick

Se o código do indicador ou script não contém a função principal, ou o nome da função é diferente, esta função não será executada. Isso significa que se o código fonte de um script não contém OnStart, esse código será compilado como um Expert Advisor.

Se um código de indicador não contém a função OnCalculate, a compilação deste indicador será impossível.

Variáveis Predefinidas

Em MQL5 não existem as variáveis pré-definidas como Ask, Bid, Bars. As variáveis de Point e Digits têm uma grafia ligeiramente diferente:

MQL4

MQL5

Digits

_Digits

Point

_Point

 

_LastError

 

_Period

 

_Symbol

 

_StopFlag

 

_UninitReason

Acesso as Timeseries

Em MQL5 não existem as timeseries predefinidas como Open[], High[], Low[], Close[], Volume[] e Time[]. A profundidade necessária de uma timeseries agora pode ser definida através das funções correspondentes para acessar as timeseries.

Expert Advisors

Expert Advisors em MQL5 não requerem a presença obrigatória de funções que manipulam os eventos de recebimento de um novo tick - OnTick, com é realizado em MQL4 (a função de arranque em MQL4 é executado quando um novo tick é recebido). Em MQL5, os Expert Advisors podem conter funções pré-definidas do manipulador de vários tipos de eventos:

  • OnTick — recebimento de um novo tick;
  • OnTimer — evento de timer;
  • OnChartEvent — eventos de entrada do teclado e mouse, eventos de um objeto gráfico em movimento, evento de edição de texto completo na entrada da etiqueta do objeto LabelEdit;
  • OnBookEvent — evento do status de mudança da Profundidade do Mercado.

Indicadores Customizados

Em MQL4, o número de buffers de indicador é limitado e não pode ultrapassar a 8. Em MQL5 não existem estas limitações, mas deve ser lembrado que cada buffer de indicador requer a alocação de uma certa parte da memória para a sua localização no terminal, por isto esta nova possibilidade não deve ser utilizada abusivamente.

MQL4 oferece apenas 6 tipos de plotagem de indicadores personalizados, enquanto MQL5 agora oferece 18 estilos de desenho. Os nomes dos tipos de desenho não mudaram, mas a ideologia da representação gráfica dos indicadores mudou significativamente.

A direção da indexação nos buffers de indicador também é diferente. Por padrão, em MQL5 todos os buffers de indicador tem o comportamento de matrizes comuns, ou seja, o elemento 0 (zero) indexado é o mais antigo no histórico e, como os índices aumentam, passamos dos dados mais antigos para os mais recentes.

A única função para trabalhar com indicadores personalizados que foi preservado da linguagem MQL4 é a função SetIndexBuffer, mas para ser utilizada; agora deve ser especificado o tipo de dado a ser armazenado em um matriz, ligada ao buffer do indicador.

As propriedades de indicadores personalizados também foram modificadas e ampliadas. Novas funções para acesso a timeseries foram adicionadas, de modo que o algoritmo de cálculo total deve ser reexaminado.

Graphical Objects

O número de objetos gráficos em MQL5 foi aumentado significativamente. Além disso, objetos gráficos agora são posicionados no gráfico com a precisão de um segundo em qualquer período de tempo - agora objetos de pontos de ancoragem não são arredondados para o tempo de abertura da barra de preço no gráfico em curso.

Agora para Setas, Textos e Objetos de Etiqueta você pode especificar métodos de vinculação, e para a Etiqueta, Botão, Gráfico, Etiqueta Bitmap e Editar, os objetos podem ser configurados no canto do gráfico onde um objeto está ligado.