MT5 und Geschwindigkeit in Aktion - Seite 46

 
Renat Fatkhullin:

Den Millisekunden-Timer gibt es schon seit langem: EventSetMillisecondTimer()

Sie sind nicht auf dem Laufenden. Angenommen, Sie müssen zwei Positionen in OnTick eröffnen. Der erste OrderSend dauert einige Millisekunden. Danach müssen Sie einen Schnappschuss machen. Und dann sollte der zweite OrderSend aufgerufen werden.

Nur OnTick kann Hunderte von Millisekunden lang ausgeführt werden. Und Sie schlagen vor, ein paar OnTimer zu knipsen.

 
Renat Fatkhullin:

Es gibt auch Probleme mit der Messbibliothek selbst. Es gibt eine Menge unnötiger Dinge, einschließlich der Gemeinkosten.

Streitereien im Studio!

 
Renat Fatkhullin:

Hier ist mein Code und die stabile Laufzeit: keine Hunderte oder Tausende von Mikrosekunden bei 20 parallelen Graphen

Wie viele Kerne haben Sie und welche Art von Prozessor? i7-2600?

8 Kerne.

2020.10.06 02:27:59.464 Terminal        MetaTrader 5 x64 build 2630 started for MetaQuotes Software Corp.
2020.10.06 02:27:59.465 Terminal        Windows 10 build 19042, Intel Core i7-2700 K  @ 3.50 GHz, 7 / 15 Gb memory, 19 / 29 Gb disk, IE 11, Admin, GMT+3

Versteckter Stresstest mit Millionen von parallelen Anfragen?

Ich habe Ihnen schon oft gesagt, dass ich Kampfberater bin. Die Anzahl der Anrufe wurde so weit wie möglich reduziert. Theoretisch (ich habe es nicht gemessen) bis zu 10 Aufrufe pro OnTick.


Mehr Transparenz. Nur weil Sie ein paar einfache _B-Aufrufe gepostet haben, ist das kein Beweis für Ihre anderen Behauptungen. Sie vergessen plötzlich den Code und die eigentliche Beschreibung der Bedingungen, sobald Sie haarsträubende Behauptungen aufstellen.

Sie müssen sich nichts einbilden - erzählen und zeigen Sie, was Sie tatsächlich aufrufen und testen. Es handelt sich nicht um ein herausgerissenes Ergebnis, das besagt: "Ich habe einen unbekannten Stresstest durchgeführt und warte auf eine Meldung, um die Welt zu informieren", sondern um den vollständigen Code des Tests.

Ich veröffentliche die Ergebnisse des Live-EA. Dort befinden sich 70 mqh-Dateien, einschließlich WinAPI. Wenn Sie es wirklich verstehen und nicht nur Worte, werde ich Ihnen den Quellcode geben. Sie werden die Bremsen ziemlich schnell reproduzieren.

 
fxsaber:

Sie sind nicht auf dem Laufenden. Nehmen wir an, Sie müssen zwei Positionen in OnTick eröffnen. Der erste OrderSend dauert einige Millisekunden. Danach müssen Sie einen Schnappschuss machen. Und dann sollte der zweite OrderSend aufgerufen werden.

Nur OnTick kann Hunderte von Millisekunden lang ausgeführt werden. Und Sie schlagen vor, einen OnTimer zu knipsen.

Ich habe kein Einrasten vorgeschlagen, sondern eine direkte Frage zum Millisekunden-Timer beantwortet.

Sie ist vorhanden, obwohl sie im aktuellen Testgerät immer noch bei 1 Sekunde ausgelöst wird. In dem neuen Tester, den wir gerade schreiben, werden wir versuchen, dies zu ändern.
 
fxsaber:

8 Kerne.

Viele Male sagte Kampfberater. Die Anzahl der Anrufe wurde so weit wie möglich reduziert. Theoretisch (ich habe es nicht gemessen) bis zu 10 Aufrufe pro OnTick.


Ich veröffentliche hier die Ergebnisse des Expert Advisors. Dort befinden sich 70 mqh-Dateien, einschließlich WinAPI. Wenn Sie nicht nur darüber reden, sondern es wirklich verstehen, werde ich Ihnen den Quellcode geben. Sie werden ziemlich schnell auf die Bremse treten.

Wir kriegen das schon hin, geben Sie uns den Quellcode.
 
fxsaber:

Die Argumente liegen auf dem Tisch!

Ihr ganzer Benchmark ist mit Müll überladen und hier ist eine saubere und verständliche (im Gegensatz zu Ihrem Code-Wirrwarr) Version davon:


//--- benchmark macros
#define _B(_function,_alert_interval)               \
          {                                         \
           ulong _latency=GetMicrosecondCount();    \
           _function;                               \
           _latency=GetMicrosecondCount()-_latency; \
           if(_latency > _alert_interval)           \
              ::Alert("Time[" + __FILE__ + " " + (string)__LINE__ + " in " + __FUNCTION__+ ": " + #_function + "] = " + (string)_latency + " mсs"); \
          }



//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   MqlTick Tick;
   
   _B(SymbolInfoTick(_Symbol,Tick),0);
   _B(SymbolInfoTick(_Symbol,Tick),0);
  }

Was sind Ihre Probleme?

  1. unlesbarer Code

  2. Einbindung in eine Klasse mit viel Overhead

  3. die Kosten für die Speicherung von 50 Ergebnissen auf dem Stapel
      static bool Set( const string Str )
      {
        if (BENCHMARK::Amount == BENCHMARK::ReserveSize)
          BENCHMARK::ReserveSize = ::ArrayResize(BENCHMARK::Bench, BENCHMARK::ReserveSize + BENCHMARK_RESERVE);
    
        BENCHMARK::Bench[BENCHMARK::Amount++].Set(Str);
    
        return(true);
      }
    
  4. die Ergebnisse - ein solider Overhead und Müll in Objektbindungen
      static ulong Get( const uint AlertInterval = 0 )
      {
        const int Pos = BENCHMARK::Amount - 1;
        const ulong Res = (Pos < 0) ? 0 : BENCHMARK::Bench[Pos].Get();
    
        if (Pos >= 0)
        {
          if (AlertInterval && (Res > AlertInterval))
            ::Alert("Time[" + BENCHMARK::Bench[Pos].Str + "] = " + (string)Res + " mсs.");
    
          BENCHMARK::Amount = Pos;
        }
    
        return(Res);
      }
    


Ich hoffe, Sie haben die Code-Optimierung für Tests nicht deaktiviert?

Ich meine den globalen Parameter Optimize=0 in der metaeditor.ini

 
Renat Fatkhullin:

Ihr ganzer Benchmark ist mit Müll überladen und hier ist eine saubere und verständliche (im Gegensatz zu Ihrem Code-Wirrwarr) Version davon:

Ihre Version befindet sich leider noch in einem frühen Stadium des Verständnisses von Bequemlichkeit. Praktisch ist es, wenn man es so machen kann.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Bibliotheken: Benchmark

fxsaber, 2020.10.01 23:49

Jetzt versuchen wir herauszufinden, wo der Schluckauf bei der Standardvariante liegt. Wir fügen einige Symbole in den Quellcode ein.

    for (long Chart = _B2(::ChartFirst()); (Chart != -1) && !Res; Chart = _B2(::ChartNext(Chart)))
      Res = (Chart != chartID) && _B2(::ChartGetInteger(Chart, CHART_IS_MAXIMIZED));

Und sehen sofort den Grund dafür.

2020.10.02 00:45:14.113 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 878 mсs.
2020.10.02 00:45:14.114 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 943 mсs.
2020.10.02 00:45:14.114 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 297 mсs.
2020.10.02 00:45:14.116 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 1787 mсs.
2020.10.02 00:45:14.116 Alert: Time[Test9.mq5 35 in IsInvisible: ::ChartNext(Chart)] = 2 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 980 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 35 in IsInvisible: ::ChartNext(Chart)] = 2 mсs.
2020.10.02 00:45:14.117 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 59 mсs.
2020.10.02 00:45:14.118 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 803 mсs.
2020.10.02 00:45:14.119 Alert: Time[Test9.mq5 36 in IsInvisible: ::ChartGetInteger(Chart,CHART_IS_MAXIMIZED)] = 1059 mсs.

CHART_IS_MAXIMIZED ist zu langsam für die Diagramme einer anderen Person. Fehlerbericht ist fertig! Es war sehr einfach mit der Bibliothek.


Wo liegt das Problem?

  1. unlesbarer Code

  2. sich in einen Kurs mit viel Overhead einklinken

  3. Stapelspeicherkosten für 50 Ergebnisse
  4. Ergebnisse erhalten - ein massiver Overhead und Müll in Objektbindungen

Die Benutzerfreundlichkeit überwiegt den geringen Overhead. Es ist erbärmlich, wenn man sich genau ansieht, wie der Code implementiert ist. Zum Beispiel ist ArrayResize ein Overhead, so dass seine Verwendung minimiert wird.

Ich hoffe, Sie haben die Codeoptimierung für Tests nicht deaktiviert?

Ich meine den globalen Parameter Optimize=0 in der metaeditor.ini

Kein Interesse an langsamen Modi. Ich betrachte die Leistung von Combat EA und achte dabei natürlich auch auf die Optimierung der Algorithmen und des Compilers.

 
Renat Fatkhullin:

Ihr ganzer Benchmark ist mit Müll überladen und hier ist eine saubere und verständliche (im Gegensatz zu Ihrem Code-Wirrwarr) Version davon:

Was ist Ihr Problem?

  1. unlesbarer Code

  2. Einbindung in eine Klasse mit viel Overhead

  3. Stapelspeicherkosten für 50 Ergebnisse
  4. Abrufen von Ergebnissen - alles Overhead und Müll in Objektbindungen


Ich hoffe, Sie haben die Code-Optimierung für Tests nicht deaktiviert?

Ich meine den globalen Parameter Optimize=0 in der metaeditor.ini

Hier ist es im C-Stil, es ist einfach und wirklich müllfrei. Danke für das Beispiel.

Einer der C-Sprachlehrer empfahl, den Unterstrich _B besser nicht in Benutzernamen zu verwenden.
Weil dieses Präfix von den Entwicklern von Bibliotheken, Programmen usw. verwendet wird.
Und um nicht in Überschneidungen zu geraten, empfahl er, es besser nicht zu verwenden.

Ist es in mql5 möglich, sich mit Ihren Namen zu überschneiden?
Oder sind benutzerdefinierte Namen vollständig von MQ-Namen abgeschirmt?

 
Roman:

Einer der C-Lehrer empfahl, den Unterstrich _B nicht in Benutzernamen zu verwenden
, da dieses Präfix von Entwicklern von Bibliotheken, Software usw. verwendet wird
. Und um Überschneidungen zu vermeiden, empfahl er, es nicht zu verwenden.

In C werden Namen, die mit "_" beginnen, als Dienst-, System- oder Spezialnamen verwendet. In diesem Fall halte ich es für zulässig. Da diese Funktion für die Wartung und Überprüfung des Codes verwendet wird.

 
Edgar Akhmadeev:

Namen, die mit "_" beginnen, werden in C als Dienst-, System- oder Spezialnamen verwendet. In diesem Fall - akzeptabel, denke ich. Da diese Funktion für die Wartung und Überprüfung des Codes verwendet wird.

Das ist der Punkt, neben mql5 gibt es auch MQ-Dienstnamen von Entwicklern.