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

 
gr101:

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.

Actualmente tiene 650 Mb

No he cambiado nada, solo lo he mantenido en funcionamiento.

 
gr101:

Gracias por los comentarios.

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

Usted se centra en el bucle. ¿Qué más utilizas en tu EA? ¿Controles gráficos o cualquier otro control?
 

Ese script anterior en el hilo es el EA completo (ForumQuestion1.mq5), es lo que empuja la memoria hacia arriba. No hay otras acciones en el EA.

No hay controles gráficos.

 

Hola Alain,

Por favor, vea el documento de Word adjunto. Esto es de una instancia de Windows Server 2012 R2 que se ejecuta en Windows Azure. Es una máquina nueva (así que no hay software raro ni nada) y está corriendo en el centro de datos de Europa Occidental.

El uso de la memoria que aumenta con el tiempo también ocurre aquí cuando se ejecuta el script ForumQuestion1.mq5 (de antes en el hilo).

Aquí está un desglose del aumento en el tiempo de 8:40am a 14:05pm pasó de 74,1MB hasta 379,9MB.

8:40 am

74.1 MB

Acaba de empezar ForumQuestion1 EA

9:53 am

281,6 MB

10:30 am

297,2 MB

11:23 horas

319,3 MB

12:23 horas

343,5 MB

13:00 horas

369,1 MB

14:05 PM

379.9 MB

Archivos adjuntos:
 
Creo que esto es normal. mi MT4 está en 1GB de ram ahora
 
Daniela Bluemel:
creo que esto es normal. mi MT4 está en 1GB de ram ahora
Este tema es sobre MT5 Daniela.
 
Alain Verleyen:
Este tema es sobre MT5 Daniela.
Sí, lo sé, pero mi MT4 tiene el mismo comportamiento
 
Encontré una solución... no es bonita pero funciona.

Solución: Ejecuta un script de PowerShell que compruebe la memoria. Cuando supera el 60% reinicia MetaTrader.

El script está abajo, estoy ocupado probándolo.

Pasos:

  1. Hacer clic en Inicio en Windows
  2. Escribe "PowerShell ISE"
  3. Cortar y pegar el script de abajo en el editor de texto
  4. Pulsar play (o guardar como archivo PS1 y ejecutarlo desde el símbolo del sistema, pero todavía lo estoy probando así que lo ejecuto desde PowerShell ISE por ahora)

La secuencia de comandos está por debajo de este reinicia Metatrader (terminal64) si la memoria se pone más de 300 MB (según la columna de memoria en el Administrador de tareas):

#################################################################

strict-mode 
cls
$memoryThresholdInKiloBytes = 300000
$cooldownSeconds = 30
$loopPauseInSeconds = 30
$counter = 0

while($true){
    if($counter -gt 1000){
        cls
    }
    
    #write-host "$(get-date) Checking memory in use... counter=$counter"
    $processPrivateSet = Get-Counter "\Process(terminal64)\Working Set - Private"
    $wsPrivateKiloBytes = $processPrivateSet.CounterSamples[0].CookedValue / 1KB
   
    $memoryLabel = $wsPrivateKiloBytes.ToString('## ### ###') + " K"

    write-host "$(get-date) Kilo Bytes in use $memoryLabel"
    if($wsPrivateKiloBytes -gt $memoryThresholdInKiloBytes){
            
        write-host "$(get-date) Over threshold of $memoryLabel closing metatrader"
        
        # Close metatrader (terminal64)
        Get-Process terminal64 | Foreach-Object { 
            $_.CloseMainWindow() | Out-Null 
        } | stop-process –force
        
        # Give time to shutdown        
        write-host "$(get-date) Shutting down cooldown of $cooldownSeconds seconds #####################"
        start-sleep -Seconds $cooldownSeconds

        # Open metatrader
        write-host "$(get-date) Opening metatrader again and wait $cooldownSeconds seconds"
        &"C:\Program Files\MetaTrader 5\terminal64.exe"     
        start-sleep $cooldownSeconds
    }

    start-sleep -Seconds $loopPauseInSeconds
    $counter = $counter + 1;
}

# Links
# http://stackoverflow.com/questions/33344611/get-memory-private-working-set-of-process
 

¿Ha intentado establecerTERMINAL_MAXBARScon TerminalInfoInteger(..) a un valor pequeño razonable?

Además de eso tienes

TERMINAL_MEMORY_PHYSICAL

Memoria física en el sistema, Mb

int

TERMINAL_MEMORY_TOTAL

Memoria disponible para el proceso de la terminal, Mb

int

TERMINAL_MEMORIA_DISPONIBLE

Memoria libre del proceso del terminal, Mb

int

TERMINAL_MEMORIA_UTILIZADA

Memoria utilizada por el terminal, Mb

int


para comprobar dónde está el quid de la cuestión.

 

Mi opinión es que no estás liberando memoria sólo con los "símbolos de borrado".

Prueba esto:

delete symbols;
symbols=NULL;