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

 
gr101:

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.

Atualmente é de 650 Mb

Eu não mudei nada, apenas o mantive funcionando.

 
gr101:

Obrigado pelo feedback.

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

Você está se concentrando no loop. O que mais você usa em sua EA? Controles gráficos ou qualquer outro controle?
 

Esse script no início é o EA completo (ForumQuestion1.mq5), é o que empurra a memória para cima. Não há outras ações na EA.

Não há controles gráficos.

 

Olá Alain,

Por favor, veja a palavra doc. em anexo. Isto é de uma instância do Windows Server 2012 R2 rodando no Windows Azure. É uma máquina nova (portanto, sem software engraçado ou nada) e está rodando no centro de dados da Europa Ocidental.

A memória de uso aumentando com o tempo também acontece aqui quando se executa o script ForumQuestion1.mq5 (de antes no tópico).

Aqui está uma quebra do aumento ao longo do tempo das 8:40h às 14:05h, que passou de 74,1MB para 379,9MB.

8:40 da manhã

74,1 MB

Acaba de iniciar o ForumQuestion1 EA

9:53h

281,6 MB

10:30h

297,2 MB

11:23h

319,3 MB

12:23pm

343,5 MB

13:00 pm

369,1 MB

14:05 PM

379,9 MB

Arquivos anexados:
 
Acho isso normal. Meu MT4 está agora na ram de 1GB
 
Daniela Bluemel:
Acho isso normal. Meu MT4 está agora na ram de 1GB
Este tópico é sobre o MT5 Daniela.
 
Alain Verleyen:
Este tópico é sobre o MT5 Daniela.
sim eu sei, mas meu MT4 tem o mesmo comportamento
 
Encontrei um trabalho ao redor... não é bonito, mas funciona.

Solução: Executar um script PowerShell que verifica a memória. Quando ultrapassa 60%, ele reinicia o MetaTrader.

O script está abaixo, estou ocupado testando-o.

Passos:

  1. Clique em Iniciar no Windows
  2. Tipo "PowerShell ISE"
  3. Corte e passe o roteiro abaixo no editor de texto
  4. Pressione play (ou salve como arquivo PS1 e execute-o a partir do prompt de comando, mas eu ainda estou testando, então execute-o a partir do PowerShell ISE por enquanto)

O script está abaixo deste reinicia Metatrader (terminal64) se a memória ultrapassar 300 MB (de acordo com a coluna de memória em seu Gerente de Tarefas):

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

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
 

Você já tentou setTERMINAL_MAXBARScom TerminalInfoInteger(...) a um valor razoavelmente pequeno?

Além disso, você já tentou:

TERMINAL_MEMORY_PHYSICAL

Memória física no sistema, Mb

int

TERMINAL_MEMÓRIA_TOTAL

Memória disponível para o processo do terminal , Mb

int

TERMINAL_MEMÓRIA_DISPONÍVEL

Memória livre do processo terminal, Mb

int

TERMINAL_MEMÓRIA_UTILIZADA

Memória utilizada pelo terminal , Mb

int


para verificar onde está o cerne da questão.

 

Meus 2 centavos é que você não está liberando a memória apenas com "apagar símbolos".

Tente isto:

delete symbols;
symbols=NULL;