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

 
니콜라이 셈코 :

WinAPI를 사용하여 두 터미널을 연결할 때 kernel32.dll 대신 user32.dll을 사용하는 것이 더 빠를 수 있다고 말하고 싶었습니다. 내가 만난 모든 구현은 kernel32.dll을 사용했습니다.

글쎄요, 한 라이브러리가 다른 라이브러리보다 더 빨리 임포트(또는 작동)해야 할 이유가 없습니다.

그러나 가져온 함수 를 호출할 때 일반적인 오버헤드에 대한 질문은 조사해야 합니다. 아마도 이것은 현재 버전의 MQL에서는 더 이상 관련이 없지만, 이전 MQL4에서 기억하는 한 이러한 비용은 기능 자체의 속도와 비교할 때 눈에 띄게 나타났습니다.

 
fxsaber :

네.

아 ... 글쎄, 내 변덕이라고 생각하십시오.

나는 속도를 좋아합니다. 빠른 사람이 먼저이고 CPU 부하가 적기 때문에 결정을 내리는 데 더 많은 리소스와 시간이 필요하기 때문입니다.

 
fxsaber :
다중 문자 OnTick의 빠른 구현

50개 기기에서 스파이를 사용하는 빈 Expert Advisor를 실행하면 메시지가 로그에 쏟아지기 시작합니다.

 2018.10 . 09 22 : 49 : 24.730 Spy (AUDNZD,W1) indicator is too slow, 4281 ms. rewrite the indicator, please

500ms의 사용자 지정 이벤트 전송 빈도에 대한 표시기에 필터를 추가하면 오류가 덜 자주 발생하지만 사라지지는 않습니다.

나 뿐인가요?


어드바이저 코드:

 #define ForEach(index,array)   for ( int index= 0 , max_ ##index=ArraySize(array); index<max_ ##index; index++)

string Symbols[];

int OnInit ()
{
   ArrayResize ( Symbols, SymbolsTotal ( true ) );

   ForEach( i, Symbols )
   {
      Symbols[i] = SymbolName (i, true );

       if ( Symbols[i] != _Symbol )
         iCustom ( Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i );
   }
   return ( INIT_SUCCEEDED );
}

void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam)
{
   if ( id == CHARTEVENT_CUSTOM )
      OnTickMS( Symbols[ ( int )lparam ] );
}

void OnTick ()
{
   CheckSignal( _Symbol );
}

void OnTickMS( const string &Symb)
{
   CheckSignal( Symb );
}

void CheckSignal( const string symbol)
{
   //Comment( symbol, ": ",
   //                   DoubleToString( SymbolInfoDouble( symbol, SYMBOL_BID ), 5 ), " / ",
   //                   DoubleToString( SymbolInfoDouble( symbol, SYMBOL_ASK ), 5 ) );
   return ;
}


프로파일러 는 iCustom의 95% 시간을 보여주고 OnChartEvent는 거의 아무것도 걸리지 않습니다. 프로세서(i5-3570)는 75%로 로드됩니다.

 
안드레이 카팀리안스키 :

50개 기기에서 스파이를 사용하는 빈 Expert Advisor를 실행하면 메시지가 로그에 쏟아지기 시작합니다.

나 뿐인가요?

처음에 이러한 오류 중 몇 가지를 잡았습니다. 그들은 더 떨어지지 않았다.

프로파일러 는 iCustom의 95% 시간을 보여주고 OnChartEvent는 거의 아무것도 걸리지 않습니다. 프로세서(i5-3570)는 75%로 로드됩니다.

릴리스 버전에서 CPU는 ~3%입니다.

 
fxsaber :

처음에 이러한 오류 중 몇 가지를 잡았습니다. 그들은 더 떨어지지 않았다.

릴리스 버전에서 CPU는 ~3%입니다.

"최적화 = 1"로 지표와 어드바이저를 모두 수집했는데 오류가 쏟아져 나옵니다.

 

표시기에 두 번째 일시 중지를 추가했습니다.

 int OnCalculate ( const int rates_total, const int prev_calculated, const int , const double &[] )
{
   static datetime prev = 0 ;
   if ( TimeCurrent () <= prev ) return (rates_total);
   prev = TimeCurrent ();

오류가 남아 있습니다.

 

지시자

 #property indicator_chart_window
#property indicator_plots 0

input long Chart = 0 ; // идентификатор графика-получателя события
input int   Index = 0 ;

ulong timer = GetMicrosecondCount ();
//===================================================================
//| 
//+------------------------------------------------------------------
int OnCalculate ( const int rates_total, const int prev_calculated, const int , const double &[] )
{
   if ( GetMicrosecondCount () - timer < 1 e6 ) return ( rates_total );
   
   timer = GetMicrosecondCount ();
   
   if ( prev_calculated )
   {
       ResetLastError ();
      
       if ( EventChartCustom ( Chart, 0 , Index, 0 , NULL ))
         Print ( GetMicrosecondCount () - timer );
       else
         Print ( ( string ) _LastError + " " + ( string )( GetMicrosecondCount () - timer) );
   }
   
   return ( rates_total );
}
//+------------------------------------------------------------------

조언자

 #property strict
//+------------------------------------------------------------------
#define ForEach(index,array)               for ( int index= 0 , max_ ##index=ArraySize(array); index<max_ ##index; index++)
//+------------------------------------------------------------------
string Symbols[];

//===================================================================
//| Expert initialization function
//+------------------------------------------------------------------
int OnInit ()
{
   ArrayResize ( Symbols, SymbolsTotal ( true ) );
   
   ForEach( i, Symbols )
   {
      Symbols[i] = SymbolName (i, true );
      
       if ( Symbols[i] != _Symbol )
         iCustom ( Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i ); // MQL5\Indicators\Spy.ex5
   }
   
   return ( INIT_SUCCEEDED );
}
//===================================================================
//| Expert deinitialization function
//+------------------------------------------------------------------
void OnDeinit ( const int reason)
{
   ArrayFree ( Symbols );
}
//===================================================================
//| ChartEvent function
//+------------------------------------------------------------------
void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam)
{
}
//===================================================================
//| Expert tick function
//+------------------------------------------------------------------
void OnTick ()
{
}
//+------------------------------------------------------------------


일시 중지를 늘리는 것은 별로 도움이 되지 않습니다. 3초에 무너지기 시작했습니다.

알 수 없는 이유로 어느 시점에서 EventChartCustom 이 작동을 멈춥니다. 약 3초 동안 죽고 오류 4001이 발생합니다.

파일:
20181010.log  276 kb
 
올렉시 체푸르니 :

지시자

조언자


일시 중지를 늘리는 것은 별로 도움이 되지 않습니다. 3초에 무너지기 시작했습니다.

알 수 없는 이유로 어느 시점에서 EventChartCustom이 작동을 멈춥니다. 약 3초 동안 죽고 오류 4001이 발생합니다.

네, 그게 문제인 것 같습니다.

다른 사람이 그것을 재현 했습니까?

 
안드레이 카팀리안스키 :

다른 사람이 그것을 재현 했습니까?

재생할 수 없음

 #define ForEach(index,array)   for ( int index= 0 , max_ ##index=ArraySize(array); index<max_ ##index; index++)

string Symbols[];
int Counter[];

int OnInit ()
{
   ArrayResize (Counter, ArrayResize ( Symbols, SymbolsTotal ( true ) ));   
   ArrayInitialize (Counter, 0 );

   ForEach( i, Symbols )
   {
      Symbols[i] = SymbolName (i, true );

       if ( Symbols[i] != _Symbol )
         if ( iCustom ( Symbols[i], PERIOD_W1 , "Spy.ex5" , ChartID (), i ) == INVALID_HANDLE )
           Alert (Symbols[i]);
   }
   return ( INIT_SUCCEEDED );
}

void OnChartEvent ( const int id, const long &lparam, const double &dparam, const string &sparam)
{
   static int Count = 0 ;
   
   if ( id == CHARTEVENT_CUSTOM )
   {
     Counter[( int )lparam]++;
     
     string Str = ( string )Count++ + "\nMarketWatch:" ;
     
     for ( int i = 0 ; i < ArraySize (Counter); i++)
      Str += "\n" + ( string )i + ": " + Symbols[i] + " " + ( string )Counter[i];
      
     Comment (Str);
   }
}


작업 시간 - 정상 비행.

 
fxsaber :

재생할 수 없음


작업 시간 - 정상 비행.

Market Watch에는 몇 개의 상품이 있습니까?

사유: