MT5 und Geschwindigkeit in Aktion - Seite 9

 
fxsaber:

Das kommt häufig vor. Die Handelsfunktionen wurden nicht aufgerufen.

SymbolInfoTick ist manchmal keine schlechte Verzögerung. Die HFT kann mit solchen unerwarteten Verzögerungen sehr gut umgehen.

Bitte fragen Sie die Entwickler, um die Gründe zu finden. In der Zwischenzeit ist es offensichtlich, dass in der Schlacht EAs ihre Profiler ist ein Muss.

Was wird der Test auf dem "leeren" Terminal zeigen?

void OnStart()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time=0,avr_time=0;
   int   count=100000;
   for(int i=0; i<count; i++)
     {
      start=GetMicrosecondCount();
      SymbolInfoTick(_Symbol, Tick);
      end=GetMicrosecondCount()-start;
      //--- >1 ms
      if(end>1000)
         Print(" > 1 ms for one SymbolInfoTick: ",DoubleToString(end/1000.0,2)," ms");
      //---
      if(end>max_time)
         max_time=end;
      avr_time+=end;
     }
   Print("SymbolInfoTick max time: ",DoubleToString(max_time/1000.0,3)," ms; avr time: ",DoubleToString(avr_time/1000.0/count,3)," ms; ",count," iterations");
//---
   start=GetMicrosecondCount();
   for(int i=0; i<count; i++)
      SymbolInfoTick(_Symbol, Tick);
   end=GetMicrosecondCount()-start;
   Print(count," SymbolInfoTick = ",DoubleToString(end/1000.0,2)," ms");
  }

Sie sollte in etwa so lauten:

2020.06.04 11:02:30.123 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.138 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:30.138 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 14.85 ms
2020.06.04 11:02:31.433 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.051 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:31.448 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.17 ms
2020.06.04 11:02:33.064 TestSymbolInfoTick (EURUSD,H1)  SymbolInfoTick max time: 0.035 ms; avr time: 0.000 ms; 100000 iterations
2020.06.04 11:02:33.079 TestSymbolInfoTick (EURUSD,H1)  100000 SymbolInfoTick = 15.12 ms

Wenn Sie uns nicht genau sagen, was Sie tun und wie genau Sie das Terminal belasten, wird es für uns schwierig sein, die Gründe dafür zu finden.

 
Anton:

Was zeigt der Test bei einem "leeren" Terminal?

Sie sollte in etwa so aussehen:

        SymbolInfoTick max time: 0.034 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 8.56 ms
        SymbolInfoTick max time: 0.047 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.04 ms
        SymbolInfoTick max time: 0.045 ms; avr time: 0.000 ms; 100000 iterations
        100000 SymbolInfoTick = 9.02 ms

Wenn Sie uns nicht genau sagen, was Sie tun und wie Sie das Terminal belasten, wird es für uns schwierig sein, die Gründe dafür zu finden.

100K Iterationen sind kein Indikator. Denn die Funktion verlangsamt sich nicht immer, aber manchmal.

Tatsächlich muss ich Teile des Kampf-EA deaktivieren, bis das Bremsen aufhört. Dann kann ich den Code zur Verfügung stellen. Wir müssen warten.

 
fxsaber:

In der Tat muss ich Teile des Kampfberaters deaktivieren, bis die Bremsen aufhören. Dann kann ich den Code zur Verfügung stellen. Ich muss warten.

Führen Sie diesen EA mit ein paar Zeichen aus, um ein schnelles Ergebnis zu erhalten.

#include <fxsaber\Benchmark.mqh> // https://c.mql5.com/3/321/Benchmark.mqh

void OnTick()
{
  MqlTick Tick[1];
  
  if (_B(CopyTicks(_Symbol, Tick, COPY_TICKS_ALL, 0, 1), 1)) // Не знаю, влияет это или нет.
    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
}


Ich hatte es in fünf Minuten.

        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 9 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 3 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 4 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 5 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 2 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 1 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.
        Alert: Time[Test6.mq5 8: SymbolInfoTick(_Symbol,Tick[0])] = 16 ms.


Sieht so aus, als ob es ausreicht, nur dies (ohne CopyTicks) im EA zu lassen.

    _B(SymbolInfoTick(_Symbol, Tick[0]), 1);
 
fxsaber:

100K Iterationen sind kein Indikator. Denn die Funktion verlangsamt sich nicht immer, aber manchmal.

Ich schlage vor, das Konzept der Definition der Schnelligkeit einer Funktion zu ändern.

Eine Funktion ist schnell, wenn es keine Spitzen in ihrer Ausführungszeit gibt.


Wie oben gezeigt wurde, haben auch einfache Funktionen solche Spitzen. Manchmal sind sie sehr groß. Ich habe keine Ahnung, was das damit zu tun hat. Es liegt jedoch auf der Hand, dass alle handelskritischen Funktionen anhand der oben vorgeschlagenen Methode auf das Vorhandensein von Spitzenwerten überprüft werden sollten. Das heißt, wir lassen Spitzenwerte, die größer als eine Millisekunde sind, ein paar Stunden lang laufen und überwachen sie.


Es muss erreicht werden, dass es zumindest auf einem leeren Terminal keine Spitzenwerte gibt. Schnelle 100K Iterationen stellen sich als nichts dar.

 
fxsaber:

Ich schlage vor, das Konzept der Definition der Schnelligkeit einer Funktion zu ändern.

Eine Funktion ist schnell, wenn es in ihrer Dauer keine Spitzenwerte gibt.


Wie oben gezeigt wurde, haben auch einfache Funktionen solche Spitzenwerte. Manchmal sind sie sehr groß. Ich habe keine Ahnung, was das damit zu tun hat. Es liegt jedoch auf der Hand, dass alle handelskritischen Funktionen anhand der oben vorgeschlagenen Methode auf das Vorhandensein von Spitzenwerten überprüft werden sollten. Das heißt, wir lassen Spitzenwerte, die größer als eine Millisekunde sind, ein paar Stunden lang laufen und überwachen sie.


Es muss erreicht werden, dass es zumindest auf einem leeren Terminal keine Spitzenwerte gibt. Schnelle 100K Iterationen stellen sich als nichts dar.

Manchmal kommt es vor, dass der Timer eine kumulative Zeitspanne anzeigt, wenn eine andere Aufgabe läuft. Das kann zum Beispiel bei der Arbeit mit Canvas passieren - wenn die Anzeigefunktion die Aufgabe auf Anzeige setzt, ohne ein Bild zu erstellen, und zurückkommt. Danach wird eine beliebige andere Funktion nacheinander ausgeführt, z. B. derselbe Kommentar, jedoch wird der Prozess des Canvas-Mappings in der CPU-Sprache gestartet und erst danach wird das Canvas angezeigt. Bei der Zeitmessung kann man sehen, dass der Kommentar sehr lange braucht, um ausgegeben zu werden, aber die Kanvas-Anzeigefunktion läuft in 0 ms.

 
fxsaber:

ausführen und einige Stunden lang Spitzenwerte von mehr als einer Millisekunde überwachen.

Wir müssen sicherstellen, dass es zumindest bei einem leeren Terminal keine Spitzenwerte gibt. Die schnellen 100K Iterationen haben sich als wertlos erwiesen.

Ich habe einen solchen Expert Advisor für die Überwachung entworfen.

// Мониторинг длительных пиков выполнения важных функций для торговли.
#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)))
  {
    MqlTick Ticks[];
    
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, 0, 1));
    _B2(CopyTicks(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));
    _B2(CopyTicksRange(Symb, Ticks, COPY_TICKS_ALL, Tick.time_msc));

    _B2(HistorySelect(Tick.time, INT_MAX));
    
    _B2(HistoryDealsTotal());
    _B2(HistoryDealGetTicket(0));
    _B2(HistoryDealGetInteger(0, DEAL_MAGIC));
    _B2(HistoryDealGetDouble(0, DEAL_PRICE));
    _B2(HistoryDealSelect(0));

    _B2(HistoryOrdersTotal());
    _B2(HistoryOrderGetTicket(0));
    _B2(HistoryOrderGetInteger(0, ORDER_MAGIC));
    _B2(HistoryOrderGetDouble(0, ORDER_PRICE_CURRENT));
    _B2(HistoryOrderSelect(0));
    
    _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(TimeTradeServer());
    
    _B2(OrdersTotal());
    _B2(OrderSelect(0));
    _B2(OrderGetDouble(ORDER_PRICE_CURRENT));
    _B2(OrderGetInteger(ORDER_MAGIC));
    _B2(OrderGetString(ORDER_SYMBOL));
    
    _B2(PositionsTotal());
    _B2(PositionSelect(Symb));
    _B2(PositionSelectByTicket(0));
    _B2(PositionGetDouble(POSITION_PRICE_CURRENT));
    _B2(PositionGetInteger(POSITION_MAGIC));
    _B2(PositionGetString(POSITION_SYMBOL));
    
    _B2(AccountInfoDouble(ACCOUNT_EQUITY));
    _B2(AccountInfoInteger(ACCOUNT_MARGIN_MODE));
    
    MqlTradeRequest Request = {0};
    MqlTradeCheckResult CheckResult;

    _B2(OrderCheck(Request, CheckResult));
    
    _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);
}


Ich habe das Ergebnis nach fünf Minuten Überwachung erhalten.

        Alert: Time[Test6.mq5 18: HistorySelect(Tick.time,INT_MAX)] = 21 ms.
        Alert: Time[Test6.mq5 24: HistoryDealSelect(0)] = 4 ms.
        Alert: Time[Test6.mq5 10: SymbolInfoTick(Symb,Tick)] = 24 ms.
        Alert: Time[Test6.mq5 14: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 4 ms.
        Alert: Time[Test6.mq5 30: HistoryOrderSelect(0)] = 3 ms.
        Alert: Time[Test6.mq5 35: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 2 ms.


SZZY Bei einem solchen Wert des Eingangsparameters gibt es viel weniger Warnmeldungen.

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


Aber das Ergebnis ist noch bedeutsamer.

        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 19 ms.
        Alert: Time[Test6.mq5 21: HistorySelect(Tick.time,INT_MAX)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 13: SymbolInfoTick(Symb,Tick)] = 10 ms.
        Alert: Time[Test6.mq5 38: SymbolInfoDouble(Symb,SYMBOL_ASK)] = 10 ms.
        Alert: Time[Test6.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 148 ms.
        Alert: Time[Test6.mq5 74: SymbolName(0,true)] = 11 ms.
 

Schließlich dauert das Ändern einer Reihe von Aufträgen bei mir manchmal 3-10 Sekunden pro Auftrag. Danach dauert es wieder lange 0,1 Sekunden.

Ich habe die Serverprotokolle abgerufen - dort ist es sofort zu sehen.


Bei einem Battle Expert Advisor ist das sehr unangenehm.

2020.06.04 15:24:48.771 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 61 ms.
2020.06.04 15:25:21.729 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 29 ms.
2020.06.04 15:27:57.842 Alert: Time[NewTicks.mqh 31: ::SymbolInfoTick(_Symbol,Tick)] = 142 ms.


Einige fantastische Werte.

 
fxsaber:

Schließlich dauert das Ändern einer Reihe von Aufträgen bei mir manchmal 3-10 Sekunden pro Auftrag. Danach dauert es wieder lange 0,1 Sekunden.

Angehobene Serverprotokolle - sofort da.

Die Situation wiederholte sich auf einem anderen Handelsserver.

Das Terminal änderte die offene Position teke für 2,5 Sekunden. Auf dem Server - 2 Millisekunden.

Höchstwahrscheinlich ist dies auch die Ursache für Probleme bei der FORTS-Ausführung.

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

Erneute Übertragungen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

MetaTrader 5 Build 1700 Plattform Beta: Projekte in MetaEditor und synthetische Werkzeuge

Renat Fatkhullin, 2017.12.14 12:47

Dies ist ein Indikator für die Qualität der Kommunikation. Der Prozentsatz der erneut übertragenen Netzwerkpakete im TCP/IP-Protokoll.

Sie wird global auf der Ebene der Netzwerkschnittstelle für alle Anwendungen des gesamten Betriebssystems berechnet. Wenn Sie einen Verdacht auf Langsamkeit und Probleme haben, sollten Sie sich diese Kennzahl ansehen. Kritisch, wenn der Server des Maklers sehr weit entfernt ist. Zum Beispiel für asiatische Händler und einen Broker in Europa.

Schon bei einer Übertragungsrate von 3 % kann man sagen, dass man nicht handeln kann. Das extreme Maß an erneuten Übertragungen ist durch schlechtes WLAN gegeben.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Neuer MetaTrader 5 build 2360: Erweiterte Integration mit SQLite

Renat Fatkhullin, 2020.04.06 12:33

Die Norm sollte weniger als 1 % betragen. Und bereits 3 % Netzverlust machen Dienste mit geringer Latenzzeit zunichte.

Unsere Übertragungen liegen beispielsweise bei 0,68 - 0,75 %, und das bei deutlich mehr Nutzern (bei MetaQuotes-Demo sind 17k online). Und wir dienen der ganzen Welt, nicht Moskau/Russland.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Renat Fatkhullin, 2017.12.17 23:03

Dies sind Statistiken der Netzwerkschnittstelle des gesamten Computers, wobei Metatrader nur einer der Benutzer ist. Das hat nicht unbedingt etwas mit dem Handelsserver zu tun.

Allgemeine Statistiken können leicht durch einen Webbrowser beschädigt werden, nachdem der Zugriff auf eine fehlerhafte und weit entfernte Website fehlgeschlagen ist. Es ist auch möglich, dass ein lokales WLAN einen Netzwerkkonflikt auffängt und Dutzende von prozentualen Neuübertragungen zu zufälligen Zeiten erhält.

Bei 20 % Wiederholungen wird keine Verbindung zum Handelsserver hergestellt, und die Wiederholungen werden ständig und endlos sein. Das Terminal hat eine ständige Verbindung, und selbst 3-5% Rückübertragungen wären fatal, wenn es lange Verbindungen aufrechterhalten wollte.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Renat Fatkhullin, 2017.12.18 11:36

Beachten Sie, dass es sich hierbei um eine technische Eigenschaft Ihres lokalen TCP/IP-Stacks handelt, die vom Betriebssystem gemeldet wird, und nicht um einen Indikator für die Qualität einer bestimmten Verbindung zu den Handelsservern. Sie umfasst alle Netzwerkaktivitäten, einschließlich System- und Telefonaktivitäten.


Die Verbindung eines Handelsclusters ist bekanntermaßen von hoher Qualität, und wir protokollieren eine Vielzahl von Parametern (dies ist eine Standardfunktion der Plattform), indem wir einminütige Schnappschüsse sammeln und anschließend analysieren.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

Renat Fatkhullin, 2017.12.18 00:13

Geprüft.

Bei keinem der Knoten in unserem Demo-Cluster, einschließlich Asien, kam es den ganzen Tag über (und auch an anderen Tagen) zu Neustarts oder einer Erhöhung der Übertragungsrate. Alles ist zwischen 0,5 % und 1,5 % normal.


Ich scheine eine Menge zu haben.

Es ist jetzt Mitternacht, die Quotierungen werden selten aktualisiert. Die Zahl der Rückübertragungen nimmt vor meinen Augen zu. Ich möchte Alert auf VPS auf einen hohen Wert > 1% für den Handel mit geringer Latenz setzen. Aber bei so großen Werten wird diese Idee sinnlos.


Was kann ich empfehlen? Tracert zum Handelsserver durchführen? Eine Art Überwachungsprogramm? Wie kann man generell sicherstellen, dass MT5 für niedrige Latenzzeiten gerüstet ist?


ZS Sobald sich die Kurse schneller bewegen, fällt der Index um ein Vielfaches.

 
fxsaber:

Rückübermittler.


Ich scheine eine Menge davon zu haben.

5-6 Uhr morgens:

Zuhause (Glasfaser, ETH zum Router, Kabel zum Computer) - 8-19%, Ping 60-70

VPS in den Niederlanden (momentan 1 MT5 mit 9 Währungen/11 Charts) - 1.2-1.6%, ping 3.7