MT5 und Geschwindigkeit in Aktion - Seite 16

 
fxsaber:

Es wäre interessant, das gleiche Skript mit anderen Handelsplattformen zu vergleichen.

MT4 b1280.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

input int inCycle = 10;    // Циклов проверки в одном OnTick
input int inAlertTime = 1; // Нижний порог в миллисекундах

#define _B2(A) _B(A, AlertTime)

void Check( const string Symb, const int AlertTime = 1 )
{
  MqlTick Tick;
  
  if (_B2(SymbolInfoTick(Symb, Tick)))
  {
    _B2(OrdersHistoryTotal());
    _B2(OrdersTotal());
    _B2(OrderSelect(0, SELECT_BY_POS));
    _B2(OrderSelect(0, SELECT_BY_POS, MODE_HISTORY));
    _B2(OrderSelect(0, SELECT_BY_TICKET));
        
    _B2(GetLastError());
    _B2(IsStopped());
    
    _B2(SymbolInfoDouble(Symb, SYMBOL_ASK));
    _B2(SymbolInfoDouble(Symb, SYMBOL_TRADE_TICK_VALUE));
    _B2(SymbolInfoDouble(Symb, SYMBOL_POINT));
    _B2(SymbolInfoInteger(Symb, SYMBOL_DIGITS));

    _B2(TimeCurrent());
    _B2(TimeLocal());
    
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
                
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
        
    _B2(MQLInfoInteger(MQL_TRADE_ALLOWED));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_EXPERT));
    _B2(AccountInfoInteger(ACCOUNT_TRADE_ALLOWED));
    _B2(TerminalInfoInteger(TERMINAL_TRADE_ALLOWED));
    
    _B2(SymbolsTotal(true));
    _B2(SymbolName(0, true));
    _B2(Symbol());
    
    _B2(GlobalVariableCheck(NULL));
    _B2(GlobalVariableGet(NULL));
    
    _B2(ResourceFree(NULL));
  }
}

void OnTick()
{
  for (int i = 0; i < inCycle; i++)
    Check(_Symbol, inAlertTime);      
}


2020.08.27 13:09:46.799 Test6 EURUSD,M1: Alert: Time[Test6.mq4 39: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
2020.08.27 13:09:46.790 Test6 EURUSD,M1: Alert: Time[Test6.mq4 18: OrderSelect(0,SELECT_BY_POS,MODE_HISTORY)] = 2 ms.
2020.08.27 13:09:46.784 Test6 EURUSD,H1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.

Es gab nur drei Ausrutscher, und die tauchten sehr selten auf. Es muss schwierig sein, eine Bremse zu erstellen, da es keine HistorySelect und CopyTicks gibt.

 
Fast235:

so sind sie beide Haswell, Xeon hat viel niedrigeren Betriebsfrequenz, wird es Leistungsabfall in der Leistung und einzelne Tests, nur in Multi-Thread-Optimierung wird ein Vorteil sein. Der i3 der neuesten Modelle sollte viel schneller laufen

Fragen Sie die Entwickler nach den Auswirkungen des Cache-Levels auf die Geschwindigkeit und allgemein nach der Geschwindigkeit von Zen2 und dem neuesten Intel


hinzufügen.

Ryzen 3700x Ich habe, können Sie Tests mit Intel tun

zum Beispiel mit diesem Skript MQL5\Scripts\UnitTests\Stat\TestStatBenchmark.mq5

mehrere Schleifen mit einem Timer

Wir sprechen hier nicht von Tests, sondern von Verzögerungen bei der Auftragsausführung. Diese Verzögerung gibt es und sie ist fließend. Und das stört sowohl den TS als auch mich sehr.

 
fxsaber:

Nur drei Dinge tauchten auf, und die auch nur sehr selten. Es muss schwierig sein, eine Bremse zu erstellen, da es keine HistorySelect und CopyTicks gibt.

Auch auf MT4 wurde gewartet.

2020.08.27 13:18:00.306 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:17:39.820 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 2 ms.
2020.08.27 13:17:32.598 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 30: TimeLocal()] = 36 ms.
2020.08.27 13:17:29.676 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:17:26.468 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 5 ms.
2020.08.27 13:17:26.460 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 1 ms.
2020.08.27 13:17:14.528 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 13: SymbolInfoTick(Symb,Tick)] = 3 ms.
2020.08.27 13:16:52.309 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.308 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 2 ms.
2020.08.27 13:16:52.307 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 13:16:42.448 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 17: OrderSelect(0,SELECT_BY_POS)] = 2 ms.
2020.08.27 13:16:32.480 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 36: AccountInfoDouble(ACCOUNT_EQUITY)] = 3 ms.
2020.08.27 13:16:32.479 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 3 ms.
2020.08.27 13:16:32.477 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 1 ms.
2020.08.27 13:16:29.096 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 26: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 1 ms.
2020.08.27 13:16:14.593 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 15: OrdersHistoryTotal()] = 23 ms.
2020.08.27 13:14:55.398 Test6 GBPCAD.rann,H1: Alert: Time[Test6.mq4 27: SymbolInfoInteger(Symb,SYMBOL_DIGITS)] = 1 ms.
2020.08.27 13:13:34.891 Test6 GBPCAD.rann,M1: Alert: Time[Test6.mq4 25: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 2 ms.

ZeitLokal in 36 Millisekunden. Wählen Sie ein Symbol mit einem größeren Tickvolumen.

 

Für alle Interessierten gibt es hier die Anleitung zum Abspielen.

Wer glaubt, dass es nicht angetastet wird.

2020.08.27 13:17:56.139 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 2 ms.
2020.08.27 13:17:56.167 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 39 ms.
2020.08.27 13:17:56.198 Test6 (EURUSD,H1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 54 ms.
2020.08.27 13:18:11.512 Test6 (EURUSD,M1)       Alert: Time[Test6.mq5 48: OrdersTotal()] = 3 ms.
 
fxsaber:

Wählen Sie ein Symbol mit einem größeren Tickvolumen.

Ich werde es nicht einmal überprüfen. Stellen Sie sich das beliebteste FORTS-Symbol mit einem Tick-Abo vor. Anstelle der OnTick-Logik in OnBookEvent. Die Verzögerungen müssen schrecklich sein.

Ich brauche einen offiziellen Rat, was ich tun kann, um die Verzögerungen zu minimieren.

 
fxsaber:

Um die Bremsen zu reproduzieren, müssen Sie das Skript auf mehreren EIN-Zeichen-Diagrammen ausführen und dafür sorgen, dass OnTick gleichzeitig aufgerufen wird. Dann werden die Alarme bei jedem Tick ausgelöst.

Das CPU-Lastdiagramm zeigt, dass terminal64.exe bis zu 30 % der acht logischen Kerne belastet. Das sind nur vier EURUSD-Charts, auf denen das Skript läuft. Sie können deutlich sehen, wie viel jedes Diagramm gleichzeitig geladen wird.

Wohin gehen so viele Ressourcen?

Diese Frage ist leicht zu beantworten.

Hier kopieren Sie eine Vielzahl von Daten:

    HistorySelect(MathRand(), INT_MAX);

Sie geben eigentlich einen Befehl, um alle verfügbaren Handelsdaten aus der Terminal-Datenbank in die EA-Umgebung zu übernehmen, um sie später zu verwenden. Sie versuchen absichtlich, einen möglichen Caching-Algorithmus für identische Anfragen auszuschalten.

Sie verwenden aber nicht alle diese Daten, sondern setzen sie in der nächsten Zeile sofort zurück:

    _B2(HistorySelect(Tick.time, INT_MAX));

Offensichtlich ist die Terminalbasis hier eine gemeinsam genutzte Ressource mit synchronisiertem Zugriff. Und Sie haben absichtlich Tausende von Aufträgen und Geschäften darin angelegt.

All diese sinnlosen Aktionen werden bei jedem Tick von mehreren Threads gleichzeitig 10 Mal wiederholt. Und Sie lassen diese Aktionen absichtlich in mehreren Threads gleichzeitig ablaufen.

Sie wissen also sehr genau, was Sie tun und warum, wo Ressourcen verbraucht werden, und gleichzeitig behaupten Sie, dass "die Verzögerung durch eine übermäßige CPU-Belastung von MT5 verursacht wird".

Abgesehen davon haben Sie eindeutig ein Problem mit Ihrem Computer. D.h., ja, Sie verschieben aktiv beträchtliche Mengen an Speicher, aber das sollte die Ausführungszeit der Funktionen nicht beeinflussen, insbesondere nicht in Verbindung mit HistorySelect().

In unseren Tests b2582, selbst mit 1000 Zeiten pro Tick und 5 EAs auf einem Zeichen-Chart, d.h. um Größenordnungen größer als Ihre Standardbedingungen, wurde kein einziger Alert beobachtet.

Unser Testsystem: Windows 10 Build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

 
Anton:

Diese Frage ist leicht zu beantworten.

Hier kopieren Sie eine Menge Daten:

Sie geben eigentlich einen Befehl, um alle verfügbaren Handelsdaten aus der Terminal-Datenbank in die EA-Umgebung zu übernehmen, um sie später zu verwenden. Absichtlich wird versucht, den möglichen Caching-Algorithmus für identische Anfragen zu stören.

Sie verwenden aber nicht alle diese Daten, sondern setzen sie in der nächsten Zeile sofort zurück:

Offensichtlich ist die Terminalbasis hier eine gemeinsam genutzte Ressource mit synchronisiertem Zugriff. Und Sie haben absichtlich Tausende von Aufträgen und Geschäften darin angelegt.

All diese sinnlosen Aktionen werden bei jedem Tick von mehreren Threads gleichzeitig 10 Mal wiederholt. Und Sie lassen diese Aktionen absichtlich in mehreren Threads gleichzeitig ablaufen.

Sie wissen also sehr genau, was Sie tun und warum, wo Ressourcen verbraucht werden, und gleichzeitig behaupten Sie, dass "die Verzögerung durch eine übermäßige CPU-Belastung von MT5 verursacht wird".

Abgesehen davon haben Sie eindeutig ein Problem mit Ihrem Computer. D.h., ja, Sie verschieben aktiv beträchtliche Mengen an Speicher, aber das sollte die Ausführungszeit der Funktionen nicht beeinflussen, insbesondere nicht in Verbindung mit HistorySelect().

In unseren Tests b2582, selbst mit 1000 Zeiten pro Tick und 5 EAs auf einem Zeichen-Chart, d.h. um Größenordnungen größer als Ihre Standardbedingungen, wurde kein einziger Alert beobachtet.

Unser Testsystem: Windows 10 Build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz


Kolleginnen und Kollegen,

es ist an der Zeit, dass Sie aus dem Kreis der Flugzeugmodellbauer heraustreten.

Hier sind die Kampfbedingungen: 4 Terminals, etwa 300 Expert Advisors, etwa 30 Instrumente. Ein Drittel der Expert Advisors sind auf Tumblers abonniert. All dies auf FORTS. Simulieren Sie unter diesen Bedingungen.

 
Dmi3:


Kolleginnen und Kollegen,

es ist an der Zeit, dass Sie aus dem Kreis der Flugzeugmodellbauer aussteigen.

Hier sind die Kampfbedingungen: 4 Terminals, rund 300 EAs, rund 30 Instrumente. Ein Drittel der EAs sind auf Zuhaltungen abonniert. All dies auf FORTS. Simulieren Sie unter diesen Bedingungen.

"Here you go" wird als Zip-Datei akzeptiert, zusammen mit einer detaillierten Beschreibung des Problems. Sonst ist es ein leeres Gespräch.

Was hier diskutiert wird, ist der Code des eingereichten EA und die Wirksamkeit seiner Ausführung. Auf der Grundlage der festgestellten Probleme wurde an der Optimierung des Terminalcodes gearbeitet.

 
Anton:

"Here you go" wird als Zip-Datei akzeptiert, zusammen mit einer detaillierten Beschreibung des Problems. Andernfalls ist es eine leere Unterhaltung.

In diesem Fall geht es um den vom EA vorgelegten Code und die Effizienz seiner Ausführung. Der Terminalcode wurde im Hinblick auf die festgestellten Probleme optimiert.

Ich habe keine Probleme, es gibt nichts zu senden.

fxsaber hat Probleme. 16 Seiten hat er hier schon geschrieben.

Und Mikhail hat seit 2014 die gleichen Probleme, er hat bereits 149 Seiten geschrieben: https://www.mql5.com/ru/forum/38456/page149.

Sie sind beide qualifiziert genug, um Ihnen alle erforderlichen Informationen zu geben.

ФОРТС. Вопросы по исполнению
ФОРТС. Вопросы по исполнению
  • 2020.08.20
  • www.mql5.com
С большими проблемами удалось это сделать (начальник отдела по работе с профессиональными клиентами ДЦ Открытие Евгений Сергеевич,.
 
Anton:

Diese Frage ist leicht zu beantworten.

Hier kopieren Sie eine Menge Daten:

Sie geben eigentlich einen Befehl, um alle verfügbaren Handelsdaten aus der Terminal-Datenbank in die EA-Umgebung zu übernehmen, um sie später zu verwenden. Gezielte Zufallsauswahl, um den möglichen Caching-Algorithmus für identische Anfragen zu stören.

Sie haben die Chronologie der Entwicklung dieses Threads nicht verfolgt, daher erlauben Sie sich anklagende Anmerkungen in Ihren Aussagen.

Ich habe die MathRand-Zeile entfernt. Hier ist ein kurzes Protokoll.

2020.08.27 22:38:57.920 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 3 ms.
2020.08.27 22:38:57.923 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:38:57.926 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:38:57.928 Alert: Time[Test6.mq5 61: AccountInfoDouble(ACCOUNT_EQUITY)] = 1 ms.
2020.08.27 22:38:57.940 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 11 ms.
2020.08.27 22:39:02.227 Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 1 ms.
2020.08.27 22:39:02.229 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:39:02.238 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 7 ms.
2020.08.27 22:39:02.241 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 1 ms.
2020.08.27 22:40:34.575 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:40:44.407 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:40:44.409 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 9 ms.
2020.08.27 22:40:46.819 Alert: Time[Test6.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 1 ms.
2020.08.27 22:40:52.760 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:40:52.764 Alert: Time[Test6.mq5 28: HistoryDealSelect(0)] = 3 ms.
2020.08.27 22:40:54.907 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:41:11.415 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.27 22:41:13.517 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:41:14.689 Alert: Time[Test6.mq5 18: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:41:45.343 Alert: Time[Test6.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 1 ms.
2020.08.27 22:42:12.156 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.27 22:42:19.654 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:32.581 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:48.662 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:49.754 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:49.756 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:42:50.803 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:42:50.804 Alert: Time[Test6.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 1 ms.
2020.08.27 22:42:50.805 Alert: Time[Test6.mq5 44: TimeCurrent()] = 1 ms.
2020.08.27 22:43:42.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.27 22:43:42.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.27 22:43:54.985 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.
2020.08.27 22:44:01.402 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 1 ms.
2020.08.27 22:44:01.405 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 2 ms.


Aber Sie verwenden nicht alle diese Daten, sondern lassen sie gleich in der nächsten Zeile verschwinden:

Natürlich ist die Terminalbasis hier eine gemeinsam genutzte Ressource mit synchronisiertem Zugang. Und Sie haben absichtlich Tausende von Aufträgen und Geschäften darin angelegt.

Ich teste es an echten Konten, bei denen Aufträge über 10.000 die Norm sind. Dabei handelt es sich nicht um gefälschte Aufträge, da mehr als 70 % von ihnen ausgeführt wurden.

Auf dem Bildschirmfoto ist übrigens 9331+576 != 12529.

All diese unsinnigen Vorgänge werden bei jedem Tick 10 Mal von mehreren Threads gleichzeitig wiederholt. Und Sie lassen diese Aktionen absichtlich in mehreren Threads gleichzeitig ablaufen.

Ich habe Probleme mit verschiedenen Charakteren. Um das Problem schneller zu reproduzieren, wird ein einzelnes Symbol vorgeschlagen.

Die 10-malige Wiederholung bei jedem Ticken ist eine unabdingbare Notwendigkeit. Da es normal ist, dass ein EA ein Dutzend TCs mit unterschiedlichen Schwerpunkten enthält.

Sie wissen also sehr genau, was Sie tun und warum und wohin die Ressourcen gehen, und dennoch behaupten Sie, dass "die Latenz auf eine übermäßige CPU-Belastung von MT5 zurückzuführen ist".

Abgesehen davon haben Sie eindeutig ein Problem mit Ihrem Computer. Ich meine, ja, Sie verschieben aktiv erhebliche Mengen an Speicher, aber es sollte nicht die Ausführungszeit von Funktionen beeinflussen, insbesondere nicht in Verbindung mit HistorySelect() in irgendeiner Weise.

Ich kann Sie nicht der Inkompetenz bezichtigen, aber was Sie geschrieben haben, ist, gelinde gesagt, verwirrend. HistorySelect ist die Suche nach vier Indizes (Anfang/Ende für die Tabelle der Aufträge und Anfang/Ende für die Tabelle der Geschäfte). Die Tabellen sind nach Zeit sortiert, so dass es schlimmstenfalls eine binäre Suche gibt (geben sollte). Bei 10K Aufträgen ist es sofort (berechnen Sie den binären Logarithmus). Welches Gedächtnisvolumen Bewegung! Niemand spricht hier von dem gefürchteten HistorySelectByPosition. Der elementare HistorySelect ist betroffen.

Bei unseren Tests mit b2582 wurde selbst bei 1000 Zeiten pro Tick und 5 EAs auf einstelligen Charts, d.h. um Größenordnungen mehr als Ihre Standardbedingungen, kein einziger Alert beobachtet.

Unser Testsystem: Windows 10 Build 18363, Intel Xeon E5-2630 v4 @ 2.20GHz

Bitte geben Sie hier die Anmeldedaten für das Handelskonto an, mit dem die Tests durchgeführt wurden.