Неожиданная внутренняя ошибка

 

Информация о терминале

2019.01.08 23:27:57.377 Terminal        MetaTrader 5 x64 build 1968 started (MetaQuotes Software Corp.)
2019.01.08 23:27:57.377 Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 10482 / 12255 Mb, Disk: 46 / 238 Gb, GMT+3
2019.01.08 23:27:57.377 Terminal        D:\MetaTrader 5\Hadge MT5

В предыдущих билдах индикатор работал нормально, даже был выложен с открытым кодом на одном из ресурсов. Жалоб от пользователей не было. Но вот мне самому стало надо им воспользоваться и вдруг на билде 1986 получаю такую ошибку

2019.01.09 15:28:39.913 ClosingLots (GBPUSD,H1) indicator is too slow, 103429 ms. rewrite the indicator, please

После удаления индикатора с графика через достаточно длительное время запись из функции OnDeinit

2019.01.09 15:30:23.323 ClosingLots (GBPUSD,H1) 1  OnDeinit
2019.01.09 15:30:23.333 ClosingLots (GBPUSD,H1) 4001

Для проверки я решил опубликовать этот незамысловатый код в CodeBase и проверку прошёл безупречно.

Хотелось-бы услышать о возможных причинах возникновения этой ошибки.

Опубликованный код тут.

 
Alexey Viktorov:

Информация о терминале

В предыдущих билдах индикатор работал нормально, даже был выложен с открытым кодом на одном из ресурсов. Жалоб от пользователей не было. Но вот мне самому стало надо им воспользоваться и вдруг на билде 1986 получаю такую ошибку

После удаления индикатора с графика через достаточно длительное время запись из функции OnSeinit

Для проверки я решил опубликовать этот незамысловатый код в CodeBase и проверку прошёл безупречно.

Хотелось-бы услышать о возможных причинах возникновения этой ошибки.

Опубликованный код тут.

Вот и у меня такая беда с одним аналогичным индикатором, но уже около года в разных билдах. Сначала работает, потом со временем начинает писать "indicator is too slow" и на графике прекращают рисоваться свечи. После удаления индикатора свечи прорисовываются.

Устранить проблему так и не смог, код уже оптимизирован максимально. В мт4 этот-же индикатор просто "летит" без каких-либо проблем. Видимо тормоза из-за доступа к истории

P.S. Кстати, если мой индикатор бросить на новый счёт где мало сделок истории, то тормозов нет и работает отменно
 
Vitaly Muzichenko:

Вот и у меня такая беда с одним аналогичным индикатором, но уже около года в разных билдах. Сначала работает, потом со временем начинает писать "indicator is too slow" и на графике прекращают рисоваться свечи. После удаления индикатора свечи прорисовываются.

Устранить проблему так и не смог, код уже оптимизирован максимально. В мт4 этот-же индикатор просто "летит" без каких-либо проблем. Видимо тормоза из-за доступа к истории

можт утечка памяти в каком-нибудь массиве - раз со временем индикатор отваливается
 
Aleksey Semenov:
можт утечка памяти в каком-нибудь массиве - раз со временем индикатор отваливается

Да это не со временем. Индикатор был написан по просьбе, сам я его только после написания посмотрел как выглядит, сделал скрин и опубликовал на стороннем форуме. Даже не думал публиковать такой примитив в CodeBase и вдруг сегодня решил посмотреть сколько отработано на конкурсном счёте а тута вот такая беда с самого запуска индикатора.

 

Профилировщик жалуется на строку

 long chartID = ChartID();
 if(ObjectFind(chartID, name) < 0)

и на ChartRedraw();

 
Vitaly Muzichenko:

Вот и у меня такая беда с одним аналогичным индикатором, но уже около года в разных билдах. Сначала работает, потом со временем начинает писать "indicator is too slow" и на графике прекращают рисоваться свечи. После удаления индикатора свечи прорисовываются.

Устранить проблему так и не смог, код уже оптимизирован максимально. В мт4 этот-же индикатор просто "летит" без каких-либо проблем. Видимо тормоза из-за доступа к истории

P.S. Кстати, если мой индикатор бросить на новый счёт где мало сделок истории, то тормозов нет и работает отменно

Вот столько истории может быть много??? ))))))))


 
Alexey Viktorov:

Вот столько истории может быть много??? ))))))))

Ну да, в вашем случае этот вариант исключается. 

Попробуйте создавать и проверять объекты (ObjectFind(chartID, name)) по событию, а не по тику, к примеру при движении мыши по графику. 

 
Vitaly Muzichenko:

Ну да, в вашем случае этот вариант исключается. 

Попробуйте создавать и проверять объекты (ObjectFind(chartID, name)) по событию, а не по тику, к примеру при движении мыши по графику. 

Не поможет. На графике застывают котировки. В обзоре рынка по символу котировки "дышат" а на графике мёртво стоят.

Перенёс всё в OnTimer() каждые 5 секунд... не полегчало.

 
Alexey Viktorov:

Не поможет. На графике застывают котировки. В обзоре рынка по символу котировки "дышат" а на графике мёртво стоят.

Перенёс всё в OnTimer() каждые 5 секунд... не полегчало.

Вот так тоже всё умирает?

//+------------------------------------------------------------------+
//| 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[])
  {
//---
   calculate();
 /*  long X, x, Y, y;
//---
   Y = long(fontSize*hs);
   X = corner == CORNER_RIGHT_UPPER || corner == CORNER_RIGHT_LOWER ? fontSize*8 : fontSize*14;
   x = corner == CORNER_RIGHT_UPPER || corner == CORNER_RIGHT_LOWER ? fontSize : X+fontSize*6;
   if(corner == CORNER_LEFT_UPPER || corner == CORNER_RIGHT_UPPER)
    {
     setLable("llltext", "Закрыто за ", color_, X, Y);
     for(int i = 0; i < 8; i++)
      {
       y = ((i+2)*Y);
       setLable("llllots"+(string)i, dts(lots[i]), color_, x, y);
       setLable("llltext"+(string)i, ssString[i], color_, X, y);
      }
    }
  else
   {
    setLable("llltext", "Закрыто за ", color_, X, Y*9);
    for(int i = 0; i < 8; i++)
     {
      y = ((6-i+2)*Y);
      setLable("llllots"+(string)i, dts(lots[i]), color_, x, y);
      setLable("llltext"+(string)i, ssString[i], color_, X, y);
     }
   }*/
//--- return value of prev_calculated for next call
   return(rates_total);
  }
 
Vitaly Muzichenko:

Вот так тоже всё умирает?

Так не проверял, но профилировщик не врёт.

Убрал эти две строки и всё затикало как положено.

Видимо разработчикам надо обратить на это внимание.

 
Alexey Viktorov:

Так не проверял, но профилировщик не врёт.


Убрал эти две строки и всё затикало как положено.

Видимо разработчикам надо обратить на это внимание.

Что именно убрали, ObjectFind и ChartRedraw?

Какая именно тупила, или обе?

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