- Execução de Programa
- Trade permission
- Eventos do Terminal Cliente
- Recursos
- Chamadas de Funções Importadas
- Erros em Tempo de Execução
- Testando Estratégias de Negociação
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 |
nenhum |
Expert Advisors e indicadores |
Handler de evento Init. Ele permite usar o tipo de retorno void. |
|
void |
const int reason |
Expert Advisors e indicadores |
Handler de evento Deinit. |
|
void |
nenhum |
scripts e serviços |
Handler de evento Start. |
|
int |
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 |
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 |
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 |
nenhum |
Expert Advisors e indicadores |
Handler de evento Timer. |
|
void |
nenhum |
Expert Advisors |
Handler de evento Trade. |
|
double |
nenhum |
Expert Advisors |
Handler de evento Tester. |
|
void |
const int id, const long &lparam, const double &dparam, const string &sparam |
Expert Advisors e indicadores |
Handler de evento ChartEvent. |
|
void |
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:
- OrderCalcMargin();
- OrderCalcProfit();
- OrderCheck();
- OrderSend();
- SendFTP();
- Sleep();
- ExpertRemove();
- MessageBox().
Todas as funções projetadas para indicadores são proibidas em Expert Advisors e scripts:
- SetIndexBuffer();
- IndicatorSetDouble();
- IndicatorSetInteger();
- IndicatorSetString();
- PlotIndexSetDouble();
- PlotIndexSetInteger();
- PlotIndexSetString();
- PlotIndexGetInteger.
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:
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;
- alteração de parâmetros de entrada do indicador.
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;
- calling the ExpertRemove() function.
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:
//+------------------------------------------------------------------+
|
Também Veja