Почему тестер МТ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.

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

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

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

[Удален]  

Не за что :)