Conflito entre EAs

 
Recentemente tenho notado que dois EAs em ativos diferentes rodando simultaneamente no mesmo terminal, tendo os mesmos nomes de variáveis estáticas, acaba conflitando na consulta de valores dessas variáveis, mesmo cada um rodando em um ativo diferente. Também tenho suspeita que ocorra com variáveis que não são estáticas.

A solução que encontrei, foi adicionar prefixos diferentes ao final de cada variável em cada robô.

Tem algum artigo já elaborado nesse sentido? 
 
Samuel Almeida:
Recentemente tenho notado que dois EAs em ativos diferentes rodando simultaneamente no mesmo terminal, tendo os mesmos nomes de variáveis estáticas, acaba conflitando na consulta de valores dessas variáveis, mesmo cada um rodando em um ativo diferente. Também tenho suspeita que ocorra com variáveis que não são estáticas.

A solução que encontrei, foi adicionar prefixos diferentes ao final de cada variável em cada robô.

Tem algum artigo já elaborado nesse sentido? 

O que controla a ação de um EA é o Magic Number, e, se ele segue todas as diretrizes para isso. Procure por esses termos...

Mas, se o seu robô não segue esse conceito, em todos os passos de um trade, todas as m*rdas podem acontecer...

;)

 
Flavio Jarabeck:

O que controla a ação de um EA é o Magic Number, e, se ele segue todas as diretrizes para isso. Procure por esses termos...

Mas, se o seu robô não segue esse conceito, em todos os passos de um trade, todas as m*rdas podem acontecer...

;)

Na verdade, esqueci de especificar. Esses EAs que me refiro, não fazem trade; apenas geram relatórios

 
Samuel Almeida:
Recentemente tenho notado que dois EAs em ativos diferentes rodando simultaneamente no mesmo terminal, tendo os mesmos nomes de variáveis estáticas, acaba conflitando na consulta de valores dessas variáveis, mesmo cada um rodando em um ativo diferente. Também tenho suspeita que ocorra com variáveis que não são estáticas.

A solução que encontrei, foi adicionar prefixos diferentes ao final de cada variável em cada robô.

Tem algum artigo já elaborado nesse sentido? 
Variável global?
 
Jonathan Pereira:
Variável global?

Sim. A variável é definida como static no início do script em escopo global e usada em OnTick().

Muitas vezes ao passar um valor para a variável em OnTick(), ela acabava não recebendo o valor para ser usado no tick seguinte.

Como não tinha certeza se o problema era um erro de execução ao passar o valor para a variável ou um conflito com outro EA rodando junto em outro ativo com os mesmos nomes de variáveis, a solução que implementei na verdade foi a seguinte:

x_EA1 = valor;

while(x_EA1 != valor)
    {
     x_EA1 = valor;
    }

Além de adicionar um prefixo _EA, adicionei um while como um fixador de valor para essas variáveis estáticas para certificar que de fato ela receba o valor determinado. Eu sei que parece bizarro, mas o problema foi resolvido, não sei se pelo while ou pelo prefixo diferenciando as variáveis entre EAs.

Não achei nada na literatura MQL5 sobre possíveis conflitos nesse sentido, muito estranho. O código ficou com uma baita gambiarra pra dar certo kkk

 
Samuel Almeida:

Sim. A variável é definida como static no início do script em escopo global e usada em OnTick().

Acho que vc esta confundindo as coisas, eu perguntei se a variavel é uma  GlobalVariable que é um grupo de funções para trabalhar com variáveis globais. O que vc descreve é que, esta usando uma variável no escopo global de seu script/EA, o que é totalmente diferente do que falei.

Outra questão, o uso de variáveis estáticas tem uma certa especificidade, e o que me parece vc esta fazendo o uso de forma errada.


"

Variáveis estáticas existem a partir do momento de execução do programa e são inicializados somente uma vez antes que a função especializada OnInit() seja chamada. Se valores iniciais não forem especificados, variáveis da classe de armazenamento estático assumem valores iniciais zero.

Variáveis locais declarados com a palavra-chave static retém seus valores durante todo o tempo de vida da função. A cada próxima chamada da função, tais variáveis locais contêm os valores que elas tinham durante a chamada anterior.

"

Documentação sobre MQL5: Manipulação de eventos / OnInit
Documentação sobre MQL5: Manipulação de eventos / OnInit
  • www.mql5.com
OnInit - Manipulação de eventos - Referência MQL5 - Referência sobre algorítimo/automatização de negociação na linguagem para MetaTrader 5
 
Jonathan Pereira:

Acho que vc esta confundindo as coisas, eu perguntei se a variavel é uma  GlobalVariable que é um grupo de funções para trabalhar com variáveis globais. O que vc descreve é que, esta usando uma variável no escopo global de seu script/EA, o que é totalmente diferente do que falei.

Outra questão, o uso de variáveis estáticas tem uma certa especificidade, e o que me parece vc esta fazendo o uso de forma errada.


"

Variáveis estáticas existem a partir do momento de execução do programa e são inicializados somente uma vez antes que a função especializada OnInit() seja chamada. Se valores iniciais não forem especificados, variáveis da classe de armazenamento estático assumem valores iniciais zero.

Variáveis locais declarados com a palavra-chave static retém seus valores durante todo o tempo de vida da função. A cada próxima chamada da função, tais variáveis locais contêm os valores que elas tinham durante a chamada anterior.

"

Exato, não é uma variável global, apenas está em um escopo global. Ela é definida antes de OnInit() e usada em OnTick(). Como falei, não é sempre que o problema ocorre. Mas depois que mudei os nomes das variáveis e adicionei o while (não mudei o local de inicialização delas), o problema foi resolvido. Agora não sei dizer o que de fato resolveu, se foi a mudança de nomes ou o uso do while

 
Samuel Almeida:

...

Se vc faz atribuições de novos valores em tempo de execução nessa variável, não faz sentido ela ser uma variável estática estando no escopo global do seu sistema, apenas faria sentido isso, se estivesse dentro de alguma função. Pois o ciclo de vida das variáveis criadas dentro de uma função não são permanentes, ou seja, existem em quanto a função esta empilhada nas chamadas do compilador.

 
Jonathan Pereira:

Se vc faz atribuições de novos valores em tempo de execução nessa variável, não faz sentido ela ser uma variável estática estando no escopo global do seu sistema, apenas faria sentido isso, se estivesse dentro de alguma função. Pois o ciclo de vida das variáveis criadas dentro de uma função não são permanentes, ou seja, existem em quanto a função esta empilhada nas chamadas do compilador.

É que além de Ontick() eu uso algumas delas também em OnDeInit(). De qualquer forma, também mudei a versão do Meta Trader que eu estava usando. Estava usando da corretora Rico e agora estou usando o padrão da Meta Quotes. Não sei se isso tem haver com alguma questão de atualização, mas já me precavi.

Razão: