MT5 und Geschwindigkeit in Aktion - Seite 11

 
Vor einiger Zeit habe ich einen primitiven Verzögerungsindikator geschrieben. Es zeigt zum Beispiel sehr gut, wie eine massive Wildbachpumpe funktioniert.
Ping
Ping
  • www.mql5.com
Для торговли важным параметром является актуальность текущей цены. На него влияет множество факторов, самый популярный из которых - сетевой пинг между терминалом и торговым сервером. Но часто из виду упускается другой параметр: так называемый "внутренний пинг терминала" - дополнительный лаг котировок внутри самого терминала (платформы) . Даже...
 
fxsaber:

Missverstanden. Wir müssen verstehen, ob MT stört oder nicht. Wir analysierten die Serverprotokolle, als sich die Pausen über Dutzende von Sekunden hinweg änderten. Auf dem Server ist alles perfekt.

Das Problem liegt also woanders.

Ich habe festgestellt, dass ich sehr oft die Preise übertreffe. D.h. eine erhebliche Verzögerung im Terminal. Es stellt sich die Frage, wie man sie identifizieren kann.

Hier habe ich VPS gekauft. Wie kann ich sicher sein, dass es perfekt passt? Ich meine, es muss irgendeine Art von numerischem Indikator geben. Wie sich herausstellt, kann man Weiterleitungen nicht trauen. Um Mitternacht - zehn Prozent.


Vielleicht kann ich eine virtuelle Maschine auf demselben physischen Rechner wie den Handelsserver einsetzen. Und von dort aus könnte ich das Terminal bedienen. Ich denke, das würde die Anzahl der Deadlocks reduzieren.

Ich habe den Eindruck, dass Tracing, Ping von der Konsole oder spezielle Software das Problem nicht lösen.
Es ist notwendig, die Beteiligung von MT in irgendeiner Form zu registrieren. Es scheint mir, dass wir einen Standpunkt einnehmen und die Entwickler bitten sollten, ihren eigenen Zähler fürTERMINAL_RETRANSMISSION zu erstellen

 
fxsaber:

Missverstanden. Wir müssen verstehen, ob MT stört oder nicht. Wir analysierten die Serverprotokolle, als sich die Pausen über Dutzende von Sekunden hinweg änderten. Auf dem Server ist alles perfekt.
Das Problem liegt also woanders.
Ich habe festgestellt, dass ich sehr oft die Preise übertreffe. D.h. eine erhebliche Verzögerung im Terminal. Es stellt sich die Frage, wie man sie identifizieren kann.

Irgendwie ist nicht ganz klar, was genau "alles ist perfekt auf dem Server" bedeutet:
1) Es kamen keine Änderungsanfragen auf dem Server an, oder alle Anfragen innerhalb von 10 Sekunden hatten einen veralteten Preis?
2) Und wie viele Sekunden beträgt der Unterschied zwischen dem "aktuellen" und dem "veralteten" Preis?
3) Wer stellt fest, dass der Preis nicht mehr aktuell ist: der MT-Server oder eine dritte Partei, vielleicht eine Börse?


Wenn das Problem häufig auftritt, können Sie den Auftragsänderungsverkehr mit Wireshark in Verbindung mit Process Monitor (Network Activity) von Sysinternals analysieren.

 
Sergey Dzyublik:

Irgendwie ist nicht ganz klar, was genau "alles ist perfekt auf dem Server" bedeutet:
1) Es kamen keine Änderungsanfragen auf dem Server an, oder alle Anfragen innerhalb von 10 Sekunden hatten einen veralteten Preis?
2) Und wie viele Sekunden beträgt der Unterschied zwischen dem "aktuellen" und dem "veralteten" Preis?
3) Wer stellt fest, dass der Preis nicht mehr aktuell ist: der MT-Server oder eine dritte Partei, vielleicht eine Börse?

Auf dem Server wurden alle Anfragen in Einheiten von Millisekunden verarbeitet. Wegen der veralteten Preise müssen Sie sich an den Administrator wenden.

Wenn das Problem immer wieder auftritt, können Sie den Datenverkehr zur Auftragsänderung mit Wireshark in Verbindung mit Process Monitor (Network Activity) von Sysinternals analysieren.

Ich bin ein völliger Neuling auf diesem Gebiet.

 

Es war möglich, HistorySelect-Funktionen Bremsen zu reproduzieren.

  1. Gehen Sie zum MetaQuotes-Demokonto mit relativ langer Handelshistorie.
    1. Wenn das Demokonto nur eine geringe Handelshistorie aufweist, aktivieren Sie den automatischen Handel und führen Sie das Skript OrderSend-Test2.ex5 parallel aus (siehe Quellcode im Anhang).
  2. Öffnen Sie zwei EURUSD-Charts und führen Sie den unten stehenden Expert Advisor in jedem der Charts aus(die gelbe Farbe im Quellcode zeigt zusätzliche Änderungen an).

    Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

    MT5 und Geschwindigkeit in Aktion

    fxsaber, 2020.06.04 14:38

    Ich habe den folgenden Expert Advisor gezeichnet.

    // Мониторинг длительных пиков выполнения важных функций для торговли.
    #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));
    
        HistorySelect(MathRand(), INT_MAX);
        _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);      
    }

MT5 b2572 wird mit Meldungen wie dieser überflutet.

2020.08.13 05:28:00.143 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.
2020.08.13 05:28:00.148 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 3 ms.
2020.08.13 05:28:00.153 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.162 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.13 05:28:00.167 Alert: Time[Test6.mq5 34: HistoryOrderSelect(0)] = 2 ms.
2020.08.13 05:28:00.174 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.180 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 5 ms.
2020.08.13 05:28:00.186 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 4 ms.
2020.08.13 05:28:00.194 Alert: Time[Test6.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 6 ms.


Bitte schreiben Sie über Ihre Ergebnisse, wer es ausprobieren will. Hatten Sie Glück mit den Verlangsamungen?


ZZY Long versuchte herauszufinden, warum es Bremsen auf Live-Konten gibt. Ich glaube, ich habe den Problembereich gefunden.

Dateien:
 
fxsaber:

ZS Long versuchte herauszufinden, warum die Kampfkonten langsam waren. Er scheint den Problembereich gefunden zu haben.

So deprimierend sieht die Kampfsituation aus.

2020.08.13 10:20:09.074 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
2020.08.13 10:20:09.074 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 59 ms.
...
2020.08.13 11:31:58.559 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 34 ms.
2020.08.13 11:31:58.559 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 35 ms.
2020.08.13 11:31:58.624 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 99 ms.
2020.08.13 11:32:12.483 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 7 ms.
2020.08.13 11:33:44.877 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 27 ms.
2020.08.13 11:33:44.877 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 21 ms.
2020.08.13 11:33:44.879 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 27 ms.
2020.08.13 11:33:47.911 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 18 ms.
2020.08.13 11:33:47.911 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 18 ms.
2020.08.13 11:33:47.912 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 29 ms.

2020.08.13 11:33:49.312 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 22 ms.
2020.08.13 11:33:49.312 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 22 ms.

2020.08.13 11:34:02.612 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 63 ms.
2020.08.13 11:34:02.613 Expert (GBPNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 63 ms.

2020.08.13 11:34:02.616 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 56 ms.
2020.08.13 11:34:12.057 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 12 ms.

2020.08.13 11:34:30.643 Expert (EURAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 32 ms.
2020.08.13 11:34:30.643 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 32 ms.

2020.08.13 11:34:30.643 Expert (GBPAUD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 8 ms.
2020.08.13 11:37:17.059 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 24 ms.
2020.08.13 11:38:30.360 Expert (EURNZD,M1)      Alert: Time[NewTicks.mqh 116: ::HistorySelect(TimeMsc/1000,INT_MAX)] = 13 ms.

Wenn Sie genau hinsehen, können Sie erkennen, dass die voneinander unabhängigen EAs auf dieselbe Weise langsamer werden (Verzögerungszeit und Dauer). Das heißt, wenn mehrere Expert Advisors HistorySelect aufrufen, hält MT5 die Ausführung aller Expert Advisors für einige Zeit an und gibt dann seine Ergebnisse an die Expert Advisors zurück.


Was ist der Grund für eine so merkwürdige (im Vergleich zur bevorstehenden) API für die Arbeit mit der Geschichte? Wo liegen die Fallstricke bei diesem Ansatz?

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

MT5 und Geschwindigkeit in Aktion

fxsaber, 2020.05.28 15:27

GeschichteWählen.

Dies ist eine wahnsinnig teure Funktion. Und leider kann keine noch so gute Zwischenspeicherung die Geschwindigkeit akzeptabel machen.


Bitte erwägen Sie die Einführung solcher Geschichtsfunktionen.

HistoryDealsSelect( const int Index, const int Count = WHOLE_ARRAY );  // Из внутренней таблицы сделок взять сделки, начиная с заданного индекса в таблице.
HistoryOrdersSelect( const int Index, const int Count = WHOLE_ARRAY ); // Из внутренней таблицы ордеров взять ордера, начиная с заданного индекса в таблице.

Sie würden die HistorySelect-Bremsen vollständig schließen. Denn es würde das Problem lösen, die neuesten Berufe sehr billig zu bekommen. Im Moment ist es eine einzige Quälerei bei der Kampfausführung.


Es ist nicht immer möglich, die letzten Geschäfte über OnTradeTransaction zu kontrollieren. Deshalb ist eine schnelle HistorySelect relevant.


Es ist wahrscheinlich nicht normal, dass die Leistung von MT4 besser ist als die von MT5, wenn es um die Handelsgeschichte geht.

Bitte entfernen Sie die Bremsen vom Handelsterminal!

 
Sind 1.000 Transaktionen in der Geschichte genug?
 
Rorschach:
Sind 1000 Berufe in der Geschichte genug?

Getestet mit diesen Werten.

        : HistoryDealsTotal() = 11045
        : HistoryOrdersTotal() = 11518
 

Bestellungen 20990

Deals 10277

Anmelden in 20 Minuten

Dateien:
20200813.log  4817 kb
 
Rorschach:

Bestellungen 20990

Deals 10277

In 20 Minuten anmelden.

Super, vielen Dank! Endlich eine vollständige Bestätigung der traurigen Verzögerungen des MT5. Und das ohne jegliche Handelsfunktionen. Probleme fast überall.

KD      0       16:00:33.382    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 34: HistoryOrderSelect(0)] = 25 ms.
PE      0       16:00:44.913    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 17: CopyTicks(Symb,Ticks,COPY_TICKS_ALL,0,1)] = 24 ms.
DP      0       16:00:44.888    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 22: HistorySelect(Tick.time,INT_MAX)] = 46 ms.
FI      0       16:00:49.579    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 28: HistoryDealSelect(0)] = 22 ms.
EE      0       16:01:03.287    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 33: HistoryOrderGetDouble(0,ORDER_PRICE_CURRENT)] = 1 ms.
KE      0       16:01:07.013    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 50: OrderGetDouble(ORDER_PRICE_CURRENT)] = 1 ms.
JM      0       16:01:12.189    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 44: TimeCurrent()] = 39 ms.
MD      0       16:01:13.067    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 81: ResourceFree(NULL)] = 1 ms.
RS      0       16:01:13.572    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 41: SymbolInfoDouble(Symb,SYMBOL_POINT)] = 7 ms.
GL      0       16:01:27.816    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 79: GlobalVariableGet(NULL)] = 22 ms.
PD      0       16:01:33.892    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 58: PositionGetInteger(POSITION_MAGIC)] = 1 ms.
KP      0       16:01:39.864    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 67: OrderCheck(Request,CheckResult)] = 3 ms.
ML      0       16:01:39.970    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 62: AccountInfoInteger(ACCOUNT_MARGIN_MODE)] = 1 ms.
KM      0       16:01:41.045    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 55: PositionSelect(Symb)] = 2 ms.
NS      0       16:01:46.832    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 78: GlobalVariableCheck(NULL)] = 1 ms.
JP      0       16:01:49.211    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 75: SymbolName(0,true)] = 1 ms.
EL      0       16:01:59.101    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 19: CopyTicksRange(Symb,Ticks,COPY_TICKS_ALL,Tick.time_msc)] = 32 ms.
IM      0       16:02:07.462    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 70: AccountInfoInteger(ACCOUNT_TRADE_EXPERT)] = 7 ms.
PJ      0       16:02:11.735    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 37: IsStopped()] = 4 ms.
OG      0       16:03:08.178    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 32: HistoryOrderGetInteger(0,ORDER_MAGIC)] = 14 ms.
JH      0       16:03:16.385    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 40: SymbolInfoDouble(Symb,SYMBOL_TRADE_TICK_VALUE)] = 5 ms.
FM      0       16:03:16.601    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 59: PositionGetString(POSITION_SYMBOL)] = 1 ms.
GH      0       16:03:21.841    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 72: TerminalInfoInteger(TERMINAL_TRADE_ALLOWED)] = 1 ms.
FJ      0       16:03:25.782    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 46: TimeTradeServer()] = 1 ms.
EO      0       16:03:26.772    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 45: TimeLocal()] = 10 ms.
HD      0       16:03:36.595    fxstest (EURUSD,M1)     Alert: Time[fxstest.mq5 13: SymbolInfoTick(Symb,Tick)] = 13 ms.
...

Das ist deprimierend. Es wäre interessant, das Ergebnis unter Linux zu sehen. Unter Win gibt es keine wirkliche Zeit, über die man reden könnte.