Diskussion zum Artikel "Vergleich von MQL5 und QLUA - warum sind Transaktionen in MQL5 bis zu 28 Mal schneller?" - Seite 2

 
Rashid Umarov:
Die Codes werden zur Verfügung gestellt, jeder kann selbst überprüfen, ob die Schlussfolgerungen gültig sind. Hier gibt es kein Problem.

Mein Code

sinput int Interval = 30; // Intervall in Sekunden

class BENCH
{
protected:
  MqlTick FirstTick;
  int Count;
  ulong StartTime;

  int GetAmountTicks( const ulong From = 0, const int Amount = 10000 ) const
  {
    MqlTick Ticks[];

    return(::CopyTicks(this.symbol, Ticks, COPY_TICKS_ALL, From, Amount));
  }
  void Init( void )
  {
    this.Count = 0;

    this.GetAmountTicks(); // Aufwärmen
    ::SymbolInfoTick(this.symbol, this.FirstTick);

    this.StartTime = ::GetMicrosecondCount();

    return;
  }

public:
  const string symbol;
  const int TimerInterval;

  BENCH( const int iTimerInterval, const string Symb = NULL ) :
         symbol((Symb == NULL) ? ::Symbol() : Symb), TimerInterval(iTimerInterval * (int)1 e6)
  {
    this.Init();

    this.StartTime = 0;
  }

  ~BENCH( void )
  {
    ::Comment("");
  }

  void Refresh( const string Symb )
  {
    if (Symb == this.symbol)
    {
      if (this.GetBenchTime() >= this.TimerInterval)
      {
        if (Count > 0)
          ::Alert(this.ToString());

        this.Init();
      }

      Count++;
    }

    return;
  }
  int GetBenchTime( void ) const
  {
    return((int)(::GetMicrosecondCount() - this.StartTime));
  }

  string ToString( void ) const
  {
    const ulong BenchTime = this.GetBenchTime();
    const int Amount = this.GetAmountTicks(this.FirstTick.time_msc);

    if ((BenchTime == 0) || (Amount == 0))
     return(NULL);

    const double Velocity1 = 1 e6 * this.Count / BenchTime;
    const double Velocity2 = 1 e6 * Amount / BenchTime;

    return((string)this.Count + "/" + (string)Amount + " = " + ::DoubleToString(100.0 * Count / Amount, 2) + "%, ExChange_History = " +
           ::DoubleToString(Velocity2, 1) + " ticks/sec, MT5_RealTime = " + ::DoubleToString(Velocity1, 1) + " units/sec, Interval = " +
           ::DoubleToString(BenchTime / 1 e6, 1) + " sec.");
  }
};

class BENCH_BOOK : public BENCH
{
public:
  BENCH_BOOK( const int iTimerInterval, const string Symb = NULL ) : BENCH(iTimerInterval, Symb)
  {
    ::MarketBookAdd(this.symbol);
  }

  ~BENCH_BOOK( void )
  {
    ::MarketBookRelease(this.symbol);
  }
};

/*
BENCH Bench(Interval);

void OnTick( void )
{
 Bench.Refresh(_Symbol);

 return;
}
*/

BENCH_BOOK BenchBook(Interval);

void OnBookEvent(const string &symbol )
{
  BenchBook.Refresh(symbol);

  return;
}

Ergebnis

2016.09.13 17:18:35.667 Bench (Si-9.16,M1)      851/754 = 112.86%, ExChange_History = 25.1 ticks/sec, MT5_RealTime = 28.3 units/sec, Interval = 30.1 sec.
2016.09.13 17:18:05.524 Bench (Si-9.16,M1)      662/506 = 130.83%, ExChange_History = 16.9 ticks/sec, MT5_RealTime = 22.1 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:35.424 Bench (Si-9.16,M1)      883/1610 = 54.84%, ExChange_History = 53.6 ticks/sec, MT5_RealTime = 29.4 units/sec, Interval = 30.0 sec.
2016.09.13 17:17:05.319 Bench (Si-9.16,M1)      834/2707 = 30.81%, ExChange_History = 90.1 ticks/sec, MT5_RealTime = 27.8 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:35.196 Bench (Si-9.16,M1)      789/627 = 125.84%, ExChange_History = 20.9 ticks/sec, MT5_RealTime = 26.3 units/sec, Interval = 30.0 sec.
2016.09.13 17:16:05.110 Bench (Si-9.16,M1)      900/822 = 109.49%, ExChange_History = 27.4 ticks/sec, MT5_RealTime = 30.0 units/sec, Interval = 30.0 sec.
2016.09.13 17:15:34.993 Bench (Si-9.16,M1)      772/747 = 103.35%, ExChange_History = 24.8 ticks/sec, MT5_RealTime = 25.7 units/sec, Interval = 30.1 sec.

Man kann deutlich sehen, wie sehr sich die Ergebnisse selbst bei benachbarten Halbminuten unterscheiden. Der Vergleich der Gläser sollte NUR zur gleichen Zeit erfolgen!

 
Тестирование синхронных операций - eine Reihe von 10 synchronen, aufeinanderfolgenden Kaufgeschäftenmit Bestätigung des Erfolgs jedes Geschäfts an der Börse. Die nachfolgende Transaktion wird erst dann durchgeführt, wenn der Handelsserver bestätigt, dass die Transaktion an der Börse erfolgreich war oder nicht. Die Ausführungsgeschwindigkeit hängt von der gesamten Kette Terminal - Handelsserver - Börse - Handelsserver - Terminal ab. Je kürzer die durchschnittliche Zeit eines synchronen Handelsvorgangs ist, desto besser.
//--- Ausführen der Operationsschleife
      for(int i=0;i<Trades;i++)
        {
         req.price  =SymbolInfoDouble(_Symbol,SYMBOL_ASK);
         req.comment=string(i+1);
         //--- Aktion
         if(!OrderSend(req,res))
           {
            PrintFormat("OrderSend() failed, retcode=%d",res.retcode);
           }
         else
           {
            trades_finished++;
            PrintFormat("#%d Buy %s 1 lot",i+1,_Symbol);
           }
        }

Wo ist die Bestätigung, von der Sie schreiben? Ich habe sie im Code nicht gefunden. Wenn Sie die Antwort von OrderSend() meinen, dann in der Hilfe:

Rückgabewert

Bei erfolgreicher Prüfung der Grundstruktur (Zeigerprüfung) wird true zurückgegeben - dies bedeutet nicht, dass die Handelsoperation erfolgreich ausgeführt wurde. Um eine genauere Beschreibung des Ergebnisses der Funktionsausführung zu erhalten, sollten Sie die Felder der Ergebnisstruktur analysieren .

Bitte erläutern Sie dies.
 
fxsaber:

Das Video zeigt den Beginn der Sitzung. Und das Video im Artikel ist der Saft. Und

die Zahl reicht nicht aus, um die Sitzung zu beginnen. Bitte erklären Sie, was eine "Warteschlange" und ein "Warm-up" ist.

Sehen Sie sich die Zeit in den Tests an - es ist die Mitte eines ruhigen Tages, nicht der Beginn der Sitzung. Das Überspringen einer kleinen Anzahl von Ticks ist also vernünftig und reicht aus, um mögliche Residuen von nicht ausgewählten Ticks zu vermeiden.

Es ist ja nicht so, dass wir Kindern in einem Forum erzählen, sie wüssten nicht, wie man Testmessungen durchführt, und sie dann aufgrund schlechter Beweise den Kürzeren ziehen. Die Tests wurden Dutzende Male durchgeführt, um sicherzustellen, dass es keine Fehler gab. Erst danach erfolgte die Veröffentlichung.

 
Alexey Kozitsyn:

Wo ist die Bestätigung, von der Sie sprechen? Ich habe sie im Code nicht gefunden. Wenn Sie die Antwort von OrderSend() meinen, dann in der Hilfe:

Bitte erklären Sie das.

OrderSend ist eine 100% synchrone Operation, die auf die Ergebnisse einer vollständigen Auftragserteilung im Server wartet.

Das heißt, im Falle einer externen Börsenausführung handelt es sich um einen vollständigen Verarbeitungszyklus mit Börsenbestätigung der Auftragserteilung.

 
Renat Fatkhullin:

Sehen Sie sich die Uhrzeit in den Tests an - es ist die Mitte eines ruhigen Tages, nicht der Beginn einer Sitzung.

Ihr Kollege sagte über die Sitzung

Handelssitzung mehrere einzelne Aktualisierungen des Stacks gibt. Daher überspringt das Skript die ersten N Ticks, um sicherzustellen, dass sich wirklich viele Orders im Stack befinden. Erst danach beginnt es mit dem Zählen der Ticks.


Wenn der Code gegenüber dem vorherigen Video unverändert geblieben ist, sieht die Sache schon anders aus.
 
fxsaber:

Mein Code

Ergebnis

Sie können deutlich sehen, wie sehr sich die Ergebnisse selbst bei benachbarten Halbminuten unterscheiden. Der Vergleich von Gläsern sollte NUR zur gleichen Zeit erfolgen!

Gleichzeitig ist, wenn der Unterschied in den Messungen bei etwa 10% liegt.

Aber wenn die Ergebnisse von Dutzenden von Tests einen stabilen Unterschied von 4-5 Mal ergeben, gibt es nichts zu diskutieren.

 
Alexey Kozitsyn:

Wo ist die Bestätigung, von der Sie sprechen? Ich habe sie im Code nicht gefunden. Wenn Sie die Antwort von OrderSend() meinen, dann in der Hilfe:

Bitte erklären Sie das.

OrderSend gibt denselben Wert zurück wie OrderCheck. Aber in diesem Fall wird OrderSend im Falle der Rückgabe von true seine Ausführung erst beenden, wenn die Antwort vom Handelsserver eintrifft.

Der Handelsserver (Gateway) ist eine Leitung zur Börse, wo nur der GO geprüft wird. Wenn also der GO falsch ist, wird der Auftrag die Börse nicht erreichen. Und in diesem Sinne haben Sie Recht, dass es gut ist, MqlTradeResult zu prüfen. Aber in diesem Fall war das GO jedes Mal in Ordnung, so dass alle Aufträge an die Börse gesendet wurden. Und OrderSend beendete seine Arbeit, nachdem es genau die Antwort der Börse erhalten hatte.

Das Ergebnis ist also korrekt.

 
fxsaber:
Ihr Kollege sagte über die Sitzung
Wenn der Code gegenüber dem vorherigen Video unverändert ist, ist das etwas anderes.

Sie sind mit einem anderen Video verwirrt, das den visuellen Vergleich des Session-Starts in drei Terminals zeigt. In diesem Video https://www.youtube.com/watch?v=i5vvD66I3Ik ist die klare visuelle Überlegenheit des MT5 bei der Geschwindigkeit der Datenaktualisierung leicht zu erkennen.

Im Artikel https://www.mql5.com/de/articles/2635 haben wir den Geschwindigkeitsunterschied an den Zahlen bewiesen und speziell die Mitte des Tages (2016.09.12 13:57 GMT+1) genommen, damit es keine Beschwerden über die potentielle Möglichkeit von jemandes Bremsen beim Marktstart gab. Das Video aus dem Artikel https://www.youtube.com/watch?v=J5nqWGQ1zh8 zeigt eine saubere sequenzielle Messung über drei Minuten ohne Unterbrechungen.

3markets 25082016 blur
3markets 25082016 blur
  • 2016.08.25
  • www.youtube.com
Запись стаканов в терминалах MetaTrader 5, Quik и SmartX 25 августа 2016. Инструмент Si-9.16
 
Renat Fatkhullin:

Sie sind mit einem anderen Video verwirrt, das den visuellen Vergleich des Session-Starts in drei Terminals zeigt. In diesem Video https://www.youtube.com/watch?v=i5vvD66I3Ik ist eine deutliche visuelle Überlegenheit des MT5 bei der Geschwindigkeit der Datenaktualisierung zu erkennen.

Im Artikel https://www.mql5.com/de/articles/2635 haben wir den Geschwindigkeitsunterschied anhand der Zahlen nachgewiesen und absichtlich die Mitte des Tages (13:57 GMT+1) genommen, damit es keine Behauptungen über die Möglichkeit gibt, dass jemand beim Marktstart bremst. Das Video aus dem Artikel https://www.youtube.com/watch?v=J5nqWGQ1zh8 zeigt eine saubere sequenzielle Messung über drei Minuten.

Ich hatte nur eine Frage zu dem Kommentar in der Quelle zum aktuellen Artikel

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion des Artikels "Vergleich von MQL5 und QLUA - warum sind Handelsoperationen in MQL5 bis zu 28 Mal schneller?".

fxsaber, 2016.09.13:25 pm

 //--- Überspringen Sie die ersten Ticks für das anfängliche Abräumen der Warteschlange und das Aufwärmen
   tickcounter++;
   if(tickcounter<ExtSkipFirstTicks)
      return;

Benötige Klärung über die Auswirkungen von Warteschlangen und Warm-up auf die Leistung.

Wenn es ein Rudiment ist (aus dem vorherigen Video) - eine Sache, wenn nicht - eine andere.
 
fxsaber:
Ich hatte nur eine Frage über den Kommentar in der Quelle zu dem aktuellen Artikel
Wenn es ein Rudiment ist (aus dem vorherigen Video) - eine Sache, wenn nicht - eine andere.

Jeder Test sollte einen Kaltstartschutz enthalten.

Das Überspringen von N Ticks ist also ein Hinweis darauf, dass wir uns dessen bewusst sind und dies berücksichtigen. Nur um die offensichtlich zu erwartende Behauptung zu vermeiden, "warum haben Sie die Auswirkungen des Kaltstarts nicht kompensiert".


Das Video über den Start der Sitzung von drei Terminals wurde am 25. August 2016 für eine andere Behauptung eines Händlers erstellt, der behauptete, dass MT5 zu Beginn der Sitzung langsamer wird. Wie sich später herausstellte, nutzte dieser Händler MT5 gar nicht, sondern verbreitete Spekulationen aus dem Forum. Es stellte sich auch heraus, dass einige Händler nicht wussten, dass die Charts von Börseninstrumenten nicht nach den Bid-Preisen, sondern nach den gehandelten Last-Preisen erstellt werden. Sie hielten die Änderung der Gebote im Stapel und ihre Nichtanzeige in den Charts für "MT5-Bremsen".

Natürlich gibt es keine Bremsen.