Caractéristiques du langage mql5, subtilités et techniques - page 94

 
Konstantin:

et comment voyez-vous l'application pratique de GetMicrosecondCount au point de gâcher tout le travail du programme dans la version actuelle ? décrivez l'application pratique

par exemple, je ne vois pas de variantes ni en c++ ni ici, sauf celles décrites par Renat, à savoir mesurer le temps d'exécution du code avec précision en mcs

Je ne comprends pas votre persistance, franchement parlant.

Le champ d'application de cette fonction est assez vaste, si vous avez de la fantaisie.
J'ai déjà mentionné plus haut le multitimer qui vous permet de faire fonctionner plusieurs timers avec des périodes différentes en même temps.
C'est aussi ce que fxsaber a déjà écrit.
La fonction microseconde par rapport à la fonction milliseconde est utile non seulement pour les tests de vitesse, mais aussi pour obtenir diverses informations de télémétrie pendant l'exécution des conseillers experts.
Si la précision de cette télémétrie est de 16 ms (plus précisément 1/64 s = 15625 microsecondes) - il s'agit d'une erreur très importante.

 
Aleksey Vyazmikin:

Configuré, mais cela n'aide pas - je ne comprends pas la raison. Vrai, mon serveur est ntp2.stratum2.ru

Si vous utilisez GetTickCount pour des intervalles aussi longs, vous ne devriez pas avoir de problèmes.
Des problèmes surviendront si vous utilisez GetMicrosecondCount.
Si l'utilisation de la fonction microseconde est une question de principe, il est préférable d'utiliser cette variante de la fonction.

Informations à prendre en compte :

Temps approximatif d'exécution des fonctions :

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

 
Nikolai Semko:

Si vous utilisez GetTickCount pour des intervalles aussi longs, vous ne devriez pas avoir de problèmes.
Des problèmes surviendront si vous utilisez GetMicrosecondCount.
Si l'utilisation de la fonction microseconde est une question de principe, il est préférable d'utiliser cette variante de la fonction.

Informations à prendre en compte :

Temps d'exécution approximatif des fonctions :

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

J'utilise le code de quelqu'un d'autre et il n'y a pas du tout de telles fonctions mais cet effet de désynchronisation se produit.

#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]);   
}
 
Slava:
Quelle est la probabilité de changer l'heure locale de l'ordinateur entre deux appels à GetMicrosecondsCount utilisés pour mesurer le temps en microsecondes ?

Cela dépend, tout d'abord, de la période spécifiée de synchronisation de l'heure du système avec l'heure Internet. Par exemple, je règle la synchronisation une fois par jour, et pendant ce temps il y a plus de 1 s de différence. Quelqu'un se synchronise une fois par heure, ou même plus souvent. Alors, calculez la probabilité.

 
Nikolai Semko:

...parce que je connais déjà cette fonction de GetMicrosecondCount() et que cette fonction est plus lente que GetTickCount.

Je suppose que cette lenteur est due au fait qu'en plus d'obtenir le PerfomanceCount natif, il secoue également l'heure locale, nous devons donc payer pour ce service baissier. Si nous comparions directement la vitesse de PerfomanceCount et de GetTickCount, la différence serait beaucoup plus faible.

Même si, franchement, je ne comprends pas vraiment tout ce discours sur la vitesse d'exécution quand on parle de 2-20 nanosecondes. Cette différence ne peut être ressentie qu'en exécutant une boucle presque vide (avec cette fonction) pendant cent millions d'itérations. C'est une solution mal conçue en soi.

 
Renat Fatkhullin:

Et oui, vous serez tout aussi époustouflé par une fonction WinAPI pure (soit GetTickCount ou QueryPerformanceCounter) lorsque vous glisserez un morceau dans la tronçonneuse en changeant la date même de quelques secondes. Il n'y a aucune protection que vous êtes censés avoir. Aspiré de votre doigt comme un problème et une prétendue solution.

Tout est donc vrai - c'est ainsi que fonctionne WinAPI et c'est la réalité.

Vous avez tort, j'ai spécifiquement cité le code ici utilisant WinApi. Exécutez-le, changez l'horloge dans le processus, et voyez le résultat.

Il n'est pas très clair comment mener un quelconque dialogue avec vous, si vos arguments sont basés sur des spéculations. Et vous ne considérez même pas nécessaire de prendre connaissance de la discussion sur le sujet.

 
Nikolai Semko:

Le champ d'application de cette fonction est assez vaste, si vous avez de la fantaisie.
J'ai déjà parlé plus haut du multitimer, qui vous permet de faire fonctionner simultanément plusieurs minuteurs avec des périodes différentes.
C'est aussi ce que fxsaber a déjà écrit.
La fonction microseconde par rapport à la fonction milliseconde est utile non seulement pour les tests de vitesse, mais aussi pour obtenir diverses informations de télémétrie pendant l'exécution des conseillers experts.
Si cette télémétrie est précise à 16 ms (plus précisément 1/64 s = 15625 microsecondes), il s'agit d'une erreur assez importante.

Je mesure constamment la vitesse d'exécution, comme Renat l'a écrit, je n'ai jamais vu de problèmes, vous semblez partir de rien, ou ne pas vouloir changer ce qui a été écrit avant, cela arrive quand on a tout en vain, sans vouloir vous offenser, mais le même multitimer que vous avez mentionné peut être facilement mis en œuvre sans aucune erreur, mais il faut payer pour cela, Renat a également donné une description en réponse à ma question ci-dessus

 
Konstantin:
La bouche de la Vérité est muette pour les non-initiés.
 
Nikolai Semko:
La bouche de la Vérité est muette pour les non-initiés.

Eh bien, oui ;)

 
Alexey Navoykov:

Cela dépend, tout d'abord, de la période de synchronisation de l'heure du système avec l'heure Internet. Par exemple, je règle la synchronisation une fois par jour, et pendant cette période il y a plus d'une seconde de divergence. Quelqu'un l'a une fois par heure, ou même plus souvent. Ici vous pouvez estimer la probabilité.

Êtes-vous sûr d'avoir lu toute la question ?

...entre deux appels à GetMicrosecondsCount...