Bibliotecas: Expert - página 7

 

Ao contrário do MT4, o MT5 não registra os parâmetros de entrada dos Expert Advisors quando eles são iniciados ou alterados. Portanto, é impossível determinar, a partir do registro, o que foi iniciado no Terminal.

Uma função semelhante pode corrigir essa situação.

#include <fxsaber\Expert.mqh> // https://www.mql5.com/pt/code/19003

// Emite os dados do EA em execução
string EAToString( const long Chart_ID = 0 )
{
  string Names[];
  MqlParam Params[];
  
  const int Flag = EXPERT::Parameters(Chart_ID, Params, Names);
  const int Size = ArraySize(Names);
  
  string Str = "Expert " + Params[0].string_value + ", expertmode = " + (string)Flag;
  
  for (int i = 0; i < Size; i++)
    Str += "\n" + Names[i] + " = " + Params[i + 1].string_value;
    
  return(Str);    
}


Aplicativo

input int inInput1 = 1;
input int inInput2 = 2;

int OnInit()
{
  Print(EAToString());
  
  return(INIT_FAILED);
}


Resultado

Test8 (EURUSD,M1)       Expert Experts\Test8.ex5, expertmode = 4
Test8 (EURUSD,M1)       inInput1 = 1
Test8 (EURUSD,M1)       inInput2 = 2


Infelizmente, isso não funciona para scripts. O MT4 produz parâmetros de entrada de scripts por si só, mas o MT5 não.

 
Não consigo executar um EA que usa DLLs usando essa biblioteca. Nos registros, o carregamento de DLLs não é permitido. Há algo que possa ser feito a respeito?
 
pivomoe:
Não consigo executar um EA que usa DLLs usando essa biblioteca. Nos registros, o carregamento de DLLs não é permitido. Há algo que possa ser feito a respeito?
Params[0].string_value += "\nexpertmode=5"; // Permissão para usar a DLL
 
fxsaber:

Está funcionando.

 
Verifiquei o trabalho da biblioteca com o grupo de entrada. Tudo está correto, não precisei alterar o código.
 

Algo que me deixa apreensivo é o princípio de usar uma constante como o nome de um modelo temporário em uma cadeia de caracteres:

#define  FILENAME (__FILE__ + ".tpl")

contém um possível bug relacionado a multithreading. Se um mesmo programa em execução em diferentes gráficos tentar usar a biblioteca, poderá haver uma colisão com o arquivo de modelo - um erro de acesso ou duas cópias idênticas do modelo serão iniciadas silenciosamente, embora tenham sido usadas cópias diferentes.

Você deve gerar um nome temporário, de preferência no formato (era __FILE__, "strike" não funciona em html aqui) MQL-program-name + timestamp + random.

Também é desejável excluir os arquivos antigos automaticamente por tempo limite em qualquer próxima chamada, por exemplo, em 1 dia (analisando parte do carimbo de data/hora), para que eles não sujem as pastas.

PS. O caso é ainda pior, pois __FILE__ é um arquivo de origem e é sempre igual a Expert.mqh - em todos os programas que o utilizam! Corrigida a frase pelo nome.
 
Stanislav Korotky:

Isso foi feito de forma consciente, pesando todos os prós e contras.

Faz sentido excluir imediatamente após a criação de um modelo, e não uma vez por dia. No entanto, é conveniente ter sempre o último modelo salvo para analisar melhor o que está acontecendo.

 
fxsaber:

Isso foi feito deliberadamente, pesando os prós e os contras.

Faz sentido excluir imediatamente após a criação de um modelo, e não uma vez por dia. No entanto, é conveniente ter sempre o último modelo salvo para analisar melhor o que está acontecendo.

Não posso citar nenhuma vantagem do método atual. Na minha opinião, sugeri um método mais correto.

Faz sentido excluir de uma vez se Sync = true (que é o padrão), mas não é implementado dessa forma agora - o arquivo permanece.

 
Stanislav Korotky:

Não consigo pensar em um único "pró" para o método atual. Na minha opinião, sugeri um método mais correto.

Os prós são a aplicação prática. Lancei o Terminal com os Expert Advisors lançados anteriormente, que, no início, entraram imediatamente em seus modelos. Eles funcionaram perfeitamente. Tenho certeza de que é possível reproduzir a colisão teórica. Mas, no meu caso, isso está longe de ser uma prática. Se você decidir criar uma solução universal, compartilhe-a aqui. Eu atualizarei a Bíblia. Não estou pronto para fazer isso sozinho.

Faz sentido excluir de uma vez se Sync = true (que é o padrão), mas não é implementado dessa forma agora - o arquivo permanece.

Sim, eu não o excluo de propósito.

 
fxsaber:

Para - este é um aplicativo prático. Lancei o Terminal com os Expert Advisors lançados anteriormente, que, no início, entraram imediatamente em seus modelos. Eles funcionaram perfeitamente. Tenho certeza de que é possível reproduzir a colisão teórica. Mas, no meu caso, isso está longe de ser uma prática. Se você decidir criar uma solução universal, compartilhe-a aqui. Eu atualizarei a Bíblia. Não estou pronto para fazer isso sozinho.

Sim, não estou excluindo-o de propósito.

Ainda não entendo por que o nome constante Expert.mqh.tpl é mais "prático" (prático?) do que os modelos com o nome do programa que os gera? Digamos que haja um programa A.mq5 e um B.mq5 que usam bibla. Se eles gerassem modelos com seus próprios nomes, seria mais prático, em primeiro lugar, ter a última "impressão digital" das ações de cada programa, em vez de substituir uma pela outra. Em segundo lugar, você poderia ver imediatamente quem é o gerador pelo nome (especialmente útil se os programas forem estrangeiros). Agora não é possível saber isso pelo arquivo Expert.mqh.tpl até que você entre nele. A solução universal que forneci é usar o nome do programa MQL+carimbo de data/hora+aleatório. E não vejo a necessidade de deixar o arquivo em sync=true. Acho que tudo já foi testado e depurado há muito tempo. No caso de erros e da necessidade de depuração, há uma opção sync=false. Nesse caso, o arquivo deve ser deixado. Acho que tudo é lógico. E as edições são simples.

Concordo que, na prática, a colisão pode ocorrer raramente, a menos que alguém use a biblio em paralelo em vários programas. Não o tenho, mas dei uma rápida olhada no código e meu olhar foi atraído pelo Expert.mqh.tpl na pasta Files. Tudo é puramente imho.