MT5와 속도 - 페이지 63

 
fxsaber :

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

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

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

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

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


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

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

메모리 사용의 누적 효과는 많은 프로그램에 있습니다. 브라우저는 이 같은 단어로 죄를 지으며 때로는 그럴 수 있습니다. 터미널도 죄를 지었습니다. 또한 누구나 기본 로그를 작성하고 작업이 많으면 일주일 만에 공연에서 날아가기 쉽습니다. 이것은 통제되어야 하는 악입니다. 진실은 어떻게 명확하지 않습니다.

 
Vladimir Pastushak :

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

지표를 통해

Особенности языка mql5, тонкости и приёмы работы
Особенности языка mql5, тонкости и приёмы работы
  • 2020.10.22
  • www.mql5.com
В данной теме будут обсуждаться недокументированные приёмы работы с языком mql5, примеры решения тех, или иных задач...
 

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

MT5와 속도

레나트 파트훌린 , 2020.10.14 04:15

진드기로 대량 작업하려면 더 많은 메모리를 설정하십시오.

4GB(가격 20유로)는 2020년에 분석 및 연구와 관련하여 좋지 않습니다.

Market 제품의 경우 이 접근 방식은 좋지 않습니다. 이러한 목발을 통해 불필요한 데이터를 메모리에 10초 동안 유지하는 것을 우회해야 합니다.

       while (! IsStopped () && :: TerminalInfoInteger ( TERMINAL_MEMORY_USED ) > inMaxMemory)
      {
         Alert (":: TerminalInfoInteger ( TERMINAL_MEMORY_USED ) = " + ( string ):: TerminalInfoInteger ( TERMINAL_MEMORY_USED ));
        
         Sleep ( 1000 );
      }

Market Screener의 형태로 사소한 Market 제품을 만드는 것은 실제로 과도한 메모리 소비로 인해 MT5에서 실현 가능한 작업이 아닙니다.

 
fxsaber :

Market Screener의 형태로 사소한 Market 제품을 만드는 것은 실제로 과도한 메모리 소비로 인해 MT5에서 실현 가능한 작업이 아닙니다.

터미널은 실행 후 너무 많은 메모리를 소모합니다.

스크리너를 실행한 후 2기가바이트(TERMINAL_MEMORY_USED 및 시간이 지남에 따라 감소하지 않음)를 먹기 시작했습니다. 이것은 5000 M1 막대에 대한 단 하나의 열린 차트입니다.


스크린샷이 저장되지 않았습니다. 그러나 터미널이 어리석은 곳에서 자체적으로 메모리를 소비하고 있음을 보여주는 예제를 던지기로 결정했습니다.

 // Создание копий оригинальных символов из Обзора рынка в виде пользовательских.
#property script_show_inputs

input datetime inStartTime = D'2020.06.01' ; // С какого времени закачивать тики

void OnStart ()
{
   for ( int i = SymbolsTotal ( true ) - 1 ; ! IsStopped () && (i >= 0 ); i--)
  {
     const string Symb = SymbolName (i, true );
    
     if (! SymbolInfoInteger (Symb, SYMBOL_CUSTOM )) // Если символ не кастомный.
    {
       Alert (Symb + " - Start." );
      
       MqlTick Ticks[];
      
       if ( CopyTicksRange (Symb, Ticks, COPY_TICKS_ALL , ( long )inStartTime * 1000 ) > 0 ) // Взяли с него тики.
      {
         const string CustomSymb = "CUSTOM_" + Symb;
      
         if ( SymbolInfoInteger (CustomSymb, SYMBOL_EXIST ) || CustomSymbolCreate (CustomSymb, AccountInfoString ( ACCOUNT_SERVER ), Symb)) // Содали кастомный.
        {
           Alert (( string )i + ": " + Symb + " - " + ( string ) CustomTicksReplace (CustomSymb, 0 , LONG_MAX , Ticks)); // Поместили в него тики.
          
           SymbolSelect (CustomSymb, true );
        }
       }
    }
  }
}


스크립트는 단순히 Market Watch의 원래 기호를 복사합니다. MQ-Demo에 모든 기호를 추가하고 이 스크립트를 처음으로 콜드에서 실행한 다음 핫에서 다시 실행해야 했습니다.

그리고 핫(틱이 이미 tkc 파일의 형태로 SSD에 있는 경우)이 시작된 후 적절한 구현으로 전혀 필요하지 않은 야생 메모리 소비를 관찰할 것입니다.


그런데 스크립트를 실행하다가 MQ-Demo에서 멈추는 현상을 발견했습니다. 비정상 종료를 통해서만 제거되며, 그 이후에는 터미널이 1GB 이상의 메모리를 해제하지 않습니다.


이 화면은 처음의 화면과 비교하기 쉽습니다.

 

죄송합니다. 이것이 버그인지 기능인지 확실하지 않습니다. 나는 스스로 답을 찾지 못했다. 그러나 질문은 성능과 관련이 있으며 여기에서이 질문을하는 것이 더 낫다고 생각합니다.

예를 들어 빈 지표에 DRAW_SECTION 유형의 버퍼 22개를 추가하면 막대가 1,000,000개 이상인 차트 하나에서 이러한 지표가 시작될 때 터미널이 상당히 느려지기 시작합니다. CPU) 표시기가 아무 것도 계산하지 않더라도 눈에 띄는 양의 RAM을 먹습니다.

내 관심은 버퍼를 다른 유형과 함께 사용하면 모든 것이 문제 없이 작동하고 그러한 속도 저하가 없다는 사실이었습니다.

예를 들어, 1,000,000개의 막대가 포함된 단일 차트에서 다음 표시기 코드를 실행했는데 터미널이 약 500MB를 먹고 특히 차트 자체가 눈에 띄게 지연되었습니다.

 #property indicator_chart_window

#property indicator_buffers    22
#property indicator_plots      22

#property indicator_type1      DRAW_SECTION
#property indicator_type2      DRAW_SECTION
#property indicator_type3      DRAW_SECTION
#property indicator_type4      DRAW_SECTION
#property indicator_type5      DRAW_SECTION
#property indicator_type6      DRAW_SECTION
#property indicator_type7      DRAW_SECTION
#property indicator_type8      DRAW_SECTION
#property indicator_type9      DRAW_SECTION
#property indicator_type10      DRAW_SECTION
#property indicator_type11      DRAW_SECTION
#property indicator_type12      DRAW_SECTION
#property indicator_type13      DRAW_SECTION
#property indicator_type14      DRAW_SECTION
#property indicator_type15      DRAW_SECTION
#property indicator_type16      DRAW_SECTION
#property indicator_type17     DRAW_SECTION
#property indicator_type18     DRAW_SECTION
#property indicator_type19     DRAW_SECTION
#property indicator_type20     DRAW_SECTION
#property indicator_type21     DRAW_SECTION
#property indicator_type22     DRAW_SECTION

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
{  
   return INIT_SUCCEEDED ;   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   return rates_total;
}

그러나 버퍼 유형을 DRAW_LINE으로 변경하면 프로세서의 부하가 급격히 떨어지고 지연이 없으며 RAM이 5배 적게 소모됩니다(약 100MB가 소모됨).

 #property indicator_chart_window

#property indicator_buffers    22
#property indicator_plots      22

#property indicator_type1      DRAW_LINE
#property indicator_type2      DRAW_LINE
#property indicator_type3      DRAW_LINE
#property indicator_type4      DRAW_LINE
#property indicator_type5      DRAW_LINE
#property indicator_type6      DRAW_LINE
#property indicator_type7      DRAW_LINE
#property indicator_type8      DRAW_LINE
#property indicator_type9      DRAW_LINE
#property indicator_type10      DRAW_LINE
#property indicator_type11      DRAW_LINE
#property indicator_type12      DRAW_LINE
#property indicator_type13      DRAW_LINE
#property indicator_type14      DRAW_LINE
#property indicator_type15      DRAW_LINE
#property indicator_type16      DRAW_LINE
#property indicator_type17     DRAW_LINE
#property indicator_type18     DRAW_LINE
#property indicator_type19     DRAW_LINE
#property indicator_type20     DRAW_LINE
#property indicator_type21     DRAW_LINE
#property indicator_type22     DRAW_LINE

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit ()
{  
   return INIT_SUCCEEDED ;   
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   return rates_total;
}   

2019년 빌드까지 다른 빌드에 대해 유사한 테스트를 수행했으며 상황은 동일합니다.

이것이 무엇과 관련되어 있으며 원칙적으로 정상입니까?
 
fxsaber :

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

매우 간단한 테스트:

 //+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick ()
  {
   TestSymbolInfoTick();
   TestPositionSelectByTicket();
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestSymbolInfoTick()
  {
   MqlTick Tick;
//---
   ulong start,end,max_time= 0 ,avr_time= 0 ,counter= 0 ;
   int    count= 100000 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
       SymbolInfoTick ( _Symbol , Tick);
      end= GetMicrosecondCount ()-start;
       //---
       if (end>max_time)
         max_time=end;
       if (end> 100 )
        {
         avr_time+=end;
         counter++;
        }
     }
   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);
  }  
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void TestPositionSelectByTicket()
  {
//---
   ulong start,end,max_time= 0 ,avr_time= 0 ,counter= 0 ;
   int    count= 100000 ;
   for ( int i= 0 ; i<count; i++)
     {
      start= GetMicrosecondCount ();
      GetBid();
      end= GetMicrosecondCount ()-start;
       //---
       if (end>max_time)
         max_time=end;
       if (end> 100 )
        {
         avr_time+=end;
         counter++;
        }
     }
   Print ( "GetBid 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);
  }

EURUSD에 대한 20명의 전문가 고문, 즉. 모든 OnTicks는 동시에 처리할 수 있습니다. 터미널 빌드 2664. 최적화, 컴파일 등 없이 테스트를 실행합니다. 100% cpu에서 추가 로딩 - 그런 배경에 대해 실제 "hft" 거래를 실행하지 않을 것입니다. 그렇죠?

일반적인 테스트 로그:

 2020.10 . 29 11 : 10 : 49.133 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 28.004 ms; avr bad time: 0.393 ms; bad iterations: 1569 total iterations: 100000
2020.10 . 29 11 : 10 : 49.136 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 4.795 ms; avr bad time: 0.361 ms; bad iterations: 1783 total iterations: 100000
2020.10 . 29 11 : 10 : 49.137 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 25.367 ms; avr bad time: 0.425 ms; bad iterations: 1496 total iterations: 100000
2020.10 . 29 11 : 10 : 49.138 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.681 ms; avr bad time: 0.352 ms; bad iterations: 1804 total iterations: 100000
2020.10 . 29 11 : 10 : 49.139 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 4.264 ms; avr bad time: 0.370 ms; bad iterations: 1734 total iterations: 100000
2020.10 . 29 11 : 10 : 49.142 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 7.049 ms; avr bad time: 0.362 ms; bad iterations: 1803 total iterations: 100000
2020.10 . 29 11 : 10 : 49.142 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.376 ms; avr bad time: 0.365 ms; bad iterations: 1754 total iterations: 100000
2020.10 . 29 11 : 10 : 49.144 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 18.048 ms; avr bad time: 0.417 ms; bad iterations: 1516 total iterations: 100000
2020.10 . 29 11 : 10 : 49.144 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 21.280 ms; avr bad time: 0.372 ms; bad iterations: 1769 total iterations: 100000
2020.10 . 29 11 : 10 : 53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.631 ms; avr bad time: 0.143 ms; bad iterations: 205 total iterations: 100000
2020.10 . 29 11 : 10 : 53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.517 ms; avr bad time: 0.134 ms; bad iterations: 170 total iterations: 100000
2020.10 . 29 11 : 10 : 53.837 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.483 ms; avr bad time: 0.144 ms; bad iterations: 178 total iterations: 100000
2020.10 . 29 11 : 10 : 53.838 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.517 ms; avr bad time: 0.147 ms; bad iterations: 182 total iterations: 100000
2020.10 . 29 11 : 10 : 53.844 SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 0.582 ms; avr bad time: 0.134 ms; bad iterations: 165 total iterations: 100000
2020.10 . 29 11 : 10 : 53.845 SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 0.518 ms; avr bad time: 0.137 ms; bad iterations: 195 total iterations: 100000
2020.10 . 29 11 : 10 : 53.845 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.530 ms; avr bad time: 0.139 ms; bad iterations: 160 total iterations: 100000
2020.10 . 29 11 : 10 : 53.846 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.575 ms; avr bad time: 0.138 ms; bad iterations: 143 total iterations: 100000
2020.10 . 29 11 : 10 : 53.848 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.593 ms; avr bad time: 0.143 ms; bad iterations: 206 total iterations: 100000
2020.10 . 29 11 : 10 : 53.849 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.446 ms; avr bad time: 0.138 ms; bad iterations: 147 total iterations: 100000
2020.10 . 29 11 : 10 : 53.850 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.661 ms; avr bad time: 0.146 ms; bad iterations: 191 total iterations: 100000
2020.10 . 29 11 : 10 : 53.850 SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 0.471 ms; avr bad time: 0.141 ms; bad iterations: 219 total iterations: 100000
2020.10 . 29 11 : 10 : 53.851 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.442 ms; avr bad time: 0.137 ms; bad iterations: 198 total iterations: 100000
2020.10 . 29 11 : 10 : 53.851 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.574 ms; avr bad time: 0.140 ms; bad iterations: 215 total iterations: 100000
2020.10 . 29 11 : 10 : 53.853 SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 0.507 ms; avr bad time: 0.140 ms; bad iterations: 222 total iterations: 100000
2020.10 . 29 11 : 10 : 53.857 SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 0.776 ms; avr bad time: 0.165 ms; bad iterations: 341 total iterations: 100000
2020.10 . 29 11 : 10 : 53.858 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.568 ms; avr bad time: 0.156 ms; bad iterations: 381 total iterations: 100000
2020.10 . 29 11 : 10 : 53.860 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.896 ms; avr bad time: 0.164 ms; bad iterations: 293 total iterations: 100000
2020.10 . 29 11 : 10 : 53.861 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 6.124 ms; avr bad time: 0.178 ms; bad iterations: 219 total iterations: 100000
2020.10 . 29 11 : 10 : 53.862 SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 0.794 ms; avr bad time: 0.164 ms; bad iterations: 356 total iterations: 100000
2020.10 . 29 11 : 10 : 54.686 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 4.870 ms; avr bad time: 0.339 ms; bad iterations: 1575 total iterations: 100000
2020.10 . 29 11 : 10 : 54.728 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 6.442 ms; avr bad time: 0.343 ms; bad iterations: 1691 total iterations: 100000
2020.10 . 29 11 : 10 : 54.732 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 7.568 ms; avr bad time: 0.349 ms; bad iterations: 1671 total iterations: 100000
2020.10 . 29 11 : 10 : 54.755 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.354 ms; avr bad time: 0.365 ms; bad iterations: 1634 total iterations: 100000
2020.10 . 29 11 : 10 : 54.773 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 9.385 ms; avr bad time: 0.352 ms; bad iterations: 1734 total iterations: 100000
2020.10 . 29 11 : 10 : 54.778 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.526 ms; avr bad time: 0.342 ms; bad iterations: 1748 total iterations: 100000
2020.10 . 29 11 : 10 : 54.785 SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.195 ms; avr bad time: 0.356 ms; bad iterations: 1708 total iterations: 100000
2020.10 . 29 11 : 10 : 54.790 SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 5.180 ms; avr bad time: 0.347 ms; bad iterations: 1796 total iterations: 100000
 
Anton :

매우 간단한 테스트:

EURUSD에 대한 20명의 전문가 고문, 즉. 모든 OnTick은 동시에 처리할 수 있습니다. 터미널 빌드 2664. 최적화, 컴파일 등 없이 테스트를 실행합니다. 100% cpu에서 추가 로딩 - 그런 배경에서 실제 "hft" 거래를 실행하지 않을 것입니다. 그렇죠?

일반적인 테스트 로그:

동일한 틱에서 1.5초 이내에 100K 반복을 수행하여 온실 조건을 생성합니다. 나는 특히 OnTick을 생성하지 않은 틱을 기다렸습니다.

내 거래 로그를 살펴보면 몇 밀리초 내에 SymbolInfoTick이 실행되는 것을 알 수 있습니다. 동시에 나는 그 순간에 완전한 유휴 CPU가 있었다는 것을 100% 압니다.


모든 것이 매우 간단합니다. 조건부로 하루에 백만 틱. 0.01% 틱에서 브레이크도 작동합니다. 지연이 있는 하루 100틱입니다. 당신은 이것이 넌센스라고 말할 것입니다. 나는 나쁘다. 주문해야 할 때 지연이 발생하면 잠재적인 금전적 손실입니다.


이 스레드가 눈에 띄지 않고 진행되는 것에 대해 매우 감사하며, 특히 이 기능에 대해 속도를 높이기 위해 많은 작업을 수행했습니다. 그러나 특정 상황에서 끔찍한 목발이 정상적인 기능을 능가 할 수 있다는 것은 다소 예상치 못한 일이었습니다. 그리고 아마도 이 백로그를 파악하고 제거하면 하루에 100개의 잠재적 지연이 10으로 바뀔 것입니다.


분기 초보다 훨씬 좋아졌다고 합니다. 그러나 사실은 남아 있습니다. 좋지 않은 순간이 있습니다. 그리고 나는 당신이 이것을 이해하고 싶지 않다는 것을 알았습니다. 당신의 선택을 존중합니다.


위에서 현재 가격을 얻기 위한 스냅샷 옵션을 제공했습니다. 유휴 CPU 시스템에서 밀리초 지연을 포착하지 않으면 저에게 완전히 적합할 것입니다.

나는 또한 SymbolInfoTick의 속도뿐만 아니라 그것이 제공하는 가격의 관련성에 대해서도 우려하고 있습니다. 나는 당신이 이 문제를 제기하지 않는 것을 봅니다. 분명히 그들은 나중에 보기로 결정했습니다.

 
fxsaber :

동일한 틱에서 1.5초 이내에 100K 반복을 수행하여 온실 조건을 생성합니다. 나는 특히 OnTick을 생성하지 않은 틱을 기다렸습니다.

내 거래 로그를 살펴보면 몇 밀리초 이내에 SymbolInfoTick이 실행되는 것을 알 수 있습니다. 동시에 나는 그 순간에 완전한 유휴 CPU가 있었다는 것을 100% 압니다.

모든 것이 매우 간단합니다. 조건부로 하루에 백만 틱. 0.01% 틱에서 브레이크도 작동합니다. 지연이 있는 하루 100틱입니다. 당신은 이것이 넌센스라고 말할 것입니다. 나는 나쁘다. 주문해야 할 때 지연이 발생하면 잠재적인 금전적 손실입니다.

이 스레드가 눈에 띄지 않고 진행되는 것에 대해 매우 감사하며, 특히 이 기능에 대해 속도를 높이기 위해 많은 작업을 수행했습니다. 그러나 특정 상황에서 끔찍한 목발이 정상적인 기능을 능가 할 수 있다는 것은 다소 예상치 못한 일이었습니다. 그리고 아마도 이 백로그를 파악하고 제거하면 하루에 100개의 잠재적 지연이 10으로 바뀔 것입니다.

분기 초보다 훨씬 좋아졌다고 합니다. 그러나 사실은 남아 있습니다. 좋지 않은 순간이 있습니다. 그리고 나는 당신이 이것을 이해하고 싶지 않다는 것을 알았습니다. 당신의 선택을 존중합니다.

위에서 현재 가격을 얻기 위한 스냅샷 옵션을 제공했습니다. 유휴 CPU 시스템에서 밀리초 지연을 포착하지 않으면 저에게 완전히 적합할 것입니다.

나는 또한 SymbolInfoTick의 속도뿐만 아니라 그것이 제공하는 가격의 관련성에 대해서도 우려하고 있습니다. 나는 당신이 이 문제를 제기하지 않는 것을 봅니다. 분명히 그들은 나중에 보기로 결정했습니다.

이것은 전혀 따뜻한 조건이 아닙니다. Sleep() 등이 없고 동시에 20개의 스레드에서 100,000개의 가격 요청에 대한 주기는 명백한 스트레스 테스트입니다. 실제 조건에서 이와 같은 것은 닫지 않아야합니다.

다른 틱이 1.5초 안에 오지 않는다고 생각한다면 - 좋아요, 천만 번 요청하세요. 아무 것도 변경되지 않고 "목발"이 더 나빠집니다.
NG       0        10 : 26 : 22.903      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 2.223 ms; avr bad time: 0.146 ms; bad iterations: 22369 total iterations: 10000000
OK       0        10 : 26 : 22.934      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 1.759 ms; avr bad time: 0.144 ms; bad iterations: 22462 total iterations: 10000000
KO       0        10 : 26 : 22.944      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 4.587 ms; avr bad time: 0.145 ms; bad iterations: 22620 total iterations: 10000000
RS       0        10 : 26 : 23.443      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 8.433 ms; avr bad time: 0.162 ms; bad iterations: 36242 total iterations: 10000000
LG       0        10 : 26 : 23.487      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 9.660 ms; avr bad time: 0.163 ms; bad iterations: 36378 total iterations: 10000000
KH       0        10 : 26 : 23.492      SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 8.433 ms; avr bad time: 0.163 ms; bad iterations: 36208 total iterations: 10000000
HK       0        10 : 26 : 23.505      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 14.355 ms; avr bad time: 0.164 ms; bad iterations: 36292 total iterations: 10000000
QN       0        10 : 27 : 26.728      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 18.589 ms; avr bad time: 0.373 ms; bad iterations: 122026 total iterations: 10000000
HQ       0        10 : 27 : 27.042      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 15.544 ms; avr bad time: 0.371 ms; bad iterations: 123026 total iterations: 10000000
RD       0        10 : 27 : 29.190      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 16.207 ms; avr bad time: 0.370 ms; bad iterations: 127228 total iterations: 10000000
QJ       0        10 : 27 : 32.661      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 7.465 ms; avr bad time: 0.495 ms; bad iterations: 994 total iterations: 10000000
CL       0        10 : 27 : 32.799      SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 16.999 ms; avr bad time: 0.585 ms; bad iterations: 1081 total iterations: 10000000
EP       0        10 : 27 : 33.056      SymbolInfoTick (EURUSD,H1)       SymbolInfoTick max bad time: 11.774 ms; avr bad time: 0.515 ms; bad iterations: 1122 total iterations: 10000000
EE       0        10 : 27 : 33.555      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 17.385 ms; avr bad time: 0.368 ms; bad iterations: 134761 total iterations: 10000000
FG       0        10 : 27 : 35.581      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 10.428 ms; avr bad time: 0.502 ms; bad iterations: 373 total iterations: 10000000
CJ       0        10 : 27 : 46.372      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.278 ms; avr bad time: 0.360 ms; bad iterations: 153668 total iterations: 10000000
QO       0        10 : 27 : 46.819      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 12.494 ms; avr bad time: 0.361 ms; bad iterations: 154170 total iterations: 10000000
KP       0        10 : 27 : 46.897      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 17.176 ms; avr bad time: 0.362 ms; bad iterations: 154258 total iterations: 10000000
PE       0        10 : 27 : 47.560      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.090 ms; avr bad time: 0.362 ms; bad iterations: 156325 total iterations: 10000000
LF       0        10 : 27 : 47.946      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 16.794 ms; avr bad time: 0.367 ms; bad iterations: 160557 total iterations: 10000000
IH       0        10 : 27 : 47.970      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 11.241 ms; avr bad time: 0.366 ms; bad iterations: 160307 total iterations: 10000000
KN       0        10 : 27 : 51.026      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 4.961 ms; avr bad time: 0.333 ms; bad iterations: 687 total iterations: 10000000
FP       0        10 : 27 : 51.517      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 19.844 ms; avr bad time: 0.372 ms; bad iterations: 165266 total iterations: 10000000
LE       0        10 : 27 : 51.574      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.435 ms; avr bad time: 0.371 ms; bad iterations: 165785 total iterations: 10000000
QE       0        10 : 27 : 51.686      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 13.601 ms; avr bad time: 0.371 ms; bad iterations: 166278 total iterations: 10000000
CK       0        10 : 27 : 52.204      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.480 ms; avr bad time: 0.374 ms; bad iterations: 161441 total iterations: 10000000
FL       0        10 : 27 : 52.262      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 19.503 ms; avr bad time: 0.374 ms; bad iterations: 161363 total iterations: 10000000
FQ       0        10 : 27 : 52.504      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.440 ms; avr bad time: 0.375 ms; bad iterations: 161927 total iterations: 10000000
KQ       0        10 : 27 : 52.507      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 20.155 ms; avr bad time: 0.375 ms; bad iterations: 161670 total iterations: 10000000
EG       0        10 : 27 : 52.558      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 15.634 ms; avr bad time: 0.371 ms; bad iterations: 167511 total iterations: 10000000
OK       0        10 : 27 : 52.751      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.698 ms; avr bad time: 0.368 ms; bad iterations: 168482 total iterations: 10000000
LL       0        10 : 27 : 53.941      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 16.659 ms; avr bad time: 0.364 ms; bad iterations: 171194 total iterations: 10000000
JP       0        10 : 27 : 58.244      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 12.019 ms; avr bad time: 0.308 ms; bad iterations: 970 total iterations: 10000000
OD       0        10 : 27 : 58.879      SymbolInfoTick (EURUSD,M15)     SymbolInfoTick max bad time: 7.972 ms; avr bad time: 0.299 ms; bad iterations: 1094 total iterations: 10000000
CE       0        10 : 28 : 06.402      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 14.140 ms; avr bad time: 0.342 ms; bad iterations: 56289 total iterations: 10000000
EK       0        10 : 28 : 06.860      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 14.013 ms; avr bad time: 0.344 ms; bad iterations: 56008 total iterations: 10000000
QL       0        10 : 28 : 06.922      SymbolInfoTick (EURUSD,H1)      GetBid max bad time: 11.626 ms; avr bad time: 0.343 ms; bad iterations: 56676 total iterations: 10000000
ER       0        10 : 28 : 07.010      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 13.021 ms; avr bad time: 0.340 ms; bad iterations: 51610 total iterations: 10000000
ER       0        10 : 28 : 08.708      SymbolInfoTick (EURUSD,M15)     GetBid max bad time: 2.970 ms; avr bad time: 0.317 ms; bad iterations: 24083 total iterations: 10000000

당신의 이 진술은 100% 거짓입니다:

Просматривая логи своей торговли, замечаю исполнение SymbolInfoTick в течение нескольких миллисекунд. При этом на 100% знаю, что в этот момент был полный Idle CPU.

귀하의 이전 진술처럼:

Уверен, что могу доказать, что получение текущих цен у Вас реализовано очень медленно. И CPU-нагрузка создает такие тормоза только из-за неправильной реализации Вами самой главной функции в MQL5.

SymbolInfoTick을 통한 가격 액세스는 이제 매우 빠르고 틱 스트림 처리에서 완전히 분리되었습니다. 매우 경제적이고 빠르게 업데이트되는 기성품 가격 캐시로 작업합니다.

모든 "0.01% 틱의 브레이크"는 스트레스 테스트 조건에서만 나타나며 이는 우수한 결과입니다. 정상적인 조건에서 액세스는 매우 빠릅니다.

SymbolInfoTick의 속도를 높이기 위해 많은 작업이 완료되었음을 인정한다면 PositionSelectByTicket을 통해 가격을 얻는 "목발"이 최선의 솔루션이 아닐 수도 있음을 믿어야 합니다.

한 가지 간단한 이유 때문에 PositionSelectByTicket의 구현은 SymbolInfoTick의 원래 "느린" 구현과 완전히 동일합니다.

위에서 썼듯이 이 구현은 진정한 의미에서 느리지 않지만 CPU 부하가 크면 런타임 스파이크의 가능성이 더 높습니다(이는 마지막 테스트에서 분명히 볼 수 있음).

여기서 타이밍은 부하가 걸리는 시스템 작업 스케줄러의 작업에 크게 의존합니다. 다른 OS와 버전에도 차이가 있을 수 있습니다.

그리고 부하가 클수록 터미널이 아닌 작업 스케줄러의 효율성을 더 많이 테스트합니다.

나는 SymbolInfoTick의 성능에 대한 주제로 글을 마칩니다.

전문가가 합성 스트레스 테스트 수준에서 부하를 생성하는 경우 "하드웨어가 작업에 적합해야 합니다."라는 단 하나의 솔루션만 있습니다.

 

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

상황:

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

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

3.수면(1)

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


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

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

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

 
pivomoe :

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

상황:

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

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

3.수면(1)

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


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

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

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

SymbolInfoTick 은 브로커의 서버에서 받은 데이터를 반환합니다. 서버가 보낸 것은 당신이 얻는 것입니다.

중개인이 브로드캐스트하는 틱 스트림에 대해 질문이 있는 경우 중개인에게 문의해야 합니다.