Ошибки 4001 и 4102. Вызовы из OnCalculate.

 

В OnCalculate() (при первом вызове) при попытке получить 

//+------------------------------------------------------------------+ 
//| Функция получает цвет отображения линии Bid.                     | 
//+------------------------------------------------------------------+ 
color ChartBidColorGet(const long chart_ID=0)
  {
//--- подготовим переменную для получения цвета 
   long result=clrNONE;
//--- сбросим значение ошибки 
   ResetLastError();
//--- получим цвет линии цены Bid 
   if(!ChartGetInteger(chart_ID,CHART_COLOR_BID,0,result))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError(),", result=",result);
     }
//--- вернем значение свойства графика 
   return((color)result);
  }

получаю ошибку 4102:

ERR_CHART_NO_REPLY

4102

График не отвечает

 

а при попытке получить

//+------------------------------------------------------------------+ 
//| Функция получает цвет осей, шкалы и строки OHLC графика.         | 
//+------------------------------------------------------------------+ 
color ChartForeColorGet(const long chart_ID=0)
  {
//--- подготовим переменную для получения цвета 
   long result=clrNONE;
//--- сбросим значение ошибки 
   ResetLastError();
//--- получим цвет осей, шкалы и строки OHLC графика 
   if(!ChartGetInteger(chart_ID,CHART_COLOR_FOREGROUND,0,result))
     {
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError(),", result=",result);
     }
//--- вернем значение свойства графика 
   return((color)result);
  }

получаю ошибку:

ERR_INTERNAL_ERROR

4001

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

 

Такое происходит в терминале

MetaTrader 5 x64 build 1210 started (MetaQuotes Software Corp.)
Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 1742 / 3981 Mb, HDD: 58970 / 234136 Mb, GMT+02:00

в котором открыто шесть графиков. На каждом графике в индикаторе в OnCalculate() происходят вызовы ChartBidColorGet и ChartForeColorGet при первом запуске за сутки. При последующих перезапусках такие ошибки не возникают. Странно, что это как-то связанно именно с первым запуском за сутки.

 

Проверил ещё раз. 

  1. Перезагрузил операционную систему.
  2. Подождал 10 минут. 
  3. Включил терминал MetaTrader 5.
  4. Выскочило несколько ошибок 4001 и 4102.
Определённо связанно такое поведение только с перезагрузкой операционной системы.

 

Почему разное поведение при первом запуске терминала после перезагрузки операционной системы и при последующих запусках терминала? Надоело перезагружать компьютер - может есть параметр в реестре или в *.ini файлах терминала, который отвечает за подсчёт запусков терминала после перезагрузки операционной системы?

 
Karputov Vladimir:

Почему разное поведение при первом запуске терминала после перезагрузки операционной системы и при последующих запусках терминала? Надоело перезагружать компьютер - может есть параметр в реестре или в *.ini файлах терминала, который отвечает за подсчёт запусков терминала после перезагрузки операционной системы?

Может, это поможет? http://www.oszone.net/11318/mon_reg
Примеры мониторинга системного реестра
  • www.oszone.net
Примеры мониторинга системного реестра
 

Я вижу, первый раз об этой ошибке писали 13 ноября 2015. Между тем, сегодня - янв 2018. Но ошибка "Error Code = 4102" до сих под не исправлена. Привожу вкладку "Эксперты" терминала MT5:

Ошибка появляется при старте индикатора при попытке определить цвет фона графика функцией:

ChartGetInteger(chart_ID,CHART_COLOR_BACKGROUND,0,result);

Уважаемые разработчики, эта ошибка до сих пор не исправлена!


 
Victor Ziborov:

Я вижу, первый раз об этой ошибке писали 13 ноября 2015. Между тем, сегодня - янв 2018. Но ошибка "Error Code = 4102" до сих под не исправлена. Привожу вкладку "Эксперты" терминала MT5:

Ошибка появляется при старте индикатора при попытке определить цвет фона графика функцией:

Уважаемые разработчики, эта ошибка до сих пор не исправлена!


Вы сами ответили на вопрос -в момент старта индикатора еще нет. 

 
Rashid Umarov:

Вы сами ответили на вопрос -в момент старта индикатора еще нет. 

Я думаю есть какая-то другая причина. Индикатора нет, но действие не с индикатором, а с окном графика. И не назначение свойства, а только чтение.

В этом индикаторе работает пока без проблем.

Параметры индикатора

  • ENUM_DRAW_TYPE - Свечи или бары строить на графике
  • For the price - По какой цене строить свечи или бары
После удаления индикатора вид графика возвращается к предыдущему виду.


В OnInit() читает параметры окна и в OnDeinit() возвращает всё взад...
 
Alexey Viktorov:

Я думаю есть какая-то другая причина. Индикатора нет, но действие не с индикатором, а с окном графика. И не назначение свойства, а только чтение.

В этом индикаторе работает пока без проблем.

В OnInit() читает параметры окна и в OnDeinit() возвращает всё взад...

Да и кода тоже нет

 
Rashid Umarov:

Да и кода тоже нет

Код абсолютно совпадающий с представленным выше.

   long result = clrNONE;
   if(!ChartGetInteger(0, CHART_COLOR_BACKGROUND, 0, result))
    Print(__FUNCTION__, ", Error Code = ", GetLastError(), ", result=", result);
 

Ну хоть бы один привел детали - в каком месте вызывается и при каких условиях. Вижу у Victor Ziborov

В OnInit() читает параметры окна и в OnDeinit() возвращает всё взад...

То есть индикатор висел на графике, потом терминал перезагрузили. Верно?
 

При добавлении индикатора на чарт происходит следующее

  1. Сначала создается индикатор - хэндл.
  2. Затем он отправляется на соответствующий чарт.
Если между первым и вторым пунктом успеет вызваться OnCalculate, то закрепления за индикатором чарта еще не произойдет. И получается облом с чтением его свойств.