mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 94

 
콘스탄틴 :

그러나 현재 버전에서 프로그램의 전체 작업을 망치는 GetMicrosecondCount의 실제 적용을 어떻게 보십니까? 실제 적용을 설명

예를 들어, Renat에서 설명한 옵션을 제외하고 C ++ 또는 여기에는 옵션이 표시되지 않습니다. mcs 단위의 정확도로 코드 실행 시간 측정

저것들. 솔직한 너의 고집이 이해가 되지 않아

이 기능의 범위는 매우 광범위합니다.
나는 이미 멀티 타이머에서 위에서 언급했는데, 이를 통해 동시에 다른 기간으로 여러 타이머를 실행할 수 있습니다.
fxsaber도 이에 대해 이미 썼습니다 .
밀리세컨드 함수에 비해 마이크로세컨드 함수는 실행 속도 테스트는 물론 Expert Advisors 운용 시 다양한 원격 정보 수집에 편리하다.
이러한 원격 측정의 정확도가 16ms(더 정확하게는 1/64s = 15625마이크로초)이면 이는 매우 큰 오류입니다.

 
알렉세이 비아즈미킨 :

구성되었지만 도움이되지 않습니다. 이유를 이해하지 못합니다. 사실, 내 서버는 ntp2.stratum2.ru입니다.

이렇게 긴 시간 간격의 카운터에 GetTickCount를 사용하면 문제가 없을 것입니다.
GetMicrosecondCount를 사용하면 문제가 발생합니다.
마이크로초 기능을 사용하는 것이 기본이라면 이 버전 의 기능을 사용하는 것이 좋습니다.

참고할 정보:

함수의 대략적인 실행 시간:

- GetTickCount - ~2ns

- GetMicrosecondCount - ~30ns

- RealMicrosecondCount - ~40ns

 
니콜라이 셈코 :

이렇게 긴 시간 간격의 카운터에 GetTickCount를 사용하면 문제가 없을 것입니다.
GetMicrosecondCount를 사용하면 문제가 발생합니다.
마이크로초 기능을 사용하는 것이 기본이라면 이 버전 의 기능을 사용하는 것이 좋습니다.

참고할 정보:

함수의 대략적인 실행 시간:

- GetTickCount - ~2ns

- GetMicrosecondCount - ~30ns

- RealMicrosecondCount - ~40ns

다른 사람의 코드를 사용하고 있는데, 어쩐지 이러한 기능이 전혀 없는데, 비동기화 효과가 발생합니다.

 #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]);   
}
 
슬라바 :
마이크로초 단위로 시간을 측정하는 데 사용되는 GetMicrosecondsCount에 대한 두 번의 호출 사이에 컴퓨터의 현지 시간이 변경되었을 확률은 얼마입니까?

우선 시스템 시간과 인터넷 시간의 지정된 동기화 기간에 따라 다릅니다. 예를 들어 하루에 한 번 동기화를 설정했는데 이 시간 동안 1초 이상의 불일치가 발생합니다. 누군가는 한 시간에 한 번 또는 더 자주 동기화합니다. 여기 확률이 있습니다.

 
니콜라이 셈코 :

... GetMicrosecondCount()의 이 기능에 대해 이미 알고 있고 이 함수가 GetTickCount보다 10배 이상 느리기 때문입니다.

이러한 느림은 네이티브 PerfomanceCount를 얻는 것 외에도 현지 시간 이 추가로 꼬여 있기 때문에 이 서비스에 대한 비용을 지불해야 한다고 생각합니다. 속도를 PerformanceCount 및 GetTickCount와 직접 비교하면 차이가 훨씬 작을 것입니다.

솔직히 말해서 2-20나노초에 관한 실행 속도에 대한 이 이야기를 잘 이해하지 못합니다. 거의 빈 루프(이 함수를 사용하여)를 1억 반복 동안 실행해야만 이 차이를 느낄 수 있습니다. 이것은 그 자체로 잘못 설계된 솔루션입니다.

 
레나트 파트훌린 :

그리고 예, 전기톱에 쇠지렛대를 밀어 넣으면 날짜가 초 단위로 변경되는 순수한 WinAPI 함수(GetTickCount란 무엇이며 QueryPerformanceCounter는 무엇입니까)에 의해 폭파될 것입니다. 일반적으로 귀하가 말하는 보호 장치가 없습니다. 문제로 손가락에서 빨려, 그리고 아마도 해결책.

맞습니다. WinAPI가 바로 이것이고 현실입니다.

당신은 잘못. 여기 에서는 특히 WinApi를 사용하여 코드를 생성했습니다. 실행하고 프로세스의 시계를 변경하고 결과를 보십시오.

귀하의 주장이 추측에 근거한 경우 귀하와 대화를 수행하는 방법이 명확하지 않습니다. 그리고 당신은 주제에 대한 토론 과정에 익숙해지는 것이 필요하다고 생각하지 않습니다.

 
니콜라이 셈코 :

이 기능의 범위는 매우 광범위합니다.
나는 이미 멀티 타이머에서 위에서 언급했는데, 이를 통해 동시에 다른 기간으로 여러 타이머를 실행할 수 있습니다.
fxsaber도 이에 대해 이미 썼습니다 .
밀리세컨드 함수에 비해 마이크로세컨드 함수는 실행 속도 테스트는 물론 Expert Advisors 운용 시 다양한 원격 정보 수집에 편리하다.
이러한 원격 측정의 정확도가 16ms(더 정확하게는 1/64s = 15625마이크로초)이면 이는 매우 큰 오류입니다.

나는 Renat이 쓴 것처럼 실행 속도를 지속적으로 측정합니다. 문제를 본 적이 없습니다. 빈 상태에서 정리하는 것처럼 보이거나 이전에 작성된 내용을 변경하고 싶지 않은 경우 다음과 같이 발생합니다. 알몸 ... 그런 다음 모든 것이 헛된 것으로 작성되었다는 것을 알게됩니다. 불쾌감은 없지만 제공 한 동일한 멀티 타이머는 오류없이 조용히 구현되지만 비용을 지불해야합니다. Renat도 답변에서 위의 설명을 제공했습니다. 내 질문

 
콘스탄틴 :
진리의 입술은 초심자에게 벙어리입니다.
 
니콜라이 셈코 :
진리의 입술은 초심자에게 벙어리입니다.

글쎄, 네))

 
알렉세이 나보이코프 :

우선 시스템 시간과 인터넷 시간의 지정된 동기화 기간에 따라 다릅니다. 예를 들어 하루에 한 번 동기화를 설정했는데 이 시간 동안 1초 이상의 불일치가 발생합니다. 누군가는 한 시간에 한 번 또는 더 자주 동기화합니다. 여기 확률이 있습니다.

전체 질문을 읽었습니까?

... GetMicrosecondsCount에 대한 두 호출 사이 ...

사유: