Características del lenguaje mql5, sutilezas y técnicas - página 94

 
Konstantin:

¿y cómo ves la aplicación práctica de GetMicrosecondCount que estropea todo el trabajo del programa en la versión actual? describe la aplicación práctica

por ejemplo, no veo ninguna variante ni en c++ ni aquí, salvo las descritas por Renat, es decir, medir el tiempo de ejecución del código con precisión en mcs

No entiendo su persistencia, francamente hablando

El alcance de esta función es bastante amplio, si se tiene un vuelo de fantasía.
Ya he mencionado anteriormente el multitemporizador que permite ejecutar varios temporizadores con diferentes períodos al mismo tiempo.
Esto es también lo que ya ha escrito fxsaber.
La función de microsegundos, comparada con la de milisegundos, es útil no sólo para las pruebas de velocidad, sino también para obtener diversas informaciones de telemetría durante el tiempo de ejecución de los Asesores Expertos.
Si la precisión de dicha telemetría es de 16 ms (más exactamente 1/64 s = 15625 microsegundos), se trata de un error muy grande.

 
Aleksey Vyazmikin:

Configurado, pero no ayuda - no entiendo la razón. Cierto, mi servidor es ntp2.stratum2.ru

Si utilizas GetTickCount para intervalos tan largos, no deberías tener ningún problema.
Se producirán problemas si se utiliza GetMicrosecondCount.
Si el uso de la función de microsegundos es una cuestión de principios, es mejor que utilice esta variante de la función.

Información a tener en cuenta:

Tiempo aproximado de ejecución de las funciones:

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

 
Nikolai Semko:

Si utiliza GetTickCount para intervalos tan largos, no debería tener ningún problema.
Se producirán problemas si se utiliza GetMicrosecondCount.
Si el uso de la función de microsegundos es una cuestión de principios, es mejor utilizar esta variante de la función.

Información a tener en cuenta:

Tiempo aproximado de ejecución de las funciones:

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

Estoy utilizando el código de otra persona y no hay tales funciones en absoluto, pero este efecto de desincronización se produce.

#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:
¿Cuál es la probabilidad de que cambie la hora local del ordenador entre dos llamadas a GetMicrosecondsCount utilizadas para medir el tiempo en microsegundos?

Esto depende, en primer lugar, del periodo establecido de sincronización de la hora del sistema con la hora de Internet. Por ejemplo, yo programo la sincronización una vez al día, y durante este tiempo hay más de 1 s de diferencia. Alguien sincroniza una vez por hora, o incluso más a menudo. Entonces, calcula la probabilidad.

 
Nikolai Semko:

...porque ya conozco esa función de GetMicrosecondCount() y que esta función es más lenta que GetTickCount.

Supongo que esta lentitud se debe a que, además de obtener el PerfomanceCount nativo, también se sacude la hora local, por lo que hay que pagar por este servicio bajista. Si comparáramos la velocidad del PerfomanceCount y del GetTickCount directamente, la diferencia sería mucho menor.

Aunque, francamente hablando, no entiendo muy bien toda esta charla sobre la velocidad de ejecución cuando estamos hablando de 2-20 nanosegundos. Esta diferencia sólo se puede sentir cuando se ejecuta un bucle casi vacío (con esta función) durante cien millones de iteraciones. Esta solución en sí está mal diseñada.

 
Renat Fatkhullin:

Y sí, te quedarás igual de flipado con una función pura de WinAPI (ya sea GetTickCount o QueryPerformanceCounter) cuando metas una chorrada en la sierra cambiando la fecha aunque sea por segundos. No hay ninguna protección de la que se habla que supuestamente se tiene. Se le ha chupado el dedo como un problema y una supuesta solución.

Así que todo es cierto: así es WinAPI y esta es la realidad.

Te equivocas, he citado específicamente el código aquí usando WinApi. Ejecútalo, cambia el reloj en el proceso y mira el resultado.

No está muy claro cómo llevar a cabo cualquier diálogo con usted, si sus argumentos se basan en especulaciones. E incluso no considera necesario familiarizarse con la discusión del tema.

 
Nikolai Semko:

El campo de aplicación de esta función es bastante extenso, si se tiene un vuelo de fantasía.
Ya he mencionado anteriormente el multitemporizador, que permite ejecutar varios temporizadores con diferentes períodos al mismo tiempo.
Esto es también lo que ya escribió fxsaber.
La función de microsegundos, comparada con la de milisegundos, es útil no sólo para las pruebas de velocidad, sino también para obtener diversas informaciones de telemetría durante el tiempo de ejecución de los Asesores Expertos.
Si esa telemetría tiene una precisión de 16 ms (más exactamente 1/64 s = 15625 microsegundos), es un error bastante grande.

Constantemente mido la velocidad de ejecución, como escribió Renat, nunca he visto ningún problema, parece que te enrollas de la nada, o no quieres cambiar lo que estaba escrito antes, eso pasa cuando lo consigues todo en vano, no te ofendas, pero el mismo multitimer que mencionaste se puede implementar fácilmente sin ningún error, pero tienes que pagar por ello, Renat también dio una descripción en respuesta a mi pregunta anterior

 
Konstantin:
La boca de la Verdad es muda para los no iniciados.
 
Nikolai Semko:
La boca de la Verdad es muda para los no iniciados.

bueno, sí ))

 
Alexey Navoykov:

Depende, en primer lugar, del periodo de sincronización de la hora del sistema con la de Internet. Por ejemplo, yo pongo la sincronización una vez al día, y durante este tiempo hay más de 1 segundo de divergencia. Alguien lo tiene una vez por hora, o incluso más a menudo. Aquí se puede estimar la probabilidad.

¿Seguro que has leído toda la pregunta?

...entre dos llamadas a GetMicrosecondsCount...