Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 94

 
Konstantin:

und wie sehen Sie die praktische Anwendung von GetMicrosecondCount, dass es die gesamte Arbeit des Programms in der aktuellen Version verdirbt? beschreiben Sie die praktische Anwendung

Zum Beispiel sehe ich weder in C++ noch hier irgendwelche Varianten, außer den von Renat beschriebenen, d.h. die Messung der Code-Ausführungszeit mit Genauigkeit in MCS

Ich verstehe Ihre Hartnäckigkeit nicht, um ehrlich zu sein.

Der Umfang dieser Funktion ist recht umfangreich, wenn Sie einen Höhenflug haben.
Ich habe oben bereits den Multitimer erwähnt, mit dem Sie mehrere Timer mit unterschiedlichen Zeiträumen gleichzeitig laufen lassen können.
Auch darüber hat fxsaber bereits geschrieben.
Die Mikrosekundenfunktion ist im Vergleich zur Millisekundenfunktion nicht nur für Geschwindigkeitstests nützlich, sondern auch für die Gewinnung verschiedener Telemetriedaten während der Laufzeit von Expert Advisors.
Wenn die Genauigkeit dieser Telemetrie 16 ms (genauer 1/64 s = 15625 Mikrosekunden) beträgt, ist dies ein sehr großer Fehler.

 
Aleksey Vyazmikin:

Konfiguriert, aber es hilft nicht - ich verstehe den Grund nicht. Richtig, mein Server ist ntp2.stratum2.ru

Wenn Sie GetTickCount für so lange Intervalle verwenden, sollten Sie keine Probleme haben.
Probleme treten auf, wenn Sie GetMicrosecondCount verwenden.
Wenn Sie die Mikrosekundenfunktion aus Prinzip verwenden, sollten Sie diese Variante der Funktion benutzen.

Informationen, die Sie zur Kenntnis nehmen sollten:

Ungefähre Zeit der Ausführung von Funktionen:

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

 
Nikolai Semko:

Wenn Sie GetTickCount für so lange Intervalle verwenden, sollten Sie keine Probleme haben.
Probleme treten auf, wenn Sie GetMicrosecondCount verwenden.
Wenn Sie die Mikrosekundenfunktion aus Prinzip verwenden, sollten Sie diese Variante der Funktion benutzen.

Informationen, die zur Kenntnis zu nehmen sind:

Ungefähre Ausführungszeit der Funktionen:

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

Ich verwende den Code eines anderen Anbieters, und dort gibt es solche Funktionen überhaupt nicht, aber dieser Desynchronisationseffekt tritt auf.

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1

input color ValuesPositiveColor = MediumSeaGreen; // Color for positive timer values
input color ValuesNegativeColor = PaleVioletRed;  // Color for negative timer values
input int   TimeFontSize        = 10;             // Font size for timer
input int   TimerShift          = 7;              // Timer shift

#define  clockName "CandleTimer"
int  atrHandle;
int ObjComplite=0;
int  OnInit()                   { atrHandle = iATR(NULL,0,30); EventSetTimer(1);  return(0); }
void OnDeinit(const int reason) { EventKillTimer(); }
void OnTimer( )                 { refreshClock();  }
int  OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
   //refreshClock();
   return(rates_total);
}
void refreshClock()
{
   static bool inRefresh = false;
           if (inRefresh) return;
               inRefresh = true;
                              ShowClock(); ChartRedraw();
               inRefresh=false;
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
void ShowClock()
{
   int periodMinutes = periodToMinutes(Period());
   int shift         = periodMinutes*TimerShift*60;
   int currentTime   = (int)TimeCurrent();
   int localTime     = (int)TimeLocal();
   int barTime       = (int)iTime(Symbol(),PERIOD_CURRENT,0);//iTime();
   int diff          = (int)MathMax(round((currentTime-localTime)/3600.0)*3600,-24*3600);

      color  theColor;
      string time = getTime(barTime+periodMinutes*60-localTime-diff,theColor);
             time = (TerminalInfoInteger(TERMINAL_CONNECTED)) ? time : time+" x";

      if(ObjComplite==0)if(ObjectFind(0,clockName) < 0)
      {            
         ObjectCreate(0,clockName,OBJ_TEXT,0,barTime+shift,0);
         ObjComplite=1;
      }   
         ObjectSetString(0,clockName,OBJPROP_TEXT,time);
         ObjectSetString(0,clockName,OBJPROP_FONT,"Arial");
         ObjectSetInteger(0,clockName,OBJPROP_FONTSIZE,TimeFontSize);
         ObjectSetInteger(0,clockName,OBJPROP_COLOR,theColor);

      
         if (ChartGetInteger(0,CHART_SHIFT,0)==0 && (shift >=0))
               ObjectSetInteger(0,clockName,OBJPROP_TIME,barTime-shift*3);
         else  ObjectSetInteger(0,clockName,OBJPROP_TIME,barTime+shift);

      double price[]; if (CopyClose(Symbol(),0,0,1,price)<=0) return;
      double atr[];   if (CopyBuffer(atrHandle,0,0,1,atr)<=0) return;
             price[0] += 3.0*atr[0]/4.0;
             
      bool visible = ((ChartGetInteger(0,CHART_VISIBLE_BARS,0)-ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0)) > 0);
      if ( visible && price[0]>=ChartGetDouble(0,CHART_PRICE_MAX,0))
            ObjectSetDouble(0,clockName,OBJPROP_PRICE,price[0]-1.5*atr[0]);
      else  ObjectSetDouble(0,clockName,OBJPROP_PRICE,price[0]);
}

//------------------------------------------------------------------
//
//------------------------------------------------------------------
string getTime(int times, color& theColor)
{
   string stime = "";
   int    seconds;
   int    minutes;
   int    hours;
   
   if (times < 0) {
         theColor = ValuesNegativeColor; times = (int)fabs(times); }
   else  theColor = ValuesPositiveColor;
   seconds = (times%60);
   hours   = (times-times%3600)/3600;
   minutes = (times-seconds)/60-hours*60;
   
   if (hours>0)
   if (minutes < 10)
         stime = stime+(string)hours+":0";
   else  stime = stime+(string)hours+":";
         stime = stime+(string)minutes;
   if (seconds < 10)
         stime = stime+":0"+(string)seconds;
   else  stime = stime+":" +(string)seconds;
   return(stime);
}


int periodToMinutes(int period)
{
   int i;
   static int _per[]={1,2,3,4,5,6,10,12,15,20,30,0x4001,0x4002,0x4003,0x4004,0x4006,0x4008,0x400c,0x4018,0x8001,0xc001};
   static int _min[]={1,2,3,4,5,6,10,12,15,20,30,60,120,180,240,360,480,720,1440,10080,43200};

   if (period==PERIOD_CURRENT) 
       period = Period();   
            for(i=0;i<20;i++) if(period==_per[i]) break;
   return(_min[i]);   
}
 
Slawa:
Wie groß ist die Wahrscheinlichkeit, dass sich die lokale Computerzeit zwischen zwei Aufrufen von GetMicrosecondsCount zur Messung der Zeit in Mikrosekunden ändert?

Dies hängt in erster Linie von dem festgelegten Zeitraum der Synchronisierung der Systemzeit mit der Internet-Zeit ab. Ich habe z.B. die Synchronisation einmal am Tag eingestellt, und während dieser Zeit gibt es mehr als 1 s Differenz. Jemand synchronisiert einmal pro Stunde oder sogar noch öfter. Berechnen Sie also die Wahrscheinlichkeit.

 
Nikolai Semko:

...denn ich weiß bereits von dieser Funktion von GetMicrosecondCount() und dass diese Funktion langsamer ist als GetTickCount.

Ich vermute, dass diese Langsamkeit auf die Tatsache zurückzuführen ist, dass zusätzlich zum nativen PerfomanceCount auch noch die lokale Zeit abgefragt wird, so dass wir für diesen bärigen Service bezahlen müssen. Wenn wir die Geschwindigkeit von PerfomanceCount und GetTickCount direkt vergleichen würden, wäre der Unterschied viel geringer.

Obwohl ich, offen gesagt, das ganze Gerede über die Ausführungsgeschwindigkeit nicht wirklich verstehe, wenn wir von 2-20 Nanosekunden sprechen. Dieser Unterschied macht sich nur bemerkbar, wenn man eine fast leere Schleife (mit dieser Funktion) für hundert Millionen Iterationen ausführt. Das ist an sich eine falsch konzipierte Lösung.

 
Renat Fatkhullin:

Und ja, Sie werden von einer reinen WinAPI-Funktion (entweder GetTickCount oder QueryPerformanceCounter) genauso weggeblasen, wenn Sie der Kettensäge einen Kratzer zufügen, indem Sie das Datum auch nur um Sekunden ändern. Es gibt überhaupt keinen Schutz, den Sie angeblich haben wollen. Aus dem Finger gesaugt als Problem und angebliche Lösung.

Es stimmt also alles - so ist die WinAPI und so ist die Realität.

Sie irren sich, ich habe den Code hier ausdrücklich mit WinApi zitiert. Führen Sie ihn aus, ändern Sie dabei die Uhr, und sehen Sie sich das Ergebnis an.

Es ist nicht ganz klar, wie man mit Ihnen einen Dialog führen kann, wenn Ihre Argumente auf Spekulationen beruhen. Und Sie halten es nicht einmal für nötig, sich mit der Diskussion über das Thema vertraut zu machen.

 
Nikolai Semko:

Der Anwendungsbereich dieser Funktion ist recht umfangreich, wenn man einen Höhenflug hat.
Ich habe bereits oben über den Multitimer gesprochen, der es Ihnen ermöglicht, mehrere Timer mit unterschiedlichen Zeiträumen gleichzeitig laufen zu lassen.
Dies ist auch das, was fxsaber bereits beschrieben hat.
Die Mikrosekundenfunktion ist im Vergleich zur Millisekundenfunktion nicht nur für Geschwindigkeitstests nützlich, sondern auch für die Gewinnung verschiedener Telemetriedaten während der Laufzeit von Expert Advisors.
Wenn diese Telemetrie auf 16 ms genau ist (genauer gesagt 1/64 s = 15625 Mikrosekunden), ist das ein ziemlich großer Fehler.

Ich messe ständig die Geschwindigkeit der Ausführung, wie Renat schrieb, habe ich noch nie irgendwelche Probleme gesehen, scheinen Sie von nichts zu wickeln, oder wollen nicht ändern, was zuvor geschrieben wurde, passiert es, wenn Sie alles umsonst bekommen, nichts für ungut, aber die gleiche Multitimer Sie erwähnt können leicht ohne Fehler implementiert werden, aber Sie müssen dafür bezahlen, Renat gab auch eine Beschreibung in Antwort auf meine Frage oben

 
Konstantin:
Der Mund der Wahrheit ist für den Uneingeweihten stumm.
 
Nikolai Semko:
Der Mund der Wahrheit ist für den Uneingeweihten stumm.

Nun, ja ))

 
Alexey Navoykov:

Sie hängt in erster Linie von der eingestellten Zeitspanne für die Synchronisierung der Systemzeit mit der Internet-Zeit ab. Ich habe z.B. einmal am Tag eine Synchronisation eingestellt, und in dieser Zeit gibt es mehr als 1 Sekunde Abweichung. Jemand hat es einmal in der Stunde, oder sogar noch öfter. Hier können Sie die Wahrscheinlichkeit abschätzen.

Sind Sie sicher, dass Sie die ganze Frage gelesen haben?

...zwischen zwei Aufrufen von GetMicrosecondsCount...