Chamadas de Funções Importadas

Para importar funções durante a execução de um programa-mql5, o terminal cliente usar "early binding". Isso significa que se um programa tem uma chamada de uma função importada, o correspondente módulo (ex5 ou dll) é carregada durante a carga do programa. MQL5 e bibliotecas DLL são executadas na thread do módulo da chamada.

Não é recomendado usar o nome do módulo com especificação completa para ser carregado, como Drive:\Directory\FileName.Ext. As bibliotecas MQL5 são carregadas a partir da pasta terminal_dir\MQL5\Libraries. Se a biblioteca não for encontrada, então o terminal tenta carregá-la a partir da pasta terminal_dir\experts.

As bibliotecas de sistema (DLL) são carregadas pelas regras do sistema operacional. Se a biblioteca já estiver carregada (por exemplo, um outro Expert Advisor, e mesmo a partir de um outro terminal cliente, executando em paralelo, então ele faz solicitações para a biblioteca já carregada. Caso contrário, ele realiza uma busca na seguinte seqüência:

  1. Diretório do qual o módulo que importa a dll foi iniciado. O módulo aqui é um Expert Advisor, um script, um indicador ou uma biblioteca EX5.
  2. Diretório terminal_data_directory\MQL5\Libraries (TERMINAL_DATA_PATH\MQL5\Libraries).
  3. Diretório do qual o terminal cliente MetaTrader 5 foi iniciado.
  4. Diretório de sistema.
  5. Diretório do Windows.
  6. Diretório corrente.
  7. Diretórios listados na variável de sistema PATH.

Se uma biblioteca DLL usa uma outra DLL no seu funcionamento, a primeira DLL não pode ser carregada no caso de não existir a segunda DLL.

Antes de um Expert Advisor (script, indicador) ser carregado, uma lista comum de todos os módulos de biblioteca EX5 é formada. Vai ser usado a partir de um Expert Advisor carregado(script, indicador)e das bibliotecas desta lista. Assim, é necessário apenas uma única carga de módulos de bibliotecas EX5 usadas muitas vezes. Bibliotecas usam variáveis predefinidas do Expert Advisor (script, indicador) que as chamam.

A biblioteca importada EX5 é procurada na seguinte seqüência:

  1. Diretório, caminho correspondente ao diretório do Expert Advisor (script, indicador) que importa o EX5).
  2. Diretório terminal_directory\MQL5\Libraries.
  3. Diretório MQL5\Libraries no diretório comum a todos os terminais clientes MetaTrader 5 (Common\MQL5\Libraries).

Funções importadas DLL em um programa-mql5 devem garantir a conformidade de chamadas do Windows API. Para garantir tal conformidade, no texto fonte de programas escritos em C ou C++, use a palavra-chave _stdcall, que é específico para os compiladores Microsoft(r). Esta conformidade é caraterizada pelo seguinte:

  • Chamador (no nosso caso, é um programa-mql5) deve "ver" um proto-tipo de uma função chamada (importado da DLL), a fim de combinar parâmetros em uma pilha de forma apropriada.
  • Chamador (em nosso caso, é um programa-mql5) coloca parâmetros na pilha em uma ordem reversa, da direita para esquerda - nesta ordem uma função lê os parâmetros passados para ela.
  • parâmetros são passados por valor, exceto aqueles explicitamente passados por referência (em nossos casos de strings)
  • Uma função importada limpa a pilha de forma independente através da leitura dos parâmetros passados para ela.

Ao descrever o proto-tipo de uma função importada, parâmetros padrão podem ser usados.

Se a biblioteca correspondente é incapaz de ser carregada, ou existe uma proibição quanto ao uso da DLL, ou a função importada não é encontrada - o Expert Advisor interrompe sua operação com a mensagem apropriada "Expert Advisor stopped" no Diário (arquivo de log). Neste caso o Expert Advisor não rodará até ser reiniciado. Um Expert Advisor pode ser reiniciado como resultado de recompilação ou após a tabela de suas propriedades ser aberto e OK ser pressionado.

Passando Parâmetros

Todos os parâmetros de tipos simples são passados por valor a menos que sejam explicitamente indicados que eles devem ser passados por referência. Quando uma string é passada, o endereço do buffer da string copiada é passado; se uma string é passada por referência, o endereço do buffer desta string sem copiá-la é passado para a função importada da DLL.

Estruturas que contém arrays dinâmicos, strings, classes, outras estruturas complexas, bem como arrays estáticos ou dinâmicos dos objetos listados, não podem ser passados como parâmetro para uma função importada.

Ao passar um array para uma DLL, o endereço do começo do buffer de dados é sempre passado (independentemente da flag AS_SERIES). Uma função dentro de uma DLL não sabe nada sobre a flag AS_SERIES, o array passado é um array estático de um comprimento indefinido; um parâmetro adicional deve ser usado para especificar o tamanho do array.