Особенности языка mql5, тонкости и приёмы работы - страница 103

 
Nikolai Semko:

Просто хотел сказать, что, возможно использование user32.dll вместо kernel32.dll может оказаться быстрее в вопросе связывания двух терминалов в помощью WinAPI, т.к. все реализации, которые я встречал именно использовали kernel32.dll. 

Да ну, не вижу причин, почему из одной библиотеки должно импортироваться (или работать) быстрее, чем из другой.

А вот вопрос общего оверхеда при вызове импортированных функций наверное стоило бы исследовать.  Возможно в нынешних версиях MQL это уже неактуально, но вот насколько я помню по старому MQL4 - там эти издержки были ощутимы, порой сравнимы со скоростью выполнения самой функции.

 
fxsaber:

Да.

Ааа..., ну считайте это моим капризом.

Просто люблю скорость, потому что кто быстрее, тот приходит первым, а так же меньше нагрузки на процессор, а значит больше ресурсов и времени для принятия решения.

 
fxsaber:
Быстрая реализация мультисимвольного OnTick

При работе пустого советника, использующего шпиона на 50 инструментах, в лог начинают сыпаться сообщения:

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

Если добавить в индикатор фильтр на частоту отправки кастум-событий в 500 мс, ошибки становятся реже, но не исчезают.

Это только у меня так?


Код советника:

#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;
}


Профилировщик показывает 95% времени iCustom, OnChartEvent почти ничего не занимает. Процессор (i5-3570) грузится на 75%.

 
Andrey Khatimlianskii:

При работе пустого советника, использующего шпиона на 50 инструментах, в лог начинают сыпаться сообщения:

Это только у меня так?

Словил несколько таких ошибок в начале . Далее не сыпались.

Профилировщик показывает 95% времени iCustom, OnChartEvent почти ничего не занимает. Процессор (i5-3570) грузится на 75%.

В Release-варианте CPU ~3%.

 
fxsaber:

Словил несколько таких ошибок в начале . Далее не сыпались.

В Release-варианте CPU ~3%.

Собрал и индикатор и советника с "Optimize=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 < 1e6 ) 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
 
Oleksii Chepurnyi:

Индикатор

Советник


Увеличение паузы не сильно помогает. Начало сыпаться ипри 3 секундах.

По непонятным причинам, в одни прекрасный момент, перестает работать EventChartCustom. Тупит около 3 секунд и выдает ошибку 4001.

Да, похоже проблема в этом.

У кого-то еще воспроизводится?

 
Andrey Khatimlianskii:

У кого-то еще воспроизводится?

Не воспроизводится

#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:

Не воспроизводится


Час работы - полет нормальный.

Сколько инструментов в обзоре рынка?

Причина обращения: