MT5 und Geschwindigkeit in Aktion - Seite 89

 
Vielleicht führen Sie einfach ein paar Tests durch und die Fragen werden verschwinden?
 
traveller00:
Vielleicht führen Sie einfach ein paar Tests durch und die Fragen werden verschwinden?

Vielleicht. Ich wünschte, ich hätte mehr Zeit, um die Tests selbst durchzuführen :(

 
traveller00:
Vielleicht führen Sie einfach ein paar Tests durch und die Fragen werden verschwinden?

Die Tests zeigen nur beim ersten Start einen Unterschied.

 
Slava:

Symbol(), _Symbol-Einträge sind äquivalent zu NULL (wobei NULL anstelle des Symbolnamens erlaubt ist).

In diesem Fall gibt es keine zusätzliche Prüfung auf das Vorhandensein des aktuellen Symbols, das Vorhandensein des aktuellen Symbols in der Marktbeobachtung und unnötige Aufrufe von Eigenschaften des aktuellen Symbols, da die Eigenschaften des aktuellen Zeichens zwischengespeichert werden

Das heißt, wenn ein normaler String-Parameter anstelle von Symbol(), _Symbol oder NULL angegeben wird, dann werden Prüfungen für das vollständige Programm und weitere Eigenschaftsaufrufe

Frage:

   string symbol=_Symbol;
   SymbolInfoInteger(symbol,...)
   SymbolInfoInteger(NULL,...)

- Verhalten der SymbolInfoXXX-Aufrufe in diesen beiden Fällen, unterscheiden sie sich um mehr als einen Haken?

symbol==_Symbol

?

 
traveller00:

Übrigens, aus den heutigen frischen Logs der neuesten Version von MT5:

Es handelte sich um 3 EAs, die auf einem Symbol schwebten, jedes auf seinem eigenen Chart. Und die Aufforderung wird immer wieder erne uert. Solche Ausschläge sind natürlich selten, aber in der Tat wurde eine Anfrage für neue Ticks, die vom letzten Tick stammen, 700 ms ausgeführt.

Ich beobachte seit etwa 12 Stunden, aber ich kann bereits sehen, dass die Verzögerungen alle Grenzen überschreiten.

Time[Main.mqh 162 in ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 8589203 mcs.

3 EAs, jeder auf seinem eigenen Chart, alle auf 1 Symbol, fordern alte Ticks vom vorherigen Tick über CopyTicksRange an. Und die Verzögerung beträgt fast 9 Sekunden. Und wie es scheint, ist das noch nicht alles. Höchstwahrscheinlich handelt es sich bei dem Tick Store um eine gemeinsam genutzte Ressource, auf die der Zugriff synchronisiert wird, aber selbst bei einer sehr schlechten Synchronisierung sollte es nicht zu solchen Zeiten kommen.

Manche werden sagen, es sei eine einmalige Panne. Während dieser 12 Stunden der Überwachung gab es leider über hundert 1-Sekunden-Ausgänge. Und diese sehen nicht mehr wie einmalige Ausbrüche aus. Es sieht so aus, als kämen oft mehrere Zecken gleichzeitig herein, was die Ursache für diese Ausschläge ist.

Selbst wenn wir die Augen vor der Tatsache verschließen, dass sich 3 EAs um eine gemeinsame Ressource stritten, sollten wir uns die andere Überwachung ansehen:

ProcessTicks: CopyTicksRange(_Symbol,OldTicks,COPY_TICKS_INFO,LastTickParsed.time_msc)] = 1401285 mcs.

Es gab nur 1 Expert Advisor für das Symbol. Und immer noch eineinhalb Sekunden. Es war nicht der einzige, es gab noch andere EAs für andere Symbole, aber ist er nicht multi-threaded? Oder können sich die Häkchen für verschiedene Symbole noch gegenseitig verlangsamen?

Dies ist eine Basisfunktionalität für einfache EAs. Die Plattform ist als algorithmische Handelsplattform positioniert. Allerdings wirft die grundlegende Funktionalität erhebliche Fragen auf. Eine große Bitte, sich das noch einmal anzusehen. Ich bin mir fast sicher, dass es irgendwo noch Raum für Verbesserungen gibt. Oder ich wäre sehr dankbar, wenn ich die letzten Ticks seit dem Aufruf der Funktion erhalten könnte, wie hier vorgeschlagen

Forum zum Thema Handel, automatische Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

fxsaber, 2021.03.01 07:28

Bitte denken Sie über eine solche Funktion nach.

int SymbolInfoTicks( const string Symb, MqlTick &Ticks[] ); // Возвращает свежие тики (не более сотни), пришедшие с предыдущего вызова этой функции.


Das Problem, NEUE Ticks ohne Überspringen zu erhalten, wird jetzt nur noch durch CopyTicks* gelöst. Das ist ein sehr umständlicher Mechanismus für diese weit verbreitete Aufgabe. Das ist, als würde man mit einer Kanone auf Vögel schießen.

Daher die Bremsen, die Speicherung großer Caches usw.

 

Die Anzahl der Aufrufe von SymbolInfoTick und CopyTicksRange wurde minimiert:

  • SymbolInfoTick-Snapshot - nicht öfter als einmal alle 100µs aufgerufen.
  • CopyTicksRange für frische Ticks wird nur aufgerufen, wenn tatsächlich ein neuer Tick im Market Watch eingetroffen ist.


Das Terminal und der Rechner (Auslagerungsdatei deaktiviert) mit dieser Last.


Dadurch konnte die Anzahl der Verzögerungsmeldungen (weniger Aufrufe) der regulären Funktionen erheblich reduziert werden.


50 Minuten lang protokollieren:

2021.03.05 19:31:45.429 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 154 mcs.
2021.03.05 19:32:58.939 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 161 mcs.
2021.03.05 19:33:01.583 ::SymbolInfoTick(_Symbol,Tick)] = 158 mcs.
2021.03.05 19:36:01.682 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 143 mcs.
2021.03.05 19:36:31.229 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 234 mcs.
2021.03.05 19:36:31.229 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 913 mcs.
2021.03.05 19:39:08.716 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 139 mcs.
2021.03.05 19:39:30.994 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 315 mcs.
2021.03.05 19:39:32.858 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 114 mcs.
2021.03.05 19:40:41.437 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 101 mcs.
2021.03.05 19:42:26.104 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 116 mcs.
2021.03.05 19:42:28.849 ::SymbolInfoTick(_Symbol,Tick)] = 109 mcs.
2021.03.05 19:43:10.977 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 481 mcs.
2021.03.05 19:43:53.945 ::SymbolInfoTick(_Symbol,Tick)] = 130 mcs.
2021.03.05 19:49:20.352 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 101 mcs.
2021.03.05 19:51:31.242 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 102 mcs.
2021.03.05 19:51:44.986 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 107 mcs.
2021.03.05 19:52:05.590 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 219 mcs.
2021.03.05 19:53:56.013 ::SymbolInfoTick(_Symbol,Tick)] = 236 mcs.
2021.03.05 19:55:41.453 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 105 mcs.
2021.03.05 19:55:47.109 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 148 mcs.
2021.03.05 19:55:47.110 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 265 mcs.
2021.03.05 19:59:26.011 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 186 mcs.
2021.03.05 20:00:01.569 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 117 mcs.
2021.03.05 20:01:19.704 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 109 mcs.
2021.03.05 20:02:07.285 ::SymbolInfoTick(_Symbol,Tick)] = 177 mcs.
2021.03.05 20:02:07.286 ::SymbolInfoTick(_Symbol,Tick)] = 198 mcs.
2021.03.05 20:02:07.286 ::SymbolInfoTick(_Symbol,Tick)] = 202 mcs.
2021.03.05 20:04:40.170 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 364 mcs.
2021.03.05 20:04:45.905 ::SymbolInfoTick(_Symbol,Tick)] = 143 mcs.
2021.03.05 20:04:45.906 ::SymbolInfoTick(_Symbol,Tick)] = 158 mcs.
2021.03.05 20:04:45.907 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 504 mcs.
2021.03.05 20:04:48.259 ::SymbolInfoTick(_Symbol,Tick)] = 104 mcs.
2021.03.05 20:04:54.727 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 104 mcs.
2021.03.05 20:05:39.642 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 101 mcs.
2021.03.05 20:07:40.189 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 101 mcs.
2021.03.05 20:09:21.844 ::SymbolInfoTick(_Symbol,Tick)] = 115 mcs.
2021.03.05 20:09:32.422 ::SymbolInfoTick(_Symbol,Tick)] = 107 mcs.
2021.03.05 20:10:02.423 ::SymbolInfoTick(_Symbol,Tick)] = 128 mcs.
2021.03.05 20:15:48.838 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 149 mcs.
2021.03.05 20:16:36.001 ::SymbolInfoTick(_Symbol,Tick)] = 105 mcs.
2021.03.05 20:17:51.499 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 480 mcs.
2021.03.05 20:17:51.638 ::SymbolInfoTick(_Symbol,Tick)] = 342 mcs.
2021.03.05 20:17:52.802 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 429 mcs.
2021.03.05 20:17:53.340 ::SymbolInfoTick(_Symbol,Tick)] = 142 mcs.
2021.03.05 20:19:21.512 ::SymbolInfoTick(_Symbol,Tick)] = 122 mcs.
2021.03.05 20:20:35.836 ::CopyTicks(_Symbol,Tick,COPY_TICKS_ALL,0,1)] = 116 mcs.


Das scheint nicht so schlimm zu sein. Es wurden keine Handelsgeschäfte getätigt. Wie steht es mit ihnen, ich werde sehen.


JEDOCH zeigt das hervorgehobene Fragment, dass drei EAs (verschiedene Charaktere) fast gleichzeitig verzögert wurden. D.h. die Verzögerung ist universell für das Terminal.

 
Slava:

Symbol(), _Symbol-Einträge sind äquivalent zu NULL (wobei NULL anstelle des Symbolnamens erlaubt ist).

In diesem Fall gibt es keine zusätzliche Prüfung auf das Vorhandensein des aktuellen Symbols, das Vorhandensein des aktuellen Symbols in der Marktbeobachtung und unnötige Aufrufe von Eigenschaften des aktuellen Symbols, da die Eigenschaften des aktuellen Knotens zwischengespeichert werden

Das heißt, wenn Sie einen einfachen String-Parameter anstelle von Symbol(), _Symbol oder NULL angeben, dann gibt es Prüfungen für das vollständige Programm und weitere Abfrageeigenschaften

Bitte erläutern Sie das noch einmal, da Ihre Worte von den Forumsnutzern unterschiedlich interpretiert werden.

 

Im Terminal mit einem EA/Chart/Symbol.


2021.03.05 23:02:02.860 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 189 mcs.
2021.03.05 23:02:24.152 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 339 mcs.
2021.03.05 23:02:53.540 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 915 mcs.
2021.03.05 23:05:35.325 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 223 mcs.
2021.03.05 23:05:41.398 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 245 mcs.
2021.03.05 23:05:44.585 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 376 mcs.
2021.03.05 23:06:35.210 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 173 mcs.
2021.03.05 23:07:38.298 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 290 mcs.
2021.03.05 23:08:50.342 ::CopyTicksRange(_Symbol,Ticks,COPY_TICKS_INFO,From)] = 102 mcs.
2021.03.05 23:14:58.216 ::SymbolInfoTick(_Symbol,Tick)] = 447 mcs.

Ein solches Protokoll in 15 Minuten. Es scheint sich also doch um ein langsames Windows zu handeln. In diesem Fall ist es das.

2021.03.05 23:49:20.792 Terminal        MetaTrader 5 x64 build 2815 started for MetaQuotes Software Corp.
2021.03.05 23:49:20.792 Terminal        Windows Server 2019 build 17763, Intel Core i7-7700 K  @ 4.20 GHz, 17 / 31 Gb memory, 3698 / 3725 Gb disk, IE 11, RDP, UAC, GMT+2
 

Ein klares Beispiel für die Bremsen, die Market Watch verursacht.

Schauen Sie sich die Werte in der Spalte "Prozessor" (zweite von rechts) an.

 
Zur Verzögerung des Servers kommt die Verzögerung des Terminals hinzu.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Indikatoren: Ping

fxsaber, 2021.03.12 10:56

Ich habe mich gerade an diesen tollen Indikator erinnert.

Es handelt sich um ein Bild von dem Gerät mit Null-Ping. Es stellt sich heraus, dass die interne Verzögerung des Terminals im Durchschnitt ~2ms beträgt. Sie schwankt zwischen 0-9 ms.


Zum Beispiel hat der Server zwei Ticks empfangen: einen ersten und einen zweiten nach 10 ms. Im Terminal kann der zweite Tick also nicht 10 ms nach dem ersten empfangen werden, sondern erst 10-19 ms nach dem ersten. Im Durchschnitt ist sie 12 ms später.

Wenn Sie aus dem Markt heraus handeln (Market Marts oder Pending Orders zum aktuellen Kurs), wird es besonders schwierig zu handhaben sein. Es ist schwer zu sagen, ob die Entwickler in der Lage sein werden, hier etwas zu verbessern.

Ein Blick auf die Moskauer Börse zeigt, dass die Situation dort ähnlich ist. Wenn Sie über den MT5-Algo handeln, ist es fast garantiert, dass Sie am Ende der Ausführungswarteschlange stehen und leider keine Zeit haben, die guten Sachen abzuholen.

Акцептирование SL/TP-ордеров
Акцептирование SL/TP-ордеров
  • 2020.11.24
  • www.mql5.com
В этой ветке пойдет речь об ордерах, которые создаются в результате срабатывания SL/TP-уровней открытых позиций...