#property strict ошибок не выдает, но пропадают линии индикатора - страница 2

 

Народ, спасибо огромное за помощь!
Отдельное - Дмитрию Федосееву (чем могу отблагодарить?) .

Ошибка была в следующем:
При прогоне пользовательской ф-ии SMA происходил выход за пределы массива, так как функция прогоняла на  SMAperiod больше элементов чем изначально заложено в i.
То есть при старте индюка на самых старых барах эта функция залезала на не существующие индексы массива.
В общем все заработало!

Борис, в for там все ровно. Если у нас будет например из истории i=356, а период сглаживания sma_period=6, то перебора не будет происходить вообще, так как 356>6.
Но тем не менее спасибо за отклик. 

 
Dmitry Fedoseev:
Борис, а вы случайно не хирург по профессии?
Утончённо)))))))))))))))))))
 
Тогда при наличии стрикт вы должны были получить сообщение об ошибке, но вы заявили что ошибок нет.
 
Dmitry Fedoseev:
Борис, а вы случайно не хирург по профессии?
Нет, но хотел чем-то помочь, хотя бы этой "ампутацией"! Очень уж показалась лишней! Иногда метод тыка помогает. Потому заранее извинился. Так что извините, если ещё интуиция не созрела! Но стараюсь её развивать. :)
 
Alexander Bereznyak:
Тогда при наличии стрикт вы должны были получить сообщение об ошибке, но вы заявили что ошибок нет.
Но ошибок в самом деле нет. Тот код что я скидывал можно в том виде как есть компилировать и ошибок/предупреждений компилятор у меня не выдает. Билд МТ4 новый вроде, на этой неделе обновлял с MetaQuote. Ошибки только в журнале терминала увидел (когда носом ткнули).
 
Pavel Veselov:

Народ, спасибо огромное за помощь!
Отдельное - Дмитрию Федосееву (чем могу отблагодарить?) .

Ошибка была в следующем:
При прогоне пользовательской ф-ии SMA происходил выход за пределы массива, так как функция прогоняла на  SMAperiod больше элементов чем изначально заложено в i.
То есть при старте индюка на самых старых барах эта функция залезала на не существующие индексы массива.
В общем все заработало!

Борис, в for там все ровно. Если у нас будет например из истории i=356, а период сглаживания sma_period=6, то перебора не будет происходить вообще, так как 356>6.
Но тем не менее спасибо за отклик. 

Не за что! Так показалось, но теперь Вы объяснили, и стало понятно, что это так задумано и верно.
 
Понятно, при компиляции нет, а о журнале забыли. По сути, эту ветку могли и не заводить.
 
Alexander Bereznyak:
Понятно, при компиляции нет, а о журнале забыли. По сути, эту ветку могли и не заводить.

Забыл, каюсь((( Я новичок в MQL4, всего то пару месяцев тыкаюсь. Без отладчика - как без рук, по привычке лезу искать проблему в коде, а про логи терминала забываю.
Но думаю ветку все равно стоило завести, поиск когда нибудь ее проиндексирует и кто нибудь найдет ответ на аналогичную проблему. Не я первый - не я последний)

А вообще, печально, что до сих пор нет отладчика. 

 

В продолжение темы.

Простейший код ниже не рисует линию индикатора, из-за превышения индекса элементов массива. (часть с глобальными объявлениями и свойствами не публикую, она стандартная)
Не выдает ошибок и предупреждений в компиляторе.
Не выдает ошибок в журнале терминала (как было в случае с предыдущим кодом).
#property strict используется.
Короче - никаких следов для поиска и устранения ошибки.

int start(){                                // старт
   Counted_bars=IndicatorCounted();         // количество просчитанных баров 
   i=Bars-Counted_bars-1;                   // индекс первого непросчитанного    
   while(i>=0){                             // цикл по непосчитанным барам
      int m=iHighest(NULL,0,MODE_HIGH,5,i); // индекс наивысшего значения цены из 5 баров начиная с индекса i до i+5
      Buf_0[i]=High[m];                     // заносим значение High с полученным индексом m в буфер индикатора
      Buf_0[i]=sma(Buf_0,5,i);              // пересчитываем текущее значение в буфере при помощи функции сглаживания с периодом 5 начиная с текущего индекса
   i--;}                                    // расчёт индекса следующего бара
return(0);}                                 // завершение старт
//===========================================================================================================================================================
//                   Функция сглаживания SMA                      //
//               -------------------------------                  //
double sma(double &sma_array[], int sma_period, int sma_start){   // объявляем функцию сглаживания (сглаживаемый массив, период, индекс рассчитываемого элемента)
   ts=0;                                                          // обнуляем вспомогательную переменную
   for(int j=sma_start;j<sma_start+sma_period;j++){               // перебор J от значения индекса рассчитываемого эл-та, до индекса увеличенного на период
      //if (Bars<=sma_start+sma_period)break;// (раскомментировав эту строку - исключим выход за пределы массива, график рисуется)
      ts+=sma_array[j];}                                          // суммируем значения массива во вспомогательную переменную
      ts/=sma_period;                                             // получаем среднее арифметическое значение элементов
   return(ts);}                                                   //возвращаем полученное значение

Вопрос:
Почему критическая ошибка не оставляет никаких следов своего существования (кроме пустоты в индикаторе)?
Есть какие либо способы поиска/выявления подобных невидимых ошибок?

 
Pavel Veselov:

В продолжение темы.

Простейший код ниже не рисует линию индикатора, из-за превышения индекса элементов массива. (часть с глобальными объявлениями и свойствами не публикую, она стандартная)
Не выдает ошибок и предупреждений в компиляторе.
Не выдает ошибок в журнале терминала (как было в случае с предыдущим кодом).
#property strict используется.
Короче - никаких следов для поиска и устранения ошибки.

Вопрос:
Почему критическая ошибка не оставляет никаких следов своего существования (кроме пустоты в индикаторе)?
Есть какие либо способы поиска/выявления подобных невидимых ошибок?

Есть в журнале сообщение. Строка 78.
Причина обращения: