![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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 Knackpunkt liegt.
Ich habe TERMINAL_MAXBARS auf 500 gesetzt (wirklich niedrig), aber es werden immer noch mehr Balken geladen (ich nehme an, das kommt aus der Datei?) und der Speicher steigt weiter an.
Ich habe damit begonnen, die oben aufgeführten Speicherzähler zu protokollieren und werde bald eine Rückmeldung dazu geben.
Ok, ich habe ein paar Rückmeldungen bekommen und es sieht ein wenig seltsam aus. Unten sind zwei Protokolle "MetaTrader Log" & "PowerShell Log" sie sind zwei Protokolle, die ich laufen lasse, die die Speichernutzung protokollieren. (Das PowerShell-Skript befindet sich weiter oben in diesem Thread, ich habe es aktualisiert, damit es mit dem Task-Manager übereinstimmt). Diese beiden Protokolle sind das erste und letzte Mal, als ich den letzten Lauf durchgeführt habe.
Interessante Punkte:
##### MetaTrader-Protokoll
##### Dies wurde von meinem Logger in Metatrader protokolliert. Es gibt den gesamten Speicher aus
#### PowerShell-Protokoll
#### Dies wurde durch das PowerShell-Skript protokolliert
04/29/2016 17:31:32 Kilo Bytes in Gebrauch 128 300 K
29.04.2016 18:05:08 Verwendete Kilobyte 215 488 K
Ich setzte die TERMINAL_MAXBARS auf 500 (wirklich niedrig), aber es ist immer noch das Laden mehr Bars (vorstellen, dass aus der Datei?) und der Speicher ist immer noch schleichende bis.
Ich habe damit begonnen, die oben aufgeführten Speicherzähler zu protokollieren und werde bald eine Rückmeldung dazu geben.
Ich habe einige Rückmeldungen erhalten, und es sieht ein wenig seltsam aus. Unten sind zwei Protokolle "MetaTrader Log" & "PowerShell Log" sie sind zwei Protokolle, die ich laufen lasse, die die Speichernutzung protokollieren. (Das PowerShell-Skript befindet sich weiter oben in diesem Thread, ich habe es aktualisiert, damit es mit dem Task-Manager übereinstimmt). Diese beiden Protokolle sind das erste und letzte Mal, als ich den letzten Lauf durchgeführt habe.
Interessante Punkte:
##### MetaTrader-Protokoll
##### Dies wurde von meinem Logger in Metatrader protokolliert. Es gibt den gesamten Speicher aus
#### PowerShell-Protokoll
#### Dies wurde durch das PowerShell-Skript protokolliert
04/29/2016 17:31:32 Kilo Bytes in Gebrauch 128 300 K
29.04.2016 18:05:08 Verwendete Kilobyte 215 488 K
Ich (Notebook, 8GB RAM, Win7-64) habe für jeden meiner 4 mt4 den gleichen RAM-Verbrauch.
Ich denke, das ist nichts, worüber Sie sich Sorgen machen müssen!
Wie viele GB sind noch frei/verfügbar?
Ich (Notebook, 8 GB Ram, Win7-64) habe für jeden meiner 4 mt4 den gleichen Ram-Verbrauch.
Ich denke, das ist nichts, worüber Sie sich Sorgen machen müssen!
Wie viele GB sind noch frei/verfügbar?
Ich habe jede Menge RAM mit den oben genannten Werten in den Diagrammen. Das Problem ist, wenn ich es laufen lasse, steigt der RAM-Verbrauch langsam an.
Nach etwa ein oder zwei Stunden ist das Maximum erreicht.
Ich führe derzeit die EA auf Server 2012, 7 GB RAM, 4 Kerne (nicht sicher, was sie sind), 64 Bit.
Ich habe eine Menge RAM auf den Ebenen oben in den Diagrammen. Das Problem ist, wenn ich es laufen lasse, steigt die RAM-Nutzung langsam an.
So nach etwa einer Stunde oder zwei beginnt es maxing aus.
Ich führe derzeit die EA auf Server 2012, 7 GB RAM, 4 Kerne (nicht sicher, was sie sind), 64 Bit.
Ich habe einmal gelernt, dass es eine Funktion von Win-Server zu sein scheint, so viel wie möglich im Speicher zu halten.
Ich habe die Terminals regelmäßig neu gestartet, aber ich wäre neugierig, ob dies einen Absturz verursachen würde oder nicht!
Ich habe einmal gelernt, dass es eine Funktion von Win-Server zu sein scheint, so viel wie möglich im Speicher zu halten.
Ich habe die Terminals regelmäßig neu gestartet, aber ich wäre neugierig, ob dies einen Absturz verursachen würde oder nicht!
Interessant... obwohl es etwas mit dem Laden von Symbolen in und aus dem Market Watch zu tun zu haben scheint.
Das Terminal stürzt nicht ab, es beginnt nur sehr langsam zu laufen, unbrauchbar langsam.
Interessant... obwohl es etwas mit dem Laden von Symbolen in und aus dem Market Watch zu tun zu haben scheint.
Das Terminal stürzt nicht ab, es beginnt nur sehr langsam zu laufen, unbrauchbar langsam.
Es ist eine Standardinstallation von Server 2012. Meine Theorie ist jedoch, dass es keine Rolle spielt, wie es eingerichtet ist. Ein Speicherleck wird mit der Zeit immer den gesamten Speicherplatz auf dem Rechner belegen.
Es spielt also keine Rolle, wie schnell oder wie viel RAM der Rechner hat, wenn er ein Leck hat, wird er irgendwann an die Grenze stoßen.
Ich möchte nur meine 2 Cents zu diesem Thema beitragen.
Es gibt hier viele gute Ideen zum Thema Memory Leak und Erhöhung, aber zum Thema und der Ursache sind meine Überlegungen:
- der veröffentlichte Quellcode prüft mehrere relevante Funktionsrückgaben nicht, z.B. SymbolSelect() return.
- for/while-Schleifen, die auf Funktionsrückgaben basieren, wie z.B. SymbolsTotal(), könnten eine Begrenzung oder einen Schutz gegen Funktionsrückgaben mit falschen Werten haben.
Nachdem wir den Code gestresst/geändert und erneut getestet haben, können wir vielleicht die Ursache des Problems finden und nachvollziehen.
Ich denke, Rogerio Figurelli hat Recht, wenn viele Funktionsaufrufe nicht zurückgegeben werden , wird der zugewiesene Speicher nicht freigegeben.
Vielleicht können Sie die Stackgröße verringern, um zu sehen, ob es zu einem Stack Overflow-Fehler kommt.
Stapel
In jedem MQL4-Programm wird ein spezieller Speicherbereich namens Stack für die Speicherung lokaler Funktionsvariablen zugewiesen, die automatisch erstellt werden. Ein Stack wird für alle Funktionen zugewiesen. Die Standard-Stackgröße beträgt 256 kb, die Stackgröße kann mit der Compilerdirektive #property stacksize verwaltet werden.
Statische lokale Variablen werden dort gespeichert, wo auch andere statische und globale Variablen gespeichert werden - in einem speziellen Speicherbereich, der getrennt vom Stack existiert. Dynamisch erstellte Variablen verwenden ebenfalls einen vom Stack getrennten Speicherbereich.
Bei jedem Funktionsaufruf wird ein Platz auf dem St ack für interne nicht-statische Variablenzugewiesen. Nach Beendigung der Funktion steht der Speicher wieder zur Verfügung.
Wird von der ersten Funktion die zweite aufgerufen, so belegt die zweite Funktion für ihre Variablen die benötigte Größe aus dem verbleibenden Stack-Speicher. Bei der Verwendung eingeschlossener Funktionen wird der Stapelspeicher also nacheinander für jede Funktion belegt. Dies kann dazu führen, dass bei einem der Funktionsaufrufe der Speicher knapp wird; eine solche Situation wird als Stack-Überlauf bezeichnet.
Daher sollten Sie für große lokale Daten besser dynamischen Speicher verwenden - beim Eintritt in eine Funktion den Speicher, der für den lokalen Bedarf benötigt wird, im System allozieren (new, ArrayResize()) und beim Verlassen der Funktion den Speicher freigeben (delete, ArrayFree()).
Siehe auch
Datentypen, Kapselung und Erweiterbarkeit von Typen,Initialisierung von Variablen, Sichtbarkeitsbereich und Lebensdauer von Variablen, Erstellen und Löschen von Objekten
Gute Punkte.
Ich werde das mal ausprobieren und hier über die Ergebnisse berichten.
Danke