Metatrader 5 - Tira muito proveito da memória ao percorrer uma carta através de símbolos

 
Hi,

Tenho um Expert Advisor que foi configurado para fazer o ciclo através de símbolos e mastiga muita memória.

Notei que é quando os símbolos são carregados para dentro e para fora do relógio do mercado que lentamente se insinua. Portanto, não é o gráfico que percorre os itens existentes no relógio do mercado, mas mais quando novos símbolos são carregados e removidos.

Está preparado para fazer o seguinte:

  1. OnInit configura o temporizador para disparar a cada 3 segundos
  2. OnTimer
    1. Obtenha o próximo símbolo na lista usando SymbolTotal() SymbolName()
    2. Define o gráfico para o próximo símbolo usando SymbolSelect() para carregá-lo no Market Watch e ChartSetSymbolPeriod() para definir o gráfico atual para o próximo símbolo
    3. Utiliza SymbolSelect() para remover quaisquer símbolos não utilizados no Market Watch

Quando eu removo o máximo de código personalizado possível e simplesmente uso os passos acima para percorrer um gráfico através dos símbolos disponíveis, noto que o uso de memória em minha máquina continua aumentando.

A CPU permanece e uma taxa constante, mas a memória dispara.

Dúvidas:

  1. Por que isso está acontecendo?
  2. Há algum trabalho ao redor ou sugestões de que alguém tenha que parar a memória de disparar?
    (ou seja, abrir um novo gráfico com ChartOpen() em vez de usar o gráfico existente com ChartSetSymbolPeriod())
  3. Há algum trabalho por perto?
    (ou seja, é exatamente assim que funciona)
  4. Alguma outra sugestão?


Muito agradecido.

 
Talvez um loop infinito? Difícil de adivinhar sem nenhum código.
 

Sim, é um loop infinito, mas essa é a idéia.

Continuar pedalando através de todos os símbolos.

O código abaixo dispara a cada 3 segundos.

Aqui está o código snippet (está tudo em um método para fins de demonstração):

void OnTimer()
  {
      // Find next symbol
      long symbolsTotal = SymbolsTotal(false);
      long count = GlobalVariableGet("testmem");
      if(count >= symbolsTotal)
      {
         count = 0;         
      }                  
      string newSymbol = SymbolName(count, false);
      SymbolSelect(newSymbol, true);
      count++;
      GlobalVariableSet("testmem", count);
      
      // Change chart symbol
      ChartSetSymbolPeriod(0, newSymbol, Period());         
      
      // Remove other symbols from Market Watch
      CArrayString *symbols = new CArrayString();
      for(int i = 0; i < SymbolsTotal(true); i++)
      {
         string symbol = SymbolName(i, true); // Get name from local market watch
         symbols.Add(symbol);
      }           
            
      int total = symbols.Total();
      for(int i = 0; i < total; i++)
      {
         string symbolToRemove = symbols.At(i);
         
         // Is the symbol not the current chart or about to  
         // be added?
         if(newSymbol != symbolToRemove)
         {            
            // Remove from Market Watch
            SymbolSelect(symbolToRemove, false);   
         }         
      }
      
      delete symbols;
   
  }
 
onde os símbolos são iniciados?
 

Não sei o que você quer dizer com "símbolos", mas o código acima está em um novo Expert Advisor com o ExecuteTimer() definido para 3 segundos.

Aqui está o código (isto está em um EA):

int OnInit()
{
//--- criar temporizador
EventSetTimer(3);

//---
return(INIT_SUCCEED);
}

 
Hi,

Acrescentei o script completo ver arquivo anexo "ForumQuestion1.mq5".

Passos para recriar o erro:

  1. Abra o script em anexo no Metaeditor (é seguro) para o Metatrader 5
  2. Gerente de tarefas abertas no Windows
    1. Procure por "Metatrader 5 Client Terminal" e anote a quantidade de memória
  3. Execute o roteiro e assista à coluna de memória no Task Manager

A memória vai aumentando lentamente à medida que o script percorre os símbolos.

Arquivos anexados:
 
gr101:
Hi,

Adicionei o script completo veja o arquivo anexo "ForumQuestion1.mq5".

Passos para recriar o erro:

  1. Abra o script em anexo no Metaeditor (é seguro) para o Metatrader 5
  2. Gerente de tarefas abertas no Windows
    1. Procure por "Metatrader 5 Client Terminal" e anote a quantidade de memória
  3. Execute o roteiro e assista à coluna de memória no Task Manager

A memória vai aumentando lentamente à medida que o script percorre os símbolos.

Eu tentei seu código e não tenho problemas de memória.

MT5 Build 1325.

 

Olá Alain,

Obrigado pela resposta.

Estou na mesma construção. O aumento da memória é lento. Demora alguns minutos. Basicamente, aumenta gradualmente.

Veja o arquivo anexo "Memory increase.docx.png", eu tenho algumas capturas de tela mostrando o aumento ao longo do tempo.

Eu estou na mesma construção "MT5 Build 1325".

Informações da máquina:

  • Windows 8.1 Enterprise
  • OS de 64 bits
  • 16Gb RAM
  • processador i7

Obrigado

Arquivos anexados:
 
gr101:

Olá Alain,

Obrigado pela resposta.

Estou na mesma construção. O aumento da memória é lento. Demora alguns minutos. Basicamente, aumenta gradualmente.

Veja o arquivo anexo "Memory increase.docx.png", eu tenho algumas capturas de tela mostrando o aumento ao longo do tempo.

Estou no mesmo build "MT5 Build 1325".

Informações da máquina:

  • Windows 8.1 Enterprise
  • OS de 64 bits
  • 16Gb RAM
  • processador i7

Obrigado

Eu estou no Windows 10 se isso fizer alguma diferença.

Seu script está em execução desde alguns minutos antes do meu post anterior. Atualmente o uso de memória é menor do que quando o iniciei (280 Mb contra 300 Mb).

EDIT: Acabei de checar o againt e agora é 189 Mb !!! ainda está diminuindo :D

EDIT2: Rodando em Metaquotes Demo-Servidor.

 

Obrigado pelo feedback.

Acho que vou atualizar para o Windows 10 e ver se isso faz alguma diferença.

 

Coloquei-o no Windows Server 12 R2 e isso também aumenta a memória.

Deixe-me monitorar isto por um tempo e dar feedback sobre este tópico.