Metatrader 5 - Toma mucha memoria al recorrer un gráfico a través de los símbolos

 
Hola,

Tengo un Asesor Experto que ha sido configurado para recorrer los símbolos y consume mucha memoria.

Me he dado cuenta de que esto ocurre cuando los símbolos se cargan y se sacan de la vigilancia del mercado, lo que aumenta lentamente, así que no es el gráfico el que recorre los elementos existentes en la vigilancia del mercado, sino más bien cuando se cargan y eliminan nuevos símbolos.

Está configurado para hacer lo siguiente:

  1. OnInit establece el temporizador para disparar cada 3 segundos
  2. OnTimer
    1. Obtiene el siguiente símbolo de la lista usando SymbolTotal() SymbolName()
    2. Establece el gráfico en el siguiente símbolo usando SymbolSelect() para cargarlo en el Market Watch y ChartSetSymbolPeriod() para establecer el gráfico actual en el siguiente símbolo
    3. Utiliza SymbolSelect() para eliminar los símbolos no utilizados en el Market Watch

Cuando elimino todo el código personalizado posible y sólo utilizo los pasos anteriores para hacer un ciclo de un gráfico a través de los símbolos disponibles, noto que el uso de la memoria en mi máquina sigue aumentando.

La CPU se mantiene a un ritmo constante pero la memoria se dispara.

Preguntas:

  1. ¿Por qué ocurre esto?
  2. ¿Hay alguna solución o sugerencia que alguien tenga para evitar que la memoria se dispare?
    (por ejemplo, abrir un nuevo gráfico con ChartOpen() en lugar de utilizar el gráfico existente con ChartSetSymbolPeriod())
  3. ¿Hay alguna solución?
    (es decir, ¿es así como funciona?)
  4. ¿Alguna otra sugerencia?


Gracias, se agradece mucho

 
¿Tal vez un bucle sin fin? Difícil de adivinar sin ningún código.
 

Sí, es un bucle interminable, pero esa es la idea.

Para mantener el ciclo a través de todos los símbolos.

El código de abajo dispara cada 3 segundos.

Aquí está el fragmento de código (es todo en un método para fines de demostración):

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;
   
  }
 
¿dónde se inician los símbolos?
 

No estoy seguro de lo que quieres decir con "símbolos", pero el código anterior está en un nuevo Asesor Experto con el ExecuteTimer() establecido en 3 segundos.

Aquí está el código (esto es en un EA):

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

//---
return(INIT_SUCCEED);
}

 
Hola,

He añadido el script completo en el archivo adjunto "ForumQuestion1.mq5".

Pasos para recrear el error:

  1. Abrir el script adjunto en Metaeditor (es seguro) para Metatrader 5
  2. Abra el Administrador de Tareas en Windows
    1. Busque "Metatrader 5 Client Terminal" y anote la cantidad de memoria
  3. Ejecute el script y observe la columna de memoria en el Administrador de Tareas

La memoria aumenta lentamente a medida que el script recorre los símbolos.

Archivos adjuntos:
 
gr101:
Hola,

He añadido el script completo en el archivo adjunto "ForumQuestion1.mq5".

Pasos para recrear el error:

  1. Abrir el script adjunto en Metaeditor (es seguro) para Metatrader 5
  2. Abra el Administrador de Tareas en Windows
    1. Busque "Metatrader 5 Client Terminal" y anote la cantidad de memoria
  3. Ejecute el script y observe la columna de memoria en el Administrador de Tareas

La memoria aumenta lentamente a medida que el script recorre los símbolos.

He probado tu código y no tengo problemas de memoria.

MT5 Build 1325.

 

Hola Alain,

Gracias por la respuesta.

Estoy en la misma build. El aumento de la memoria es lento. Tarda unos minutos. Básicamente aumenta gradualmente.

Vea el archivo adjunto "Memory increase.docx.png", tengo algunas capturas de pantalla que muestran el aumento en el tiempo.

Estoy en la misma build "MT5 Build 1325"

Información de la máquina:

  • Windows 8.1 Enterprise
  • Sistema operativo de 64 bits
  • 16Gb RAM
  • procesador i7

Gracias

Archivos adjuntos:
 
gr101:

Hola Alain,

Gracias por la respuesta.

Estoy en la misma build. El aumento de la memoria es lento. Tarda unos minutos. Básicamente aumenta gradualmente.

Ver el archivo adjunto "Memory increase.docx.png", tengo algunas capturas de pantalla en la que se muestra la acumulación en el tiempo.

Estoy en la misma build "MT5 Build 1325"

Información de la máquina:

  • Windows 8.1 Enterprise
  • Sistema operativo de 64 bits
  • 16Gb RAM
  • Procesador i7

Gracias

Estoy en Windows 10 si eso hace alguna diferencia.

Tu script está funcionando desde unos minutos antes de mi post anterior. Actualmente el uso de la memoria es menor que cuando lo inicié (280 Mb contra 300 Mb).

EDIT: Acabo de comprobar againt y es ahora 189 Mb !!! sigue disminuyendo :D

EDIT2: Funcionando en el servidor de demostración de Metaquotes.

 

Gracias por los comentarios.

Creo que voy a actualizar a Windows 10 y ver si eso hace una diferencia.

 

Lo he puesto en Windows Server 12 R2 y eso también hace subir la memoria.

Déjame monitorear esto por un tiempo y dar retroalimentación en este hilo.