MT5 und Geschwindigkeit in Aktion - Seite 35

 
fxsaber:

Ichbin es leid, die Snapshots zu debuggen. Endlich ist es perfekt. Ein Berater, nichts. Zwei - perfekt. 20 - Katastrophe: CPU ist unter 100%. HistorySelect verzögert sich um viele Millisekunden.

Es scheint, dass MT5 nicht für den gleichzeitigen Betrieb mehrerer Expert Advisors gedacht ist.

Schreiben Sie einen Stresstest oder einen gewöhnlichen Expert Advisor?

Höchstwahrscheinlich handelt es sich um einen Multi-Thread-Stresstest in einer einzigen Basis. Ich werde es also wiederholen:

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MT5 und Geschwindigkeit in Aktion

Renat Fatkhullin, 2020.09.16 12:47

Wenn ich es richtig verstehe, gibt es dort keinen EA, sondern einen Stresstester für jedes Symbol. Damit ändert sich der Fall völlig. Und es zeigt, dass sich die Anfangsbedingungen verstecken.

Das heißt, dass auf 8(4+HT) CPUs 16 Threads (+N Worker-Terminal-Threads parallel) nonstop und ohne Verzögerung in ein synchronisiertes Symboldatenbankobjekt einbrechen. Lese-/Schreibsperren werden durcheinander gebracht, weil ständig ein Tick geschrieben wird.

In der Regel kann in einem solchen Profil, je nach Steilheit des Prozessors und seiner Beherrschung der Threads, jeder Thread zwischen 60% und 80% der Zeit mit Warten verbringen.

Und das unabhängig von der Art der Aufgabe.

Wenn Sie tatsächlich in 20 Threads ununterbrochen um eine Ressource kämpfen, gibt es mehrere Möglichkeiten:

  1. den Zugang logisch entkoppeln und keine Stresstests durchführen
  2. gehen Sie zu Ihrem eigenen Cache (Variante von Punkt 1)
  3. Aktualisieren Sie Ihre Hardware (lassen Sie sich nicht von der Tatsache täuschen, dass der i7 2600k nicht schlecht ist - er ist schlecht)


Lesen Sie den Karton sorgfältig durch. Wenn N Threads auf ein einziges Sync-Objekt treffen, beträgt die leere Wartezeit 60-80%.

Und die Grenze der Multithreading-Effizienz wird bei etwa 8-12 Threads liegen. Mit zunehmender Anzahl von Threads sinkt die Abtastrate. Bei 2600k ist die Effizienzgrenze sogar noch niedriger.

 
Renat Fatkhullin:

Schreiben Sie einen Stresstest oder die Arbeit eines gewöhnlichen Experten?

Gewöhnlich

Vielmehr handelt es sich um einen Multi-Thread-Stresstest in einer einzigen Basis. Ich wiederhole also:

Wenn Sie tatsächlich in 20 Threads ununterbrochen um eine einzige Ressource kämpfen, gibt es mehrere Möglichkeiten:

  1. den Zugriff logisch entkoppeln und sich nicht mit dem Stresstest befassen
  2. gehen Sie zu Ihrem eigenen Cache (Variante von Punkt 1)
  3. Aktualisieren Sie Ihre Hardware (lassen Sie sich nicht von der Tatsache täuschen, dass der i7 2600k nicht schlecht ist - er ist schlecht)


Lesen Sie den Karton sorgfältig durch. Wenn N Threads auf ein einziges Sync-Objekt stoßen, liegt die leere Wartezeit bei 60-80 %.

Und die Grenze der Multithreading-Effizienz wird irgendwo bei 8-12 Threads liegen. Wenn die Anzahl der Threads steigt, sinkt die Abtastrate. Bei 2600k ist die Effizienzgrenze sogar noch niedriger.

Vollständige Zwischenspeicherung der Historie. Aber auch dies erfordert den Aufruf von HistorySelect(0, INT_MAX).

Als Experiment habe ich alle für die Handelslogik notwendigen Aufrufe der Historie gestrichen. Die Belastung der CPU hat stark abgenommen.


Wenn es 20 Roboter gibt, bedeutet das im Allgemeinen, dass man mit nur einem Terminal eine Katastrophe auslösen kann, wenn man sie über die gesamte Geschichte hinweg aufruft. Über mehrere Terminals können wir nicht einmal sprechen.

Und ich habe das Gefühl, dass das Synchro-Objekt nicht nur Geschichte ist. SymbolInfoTick, CopyTicks und etwas anderes, wie es scheint.

Jedenfalls kann ich nicht einmal fünf Terminals mit jeweils einem Dutzend Robotern in Betrieb nehmen.

Der Blick auf den Bremsprofiler ist ein Flop.

 
fxsaber:

Gewöhnlich

Vollständige Zwischenspeicherung des Verlaufs. Aber auch dies erfordert den Aufruf von HistorySelect(0, INT_MAX).

Ich habe versuchsweise alle für die Handelslogik notwendigen Historienaufrufe abgeschaltet. Die Belastung der CPU hat stark abgenommen.


Wenn es 20 Roboter gibt, bedeutet das im Allgemeinen, dass man mit nur einem Terminal eine Katastrophe auslösen kann, wenn man sie über die gesamte Geschichte hinweg aufruft. Über mehrere Terminals können wir nicht einmal sprechen.

Und ich habe das Gefühl, dass das Synchro-Objekt nicht nur Geschichte ist. SymbolInfoTick, CopyTicks und etwas anderes, wie es scheint.

Jedenfalls kann ich nicht einmal fünf Terminals mit jeweils einem Dutzend Robotern in Betrieb nehmen.

Der Blick auf den Bremsprofiler ist ein Flop.

Weder Beweise noch numerische Daten.

1) Wie oft pro Sekunde führt jeder EA HistorySelect-Abfragen durch?

2) Welche Funktionen werden genau verlangsamt?

3) Protokolle?

4) Was ist das Prinzip der Roboter?

 
fxsaber:

Alles in allem, wenn es 20 Roboter gibt, dann ist es eine Katastrophe mit nur einem Terminal, wenn man die Geschichte in ihnen anspricht. Mehrere Terminals kommen nicht in Frage.

Vielleicht im Gegenteil - jedes Terminal wird sein eigenes Synchro-Objekt unterstützen, und es wird keine Warteschlange mit 20 EAs dazu geben?

Versuchen Sie, 1 Roboter auf 1 Terminal laufen zu lassen, es wird interessant sein, das Ergebnis zu sehen.

 
Andrey Khatimlianskii:

Vielleicht im Gegenteil - jedes Terminal wird sein eigenes Sync-Objekt unterstützen und es wird keine Warteschlange mit 20 EAs dazu geben?

Versuchen Sie, 1 Roboter auf 1 Terminal laufen zu lassen, es ist interessant, das Ergebnis zu sehen.

Leider wird das Ergebnis dieses Experiments keine Antwort auf die Frage geben, was zu tun ist.

 
fxsaber:

Leider wird das Ergebnis dieses Experiments keine Antwort auf die Frage geben, was zu tun ist.

Überdenken Sie das Konzept des Handelsroboters

Hinzugefügt

Ich habe 3 Terminals auf real + 1 Demo, in denen ich arbeite

Jedes Terminal hat 42 Roboter, die OnBoorEvent mit 3 bis 4 Zeichen verwenden,

Außerdem wird alle 0,5 Sekunden ein Timer ausgelöst und jeder Roboter greift auf die globalen Variablen des Terminals zu,

und nutzt 8,34 GB von 32 GB RAM und 6,7% der CPU

Und nichts wird langsamer, außer dem TM5-Server zu Beginn der Handelssitzungen.

 
Renat Fatkhullin:

Es gibt weder Beweise noch numerische Daten.

1) Wie oft pro Sekunde führt jeder Experte HistorySelect-Abfragen durch?

2) Welche Funktionen werden genau verlangsamt?

3) Protokolle?

4) Welches Prinzip steckt hinter den Robotern?

Es fällt mir sehr schwer, diese Fragen zu beantworten, weil ich selbst nicht in der Lage bin, die Ursachen für die Verlangsamung zu erkennen. Der Profiler wird nicht einmal ausgeführt. Ihre Messungen sind Betrug, denn die Verzögerung kommt bereits von der CPU. Die Reduzierung des Zugriffs auf Umgebungsfunktionen durch Snapshots und Caching hat leider nicht die erwartete Wirkung gezeigt. Ich warte auf einen Profiler, der in der Lage sein wird, den Expert Advisor zu kompilieren.


Während ich damit beschäftigt war, fand ich im Strategietester ein solches Durcheinander mit der Handelshistorie.

void OnTick()
{
  static bool FirstRun = true;
    
  if (FirstRun)
  {
    MqlTick Tick;

    if (SymbolInfoTick(_Symbol, Tick) && Tick.ask)
    {
      MqlTradeRequest Request = {0};
      MqlTradeResult Result;
      
      Request.action = TRADE_ACTION_PENDING;
      Request.type = ORDER_TYPE_BUY_LIMIT;
      Request.symbol = _Symbol;
      Request.volume = 1;
      Request.price = Tick.ask - 10000 * _Point;

      if (OrderSend(Request, Result)) // Выставили отложку.
      {
        Request.action = TRADE_ACTION_DEAL;      
        Request.type = ORDER_TYPE_BUY;
        Request.price = Tick.ask;
        
        FirstRun = !OrderSend(Request, Result); // Открыли позицию.
      }
    }
  }

  HistorySelect(0, INT_MAX); // Результат зависит от этой строки.  
}

// Проверяет наличие ордера в истории торгов.
bool CheckTicket( const long Ticket )
{
  return(HistoryOrderGetInteger(Ticket, ORDER_TICKET) == Ticket);
}

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

void OnDeinit( const int )
{
  if (HistorySelect(0, INT_MAX))
  {
    PRINT(CheckTicket(4)); // true
    PRINT(CheckTicket(3)); // true
    PRINT(CheckTicket(2)); // false
  }  
}


Das Ergebnis ist

        AUDCAD : real ticks begin from 2020.07.15 00:00:00
        2020.07.15 00:01:09   buy limit 1 AUDCAD at 0.84993 (0.94914 / 0.94993)
        2020.07.15 00:01:09   market buy 1 AUDCAD (0.94914 / 0.94993)
        2020.07.15 00:01:09   deal #2  buy 1 AUDCAD at 0.94993 done (based on order #3)
        2020.07.15 00:01:09   deal performed [#2  buy 1 AUDCAD at 0.94993]
        2020.07.15 00:01:09   order performed buy 1 at 0.94993 [#3  buy 1 AUDCAD at 0.94993]
        2020.07.15 23:59:58   position closed due end of test at 0.94646 [#3  buy 1 AUDCAD 0.94993]
        2020.07.15 23:59:58   deal #3  sell 1 AUDCAD at 0.94646 done (based on order #4)
        2020.07.15 23:59:58   deal performed [#3  sell 1 AUDCAD at 0.94646]
        2020.07.15 23:59:58   order performed sell 1 at 0.94646 [#4  sell 1 AUDCAD at 0.94646]
        2020.07.15 23:59:58   order canceled due end of test [#2  buy limit 1 AUDCAD at 0.84993]
        final balance 99999653.00 pips
        2020.07.15 23:59:58   CheckTicket(4) = true
        2020.07.15 23:59:58   CheckTicket(3) = true
        2020.07.15 23:59:58   CheckTicket(2) = false


Ich habe diesen Fehler kaum bemerkt und versuche schon seit über einer Stunde, eine Wiederholung zu schreiben. Der Code ist schwachsinnig, aber er zeigt das Problem. Ob es etwas Ähnliches nicht im Tester, sondern im Terminal gibt, weiß ich nicht.

Suchbegriff: Oshibka 013.


ZS b2626 - behoben.

 
prostotrader:

Überdenken Sie das Konzept des Handelsroboters

Nur ein Roboter, der mit allen Symbolen handelt?

 
fxsaber:

Nur ein Roboter, der mit allen Symbolen handelt?

Verschiedene Roboter, die aber alle ungefähr nach dem gleichen Muster aufgebaut sind.

An einem Terminal sind jeweils 42 Arbeitsplätze beteiligt, bei drei Terminals sind es 126, also etwa 400 Symbole.

Hinzugefügt

Zur Wiederholung (ich)

Jeder Roboter verwendet OnBoorEvent mit 3 bis 4 Zeichen,

plus alle 0,5 Sekunden wird ein Timer ausgelöst + jeder Roboter greift auf dieGlobal Variables des Terminals zu,

8,34 GB von 32 GB RAM und 6,7 % CPU-Nutzung

Und nichts verlangsamt sich, außer dem TM5-Server (oder der Openreach-Hardware) zu Beginn der Handelssitzungen.

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 
prostotrader:

Unterschiedliche Roboter, aber alle ungefähr nach dem gleichen Schema gebaut.

An einem Terminal sind jeweils 42 Stellen beteiligt, an drei - 126 sind es etwa 400 Zeichen

Hinzugefügt

Um (mich) zu wiederholen.

Jeder Roboter verwendet OnBoorEvent mit 3 bis 4 Zeichen,

plus alle 0,5 Sekunden wird ein Timer ausgelöst + jeder Roboter greift auf dieGlobal Variables des Terminals zu,

8,34 GB von 32 GB RAM werden genutzt und 6,7% der CPU werden genutzt

Und nichts verlangsamt sich, außer dem TM5-Server (oder Open's Iron) zu Beginn der Handelssitzungen.

Das Seltsame ist, dass bei mir das Gegenteil der Fall ist.

Mein Gerät hat 4 Terminals, ich habe die Anzahl der Expert Advisors auf etwa 200 reduziert, ich habe alle OnBooks abgeschaltet, bin zu OnTick zurückgekehrt und habe meine Hardware aktualisiert, aber die Probleme sind die gleichen wie bei fxsaber.

Aber bei meinem Opener gibt es schon lange keine Lags mehr am Morgen. Und was sie einmal waren! Manchmal bis zu 75 Sekunden :)