MT5와 속도 - 페이지 62

 
Rorschach :
실시간 커널이 어떻게든 도움이 될까요?

분명히 더 많은 코어를 설치하고 상황을 단일 코어 다운로드의 100%로 가져오지 마십시오.

동화를 믿지 마세요. 프로세서와 스레드 스케줄러는 상상하는 대로 작동하지 않습니다.

 
Anton :

최근 빌드에서 틱 스트림을 수신하는 것은 이론적으로조차 효과가 없습니다. 실제로 SymbolInfoTick은 이미 캐시와 함께 작동 하지만 개별 시민은 계속해서 검은 고양이를 찾습니다.

그리고 그는 시험에서 80%도 얻지 못했습니다. 4개의 코어에 6개의 에이전트가 있습니다. 100% 보장됩니다.

유일한 질문은 그의 시스템의 작업 스케줄러가 이러한 상황에 대처하는 방법입니다. 동시에 책임은 터미널의 구현이라는 진술이 만들어집니다.

저것들. 컴퓨터가 측정할 수 없을 정도로 로드되고 말 그대로 모든 것이 느려질 때 상황이 인위적으로 만들어지고 "오, 봐요, 터미널이 때때로 거기에 지연이 있는 이유는 무엇입니까?"라는 스타일로 진술됩니다.

그런 조건에서도 "약 0.01%"라는 사실에 눈을 감자. 디테일은 지옥에! "병원의 평균 온도는 아무도 괴롭히지 않는다", "지연은 거래 중에 문제를 일으킨다", "우리는 HFT를 원한다"라고 말하면 충분하다.

게다가 우리는 HFT 가 오래된 사무실 데스크탑이나 죽은 가상 머신에 대한 20명의 전문가가 되기를 원합니다.

PS PositionSelectByTicket() 구현 시 액세스 동기화를 통해 공유 리소스에 무조건 액세스할 수 있습니다. 그리고 각 통화에서 위치를 선택하지 않으면 이전 가격을 읽는 것입니다. SymbolInfoDouble을 통해 "스냅샷"을 만드는 것이 더 쉬웠습니다.

고맙습니다

내 질문이 제기되었습니다. 왜냐하면 반년 전 나는 코드를 최적화하고 시스템 기능의 속도를 테스트했고, 반년 전에는 SymbolInfoDouble이 SymbolInfoTick보다 느렸다.

그러나 일반적으로 당신은 아마도 진실을 말하고 있을 것입니다. 오늘 저는 특히 멀티 코어 프로세서의 캐시에 대한 몇 가지 기사를 검색했습니다(저는 오랫동안 이 정보에 관심이 없었습니다).

여기에 짧은 기사가 있습니다 https://i2hard.ru/publications/25666/

결론은 ALU가 L1 캐시에서 독점적으로 데이터를 수신한다는 것입니다. 이는 매우 작습니다. 프로세서를 최대한 로드하면 실제로 테스트가 운영 체제 테스트 + 속도 테스트로 바뀝니다 . 프로세서 캐시 (로드, 예측 L1 + L3 데이터), 코드(애플리케이션)의 성능 테스트에서는 제외

 

fxsaber , 작업 관리자에서 에이전트에 대해 낮은 우선 순위를 설정하고 MT5에 대해 높은 우선 순위를 설정하면 어떻게 될까요?

모든 OS 프로그램/스레드에 대해 특정 CPU 스레드 형태로 리소스 할당을 차단하는 유틸리티를 찾을 수 없습니다. 그렇지 않으면 MT5에 대한 스레드를 예약하고 다른 프로그램에 대한 작업을 자동으로 차단할 수 있습니다. 이론적으로 지연을 줄일 수 있습니다.

 
Anton :

최근 빌드에서는 틱 스트림을 수신해도 이론적으로 영향을 미치지 않습니다. 실제로 SymbolInfoTick은 이미 캐시와 함께 작동 하지만 개별 시민은 계속해서 검은 고양이를 찾습니다.

개별 시민이 얻은   와이드 팬츠부터   동일한 조건에서 목발이 표준 기능보다 더 빠르게 작동한다는 것을 보여주는 귀중한 화물 MQL 코드의 사본입니다 .

그러나 당신은 당신의 기능이 좋다고 주장합니다. 단지 사용 조건에 제한이 있을 뿐입니다.

그리고 그는 시험에서 80%도 얻지 못했습니다. 4개의 코어에 6개의 에이전트가 있습니다. 100% 보장됩니다.

유일한 질문은 그의 시스템의 작업 스케줄러가 이러한 상황에 대처하는 방법입니다. 동시에 책임은 터미널의 구현이라는 진술이 만들어집니다.

저것들. 컴퓨터가 측정할 수 없을 정도로 로드되고 말 그대로 모든 것이 느려질 때 상황이 인위적으로 만들어지고 "오, 봐요, 터미널이 때때로 거기에 지연이 있는 이유는 무엇입니까?"라는 스타일로 진술됩니다.

6/8 - 속도가 느려지지 않습니다. 브라우저, 컴파일, 디버깅 등 브레이크의 힌트가 없는 평행 쟁기.

하지만 지금은 의도적으로 모든 것을 끄고 에이전트의 4/8만 남겼습니다. 상황은 기능의 브레이크로 변경되지 않았습니다.

게다가 우리는 HFT 가 오래된 사무실 데스크탑이나 죽은 가상 머신에 대한 20명의 전문가가 되기를 원합니다.

빠른 자동차가 사용되었습니다. 그리고 이미 6개의 차트만이 제동을 걸었습니다.

PS PositionSelectByTicket() 구현 시 액세스 동기화를 통해 공유 리소스에 무조건 액세스할 수 있습니다. 그리고 각 통화에서 위치를 선택하지 않으면 이전 가격을 읽는 것입니다. SymbolInfoDouble을 통해 "스냅샷"을 만드는 것이 더 쉬웠습니다.

그리고 나는 이것을 사용합니다.

 // Снепшот SymbolInfoTick для текущего символа.
bool SymbolInfoTick ( MqlTick &Tick )
{
   static MqlTick PrevTick = { 0 };
   static ulong PrevTime = 0 ;
  
   const ulong NewTime = GetMicrosecondCount ();
   const bool Res = (NewTime - PrevTime < 1000 ) || (:: SymbolInfoTick ( _Symbol , PrevTick) && ( bool )(PrevTime = NewTime));
  
  Tick = PrevTick;
  
   return (Res);
}
 

터미널에 문제가 있을 때 전투 성능의 속도에 대해 이야기할 수 있습니다.

Expert Advisor는 모든 금융 상품을 스캔하고 주어진 패턴을 찾습니다.

금융 상품에 부딪혀 단단히 매달립니다!!!

도움말의 코드 , 단계, 문제가 있는 핀 도구 및 타이머만 적었습니다.

 //+------------------------------------------------------------------+ 
//|                                              TestLoadHistory.mq5 | 
//|                        Copyright 2009, MetaQuotes Software Corp. | 
//|                                              https://www.mql5.com | 
//+------------------------------------------------------------------+ 
#property copyright "2009, MetaQuotes Software Corp." 
#property link        "https://www.mql5.com" 
#property version    "1.02" 
#property script_show_inputs 
//--- input parameters 
input string           InpLoadedSymbol= "RTSCHH1" ;   // Symbol to be load 
input ENUM_TIMEFRAMES InpLoadedPeriod= PERIOD_H1 ;   // Period to be load 
input datetime         InpStartDate= D'2006.01.01' ; // Start date 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart () 
  { 
   Print ( "Start load" ,InpLoadedSymbol+ "," +GetPeriodName(InpLoadedPeriod), "from" ,InpStartDate); 
//--- 
   int res=CheckLoadHistory(InpLoadedSymbol,InpLoadedPeriod,InpStartDate); 
   switch (res) 
     { 
       case - 1 : Print ( "Unknown symbol " ,InpLoadedSymbol);             break ; 
       case - 2 : Print ( "Requested bars more than max bars in chart " ); break ; 
       case - 3 : Print ( "Program was stopped " );                         break ; 
       case - 4 : Print ( "Indicator shouldn't load its own data " );       break ; 
       case - 5 : Print ( "Load failed " );                                 break ; 
       case    0 : Print ( "Loaded OK " );                                   break ; 
       case    1 : Print ( "Loaded previously " );                           break ; 
       case    2 : Print ( "Loaded previously and built " );                 break ; 
       default : Print ( "Unknown result " ); 
     } 
//--- 
   datetime first_date; 
   SeriesInfoInteger (InpLoadedSymbol,InpLoadedPeriod, SERIES_FIRSTDATE ,first_date); 
   int bars= Bars (InpLoadedSymbol,InpLoadedPeriod); 
   Print ( "First date " ,first_date, " - " ,bars, " bars" ); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//|                                                                  | 
//+------------------------------------------------------------------+ 
int CheckLoadHistory( string symbol, ENUM_TIMEFRAMES period, datetime start_date) 
  { 
   Print ( " === 1 === " );
   datetime first_date= 0 ; 
   datetime times[ 100 ]; 
//--- check symbol & period 
   if (symbol== NULL || symbol== "" ) symbol= Symbol (); 
   if (period== PERIOD_CURRENT )     period= Period (); 
//--- check if symbol is selected in the MarketWatch 
   if (! SymbolInfoInteger (symbol, SYMBOL_SELECT )) 
     { 
       if ( GetLastError ()== ERR_MARKET_UNKNOWN_SYMBOL ) return (- 1 ); 
       SymbolSelect (symbol, true ); 
     } 
     
     ulong time = GetMicrosecondCount ();
     Print ( " === 2 === " ,first_date);
//--- check if data is present 
   bool date = SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date); 
   
   Print ( " === 2.1 === " ,(time - GetMicrosecondCount ()));
   
   if (first_date> 0 && first_date<=start_date) return ( 1 ); 
//--- don't ask for load of its own data if it is an indicator 

Print ( " === 2.2 === " );
   if ( MQL5InfoInteger ( MQL5_PROGRAM_TYPE )== PROGRAM_INDICATOR && Period ()==period && Symbol ()==symbol) 
       return (- 4 ); 
//--- second attempt 
Print ( " === 2.3 === " );
   if ( SeriesInfoInteger (symbol, PERIOD_M1 , SERIES_TERMINAL_FIRSTDATE ,first_date)) 
     { 
       //--- there is loaded data to build timeseries 
       Print ( " === 2.4 === " );
       if (first_date> 0 ) 
        { 
         //--- force timeseries build 
         CopyTime (symbol,period,first_date+ PeriodSeconds (period), 1 ,times); 
         //--- check date 
         Print ( " === 2.5 === " );
         if ( SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date)) 
             if (first_date> 0 && first_date<=start_date) return ( 2 ); 
        } 
     } 
     
     Print ( " === 3 === " );
     
//--- max bars in chart from terminal options 
   int max_bars= TerminalInfoInteger ( TERMINAL_MAXBARS ); 
//--- load symbol history info 
   datetime first_server_date= 0 ; 
   while (! SeriesInfoInteger (symbol, PERIOD_M1 , SERIES_SERVER_FIRSTDATE ,first_server_date) && ! IsStopped ()) 
       Sleep ( 5 ); 
//--- fix start date for loading 

Print ( " === 4 === " );


   if (first_server_date>start_date) start_date=first_server_date; 
   if (first_date> 0 && first_date<first_server_date) 
       Print ( "Warning: first server date " ,first_server_date, " for " ,symbol, 
             " does not match to first series date " ,first_date); 
//--- load data step by step 

Print ( " === 5 === " );

   int fail_cnt= 0 ; 
   while (! IsStopped ()) 
     { 
       //--- wait for timeseries build 
       while (! SeriesInfoInteger (symbol,period, SERIES_SYNCHRONIZED ) && ! IsStopped ()) 
         Sleep ( 5 ); 
       //--- ask for built bars 
       int bars= Bars (symbol,period); 
       if (bars> 0 ) 
        { 
         if (bars>=max_bars) return (- 2 ); 
         //--- ask for first date 
         if ( SeriesInfoInteger (symbol,period, SERIES_FIRSTDATE ,first_date)) 
             if (first_date> 0 && first_date<=start_date) return ( 0 ); 
        } 
       //--- copying of next part forces data loading 
       int copied= CopyTime (symbol,period,bars, 100 ,times); 
       if (copied> 0 ) 
        { 
         //--- check for data 
         if (times[ 0 ]<=start_date)   return ( 0 ); 
         if (bars+copied>=max_bars) return (- 2 ); 
         fail_cnt= 0 ; 
        } 
       else 
        { 
         //--- no more than 100 failed attempts 
         fail_cnt++; 
         if (fail_cnt>= 100 ) return (- 5 ); 
         Sleep ( 10 ); 
        } 
     } 
     
     Print ( " === 6 === " );
//--- stopped 
   return (- 3 ); 
  } 
//+------------------------------------------------------------------+ 
//| Возвращает строкое значение периода                              | 
//+------------------------------------------------------------------+ 
string GetPeriodName( ENUM_TIMEFRAMES period) 
  { 
   if (period== PERIOD_CURRENT ) period= Period (); 
//--- 
   switch (period) 
     { 
       case PERIOD_M1 :   return ( "M1" ); 
       case PERIOD_M2 :   return ( "M2" ); 
       case PERIOD_M3 :   return ( "M3" ); 
       case PERIOD_M4 :   return ( "M4" ); 
       case PERIOD_M5 :   return ( "M5" ); 
       case PERIOD_M6 :   return ( "M6" ); 
       case PERIOD_M10 : return ( "M10" ); 
       case PERIOD_M12 : return ( "M12" ); 
       case PERIOD_M15 : return ( "M15" ); 
       case PERIOD_M20 : return ( "M20" ); 
       case PERIOD_M30 : return ( "M30" ); 
       case PERIOD_H1 :   return ( "H1" ); 
       case PERIOD_H2 :   return ( "H2" ); 
       case PERIOD_H3 :   return ( "H3" ); 
       case PERIOD_H4 :   return ( "H4" ); 
       case PERIOD_H6 :   return ( "H6" ); 
       case PERIOD_H8 :   return ( "H8" ); 
       case PERIOD_H12 : return ( "H12" ); 
       case PERIOD_D1 :   return ( "Daily" ); 
       case PERIOD_W1 :   return ( "Weekly" ); 
       case PERIOD_MN1 : return ( "Monthly" ); 
     } 
//--- 
   return ( "unknown period" ); 
  }

작업 결과:

 2020.10 . 28 11 : 18 : 08.067 Test (FUTBRNJAN21,M1)   Start loadRTSCHH1,H1from2006. 01.01 00 : 00 : 00
2020.10 . 28 11 : 18 : 08.067 Test (FUTBRNJAN21,M1)    === 1 === 
2020.10 . 28 11 : 18 : 08.067 Test (FUTBRNJAN21,M1)    === 2 === 1970.01 . 01 00 : 00 : 00
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 2.1 === 18446744073475877138    Время выполнения SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date); 
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 2.2 === 
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 2.3 === 
2020.10 . 28 11 : 22 : 01.741 Test (FUTBRNJAN21,M1)    === 3 === 

스크립트 실행이 끝날 때까지 기다리지 않았습니다.

터미널에 이런 버그가 있는 한 전투 성능은 말할 것도 없다!!!

금융 상품이 시장 개요에 들어갈 때 적어도 모든 자산과 역사 시작 날짜가 표시될 것으로 예상되었습니다. 서버에 기록이 없으면

 SeriesInfoInteger(symbol,period,SERIES_FIRSTDATE,first_date)

즉시 NULL을 반환해야 하는데 실행 시간이 18446744073475877138인 이유는 무엇입니까?


어쩌면 내가 무엇을 몰라? CopyXXX 기능도 16-29초 동안 멈춥니다!!!

브로커가 3000-6000 금융 상품을 가지고 있다면 그것은 정상이 아닙니다.

 
Vladimir Pastushak :

어쩌면 내가 무엇을 몰라? CopyXXX 기능도 16-29초 동안 멈춥니다!!!

브로커가 3000-6000 금융 상품을 가지고 있으면 정상이 아닙니다.

바는 악이다. 따라서 다른 스레드에 게시하십시오.

 
fxsaber :

바는 악이다. 따라서 다른 스레드에 게시하십시오.

프로그래밍 방식으로 금융 상품을 선택하고 수세기 동안 고정되지 않는 방법을 알고 있습니까?

 
Vladimir Pastushak :

프로그래밍 방식으로 금융 상품을 선택하고 수세기 동안 고정되지 않는 방법을 알고 있습니까?

이 문제에 직면하지 않았습니다.

 
Aleksey Vyazmikin :

fxsaber , 작업 관리자에서 에이전트에 대해 낮은 우선 순위를 설정하고 MT5에 대해 높은 우선 순위를 설정하면 어떻게 될까요?

특정 CPU 스레드의 형태로 리소스의 모든 OS 프로그램/스레드에 대한 할당을 차단하는 유틸리티를 찾을 수 없습니다. 그렇지 않으면 MT5에 대한 스레드를 예약하고 다른 프로그램에 대한 점유를 자동으로 차단할 수 있습니다. 이론적으로 지연을 줄일 수 있습니다.

모든 에이전트에 대해 가장 낮은 우선 순위를 설정합니다.

도움이 되지 않습니다.


위협 결과는 실행 중인 어드바이저의 수에 영향을 받습니다.

 

개발자 여러분, MQL_MEMORY_USED가 어떻게 계산되는지 알려주실 수 있나요?

모든 EA 변수가 차지하는 메모리를 계산했습니다.

 MQL_MEMORY_USED = 60 MB , Virtual = 3.40 MB ( 5.7 %)

이것은 10% 미만입니다. 내가 올바르게 이해한다면 MQL_MEMORY_USED에는 History 캐시와 CopyTicks 캐시가 포함됩니다. 그러나 여전히 훨씬 덜 걸릴 것입니다.

동시에 병렬 고문은 몇 배 적게 먹습니다. 원리는 동일하지만.

일반적으로 이 값에는 무엇이 포함됩니까?


추신: 어드바이저와 함께 템플릿을 저장하고 동일한 차트에 적용하여 재부팅했습니다. 그렇게 되었다.

 MQL_MEMORY_USED = 7 MB , Virtual = 3.40 MB ( 48.6 %)

메모리 소비가 거의 10배 정도 변경되었습니다. 그것이 무엇을 의미하는지 설명하기가 어렵습니다.