MT5 und Geschwindigkeit in Aktion - Seite 54

 
Roman:

OK, lassen Sie mich das anders formulieren. Innerhalb von mql ist das in etwa möglich, abhängig von der Taktfrequenz des Prozessors.
Was ist mit PWM? -Ein Impulssignal mit konstanter Frequenz und variablem Tastverhältnis.
Setzt sie nicht eine Konstante?

Lesen Sie zunächst, was die WinAPI-Funktion Sleep ist und was sie tatsächlich tut

PS Windows ist kein Echtzeitsystem

 
Slava:

Lesen Sie zunächst nach, was die WinAPI-Funktion Sleep ist und was sie tatsächlich tut

PS Windows ist kein Echtzeitsystem

Was hat die WinAPI Sleep damit zu tun?
Wenn wir über Mikrosekundenschlupf sprechen
Individuell für Ihren Prozessor können Sie die Timerfrequenz bestimmen und die Anzahl der Wiederholungen berechnen.
Sie können also Ihren eigenen MicrosecondCount in mql schreiben, aber was bringt das? Die Standardversion ist ausreichend.

MT5 и скорость в боевом исполнении
MT5 и скорость в боевом исполнении
  • 2020.10.10
  • www.mql5.com
MT5 - шустрая платформа. Но есть узкие горлышки, которые сводят на нет все старания быстрой торговли...
 
Roman:

Es ist mir peinlich zu fragen, was WinAPI Sleep damit zu tun hat.
Wenn wir über Mikrosekundenschlupf sprechen
Individuell für Ihren Prozessor können Sie die Timerfrequenz festlegen und die Anzahl der Wiederholungen berechnen.
Sie können also Ihren eigenen MicrosecondCount in mql schreiben, aber was bringt das? Die Standardversion ist ausreichend.

Ihr eigener ausstehender Schlupf ohne Kontextwechsel wird Ihren Kern zu 100 % auffressen.

Dies ist eine unheimliche Programmiermethode. Gott bewahre, dass ein solcher Code auf den Markt gelangt.

 
Renat Fatkhullin:

Ihr Warteschleifchen ohne Kontextwechsel wird Ihren Kern zu 100% auffressen.

Das ist eine furchtbare Programmiermethode. Gott bewahre, dass ein solcher Code auf den Markt gelangt.

Und niemand hat bestritten, dass hardcore ))
Wenn Sie ein Beispiel für Kontextwechsel zeigen, können Sie sich vielleicht verbessern?

Hier ist die CPU-Last für µsSLEEP (µsRange), auf VirtualBox mit nur 2 Kernen, 4 Threads.
Bergleute tun Schlimmeres als das ))

cp

 

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: Sequenz

fxsaber, 2020.10.13 12:54

Ein Beispiel für einen EA, der die meisten VPS töten wird.
#include <fxsaber\Sequence.mqh> // https://www.mql5.com/ru/code/31446

#define  PRINT(A) Print(#A + " = " + (string)(A))

input datetime inFrom = D'2020.09.01'; // С какой даты анализировать историю

void OnInit()
{
  SEQUENCE Sequence; // Последовательный запуск расчетов
  
//  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.
  {
    MqlTick Ticks[];
    
    PRINT(CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, (long)inFrom * 1000));
    PRINT(TerminalInfoInteger(TERMINAL_MEMORY_USED));
    
    Sleep(10000); // Ждем освобождения CopyTicks-данных.
  }
}


Ich lasse es auf einigen Charts mit verschiedenen Symbolen laufen. Ich habe dieses Skript mit inAmount = 5 verwendet, um diese Aktion zu automatisieren.


Ergebnis.

2020.10.13 13:26:53.199 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406953
2020.10.13 13:26:53.326 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 2838
2020.10.13 13:26:53.528 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430958
2020.10.13 13:26:53.807 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3144
2020.10.13 13:26:53.924 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244747
2020.10.13 13:26:54.214 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3464
2020.10.13 13:26:54.344 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327679
2020.10.13 13:26:54.702 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 3797
2020.10.13 13:26:54.864 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340006
2020.10.13 13:26:55.457 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4308
2020.10.13 13:26:55.666 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730155
2020.10.13 13:26:55.756 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 4316

Das Terminal benötigt mehr als 4 GB Speicherplatz, um diese sechs Expert Advisors auszuführen. Bitte beachten Sie, dass sie nur für die Initialisierung, nicht aber für den Betrieb dieser EAs benötigt wird. Stellen Sie sich vor, Sie starten das Terminal mit Expert Advisors, die darin hängen. Wenn Sie keine ehrlichen 4 GB RAM zur Verfügung haben, ist das fast eine Katastrophe.


Entfernen wir nun den Kommentar zu dieser Zeile im Quellcode.

  if (Sequence.Init()) // Раскомментируйте для последовательного выполнения.

So haben wir die sequenzielle Initialisierung von Expert Advisors ermöglicht.


Schauen wir uns das Ergebnis (nach der Neukompilierung) an.

2020.10.13 13:27:24.002 Test9 (AUDCAD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5406980
2020.10.13 13:27:24.021 Test9 (AUDCAD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1234
2020.10.13 13:27:35.407 Test9 (EURUSD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4244772
2020.10.13 13:27:35.422 Test9 (EURUSD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1095
2020.10.13 13:27:46.886 Test9 (GBPCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 5340072
2020.10.13 13:27:46.905 Test9 (GBPCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1224
2020.10.13 13:27:58.293 Test9 (AUDCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 4327724
2020.10.13 13:27:58.310 Test9 (AUDCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1114
2020.10.13 13:28:09.683 Test9 (EURCHF,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 3430999
2020.10.13 13:28:09.696 Test9 (EURCHF,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1015
2020.10.13 13:28:21.339 Test9 (EURAUD,H1)       CopyTicksRange(_Symbol,Ticks,COPY_TICKS_ALL,(long)inFrom*1000) = 7730313
2020.10.13 13:28:21.363 Test9 (EURAUD,H1)       TerminalInfoInteger(TERMINAL_MEMORY_USED) = 1519


Beim Start der Expert Advisors ist es uns gelungen, den Speicherverbrauch des Terminals um mehr als 2,5 GB zu reduzieren. Die Wahrscheinlichkeit von VPS-Abstürzen (und schwachen Heimcomputern) ist deutlich gesunken.


So sehen beide Läufe in der Dynamik aus.

Der sequenzielle Start verlängerte die Gesamtinitialisierungszeit, aber es gelang, den Terminal davon abzuhalten, große Mengen an RAM zu verbrauchen.


Dieoberen und unteren Diagramme zeigen deutlich den parallelen Initialisierungsprozess (linke hohe Spitze) und sechs aufeinander folgende Initialisierungen (sechs mittlere Spitzen).


SZY Bei den Experimenten kam eine unangenehme Nuance mit Sleep zum Vorschein - siehe Quellcode.


Ich bitte darum, dass der Speicher nach der Verwendung von CopyTicks zwangsweise freigegeben wird. Nicht um solche Schlafkrücken zu schaffen.

 
Bitte empfehlen Sie die am wenigsten speicherintensive Methode zur Abfrage der Tick-Historie in einem bestimmten Intervall.
 
fxsaber:
Bitte empfehlen Sie die günstigste Methode, um den Zeckenverlauf in einem bestimmten Intervall abzufragen.

Es klingt für mich so, als ob Sie nicht nach einem billigen Gerät suchen, sondern nach einer Möglichkeit, schnell Speicherplatz freizugeben.

als eine zu prüfende Option:

- dynamisches Array MqlTick Ticks[] in Klasse einpacken und Objekt mit new erstellen (d.h. auch dynamisches Objekt), löschen, wenn man es nicht braucht

- dasselbe, aber mit Struktur, aber im lokalen Bereich ( oder Funktion oder lokaler Block { } - oder Schleife mit einer Iteration ? ), Strukturen funktionieren nicht so gut wie Klassen - ich schrieb die meisten meiner EA-Code weg von Klassen und ersetzen sie mit Datenstrukturen, Optimierung Geschwindigkeit deutlich erhöht - vielleicht ist es ein subjektiver Effekt - vielleicht neue Builds sind schneller

- Versuchen Sie, ArrayFree() in den Destruktor einzufügen

 
Igor Makanu:

Ich glaube nicht, dass Sie nach einer billigen Lösung suchen, sondern nach einer Möglichkeit, schnell Speicherplatz freizugeben.

Das Terminal gibt keinen Speicherplatz frei. MMS-Variablen haben damit nichts zu tun.

 
fxsaber:

Das Terminal gibt den Speicher nicht frei. MMS-Variablen haben damit nichts zu tun.

Was passiert, wenn Sie Größe = 1 erzwingen?

Was wäre, wenn Sie das täten?

MqlTick  Tick[];
MqlTick  ZeroTick[1] = {0};
.....
ArrayResize(Tick,1);
ArrayCopy(Tick,ZeroTick)
 
Igor Makanu:

und wenn

Nach dem Aufruf von CopyTicks hält das Terminal alle Daten für einige Sekunden im Speicher. Nur für den Fall, dass jemand ein Stück Zeckengeschichte nachlesen möchte.

D.h. der vom Terminal verbrauchte Speicherplatz hängt nicht von der Größe der MQL-Variablen ab.


Die Aufgabe besteht darin, das Terminal zu zwingen, den Speicher freizugeben.