MT5 und Geschwindigkeit in Aktion - Seite 60

 
Anton:

Test-Code:

Dieser Code zeigt, dass der Autor das Problem nicht verstanden hat.

Beweisen Sie es.
// Классический SYMBOL_BID vs Альтернативный SYMBOL_BID.
// Запускать только на демо-счетах.

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

bool GetPosition( const int Type = OP_BUY )
{
  bool Res = false;
  
  for (int i = PositionsTotal() - 1; (i >= 0) && !Res; i--)
    Res = PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && 
                                  (PositionGetString(POSITION_SYMBOL) == _Symbol);
                                  
  return(Res);
}

// Альтернативный способ получения Bid-цены текущего символа.
// Запускать только на демо-счетах.
double GetBid()
{
  static const TICKET_TYPE Ticket = GetPosition() ? PositionGetInteger(POSITION_TICKET) : OrderSend(_Symbol, OP_BUY, 0.1, Ask, 0, 0, 0);
  
  return(PositionSelectByTicket(Ticket) ? PositionGetDouble(POSITION_PRICE_CURRENT) : 0);
}

#define  TOSTRING(A) ", "#A + " = " + (string)(A)

#define  MACROS(A, B)                                              \
  const ulong StartTime##A = GetMicrosecondCount();               \
  const double A = B;                                             \
  const ulong Interval##A = GetMicrosecondCount() - StartTime##A; \
                                                                  \
  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;  

long TimeBid1 = 0; // Суммарное время на длительный SYMBOL_BID
long TimeBid2 = 0; // Суммарное время на длительный GetBid()

const bool Init = EventSetTimer(10) && GetBid(); // Будем выводить статистику каждый 10 секунд.

void OnTimer()
{
  // На сколько отстает один вариант от другого по времени выполнения.
  Alert(TOSTRING(TimeBid1 - TimeBid2) + " mcs." + TOSTRING(TimeBid1) + TOSTRING(TimeBid2));
}

void OnTick()
{  
  const uint StartTime = GetTickCount();
  
//  return;
  
  while (!IsStopped() && (GetTickCount() - StartTime < 10000))
  {
    MACROS(Bid1, SymbolInfoDouble(_Symbol, SYMBOL_BID))
    MACROS(Bid2, GetBid())
      
//    if (Bid1 != Bid2)
//      Alert("Error!" + TOSTRING(Bid1) + TOSTRING(Bid2));
    
//    Sleep(0); // Специально убрал.
  }
}

Dieser EA ermittelt den Geldkurs des aktuellen Symbols auf zwei Arten. Für jeden von ihnen wird die Ausführungszeit der langen Ausführungsfälle summiert. Und zeigt dann den Unterschied zwischen den beiden.


Geladene 6/8 Agenten. Und ließ diesen EA auf sechs Charts (verschiedene Symbole) auf demRannForex-Server Demo laufen. Ergebnis.

2020.10.26 16:10:40.596 Test9 (EURNZD,H1)       Alert: , TimeBid1-TimeBid2 = 236507295 mcs., TimeBid1 = 246491044, TimeBid2 = 9983749
2020.10.26 16:10:42.596 Test9 (CAC40,H1)        Alert: , TimeBid1-TimeBid2 = 235249710 mcs., TimeBid1 = 241768964, TimeBid2 = 6519254
2020.10.26 16:10:44.267 Test9 (DAX30,H1)        Alert: , TimeBid1-TimeBid2 = 243552816 mcs., TimeBid1 = 253424672, TimeBid2 = 9871856
2020.10.26 16:10:44.382 Test9 (DJI30,H1)        Alert: , TimeBid1-TimeBid2 = 265778370 mcs., TimeBid1 = 272279313, TimeBid2 = 6500943
2020.10.26 16:10:44.623 Test9 (ASX200,H1)       Alert: , TimeBid1-TimeBid2 = 210921561 mcs., TimeBid1 = 219901110, TimeBid2 = 8979549
2020.10.26 16:10:44.732 Test9 (FTSE100,H1)      Alert: , TimeBid1-TimeBid2 = 226824499 mcs., TimeBid1 = 235809635, TimeBid2 = 8985136

Wir haben einen vollständigen Beweis dafür, dass die Gesamtausführungszeit(TimeBid1) von SYMBOL_BID in katastrophaler Weise (TimeBid2) gegenüber der Alternative, die den Gebotspreis erhält, verloren ist.


Diese Krückenlösung zur Ermittlung der aktuellen Preise übertrifft die Leistung der Hauptfunktion von MQL5 selbst. Sind Sie mit diesem Beweis einverstanden?


Ich wünschte, ich hätte schon früher an diese wortgewandte Krücke gedacht.


ZZZY Der EA muss den Algo-Handel zulassen, damit er funktioniert. Führen Sie es daher nur auf Demokonten aus.

 
fxsaber:

Dieser EA ermittelt den Geldkurs des aktuellen Symbols auf zwei Arten.

POSITION_PRICE_CURRENT gerissen ist?

Womit werden wir dann verglichen? Den letzten gespeicherten Preis (wann?) mit dem letzten dem Terminal bekannten Preis abrufen?

Na ja, und etwa 6 von 8 Adern haben es direkt gesagt. Warum solche Tests?

 
fxsaber:

Dieser Code zeigt, dass der Autor das Problem nicht verstanden hat.

Ihre Aussage beweist, dass Sie das Offensichtliche nicht sehen wollen.

Dieser Code zeigt, dass es keine "SymbolInfoTick-Bremse" gibt.

Auf mehr oder weniger moderner Hardware beträgt die SymbolInfoTick-Laufzeit weniger als 1 MICROSekunde.

Dieser Expert Advisor erhält den Geldkurs des aktuellen Symbols auf zwei Arten. Für jeden von ihnen wird die Ausführungszeit der langen Ausführungsfälle summiert. Und dann zeigt sie den Unterschied zwischen ihnen.

Geladene 6/8 Agenten. Und ließ diesen EA auf sechs Charts (verschiedene Symbole) auf demRannForex-Server Demo laufen. Ergebnis.

Wir haben einen vollständigen Beweis dafür, dass die Gesamtausführungszeit(TimeBid1) von SYMBOL_BID in katastrophaler Weise (TimeBid2) an die Alternative verliert, die den Angebotspreis erhält.

Diese Krückenlösung zur Ermittlung der aktuellen Preise übertrifft die Leistung der Hauptfunktion von MQL5 selbst. Sind Sie mit diesem Beweis einverstanden?

Ich wünschte, ich hätte schon früher an diese wortgewandte Krücke gedacht.

ZZZY Der Expert Advisor muss den Algo-Handel ermöglichen. Daher kann es sinnvoll sein, die Software nur auf Demokonten einzusetzen.

Nein, das ist kein Beweis. Ein absolut schmutziger Test, der nicht ernst genommen werden kann.

Ich mache mir nicht einmal die Mühe, ins Detail zu gehen, die Tatsache, dass Sie wieder einen einzigen Aufruf mit GetMicrosecondCount() timen, und wieder mit "Loaded 6/8 Agents" auf einer 4-Kernel-CPU im Hintergrund.

Ich habe oben bereits deutlich gezeigt, dass es möglich ist, auch auf diese Weise imaginäre Bremsen in der "x++"-Ausführung zu finden.

Ihre Aussage über "SymbolInfoTick Bremsen" ist elementar geprüft und durch meinen Code widerlegt, sehr einfach und offensichtlich.

Die ursprüngliche Implementierung von SymbolInfoTick war zwar recht schnell, führte aber bei starker Multithreading-Belastung zu sporadischen Ausführungszeitspitzen auf einzelnen Threads.

In den neuesten Builds ist auch dieser Nachteil nicht mehr vorhanden.

Es ist einfach erstaunlich, dass Sie immer wieder mit jemandem streiten, der genau weiß, wovon er spricht, d. h. der Implementierungen sieht und sie in verschiedenen Modi profilieren kann.

"Streiten wir über den Geschmack von Austern und Kokosnüssen mit denen, die sie gegessen haben".

 
Andrey Khatimlianskii:

POSITION_PRICE_CURRENT gerissen ist?

Nein. MT4Orders wird nur verwendet, um eine Position zu platzieren.

Womit werden wir dann verglichen? Abruf des letzten gespeicherten Preises (wann?) vs. Abruf des letzten dem Terminal bekannten Preises?

Wir vergleichen die Dauer der Preisermittlung durch Market Watch und die Position. Die Preise stimmen natürlich überein.

Und etwa 6 von 8 Adern sagten direkt. Warum solche Tests?

Nur damit selbst ein Blinder sieht, dass es ein Problem gibt. Es ist unsinnig, wenn der Bid-Preis nicht über die Position verlangsamt wird und SymbolInfoTick schrecklich hinkt.


Ich habe das Gefühl, dass diese MQ-Mauer ohne die Unterstützung der Forumsnutzer nicht durchbrochen werden kann. Der Code ist kurz, Profis sollten ihn schnell erfassen können. Er weist keine Mängel auf. Es zeigt sich deutlich, dass die Preise durch Positionen viel schneller erhalten werden als durch Market Watch. Ich verstehe nicht, wie MQs das Offensichtliche nicht sehen können.

 
Anton:

Ihre Aussage beweist, dass Sie das Offensichtliche nicht sehen wollen.

Dieser Code zeigt, dass es keine "SymbolInfoTick-Bremse" gibt.

Auf mehr oder weniger moderner Hardware beträgt die Laufzeit von SymbolInfoTick nicht mehr als 1 MIKROsekunde.

Nein, das ist kein Beweis. Ein absolut chaotischer Test, der nicht ernst genommen werden kann.

Ich werde mir nicht einmal die Mühe machen, ins Detail zu gehen, die Tatsache, dass Sie wieder einmal die Zeit eines einzigen Aufrufs von GetMicrosecondCount() messen, und wieder vor dem Hintergrund von "Loaded 6/8 Agents" auf einer 4-Kern-CPU, reicht aus.

Ich habe oben bereits deutlich gezeigt, dass es möglich ist, auch auf diese Weise imaginäre Bremsen in der "x++"-Ausführung zu finden.

Ihre Aussage über "SymbolInfoTick Bremsen" ist elementar geprüft und durch meinen Code widerlegt, sehr einfach und offensichtlich.

Die ursprüngliche Implementierung von SymbolInfoTick war zwar recht schnell, führte aber bei starker Multithreading-Belastung zu sporadischen Ausführungszeitspitzen auf einzelnen Threads.

Auch die neuesten Builds haben diesen Nachteil nicht.

Es ist einfach erstaunlich, dass Sie immer wieder mit jemandem streiten, der genau weiß, wovon er spricht, d. h. der Implementierungen sieht und sie in verschiedenen Modi profilieren kann.

"Über den Geschmack von Austern und Kokosnüssen kann man mit denen streiten, die sie gegessen haben.

Sie haben sich den Code nicht angeschaut. Ich glaube nicht an Inkompetenz.

  if (Interval##A > 100)                                          \
    Time##A += (long)Interval##A;

Es handelt sich um eine Bedingung, bei der die Ausführung nur dann zählt, wenn sie länger als 100µs gedauert hat. Wenn Sie glauben, dass es sich um einen kleinen Wert handelt, machen Sie ihn um eine Größenordnung länger. Die Wirkung ist dieselbe.

Beide zu vergleichenden Funktionen befinden sich unter absolut gleichen Bedingungen. Der eine bremst am Ende, der andere nicht. Schauen Sie sich noch einmal genau an, was der Code misst.


Im Moment werden durch das Ersetzen von SymbolInfoTick in Kampf-EAs mit der vorgeschlagenen Krücke fast alle Verzögerungen im Zusammenhang mit dem Erhalt der aktuellen Preise beseitigt. Es ist wahnhaft, aber leider ist es so.


HI Beachten Sie das while in OnTick. Es wurde absichtlich so gestaltet, dass es Zecken abfängt, die nach der Annahme von OnTick entstanden sind. Der Code wurde nicht aus heiterem Himmel geschrieben. Es handelt sich nicht um einen völlig künstlichen Zyklus, der die durchschnittliche Temperatur im Krankenhaus unter idealen Bedingungen misst.

 
fxsaber:

Ich glaube, dass diese MQ-Wand ohne die Unterstützung der Forumsmitglieder nicht durchkommen wird. Der Code ist kurz, die Profis sollten ihn schnell herausfinden können. Dort gibt es keine Mängel. Es zeigt sich deutlich, dass die Preise durch Positionen viel schneller erhalten werden als durch Market Watch. Ich verstehe nicht, wie MQ das Offensichtliche nicht sehen kann.

Es gibt keine Fehler im Code, daher ist SymbolInfoTick langsamer als der Preis einer offenen Position

Netter Hack, der den Preis von der Position ableitet, ich hätte nicht gedacht, dass es einen solchen Unterschied geben könnte.
 
fxsaber:

Nur damit auch ein Blinder sieht, dass es ein Problem gibt. Nun, es ist Unsinn, wenn Bid-Preis durch Position ist nicht langsam, aber SymbolInfoTick ist in einer schrecklichen Weise verzögert.

Versuchen Sie, SymbolInfoTick zu testen, wenn es nur ein Symbol in der Marktübersicht gibt und wenn es Dutzende von Symbolen gibt, aber nach einem einzigen Symbol gefragt wird - wie in Ihrem Beispiel

es ist sehr wahrscheinlich, dass der Server den Datenverkehr komprimiert hat und dass SymbolInfoTick beim Dekomprimieren der Daten diese zeitweilige Verzögerung aufweist

d.h. wenn es viele Zeichen gibt, wird es noch häufigere oder tiefere Einbrüche in der Testzeit geben


Wenn sich dies also bewahrheitet, muss die gesamte Architektur neu gestaltet werden.... zweifelhaftes Vergnügen

 
Igor Makanu:

Versuchen Sie, SymbolInfoTick zu testen, wenn es nur ein Symbol in der Marktübersicht gibt und wenn es Dutzende von Symbolen gibt, aber fragen Sie nach einem Tool - wie in Ihrem Beispiel

es ist sehr wahrscheinlich, dass der Server komprimierten Datenverkehr sendet und dass SymbolInfoTick beim Dekomprimieren der Daten periodische Verzögerungen erfährt

d.h. wenn es viele Symbole gibt, wird es noch häufigere oder tiefere Einbrüche in der Testzeit geben.

Diese Hypothese bezieht sich auf den Fall, dass die Preise in Market Watch hinter den Tumblr-Preisen zurückbleiben (und umgekehrt). Aber bisher haben wir nur über das Bremsen von SymbolInfoTick selbst innerhalb des Terminals gesprochen, ohne die Frage der Preisrelevanz zu berühren.

 
fxsaber:

Die beiden zu vergleichenden Funktionen befinden sich unter genau den gleichen Bedingungen.

Zumindest wird GetBid nach SymbolInfoDouble aufgerufen. Wenn wir sie austauschen, wird das Ergebnis dasselbe sein?

Irgendetwas sagt mir, dassPOSITION_PRICE_CURRENT den gespeicherten Preis nimmt, und nicht den neuen Preis.

Andererseits sehe ich auch keinen Sinn darin, mit einer zu 80 % ausgelasteten CPU zu testen. Wir testen die CPU-Leistung und die Ressourcenzuweisung durch den Windup, nicht die Funktionen, die wir brauchen.

 
Andrey Khatimlianskii:

Zumindest wird GetBid nach SymbolInfoDouble aufgerufen. Wenn Sie sie austauschen, wird das Ergebnis dasselbe sein?

Ich habe vor der Veröffentlichung damit experimentiert. Nein, das tut es nicht.

Irgendetwas sagt mir, dassPOSITION_PRICE_CURRENT den gespeicherten Preis nimmt, und nicht den neuen Preis.

Das ist der Punkt, MQL-Programme brauchen den letzten Preis, der am Terminal ankam, nicht etwas anderes. Wenn ein Tick im Terminal eingeht, werden alle Positions-/Auftragstabellen automatisch aktualisiert.

Auch hier sehe ich keinen Sinn darin, mit einer zu 80 % ausgelasteten CPU zu testen. Wir testen die CPU-Leistung und die Ressourcenzuweisung durch den Windup, nicht die Funktionen, die wir brauchen.

Die wichtigste Voraussetzung ist, dass die Umgebung für beide Funktionen identisch ist. Die CPU-Auslastung ist der auffälligste Faktor für die Sichtbarkeit von Diskrepanzen.

Zwanzig parallele EAs können manchmal einen SymbolInfoTick-Aufruf zur gleichen Zeit machen, dann gibt es einen Millisekunden-Burst von Last und Verzögerungen. Ich habe nur vorgeschlagen, dies ausdrücklich zu tun, damit das Problem sofort auffällt.


Auch hier sind die Testbedingungen für beide Funktionen identisch. Tatsache.

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

MT5 und Geschwindigkeit in Aktion

fxsaber, 2020.10.26 17:53

Im Moment beseitigt das Ersetzen von SymbolInfoTick in Kampf-EAs durch die vorgeschlagene Krücke fast alle Bremsen, die mit dem Erhalten aktueller Preise verbunden sind. Es ist wahnhaft, aber leider ist es so.