Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 94

 
Konstantin:

e come vedi l'applicazione pratica di GetMicrosecondCount che rovina l'intero lavoro del programma nella versione attuale? descrivi l'applicazione pratica

per esempio, non vedo nessuna variante né in c++ né qui, tranne quelle descritte da Renat, cioè misurare il tempo di esecuzione del codice con precisione in mcs

Non capisco la sua persistenza, francamente parlando

La portata di questa funzione è abbastanza estesa, se avete un volo di fantasia.
Ho già menzionato sopra il multitimer che permette di eseguire diversi timer con periodi diversi allo stesso tempo.
Questo è anche ciò che fxsaber ha già scritto.
La funzione microsecondi rispetto alla funzione millisecondi è utile non solo per testare la velocità, ma anche per ottenere varie informazioni di telemetria durante l'esecuzione di Expert Advisors.
Se la precisione di tale telemetria è di 16 ms (più precisamente 1/64 s = 15625 microsecondi) - questo è un errore molto grande.

 
Aleksey Vyazmikin:

Configurato, ma non aiuta - non capisco la ragione. Vero, il mio server è ntp2.stratum2.ru

Se usate GetTickCount per intervalli così lunghi, non dovreste avere problemi.
Si verificheranno dei problemi se si usa GetMicrosecondCount.
Se usare la funzione microsecondi è una questione di principio, è meglio usare questa variante della funzione.

Informazioni di cui prendere nota:

Tempo approssimativo di esecuzione delle funzioni:

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

 
Nikolai Semko:

Se usate GetTickCount per intervalli così lunghi, non dovreste avere problemi.
Si verificheranno dei problemi se si usa GetMicrosecondCount.
Se usare la funzione microsecondi è una questione di principio, è meglio usare questa variante della funzione.

Informazioni da prendere in considerazione:

Tempo approssimativo di esecuzione delle funzioni:

- GetTickCount - ~ 2 ns

- GetMicrosecondCount - ~ 30 ns

-RealMicrosecondCount - ~ 40 ns

Sto usando il codice di qualcun altro e non ci sono affatto queste funzioni, ma si verifica questo effetto di desincronizzazione.

#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:
Qual è la probabilità di cambiare il tempo locale del computer tra due chiamate a GetMicrosecondsCount usate per misurare il tempo in microsecondi?

Questo dipende, prima di tutto, dal periodo impostato di sincronizzazione dell'ora del sistema con l'ora di Internet. Per esempio, ho impostato la sincronizzazione una volta al giorno, e durante questo periodo c'è più di 1 s di differenza. Qualcuno si sincronizza una volta all'ora, o anche più spesso. Quindi, calcola la probabilità.

 
Nikolai Semko:

...perché so già di tale caratteristica di GetMicrosecondCount() e che questa funzione è più lenta di GetTickCount.

Suppongo che questa lentezza sia dovuta al fatto che oltre ad ottenere il PerfomanceCount nativo, esso fa anche scatti sull'ora locale, quindi dobbiamo pagare per questo servizio ribassista. Se confrontassimo direttamente la velocità di PerfomanceCount e GetTickCount, la differenza sarebbe molto più piccola.

Anche se, francamente, non capisco tutto questo discorso sulla velocità di esecuzione quando si parla di 2-20 nanosecondi. Questa differenza può essere sentita solo quando si esegue un ciclo quasi vuoto (con questa funzione) per cento milioni di iterazioni. Questa soluzione stessa è progettata in modo errato.

 
Renat Fatkhullin:

E sì, sarete ugualmente spazzati via da una funzione WinAPI pura (sia GetTickCount che QueryPerformanceCounter) quando infilate uno scarto nella motosega cambiando la data anche di pochi secondi. Non c'è nessuna protezione che si dice di avere. Succhiato dal dito come problema e presunta soluzione.

Quindi è tutto vero - questo è come WinAPI e questa è la realtà.

Ti sbagli, ho specificamente citato il codice qui usando WinApi. Eseguilo, cambia l'orologio nel processo e vedi il risultato.

Non è molto chiaro come condurre un qualsiasi dialogo con te, se i tuoi argomenti sono basati su speculazioni. E non consideri nemmeno necessario conoscere la discussione sull'argomento.

 
Nikolai Semko:

Il campo di applicazione di questa funzione è abbastanza esteso, se avete un volo di fantasia.
Ho già parlato sopra del multitimer, che permette di eseguire diversi timer con periodi diversi allo stesso tempo.
Questo è anche quello di cui ha già scritto fxsaber.
La funzione microsecondi rispetto alla funzione millisecondi è utile non solo per testare la velocità, ma anche per ottenere varie informazioni di telemetria durante l'esecuzione di Expert Advisors.
Se tale telemetria è precisa a 16 ms (più precisamente 1/64 s = 15625 microsecondi), è un errore abbastanza grande.

Misuro costantemente la velocità di esecuzione, come ha scritto Renat, non ho mai visto alcun problema, sembra che ti avvolgi dal nulla, o non vuoi cambiare ciò che è stato scritto prima, succede quando si ottiene tutto invano, senza offesa, ma lo stesso multitimer che hai citato può essere facilmente implementato senza alcun errore, ma si deve pagare per questo, Renat ha anche dato una descrizione in risposta alla mia domanda sopra

 
Konstantin:
La bocca della Verità è muta per i non iniziati.
 
Nikolai Semko:
La bocca della Verità è muta per i non iniziati.

beh, sì ))

 
Alexey Navoykov:

Dipende, prima di tutto, dal periodo impostato di sincronizzazione dell'ora del sistema con l'ora di Internet. Per esempio, ho impostato la sincronizzazione una volta al giorno, e durante questo periodo c'è più di 1 secondo di divergenza. Qualcuno ce l'ha una volta all'ora, o anche più spesso. Qui si può stimare la probabilità.

Sei sicuro di aver letto tutta la domanda?

...tra due chiamate a GetMicrosecondsCount...

Motivazione: