Execução de Programa

Cada script, serviço e EA é executado em seu próprio fluxo separado. Todos os indicadores calculados com base em um símbolo, mesmo se estiverem sendo executados em gráficos diferentes, funcionam no mesmo fluxo. Assim, todos os indicadores em um símbolo compartilham os recursos de um fluxo.

Todas as outras ações associadas a um símbolo, como processamento de ticks e sincronização de histórico, também são consistentemente realizadas no mesmo segmento com indicadores. Isso significa que se uma ação infinita é realizada em um indicador, todos os outros eventos associados a seu ativo nunca serão realizados.

Ao executar um Expert Advisor, certifique-se de que ele tem um ambiente de negociação real e pode acessar o histórico do requerido ativo e período, e sincronizar dados entre o terminal e o servidor. Para todos estes procedimentos, o terminal fornece um atraso de iniciação de não mais que 5 segundos, após o qual o Expert Advisor será iniciado com os dados disponíveis. Portanto, no caso de não haver conexão com o servidor, isso pode levar a um atraso na iniciação de um Expert Advisor.

A tabela abaixo contém um breve resumo sobre programas MQL5:

Programa

Execução

Observação

Serviço

No fluxo em si, há o mesmo número de serviços e de fluxos de execução para eles

O serviço em loop não pode atrapalhar outros programas

Script

Um segmento separado, o número de segmentos para scripts é igual ao número de scripts

Um script em loop não é capaz de interromper a execução de outros programas

Expert Advisor

Um segmento separado, o número de segmentos para Expert Advisor é igual ao número de Expert Advisor

Um Expert Advisor em loop não é capaz de interromper a execução de outros programas

Indicador

Um segmento para todos os indicadores de um símbolo. O número de segmentos é igual ao número de símbolos com indicadores

Um loop infinito em um indicador irá parar todos os outros indicadores sobre este ativo

Logo após um programa ser anexado a um gráfico, ele é carregado para a memória do terminal cliente, bem como variáveis globais são inicializadas. Caso alguma variável global do tipo classe tiver um construtor, este construtor será chamado durante a inicialização das variáveis globais.

Após isso, o programa fica esperando por um evento do terminal cliente. Cada programa-MQL5 deve ter ao menos um manipulador (handler) de evento, caso contrário o programa carregado não será executado. Handlers de evento têm nomes pré-definidos, parâmetros e tipos de retorno.

Tipo

Nome da Função

Parâmetros

Aplicativo

Comentário

int

OnInit

nenhum

Expert Advisors e indicadores

Handler de evento Init. Ele permite usar o tipo de retorno void.

void

OnDeinit

const int reason

Expert Advisors e indicadores

Handler de evento Deinit.

void

OnStart

nenhum

scripts e serviços

Handler de evento Start.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const datetime &Time[],

const double &Open[],

const double &High[],

const double &Low[],

const double &Close[],

const long &TickVolume[],

const long &Volume[],

const int &Spread[]

indicadores

Handler de evento Calculate para todos os preços.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

indicadores

Handler de evento Calculate sobre um array único de dados.

Um indicador não pode ter simultaneamente dois handlers de evento.

Neste caso apenas um handler (manipulador) de evento vai trabalhar na array de dados.

void

OnTick

nenhum

Expert Advisors

Handler de evento NewTick. Enquanto o evento de recebimento de um novo tick está sendo processado, nenhum outro evento deste tipo é recebido.

void

OnTimer

nenhum

Expert Advisors e indicadores

Handler de evento Timer.

void

OnTrade

nenhum

Expert Advisors

Handler de evento Trade.

double

OnTester

nenhum

Expert Advisors

Handler de evento Tester.

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

Expert Advisors e indicadores

Handler de evento ChartEvent.

void

OnBookEvent

const string &symbol_name

Expert Advisors e indicadores

Handler de evento BookEvent.

Um terminal cliente envia novos eventos para o gráfico aberto correspondente. Os eventos podem ser gerados por gráficos (Eventos de gráfico) ou programas-MQL5 (eventos customizados). A geração de eventos de criação ou exclusão de objetos gráficos sobre um gráfico pode ser habilitado ou desabilitado através da definição das propriedades de gráfico CHART_EVENT_OBJECT_CREATE e CHART_EVENT_OBJECT_DELETE. Cada programa MQL5 e cada gráfico têm sua própria fila de eventos, onde todos os novos eventos que chegam são adicionados.

Um programa recebe somente eventos do gráfico no qual ele está rodando. Todos os eventos são processados um após o outro na ordem que em eles são recebidos. Se um fila já tiver um evento NewTick, ou este evento está correntemente sendo processado, então um novo evento NewTick não é colocado na fila do programa MQL5. Similarmente, se ChartEvent já esta enfileirado, ou este evento está sendo processado, nenhum novo evento deste tipo é enfileirado. Os eventos de timer são tratados da mesma forma — se o evento Timer está na filha ou sendo tratado, um novo evento timer não é enfileirado .

Filas de evento têm um tamanho limitado mas suficiente, de modo que a sobrecarga de uma fila em programas bem escritos é improvável. No caso de uma sobrecarga de fila, novos eventos são descartados sem enfileiramento.

Evite usar loops infinitos para manipular eventos. As únicas exceções a essa regra são scripts e serviços que manipulam um único evento Start.

Bibliotecas não tratam nenhum evento.

 

Funções proibidas em Indicadores e Expert Advisors

Indicatores, scripts e Expert Advisors são programas executáveis escritos em MQL5. Eles são projetados para diferentes tipos de tarefas. Portanto existem algumas restrições quanto ao uso de certas funções, dependendo do tipo de programa. As seguintes funções são proibidas em indicadores:

 

Todas as funções projetadas para indicadores são proibidas em Expert Advisors e scripts:

A biblioteca (library) não é um programa independente e é executado no contexto do programa MQL5 que a chamou: script, indicador ou Expert Advisor. Desta forma, as restrições acima se aplicam à biblioteca (library) chamada.

 

Proibição do uso de funções nos serviços

Os serviços não aceitam eventos, pois não estão vinculados a gráficos. Nos serviços são proibidas as seguintes funções:

ExpertRemove();

EventSetMillisecondTimer();

EventSetTimer();

EventKillTimer();

SetIndexBuffer();

IndicatorSetDouble();

IndicatorSetInteger();

IndicatorSetString();

PlotIndexSetDouble();

PlotIndexSetInteger();

PlotIndexSetString();

PlotIndexGetInteger();

 

Carga e Descarga de Indicadores

Indicadores são carregados nos seguintes casos:

  • um indicador é anexado a um gráfico;
  • inicio do terminal (se o indicador estava anexado a um gráfico antes do encerramento do terminal);
  • carga de um template (se o indicador anexado a um gráfico estiver especificado no template);
  • alteração de um perfil (se o indicador estiver anexado a um dos gráficos do perfil alterado);
  • alteração de um ativo e/ou período de um gráfico, no qual o indicador está anexado;
  • alteração da conta na qual o terminal está conectado;
  • após uma bem sucedida recompilação de um indicador, se o indicador estiver anexado a um gráfico;
  • alteração de parâmetros de entrada do indicador.

 

Indicadores são descarregados nos seguintes casos:

  • ao desanexar um indicador de um gráfico;
  • encerramento do terminal (se o indicador estiver anexado a um gráfico);
  • carga de um template, se um indicador estiver anexado a um gráfico;
  • fechamento de um gráfico, no qual o indicador estava anexado;
  • alteração de um perfil, se o indicador estiver anexado a um dos gráficos do perfil alterado;
  • alteração de um ativo e/ou período de um gráfico, no qual o indicador está anexado;
  • alteração da conta na qual o terminal está conectado;

 

Carga e Descarga de Expert Advisors

Expert Advisors são carregados nos seguintes casos:

  • ao anexar um Expert Advisor a um gráfico;
  • início de terminal (se o Expert Advisor estava anexado a um gráfico antes do encerramento do terminal);
  • carga de um template (se o Expert Advisor anexado a um gráfico está especificado no template);
  • alteração de um perfil (se o Expert Advisor está anexado a um dos gráficos do perfil);
  • conexão a uma conta, mesmo se o número da conta for o mesmo (se o Expert Advisor estava anexado ao gráfico antes da autorização do terminal no servidor.
     

Expert Advisors são descarregados nos seguintes casos:

  • ao desanexar um Expert Advisor de um gráfico;
  • Se um novo Expert Advisor é anexo a um gráfico, e um outro Expert Advisor já estava anexado, este Expert Advisor é descarregado.
  • encerramento do terminal (se o Expert Advisor estiver anexado a um gráfico);
  • carga de um template, se um Expert Advisor está anexado a um gráfico;
  • fechamento de um gráfico, no qual o Expert Advisor está anexado.
  • alteração de um perfil, se o Expert Advisor está anexado a um dos gráficos do perfil alterado;
  • alteração da conta na qual o terminal está conectado (se o Expert Advisor estava anexado a um gráfico antes da autorização do terminal no servidor;

Em caso de alteração de ativo ou período de um gráfico, no qual o Expert Advisor está anexado, Expert Advisors não são carregados ou descarregados. Neste caso o terminal cliente subseqüentemente chama os handlers OnDeinit() sobre o ativo/período antigo e OnInit() sobre o novo ativo/período; valores de variáveis globais e variáveis estáticas não são redefinidos. Todos os eventos que foram recebidos pelo Expert Advisor antes da inicialização ser concluída (função OnInit()) são pulados.

 

Carga e Descarga de Scripts

Scripts são carregados imediatamente após eles serem anexados a um gráfico e descarregados imediatamente após eles concluírem sua operação. OnInit() e OnDeinit() não são chamados por scripts.

Quando um programa é descarregado (excluído de um gráfico) o terminal cliente realiza a desinicialização de variáveis globais e excluí a fila de eventos. Neste caso a desinicialização significa a redefinição de todas as variáveis de tipo string, desalocação de objetos de array dinâmico e chamada de seus destrutores se eles estiverem disponíveis.

 

Carga e Descarga de Serviços

Os serviços são carregados imediatamente após o início do terminal, se, ao parar o terminal, eles são iniciados. Os serviços são descarregados imediatamente após o término de seu trabalho.

Os serviços têm um único manipulador OnStart() no qual você pode organizar um loop infinito de recebimento e de processamento de dados, por exemplo, ao criar e atualizar símbolos personalizados usando funções de rede.

Ao contrário de EAs, de indicadores e de scripts, os serviços não estão vinculados a um gráfico específico, portanto, para iniciar o serviço é fornecido um mecanismo separado. A criação de uma nova instância do serviço é feita a partir do Navegador usando o comando Adicionar serviço. Para iniciar, parar, remover uma instância de serviço, use seu menu. Para gerenciar todas as instâncias, use o menu do próprio serviço.

 

Para um melhor entendimento do funcionamento de um Expert Advisor, nós recomendamos compilar o código do seguinte Expert Advisor e realizar ações de carga/descarga, alteração de template, alteração de ativo, alteração de período, etc:

Exemplo:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass construtor"); }
   ~CTestClass() { Print("CTestClass destruidor"); }
  };
CTestClass global;
//+------------------------------------------------------------------+
//| Função de inicialização do Expert                                |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Inicialização");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de Desinicialização do Expert                             |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("Desinicialização com motivo",reason);
  }
//+------------------------------------------------------------------+
//| Função tick (ponto) de um Expert                                 |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+

Também Veja

Eventos do terminal cliente, Handlers de Evento