Metatrader 5 - Benötigt viel Speicher beim Durchlaufen eines Charts durch Symbole - Seite 2

 
gr101:

Ich habe es auf Windows Server 12 R2 gesetzt und das treibt den Speicher ebenfalls in die Höhe.

Lassen Sie mich dies für eine Weile zu überwachen und geben Feedback zu diesem Thread.

Derzeit sind es 650 MB.

Ich habe nichts geändert, nur halten Sie es laufen.

 
gr101:

Danke für das Feedback.

Ich denke, ich werde auf Windows 10 aktualisieren und sehen, ob das einen Unterschied macht.

Sie konzentrieren sich auf die Schleife. Was verwenden Sie sonst noch in Ihrem EA? Grafische Steuerelemente oder irgendwelche anderen Steuerelemente?
 

Das Skript früher im Thread ist die vollständige EA (ForumQuestion1.mq5), es ist, was schiebt den Speicher nach oben. Es gibt keine anderen Aktionen im EA.

Keine grafischen Kontrollen.

 

Hallo Alain,

bitte sehen Sie sich das angehängte Word-Dokument an. Dies ist von einer Windows Server 2012 R2-Instanz, die in Windows Azure läuft. Es ist eine neue Maschine (also keine komische Software oder so) und sie läuft im westeuropäischen Rechenzentrum.

Der mit der Zeit ansteigende Speicherverbrauch tritt auch hier auf, wenn das Skript ForumQuestion1.mq5 (von weiter oben im Thread) ausgeführt wird.

Hier ist eine Aufschlüsselung des Anstiegs über die Zeit von 8:40 Uhr bis 14:05 Uhr von 74,1 MB auf 379,9 MB.

8:40 Uhr

74.1 MB

Habe gerade ForumQuestion1 EA gestartet

9:53 Uhr

281,6 MB

10:30 Uhr

297,2 MB

11:23 Uhr

319,3 MB

12:23 Uhr

343,5 MB

13:00 Uhr

369,1 MB

14:05 UHR

379,9 MB

Dateien:
 
Ich denke, das ist normal. Mein MT4 hat jetzt 1GB RAM
 
Daniela Bluemel:
ich denke, das ist normal. mein MT4 hat jetzt 1GB RAM
Dieses Thema ist über MT5 Daniela.
 
Alain Verleyen:
Dieses Thema ist über MT5 Daniela.
ja ich weiß, aber mein MT4 hat das gleiche Verhalten
 
Ich habe eine Umgehung gefunden... es ist nicht schön, aber es funktioniert.

Lösung: Führen Sie ein PowerShell-Skript aus, das den Speicher überprüft. Wenn es über 60% kommt, startet es MetaTrader neu.

Das Skript ist unten, ich bin gerade dabei, es zu testen.

Schritte:

  1. Klicken Sie unter Windows auf Start
  2. Geben Sie "PowerShell ISE" ein.
  3. Schneiden Sie das unten stehende Skript aus und fügen Sie es in den Texteditor ein
  4. Drücken Sie die Wiedergabetaste (oder speichern Sie es als PS1-Datei und führen Sie es von der Eingabeaufforderung aus, aber ich teste es noch, also führen Sie es vorerst von der PowerShell ISE aus)

Das folgende Skript startet Metatrader (terminal64) neu, wenn der Arbeitsspeicher 300 MB überschreitet (gemäß der Speicherspalte im 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
 

Haben Sie versucht,TERMINAL_MAXBARSmit TerminalInfoInteger(..) auf einen vernünftigen kleinen Wert zu setzen?

Außerdem haben Sie:

TERMINAL_MEMORY_PHYSICAL

Physischer Speicher im System, Mb

int

TERMINAL_MEMORY_TOTAL

Für den Prozess des Terminals verfügbarer Speicher, Mb

int

TERMINAL_MEMORY_AVAILABLE

Freier Speicher des Terminalprozesses, Mb

int

TERMINAL_MEMORY_USED

Vom Terminal belegter Speicher, Mb

int


um zu prüfen, wo der springende Punkt liegt.

 

Meine 2 Cents sind, dass Sie mit "Löschsymbolen" allein keinen Speicher freigeben.

Versuchen Sie dies:

delete symbols;
symbols=NULL;