MT5 und Geschwindigkeit in Aktion - Seite 91

 
Anton:

Ist ObjectGetInterger-Bremsen die Norm?

 
fxsaber:

Ist ObjectGetInterger-Bremsen die Norm?

Get-Methoden sind bereits synchron, sie warten also. Die Arbeit mit Objekten erfolgt über eine spezielle Befehlswarteschlange, nicht über den direkten Zugriff auf Objekte.

Zur Information: Es wird dringend empfohlen, Set- und Get-Methoden nicht zu vermischen. Es ist besser, erst im Plural zu schreiben und dann im Plural zu lesen. Oder andersherum.

 
Renat Fatkhullin:

Get-Methoden sind bereits synchron, sie warten also. Objekte werden über eine spezielle Befehlswarteschlange bearbeitet, nicht über den direkten Zugriff auf Objekte.

Zur Information: Es wird nicht empfohlen, Set- und Get-Methoden zu mischen. Es ist besser, Set zu schreiben und dann Set zu lesen. Oder andersherum.

Ich habe leider Probleme damit. Dies zeigt der obige Code.

Vielen Dank für die Klarstellung.

 
In bestimmten Situationen konnte ich sie aus dem Weg räumen.

echten Konto.

2021.03.29 17:18:55.280 TradesID_Example (EURUSD,M1)    HistoryDealsTotal() = 99663
2021.03.29 17:18:55.280 TradesID_Example (EURUSD,M1)    HistoryOrdersTotal() = 174307

2021.03.29 17:24:15.862 TradesID_Example (EURUSD,M1)    GetSumByPositionsID(PositionsID,GetSumByPositionID) = 29906412.60837016
2021.03.29 17:24:15.862 TradesID_Example (EURUSD,M1)    Alert: Bench_Stack = 0, 1 <= Time[GetSumByPositionsID(PositionsID,GetSumByPositionID))] = 320581370 mcs.

2021.03.29 17:24:16.057 TradesID_Example (EURUSD,M1)    GetSumByPositionsID(PositionsID,GetSumByPositionID2) = 29906412.60837016
2021.03.29 17:24:16.057 TradesID_Example (EURUSD,M1)    Alert: Bench_Stack = 0, 1 <= Time[GetSumByPositionsID(PositionsID,GetSumByPositionID2))] = 195526 mcs.
2021.03.29 17:24:16.170 TradesID_Example (EURUSD,M1)    GetSumByPositionsID(PositionsID,GetSumByPositionID2) = 29906412.60837016
2021.03.29 17:24:16.170 TradesID_Example (EURUSD,M1)    Alert: Bench_Stack = 0, 1 <= Time[GetSumByPositionsID(PositionsID,GetSumByPositionID2))] = 112839 mcs.

Die Bibliothek ist ~2500 Mal schneller als die übliche Implementierung. Nur ein alternativer Ansatz erlaubt es, einige Berechnungen in angemessener Zeit durchzuführen.

 

Um das Terminal zu zwingen, Speicher zuzuweisen, können Sie dieses Skript ausführen

void OnStart()
  {
   short arr[];
   ArrayResize(arr,INT_MAX);
   ArrayInitialize(arr,0);
   Print(ArraySize(arr));
   Sleep(5000);
  }

Array-Größe an die RAM-Größe anpassen

 
Rorschach:

Um das Terminal zu zwingen, Speicher zuzuweisen, können Sie dieses Skript ausführen

Array-Größe an die RAM-Größe anpassen

Worum geht es dabei?

 
fxsaber:

Worum geht es dabei?

Es scheint, dass das Terminal in einen Speichermangel gerät und die internen Mechanismen zur Freigabe des Terminals funktionieren.

 
traveller00:

Offensichtlich funktionieren die internen Mechanismen der Speicherfreigabe, wenn Sie das Terminal in einen Zustand der Speicherknappheit versetzen.

Ja, dem Terminal geht der Speicher aus und es beginnt, zwischengespeicherte Daten zurückzusetzen.

 

Es ist eine außergewöhnliche Situation entstanden. Der Expert Advisor macht einen Screenshot auf der Grundlage des Indikatorsignals und gibt, wenn die Filter passen, einen Befehl zum Öffnen/Schließen von Positionen.
Der Name des Screenshots enthält die Uhrzeit: Tag, Stunde und Sekunde, zum Beispiel CHFJPY_d29_h10_m24_s17. Die Zeit wird von der Funktion TimeCurrent() übernommen.

Es gibt 28 Instanzen des Expert Advisors, die im Terminal laufen. Irgendwann, für 44 Minuten, schien das Terminal einzufrieren und um 10:27 Uhr funktionierte es wieder normal. Hier ist der Teil des Terminalprotokolls selbst:


Es sind keine Verbindungsunterbrechungen zu erkennen. Der erste Eintrag für EURUSD um 10:27 Uhr ist der Schlusskurs von 10:14 Uhr in der Transaktionshistorie.

Nachstehend finden Sie einen Teil des Protokolls des EA. Wie Sie an den oberen roten Rahmen sehen können, sind die Zeit der Protokollierung und TimeCurrent(), die im Namen des Screenshots steht, fast identisch.
Und bei den unteren Bildern beträgt der Unterschied eine halbe Stunde.


Auf dem Symbol CHFJPY wurde ein Screenshot mit dem Eröffnungssignal um 10:12 Uhr erstellt, während der zweite Screenshot mit dem Signal um 10:24 Uhr erstellt wurde. Aber die Öffnung/Schließung und die Neueröffnung erfolgten innerhalb einer Minute um 10:27 Uhr.

Jedenfalls passierte diese Seltsamkeit von 9:43 bis 10:27:
1) TimeCurrent() funktioniert und erhält die aktuelle Serverzeit, der Expert Advisor erhält korrekte Signale vom Indikator.
2) Das Protokoll wurde erst um 10:27 Uhr geschrieben. Die Screenshots wurden um 10:27 Uhr auf meiner Festplatte im Ordner "Dateien" gespeichert, neue Aufträge (basierend auf alten Signalen) wurden um 10:27 Uhr eröffnet.

Vielleicht ist jemandem dieses Problem schon einmal begegnet, was könnte der Grund für solche Schluckaufs oder Verlangsamungen sein? Welche Funktion sollte verwendet werden, um die Ursache zu ermitteln? Diese Situation hat sich seit April mehrmals wiederholt.

 
Vasiliy Pushkaryov:

Können Sie mir sagen, welche Funktionen ich verwenden muss, um die Ursache zu finden?

Überwachen Sie die Diskrepanz zwischen TimeLocal und TimeCurrent.