Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 94

 
Konstantin :

Ancak GetMicrosecondCount'un mevcut sürümde programın tüm çalışmasını bozan pratik uygulamasını nasıl görüyorsunuz? pratik uygulamayı tarif et

örneğin, C ++ veya burada Renat tarafından açıklananlar dışında herhangi bir seçenek görmüyorum, yani. kod yürütme süresinin mcs cinsinden doğrulukla ölçülmesi

onlar. Dürüst olmak gerekirse inatçılığını anlamıyorum

Bir fantezi uçuşu varsa, bu işlevin kapsamı çok geniştir.
Aynı anda farklı periyotlarla birden çok zamanlayıcı çalıştırmanıza izin veren multitimerdan yukarıda bahsetmiştim.
fxsaber zaten bunun hakkında da yazdı .
Milisaniye işlevine kıyasla bir mikrosaniye işlevi, yalnızca yürütme hızını test etmek için değil, aynı zamanda Uzman Danışmanların çalışması sırasında çeşitli telemetrik bilgileri toplamak için de uygundur.
Böyle bir telemetrinin doğruluğu 16 ms ise (daha doğrusu 1/64 s = 15625 mikrosaniye), bu çok büyük bir hatadır.

 
Alexey Vyazmikin :

Yapılandırılmış, ancak yardımcı olmuyor - nedenini anlamıyorum. Doğru, sunucum ntp2.stratum2.ru

GetTickCount'u bu kadar büyük zaman aralıklarına sahip bir sayaç için kullanırsanız, herhangi bir sorun olmamalıdır.
GetMicrosecondCount kullanıyorsanız sorunlar olacaktır.
Mikrosaniye işlevinin kullanılması temel bir noktaysa, işlevin bu sürümünü kullanmak daha iyidir.

Dikkat edilmesi gereken bilgiler:

İşlevlerin yaklaşık yürütme süresi:

- GetTickCount - ~2 ns

- GetMicrosecondCount - ~30ns

- RealMicrosecondCount - ~40ns

 
Nikolay Semko :

GetTickCount'u bu kadar uzun süreler için bir sayaç için kullanırsanız, herhangi bir sorun olmamalıdır.
GetMicrosecondCount kullanıyorsanız sorunlar olacaktır.
Mikrosaniye işlevinin kullanılması temel bir noktaysa, işlevin bu sürümünü kullanmak daha iyidir.

Dikkat edilmesi gereken bilgiler:

İşlevlerin yaklaşık yürütme süresi:

- GetTickCount - ~2 ns

- GetMicrosecondCount - ~30ns

- RealMicrosecondCount - ~40ns

Başka birinin kodunu kullanıyorum, bir şekilde bu işlevler yok, ancak senkronizasyonsuzlaştırma etkisi oluşuyor.

 #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 :
Bilgisayarın yerel saatinin, zamanı mikrosaniye cinsinden ölçmek için kullanılan GetMicrosecondsCount'a yapılan iki çağrı arasında değişmiş olma olasılığı nedir?

Her şeyden önce, sistem saatinin İnternet saati ile belirtilen senkronizasyon süresine bağlıdır. Örneğin, senkronizasyonu günde bir kez ayarladım ve bu süre zarfında 1 saniyeden fazla tutarsızlık çıkıyor. Birisi saatte bir, hatta daha sık senkronize oluyor. İşte olasılık.

 
Nikolay Semko :

...çünkü GetMicrosecondCount()'un bu özelliğini zaten biliyorum ve bu fonksiyon GetTickCount'tan bir kat daha yavaş.

Böyle bir yavaşlığın, yerel PerfomanceCount'u elde etmenin yanı sıra yerel saatin ayrıca seğirmesinden kaynaklandığına inanıyorum, bu nedenle bu kötü hizmet için ödeme yapmanız gerekiyor. Hız doğrudan PerformanceCount ve GetTickCount ile karşılaştırılsaydı, fark çok daha küçük olurdu.

Dürüst olmak gerekirse, 2-20 nanosaniye söz konusu olduğunda yürütme hızıyla ilgili bu konuşmayı gerçekten anlamıyorum. Bu farkı ancak neredeyse boş bir döngüyü (bu işlevle) yüz milyon yineleme boyunca çalıştırarak gerçekten hissedebilirsiniz. Bu başlı başına kötü tasarlanmış bir çözümdür.

 
Renat Fatkhullin'in fotoğrafı.

Ve evet, bir testereye bir levye taktığınızda, tarihi saniyeler içinde bile değiştirdiğinizde, saf bir WinAPI işlevi (GetTickCount nedir, QueryPerformanceCounter nedir) tarafından havaya uçurulacaksınız. Genel olarak, varlığından bahsettiğiniz iddia edilen hiçbir koruma yoktur. Bir sorun olarak parmaktan emildi ve sözde bir çözüm.

Bu doğru - WinAPI böyle ve gerçeklik böyle.

Hatalısınız. Burada özellikle WinApi kullanımıyla kodu burada sonuçlandırdım. Koşun, süreçteki saati değiştirin ve sonuca bakın.

Argümanlarınız spekülasyona dayanıyorsa, sizinle herhangi bir diyaloğu nasıl yürüteceğiniz çok açık değil. Ve konunun tartışılmasının seyrine kendinizi alıştırmanın gerekli olduğunu bile düşünmüyorsunuz.

 
Nikolay Semko :

Bir fantezi uçuşu varsa, bu işlevin kapsamı çok geniştir.
Aynı anda farklı periyotlarla birden çok zamanlayıcı çalıştırmanıza izin veren multitimerdan yukarıda bahsetmiştim.
fxsaber zaten bunun hakkında da yazdı .
Milisaniye işlevine kıyasla bir mikrosaniye işlevi, yalnızca yürütme hızını test etmek için değil, aynı zamanda Uzman Danışmanların çalışması sırasında çeşitli telemetrik bilgileri toplamak için de uygundur.
Böyle bir telemetrinin doğruluğu 16 ms ise (daha doğrusu 1/64 s = 15625 mikrosaniye), bu çok büyük bir hatadır.

Renat'ın yazdığı yürütme hızını sürekli ölçüyorum, hiç sorun görmedim, boşuna dolanıyor gibisin ya da daha önce yazılanları değiştirmek istemiyorsun, dedikleri gibi, çıplak ... ve sonra her şeyin boşuna yazıldığını anlıyorsunuz, kusura bakmayın, ancak sağladığınız aynı multitimer sessizce sorunsuz bir şekilde uygulanıyor, ancak bunun için ödeme yapmanız gerekecek, Renat ayrıca cevabında yukarıda bir açıklama yaptı. benim sorum

 
Konstantin :
Gerçeğin dudakları, deneyimsizler için dilsizdir.
 
Nikolay Semko :
Gerçeğin dudakları, deneyimsizler için dilsizdir.

iyi evet ))

 
Alexey Navoykov :

Her şeyden önce, sistem saatinin İnternet saati ile belirtilen senkronizasyon süresine bağlıdır. Örneğin, senkronizasyonu günde bir kez ayarladım ve bu süre zarfında 1 saniyeden fazla tutarsızlık çıkıyor. Birisi saatte bir, hatta daha sık senkronize oluyor. İşte olasılık.

sorunun tamamını okudun mu?

... GetMicrosecondsCount'a yapılan iki çağrı arasında ...