Metatrader 5 - Richiede molta memoria quando si scorre un grafico attraverso i simboli - pagina 2

 
gr101:

L'ho messo su Windows Server 12 R2 e anche questo spinge la memoria in alto.

Lasciatemi monitorare questo per un po' e dare un feedback su questo thread.

Attualmente è di 650 Mb

Non ho cambiato nulla, basta tenerlo in funzione.

 
gr101:

Grazie per il feedback.

Penso che aggiornerò a Windows 10 e vedrò se questo fa la differenza.

Ti stai concentrando sul loop. Cos'altro usi nel tuo EA? Controlli grafici o altri controlli?
 

Quello script all'inizio del thread è l'EA completo (ForumQuestion1.mq5), è quello che spinge la memoria verso l'alto. Non ci sono altre azioni nell'EA.

Nessun controllo grafico.

 

Ciao Alain,

Si prega di vedere il documento word allegato. Questo proviene da un'istanza di Windows Server 2012 R2 in esecuzione in Windows Azure. È una macchina nuova (quindi nessun software strano o altro) ed è in esecuzione nel data center dell'Europa occidentale.

La memoria di utilizzo che aumenta nel tempo si verifica anche qui quando si esegue lo script ForumQuestion1.mq5 (da prima nel thread).

Ecco una ripartizione dell'aumento nel tempo dalle 8:40 alle 14:05 è passato da 74.1MB a 379.9MB.

8:40

74,1 MB

Appena iniziato ForumQuestion1 EA

9:53 am

281.6 MB

10:30 am

297.2 MB

11:23 am

319.3 MB

12:23

343.5 MB

13:00 pm

369.1 MB

14:05 PM

379,9 MB

File:
 
Penso che questo sia normale. il mio MT4 è su 1GB di ram ora
 
Daniela Bluemel:
Penso che questo sia normale. la mia MT4 è su 1GB di ram ora
Questo argomento riguarda la MT5 Daniela.
 
Alain Verleyen:
Questo argomento riguarda la MT5 Daniela.
Sì, lo so, ma il mio MT4 ha lo stesso comportamento
 
Ho trovato un work around... non è bello ma funziona.

Soluzione: Esegui uno script PowerShell che controlla la memoria. Quando supera il 60% riavvia MetaTrader.

Lo script è qui sotto, sono impegnato a testarlo.

Passi:

  1. Clicca su Start in Windows
  2. Digitare "PowerShell ISE".
  3. Tagliare e incollare lo script qui sotto nell'editor di testo
  4. Premi play (o salva come file PS1 ed eseguilo dal prompt dei comandi, ma lo sto ancora testando, quindi per ora lo eseguo da PowerShell ISE)

Lo script è qui sotto questo riavvia Metatrader (terminal64) se la memoria supera i 300 MB (come da colonna della memoria nel vostro Task Manager):

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

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
 

Hai provato a impostareTERMINAL_MAXBARScon TerminalInfoInteger(..) su un valore ragionevolmente piccolo?

Oltre a questo avete:

TERMINAL_MEMORY_PHYSICAL

Memoria fisica nel sistema, Mb

int

TERMINALE_MEMORIA_TOTALE

Memoria disponibile per il processo del terminale, Mb

int

TERMINALE_MEMORIA_DISPONIBILE

Memoria libera del processo del terminale, Mb

int

MEMORIA_TERMINALE_USATA

Memoria utilizzata dal terminale, Mb

int


per controllare dov'è il nocciolo della questione.

 

I miei 2 centesimi sono che non state liberando la memoria con i soli "simboli di cancellazione".

Provate questo:

delete symbols;
symbols=NULL;
Motivazione: