Почему тестер МТ4 страшно тормозит при использовании этого индикатора?

 

Если не сложно, помогите понять что не так при попытке считать данные буфера индикатора.

Вот код из советника:

      if (IsTesting())
         {
         Trend    = GlobalVariableGet(GV_tradesTrend);
         TrendUP  = iCustom(NULL,0,"Used\\# Once Trades Trend",3,0);
         TrendDN  = iCustom(NULL,0,"Used\\# Once Trades Trend",4,0);
         if (TrendUP>0) {Trend=1; GlobalVariableSet(GV_tradesTrend,1);}
         if (TrendDN>0) {Trend=-1;GlobalVariableSet(GV_tradesTrend,-1);}
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
      else
         {
         Trend = GetLastTrendChange();
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}
         }
//+----------------------------------------------------------------------------+
int GetLastTrendChange()
   {
   int   trendType=0;
   int   y=0;
   int   t=500;
   while (y<t)
      {
      if (iOpen(NULL,0,t)==y) {return(0);}
      trendType=FindTrendChange(y);
      if (trendType==1 || trendType==-1) {return(trendType);}
      y++;
      }
   return(0);
   }
//+----------------------------------------------------------------------------+
int FindTrendChange(int index)
   {
   double   trendUP,trendDN;
   int      trendType=0;
   trendUP = iCustom(NULL,0,"Used\\# Once Trades Trend",3,index);
   trendDN = iCustom(NULL,0,"Used\\# Once Trades Trend",4,index);
   if (trendUP>0) {trendType=1;}
   if (trendDN>0) {trendType=-1;}
   return (trendType);
   }
//+----------------------------------------------------------------------------+

В реале и на тестах поиск последнего значения через функцию работает, но тест катастрофически замедляется (тест полугодия растягивается на несколько суток).

Поэтому решил использовать подмену на тестировании и запоминать последнее значение в глобальную переменную - советник перестал видеть данные буфера. При чём, хотя пустые буферы равны 0, почему то переменные советника принимают значения EMPTY_VALUE и не меняются.

comm

А наведение курсора на строку буфера в окне данных в подсказке появляются два значения, причём первое равно 0, например Value 5; 0.0000; 0.8855.

Я с этим никак не разберусь, хоть и ковырялся в коде индикатора. Поиск в интернете и в документации не помог. Может кто-нибудь подскажет, почему так затормаживается тест при обращении к этому индикатору?

Помогите пожалуйста!

 

Файлы:
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Глобальные переменные создаются путем размещения их объявлений вне описания какой-либо функции. Глобальные переменные определяются на том же уровне, что и функции, т. е. не локальны ни в каком блоке. Область видимости глобальных переменных - вся программа, глобальные переменные доступны из всех функций, определенных в программе...
 

Несовершенство алгоритма. В самом индикаторе цикл в цикле, и Вы еще в цикле iCustom вызываете. Храните предыдущие значения индикатора в массиве и вызывайте iCustom один раз на одном баре. Значительно полегчает.

И это странное действие:

   int   y=0;
   int   t=500;
   while (y<t)
      {
      if (iOpen(NULL,0,t)==y) {return(0);}
      //..........
      y++;
      }
с чем Вы сравниваете цену открытия? Но это так, на глаза попало. А основная проблема - iCustom в цикле.
 
Alexey G. Smolyakov:

Если не сложно, помогите понять что не так при попытке считать данные буфера индикатора.

Вот код из советника:

В реале и на тестах поиск последнего значения через функцию работает, но тест катастрофически замедляется (тест полугодия растягивается на несколько суток).

Поэтому решил использовать подмену на тестировании и запоминать последнее значение в глобальную переменную - советник перестал видеть данные буфера. При чём, хотя пустые буферы равны 0, почему то переменные советника принимают значения EMPTY_VALUE и не меняются.

А наведение курсора на строку буфера в окне данных в подсказке появляются два значения, причём первое равно 0, например Value 5; 0.0000; 0.8855.

Я с этим никак не разберусь, хоть и ковырялся в коде индикатора. Поиск в интернете и в документации не помог. Может кто-нибудь подскажет, почему так затормаживается тест при обращении к этому индикатору?

Помогите пожалуйста!

 

Файлы:

а зачем вам глобальные переменные в режиме тестирования ? Они подгружают процессор и если каждый тик их дёргать то вполне могут быть причиной тормозов на слабой машине

подумайте как тестироваться без них

 
Aleksei Stepanenko:

Несовершенство алгоритма. В самом индикаторе цикл в цикле, и Вы еще в цикле iCustom вызываете. Храните предыдущие значения индикатора в массиве и вызывайте iCustom один раз на одном баре. Значительно полегчает.

И это странное действие:

с чем Вы сравниваете цену открытия? Но это так, на глаза попало. А основная проблема - iCustom в цикле.

Спасибо! С массивами я на вы, но Вы подсказали главное - пока попробую вызывать iCustom один раз на баре (кстати, раньше в советнике и был такой подход ко всем индикаторам) и сохранять в глобальную.

Странное действие- попытка проверить наличие котировок - видимо не получилось, но это и не важно.

Может вы сможете подсказать почему в случае

         Trend    = GlobalVariableGet(GV_tradesTrend);
         TrendUP  = iCustom(NULL,0,"Used\\# Once Trades Trend",3,0);
         TrendDN  = iCustom(NULL,0,"Used\\# Once Trades Trend",4,0);
         if (TrendUP>0) {Trend=1; GlobalVariableSet(GV_tradesTrend,1);}
         if (TrendDN>0) {Trend=-1;GlobalVariableSet(GV_tradesTrend,-1);}
         if (Trend==1)  {GlobalVariableSet(GV_Trend,1);}
         if (Trend==-1) {GlobalVariableSet(GV_Trend,-1);}
         if (Trend==0)  {GlobalVariableSet(GV_Trend,0);}

советник не получает данные от индикатора и переменные TrendUP и TrendDN становятся равны 2147483647 и не меняются (соответственно Trend==-1 на всём протяжении теста)? 

Документация по MQL5: Технические индикаторы / iCustom
Документация по MQL5: Технические индикаторы / iCustom
  • www.mql5.com
[in]  Имя пользовательского индикатора. Если перед именем указан обратный слеш '\', то EX5-файл индикатора ищется относительно корневой директории индикаторов MQL5. Таким образом при вызове FirstIndicator"...) индикатор будет загружаться как MQL5\FirstIndicator.ex5. Если по этому пути файла не окажется, то возникнет ошибка 4802...
 

Вероятно, на нулевом баре сигнал не рассчитывается. Поставьте 1.

Индикатор медленный. Внутри он сам себя вызывает на различных таймфреймах. Ещё и куча циклов. Делали не подумав о скорости.

Здесь советник для примера, значения печатает в журнале.

Файлы:
 
Aleksei Stepanenko:

Вероятно, на нулевом баре сигнал не рассчитывается. Поставьте 1.

Индикатор медленный. Внутри он сам себя вызывает на различных таймфреймах. Ещё и куча циклов. Делали не подумав о скорости.

Здесь советник для примера, значения печатает в журнале.

Огромное спасибо за помощь! Буду вникать.

 

Не за что :)