MT5와 속도 - 페이지 64

 

Anton :

Idle-CPU, RannForex-Server, 다른 기호가 있는 6개의 차트에서 Expert Advisor를 실행합니다. 컴퓨터로 돌아와보니 이것저것 많이 나오더라구요.

 2020.10 . 30 13 : 50 : 21.852 Test9 (GBPUSD,H1)       SymbolInfoTick max bad time: 2.008 ms; avr bad time: 2.008 ms; bad iterations: 1 total iterations: 10000000
2020.10 . 30 13 : 50 : 22.142 Test9 (EURUSD,H1)       GetBid max bad time: 1.125 ms; avr bad time: 1.125 ms; bad iterations: 1 total iterations: 10000000
2020.10 . 30 13 : 50 : 23.072 Test9 (USDCHF,H1)       SymbolInfoTick max bad time: 2.245 ms; avr bad time: 2.245 ms; bad iterations: 1 total iterations: 10000000
2020.10 . 30 13 : 50 : 23.288 Test9 (USDCAD,H1)       GetBid max bad time: 1.298 ms; avr bad time: 1.182 ms; bad iterations: 2 total iterations: 10000000
2020.10 . 30 13 : 50 : 23.297 Test9 (AUDCAD,H1)       GetBid max bad time: 0.977 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 10000000
2020.10 . 30 13 : 50 : 24.393 Test9 (EURUSD,H1)       SymbolInfoTick max bad time: 3.400 ms; avr bad time: 2.862 ms; bad iterations: 2 total iterations: 10000000


나는 이런 나쁜 시간 조건을 가지고 있습니다.

       if (end> 1000 )
        {
         avr_time+=end;
         counter++;
        }


위협 포럼 회원의 객관성을 위해 코드를 첨부했습니다.

파일:
Test9.mq5  6 kb
 
fxsaber :

Idle-CPU, RannForex-Server, 다른 기호가 있는 6개의 차트에서 Expert Advisor를 실행합니다. 컴퓨터로 돌아와보니 이것저것 많이 나오더라구요.

내가 올바르게 이해한다면 이 테스트에서는 6개의 루프형 Expert Advisors가 4개의 CPU 코어에서 작동하고 각각은 100%에서 하나의 코어를 로드하려고 합니다. 저것들. 이것은 확실히 정상적인 작업 조건과는 거리가 먼 스트레스 테스트입니다.

이러한 조건에서 1000만 요청당 1-2ms의 1 또는 2 버스트가 우수한 결과입니다.

그리고 다시 한 번 말씀드립니다. 부하가 클수록 터미널이 아닌 OS 작업 스케줄러의 효율성을 더 많이 테스트해야 합니다. 자신을 속이지 마십시오.

 
pivomoe :

SymbolInfoTick에서 제공하는 틱의 관련성에 대해 질문이 있습니다.

상황:

1. TimeCurretn()을 수행합니다. 시간 18:00:00

2. 잘못 정의된 기호에 대해 SymbolInfoTick을 만듭니다. 17:58:00의 시간으로 틱을 얻습니다.

3.수면(1)

4. 잘못 정의된 기호에 SymbolInfoTick 만들기. 우리는 17:59:00 시간에 틱을 얻습니다.


즉, 네 번째 단락에서 TimeCurretn()과 1분 차이가 나는 새로운 틱을 얻었습니다.

이 상황에서 문제가 있다고 보십니까?

그런 상황에 덜 자주 빠지는 방법?

테스트 고문.

 // Проверочный советник на корректность последовательного прихода тиков в MT5.

#include <TypeToBytes.mqh> // https://www.mql5.com/ru/code/16280

string Symbols[];
MqlTick LastTicks[]; // Последние тики из Обзора рынка.

const int Size2 = ArrayResize (Symbols, SymbolsTotal ( true ));

int OnInit ()
{
   for ( int i = 0 ; i < Size2; i++)
    Symbols[i] = SymbolName (i, true );
  
  GetMarketWatch(LastTicks);
    
   return (! EventSetMillisecondTimer ( 1 ));
}

// Получает тики из Обзора рынка.
void GetMarketWatch( MqlTick &Ticks[] )
{
   for ( int i = ArrayResize (Ticks, Size2) - 1 ; i >= 0 ; i--)
     SymbolInfoTick (Symbols[i], Ticks[i]);
}

// Возвращает индекс самого свежего тика.
int GetLastTick( const MqlTick &Ticks[] )
{
   long LastTime = 0 ;
   int Pos = 0 ;
  
   for ( int i = 0 ; i < Size2; i++)
     if (Ticks[i].time_msc > LastTime)
    {
      LastTime = Ticks[i].time_msc;
      
      Pos = i;
    }
  
   return (Pos);
}

// Возвращает индекс измененного тика с наименьшим временем.
int GetFirstFreshTick( const MqlTick &PrevTicks[], const MqlTick &NewTicks[] )
{
   long LastTime = LONG_MAX ;
   int Pos = - 1 ;
  
   for ( int i = 0 ; i < Size2; i++)
     if ((_R(PrevTicks[i]) != NewTicks[i]) && (NewTicks[i].time_msc < LastTime))
    {
      LastTime = NewTicks[i].time_msc;
      
      Pos = i;
    }
  
   return (Pos);
}

// Распечатка тика.
void PrintTick( const string Str, const MqlTick &Ticks[], const int Pos )
{
   Print (Str + " " + Symbols[Pos] + ":" );
   ArrayPrint (Ticks, 5 , NULL , Pos, 1 );
}

void OnTimer ()
{  
   MqlTick NewTicks[];
  
  GetMarketWatch(NewTicks); // Получили все тики из Обзора рынка
  
   const int FirstFreshPos = GetFirstFreshTick(LastTicks, NewTicks); // Взяли самый ранний тик из вновь пришедших.
  
   if (FirstFreshPos != - 1 ) // Если пришедшие тики были.
  {
     const int LastPos = GetLastTick(LastTicks); // Взяли самый свежий тик с предыдущего запроса Обзора рынка.
    
     if (NewTicks[FirstFreshPos].time_msc < LastTicks[LastPos].time_msc) // Если нарушена временная последовательность.
    {
       Alert ( "BUG?" ); // Сообщаем об этом.
      
      PrintTick( "PrevTick" , LastTicks, LastPos);
      PrintTick( "NewTick" , NewTicks, FirstFreshPos);
    }
     
     ArraySwap (LastTicks, NewTicks); // Запоминаем последний опрос Обзора рынка.
  }  
}


경고가 없습니다. 결과(6개 차트에 출시됨).

 2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)       Alert : BUG?
2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)       PrevTick EURAUD:
2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)       [ 0 ] 2020.10 . 30 16 : 08 : 56 1.65631 1.65637 0.0000          0 1604074136 152        6        0.00000
2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)       NewTick EURSGD:
2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 08 : 51.130 Test9 (GBPUSD,H1)       [ 0 ] 2020.10 . 30 16 : 08 : 56 1.59391 1.59404 0.0000          0 1604074136 149        4        0.00000
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)       Alert : BUG?
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)       PrevTick EURGBP:
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)       [ 0 ] 2020.10 . 30 16 : 09 : 19 0.90135 0.90138 0.0000          0 1604074159 733        4        0.00000
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)       NewTick XAUUSD:
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)                        [time]      [bid]      [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 09 : 14.707 Test9 (USDCHF,H1)       [ 0 ] 2020.10 . 30 16 : 09 : 19 1882.94000 1882.97000 0.0000          0 1604074159 728        6        0.00000
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)       Alert : BUG?
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)       PrevTick AUDNZD:
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)       [ 0 ] 2020.10 . 30 16 : 09 : 24 1.06010 1.06012 0.0000          0 1604074164 946        4        0.00000
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)       NewTick USDNOK:
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 09 : 19.935 Test9 (GBPUSD,H1)       [ 0 ] 2020.10 . 30 16 : 09 : 24 9.50256 9.50288 0.0000          0 1604074164 945        2        0.00000
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)       Alert : BUG?
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)       PrevTick USDCAD:
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)       [ 0 ] 2020.10 . 30 16 : 09 : 28 1.33050 1.33052 0.0000          0 1604074168 639        2        0.00000
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)       NewTick XAUUSD:
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)                        [time]      [bid]      [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 09 : 23.612 Test9 (USDJPY,H1)       [ 0 ] 2020.10 . 30 16 : 09 : 28 1883.11000 1883.18000 0.0000          0 1604074168 634        4        0.00000


문제가 있습니다. 얼마나 심각한지 말하기 어렵습니다.

 
Anton :

내가 올바르게 이해한다면 이 테스트에서는 6개의 루프형 Expert Advisors가 4개의 CPU 코어에서 작동하고 각각은 100%에서 하나의 코어를 로드하려고 합니다. 저것들. 이것은 확실히 정상적인 작업 조건과는 거리가 먼 스트레스 테스트입니다.

EA 스트레스 테스트인가요? 꽁꽁 얼었으니까 물어봐

 #include <fxsaber\BenchMark\Benchmark.mqh> // https://www.mql5.com/ru/code/31279

void GetMarketWatch( MqlTick &Ticks[] )
{
   for ( int i = ArrayResize (Ticks, Size2) - 1 ; i >= 0 ; i--)
     _B( SymbolInfoTick (Symbols[i], Ticks[i]) , 100 ) ;
}

경고의 바다를 발행합니다.

 2020.10 . 30 16 : 18 : 53.713 Test9 (USDJPY,H1)       Alert : Bench_Stack = 0 , 100 <= Time[Test9.mq5 107 in GetMarketWatch: SymbolInfoTick (Symbols[i],Ticks[i])] = 166 mcs.
2020.10 . 30 16 : 18 : 53.729 Test9 (USDJPY,H1)       Alert : Bench_Stack = 0 , 100 <= Time[Test9.mq5 107 in GetMarketWatch: SymbolInfoTick (Symbols[i],Ticks[i])] = 120 mcs.
2020.10 . 30 16 : 18 : 53.901 Test9 (EURUSD,H1)       Alert : Bench_Stack = 0 , 100 <= Time[Test9.mq5 107 in GetMarketWatch: SymbolInfoTick (Symbols[i],Ticks[i])] = 127 mcs.
2020.10 . 30 16 : 18 : 53.917 Test9 (EURUSD,H1)       Alert : Bench_Stack = 0 , 100 <= Time[Test9.mq5 107 in GetMarketWatch: SymbolInfoTick (Symbols[i],Ticks[i])] = 131 mcs.
2020.10 . 30 16 : 18 : 55.141 Test9 (USDCHF,H1)       Alert : Bench_Stack = 0 , 100 <= Time[Test9.mq5 107 in GetMarketWatch: SymbolInfoTick (Symbols[i],Ticks[i])] = 104 mcs.
2020.10 . 30 16 : 18 : 55.204 Test9 (EURUSD,H1)       Alert : Bench_Stack = 0 , 100 <= Time[Test9.mq5 107 in GetMarketWatch: SymbolInfoTick (Symbols[i],Ticks[i])] = 107 mcs.
 

그 과정에서 ArrayPrint 로그에 대한 순차 출력 버그가 발견되었습니다.

 2020.10 . 30 16 : 26 : 05.320 Test9 (USDCAD,H1)       PrevTick AUDCAD:
2020.10 . 30 16 : 26 : 05.320 Test9 (GBPUSD,H1)       NewTick XAUEUR:
2020.10 . 30 16 : 26 : 05.320 Test9 (GBPUSD,H1)                        [time]      [bid]      [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 26 : 05.320 Test9 (USDCAD,H1)                        [time]   [bid]   [ask] [last] [volume]    [time_msc] [flags] [volume_real]
2020.10 . 30 16 : 26 : 05.320 Test9 (GBPUSD,H1)       [ 0 ] 2020.10 . 30 16 : 26 : 10 1612.03000 1612.43000 0.0000          0 1604075170357        4        0.00000
2020.10 . 30 16 : 26 : 05.320 Test9 (USDCAD,H1)       [ 0 ] 2020.10 . 30 16 : 26 : 10 0.93785 0.93790 0.0000          0 1604075170359        4        0.00000

이것은 실수임이 분명합니다. 왜냐하면. 그런 소스.

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

MT5와 속도

fxsaber , 2020.10.30 15:04

 // Распечатка тика.
void PrintTick( const string Str, const MqlTick &Ticks[], const int Pos )
{
   Print (Str + " " + Symbols[Pos] + ":" );
   ArrayPrint (Ticks, 5 , NULL , Pos, 1 );
}

      PrintTick( "PrevTick" , LastTicks, LastPos);
      PrintTick( "NewTick" , NewTicks, FirstFreshPos);
이것은 꽤 흔한 실수입니다. ArrayPrint의 현재 구현에서 문자열은 여러 Print를 차례로 호출하여 인쇄됩니다. 그리고 먼저 모든 데이터로 하나의 큰 문자열을 만든 다음 하나의 Print를 통해 표시해야 합니다.
 

매초마다 경고가 여러 번 트리거되었습니다.

 17 : 59 : 50.126     Temp (SILV- 9.21 ,H1)                      [time]     [bid]     [ask]    [last] [volume]    [time_msc] [flags] [volume_real]
KD       0        17 : 59 : 50.126     Temp (SILV- 9.21 ,H1)     [ 0 ] 2020.10 . 30 17 : 59 : 49 155.38000 155.39000 155.38000          3 1604080789146        0        3.00000
CH       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)     Alert : BUG?
JO       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)     PrevTick Si- 12.20 :
LE       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)                      [time]       [bid]       [ask]      [last] [volume]    [time_msc] [flags] [volume_real]
OK       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)     [ 0 ] 2020.10 . 30 17 : 59 : 49 79741.00000 79742.00000 79743.00000          1 1604080789200        0        1.00000
QF       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)     NewTick ROSN:
FS       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)                      [time]     [bid]     [ask]    [last] [volume]    [time_msc] [flags] [volume_real]
HR       0        17 : 59 : 50.141     Temp (SILV- 9.21 ,H1)     [ 0 ] 2020.10 . 30 17 : 59 : 49 349.80000 349.95000 349.85000        57 1604080789179        0        57.00000
 
컴퓨터에 있었다, 어떤 계산도 하지 않았다. CPU를 로드한 것이 없습니다.
 2020.11 . 03 16 : 04 : 01.137          Alert : Bench_Stack = 3 , 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 48764 mcs.
2020.11 . 03 18 : 31 : 04.622          Alert : Bench_Stack = 3 , 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 4143 mcs.
2020.11 . 03 19 : 00 : 34.117          Bench_Stack = 2 , 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 1069 mcs.
2020.11 . 03 19 : 00 : 34.117          Bench_Stack = 2 , 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 1100 mcs.
2020.11 . 03 19 : 01 : 49.199          Alert : Bench_Stack = 3 , 100 <= Time[NewTicks.mqh 33 in NEWTICKS::GetMarketWatchTick: :: SymbolInfoTick ( _Symbol ,Tick)] = 19301 mcs.

SymbolInfoTick은 실행하는 데 19ms와 48ms가 걸렸습니다 . 지속 시간이 수백 마이크로초인 수십 가지 경우. 그러나 그는 그것들을 가져오지 않았습니다.


분명히 재생하려면 하루 동안 전투 고문을 실행 한 다음 시청해야합니다. 제 생각에는 그러한 지연의 개시자가 무엇인지 파악하는 것은 비현실적입니다.

 

페이지 상단의 Test9 코드를 살펴보았습니다. 왜 한 캐릭터에게 틱을 요청하기 위해 Sleep 없이 천만 번을 반복합니까? 그러한 테스트가 실제 거래와 어떤 관련이 있습니까?

내 생각에 테스트는 다음과 같아야 합니다. 시장 검토에서 각 기호의 틱을 요청합니다. Sleep(1) 등을 원으로 일시 중지합니다. 코드를 약간 변경하십시오.

 int OnInit ()
{
   string Symbols[];
   int     TotalSymbol= SymbolsTotal ( true );
   
   ArrayResize (Symbols,TotalSymbol);
   for ( int i= 0 ;i<TotalSymbol;i++)
   Symbols[i]= SymbolName (i, true );
   
   
   MqlTick Tick;
//---
   double temp= 0 ;
   ulong start,end,max_time= 0 ,avr_time= 0 ,counter= 0 ;
   int    count= 1 e4;
   
   for ( int i= 0 ; ! IsStopped () && (i<count); i++)
     {
       Sleep ( 1 );   
       for ( int j= 0 ;j<TotalSymbol;j++)
        {
         start= GetMicrosecondCount ();   
         SymbolInfoTick (Symbols[j], Tick);
         // temp++;
         
         end= GetMicrosecondCount ()-start;
       //---
         if (end>max_time)
         max_time=end;
         if (end> 1000 )
        {
         avr_time+=end;
         counter++;
        }
       } 
     }
   Comment ( "SymbolInfoTick max bad time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr bad time: " ,counter ? DoubleToString (avr_time/ 1000.0 /counter, 3 ): "0" , " ms; bad iterations: " ,counter, " total iterations: " ,count);
   Print ( "SymbolInfoTick max bad time: " , DoubleToString (max_time/ 1000.0 , 3 ), " ms; avr bad time: " ,counter ? DoubleToString (avr_time/ 1000.0 /counter, 3 ): "0" , " ms; bad iterations: " ,counter, " total iterations: " ,count);
   return INIT_FAILED ;
  }  

리뷰에서 55자를 테스트하십시오.

 SymbolInfoTick max bad time: 0.212 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 10000

이제 SymbolInfoTick temp++ 대신 테스트해 보겠습니다.

 SymbolInfoTick max bad time: 0.102 ms; avr bad time: 0 ms; bad iterations: 0 total iterations: 10000
 
pivomoe :

페이지 상단의 Test9 코드를 살펴보았습니다. 왜 한 캐릭터에게 틱을 요청하기 위해 Sleep 없이 천만 번을 반복합니까?

평지에는 없습니다. 세부 정보 - 스레드를 읽습니다.

 
fxsaber :

평지에는 없습니다. 세부 정보 - 스레드를 읽습니다.

이런 측정기법으로 temp++의 경우에도 최대 실행시간이 수십 마이크로초라는 게 귀찮지 않나요?