Вопрос к разработчикам: Ошибка #4103 билд 216

 
//+------------------------------------------------------------------+
// int TradeIsBusy( int MaxWaiting_sec = 30 )                        |
// Функция меняет значение глобальной переменной TradeIsBusy с 0     |
// на 1.                                                             |
// Если в момент запуска TradeIsBusy = 1, функция ждёт, пока         |
// TradeIsBusy станет = 0, и только потом меняет.                    |
// Если глобальной переменной TradeIsBusy не существует, функция     |
// создаёт её.                                                       |
// Коды возвратов:                                                   |
//  1 - успешное завершение. Глобальной переменной TradeIsBusy       |
// присвоено значение 1                                              |
// -1 - в момент запуска функции TradeIsBusy = 1, ожидание было      |
// прервано пользователем (эксперт удалён с графика, закрыт          |
// терминал, изменился период и/или символ графика, ... )            |
// -2 - в момент запуска функции TradeIsBusy = 1, истекло            |
// максимальное время ожидания (MaxWaiting_sec)                      |
//+------------------------------------------------------------------+
int TradeIsBusy(int MaxWaiting_sec = 30)
  {
// при тестировании нет смысла в разделении торгового потока - просто
// завершаем работу функции
      if(IsTesting()) 
          return(1);
      int _GetLastError = 0, StartWaitingTime = GetTickCount();
//+------------------------------------------------------------------+
//| Проверяем, существует ли гл. переменная и, если нет, создаём её  |
//+------------------------------------------------------------------+
      while(true)
        {
             // если эксперт был остановлен пользователем, прекращаем работу
             if(IsStopped()) 
               { 
                 Print("Эксперт был остановлен пользователем!"); 
                 return(-1); 
               }
             // если ожидание длится дольше времени, указанного в 
             // переменной MaxWaiting_sec, тоже прекращаем работу
             if(GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000)
               {
                    Print("Превышен лимит ожидания (" + MaxWaiting_sec + " сек.)!");
                    return(-2);
               }
             // проверяем, существует ли гл. переменная
             // если она есть, выходим из этого цикла и переходим к блоку изменения
             // значения TradeIsBusy
             if(GlobalVariableCheck("TradeIsBusy")) 
                 break;
             else
               // если GlobalVariableCheck вернула FALSE, значит либо переменной нет, 
               //либо при проверке возникла ошибка
               {
                    _GetLastError = GetLastError();
                    // если это всё таки ошибка, выводим информацию, ждём 0,1 секунды 
                    // и начинаем проверку сначала
                    if(_GetLastError != 0)
                      {
                           Print("TradeIsBusy() - GlobalVariableCheck( \"TradeIsBusy\" ) - Error #", 
                                 _GetLastError);
                           Sleep(100);
                           continue;
                      }
               }
             // если ошибки нет, значит глобальной переменной просто нет, пытаемся создать её
             // если GlobalVariableSet > 0, значит глобальная переменная успешно создана. 
             // Выходим из ф-ции
             if(GlobalVariableSet("TradeIsBusy", 1.0) > 0) 
                 return(1);
             else
               // если GlobalVariableSet вернула значение <= 0, значит при создании 
               // переменной возникла ошибка
               {
                    _GetLastError = GetLastError();
                    // выводим информацию, ждём 0,1 секунды и начинаем попытку сначала
                    if(_GetLastError != 0)
                      {
                           Print("TradeIsBusy() - GlobalVariableSet( \"TradeIsBusy\", 0.0 ) - Error #", 
                                 _GetLastError);
                           Sleep(100);
                           continue;
                      }
               }
       }
//+------------------------------------------------------------------+
//| Если выполнение функции дошло до этого места, значит глобальная  |
//| переменная существует.                                           |
//| Ждём, пока TradeIsBusy станет = 0 и меняем значение TradeIsBusy  |
//| с 0 на 1                                                         |
//+------------------------------------------------------------------+
      while(true)
        {
             // если эксперт был остановлен пользователем, прекращаем работу
             if(IsStopped()) 
               { 
                 Print("Эксперт был остановлен пользователем!"); 
                 return(-1); 
               }
             // если ожидание длится дольше времени, указанного в переменной 
             // MaxWaiting_sec, тоже прекращаем работу
             if(GetTickCount() - StartWaitingTime > MaxWaiting_sec * 1000)
               {
                    Print("Превышен лимит ожидания (" + MaxWaiting_sec + " сек.)!");
                    return(-2);
               }
             // пытаемся менять значение TradeIsBusy с 0 на 1
             // если нам это удаётся, выходим из ф-ции, возвращая 1 - 
             // "успешное завершение"
             if(GlobalVariableSetOnCondition("TradeIsBusy", 1.0, 0.0)) 
                 return(1);
             else
               // если нет, возможны 2 причины: TradeIsBusy = 1 (тогда надо ждать), 
               // либо возникла ошибка (это мы и проверим)
               {
                    _GetLastError = GetLastError();
                    // если это всё таки ошибка, выводим информацию и пробуем ещё раз
                    if(_GetLastError != 0)
                      {
                           Print("TradeIsBusy() - GlobalVariableSetOnCondition " + 
                                 "( \"TradeIsBusy\", 1.0, 0.0 ) - Error #", _GetLastError );
                           continue;
                      }
               }
             // если ошибки нет, значит TradeIsBusy = 1 (другой эксперт торгует) - 
             // выводим информацию и ждём...
             Comment("Ждём, пока другой эксперт закончит торговать...");
             Sleep(1000);
             Comment("");
        }
  }

Использую данную функцию достаточно давно. С момента обновления до 216 билда советники начали выдавать следующую ошибку:

08:11:01 Советник GBPUSD,H1: TradeIsBusy() - GlobalVariableSetOnCondition ( "TradeIsBusy", 1.0, 0.0 ) - Error #4103

Ошибка появляется только в момент попытки открытия различными советниками первого ордера после перезагрузки теримнала. И в дальнейшем не возникает. Причём ни сама функция, ни советники её использующие, ни к каким файлам не обращаются. Я думаю, что здесь кроется какой-то баг, связанный с созданием глобальной переменной.

 

Аналогичная проблема только номер ошибки другой #4202, как я понял эта ошибка сохраняется из последней функции вернувшей ошибку.

Однако ошибка появляется не только после запуска терминала. а так же и в дальнейшем.

Так же функция GlobalVariableGet выдаёт такую же ошибку



12:39:21 EA-v.0.5_beta5 GBPJPY,M1: _PauseBeforeTrade() - GlobalVariableGet ( "LastTradeTime" ) - Error #4202
12:39:21 EA-v.0.5_beta5 GBPJPY,M1: TradeIsBusy() - GlobalVariableSetOnCondition ( "TradeIsBusy", 1.0, 0.0 ) - Error #4202
12:39:21 EA-v.0.5_beta5 GBPJPY,M1: TradeIsBusy() - GlobalVariableSetOnCondition ( "TradeIsBusy", 1.0, 0.0 ) - Error #4202
12:39:21 EA-v.0.5_beta5 GBPJPY,M1: WriteFileIsBusy() - GlobalVariableSetOnCondition ( "WriteFileIsBusy", 1.0, 0.0 ) - Error #4202
12:39:21 EA-v.0.5_beta5 GBPJPY,M1: TradeIsBusy() - GlobalVariableSetOnCondition ( "TradeIsBusy", 1.0, 0.0 ) - Error #4202
12:39:21 EA-v.0.5_beta5 GBPJPY,M1: WriteFileIsBusy() - GlobalVariableSetOnCondition ( "WriteFileIsBusy", 1.0, 0.0 ) - Error #4202
12:39:21 EA-v.0.5_beta5 GBPJPY,M1: TradeIsBusy() - GlobalVariableSetOnCondition ( "TradeIsBusy", 1.0, 0.0 ) - Error #4202

 

Вы используете библиотеку функций?

 
stringo:

Вы используете библиотеку функций?

Нет.

 
Analitik:
stringo:

Вы используете библиотеку функций?

Нет.

Обращений к графическим объектам тоже нет?

 

Обращений к графическим объектам тоже нет.

Сегодня хотел ещё раз проанализировать, но ошибку воспроизвести не смог. Может быть какой-то сбой в моём терминале.

Если ошибка возобновится - напишу. Спасибо за ответы.

 

Да. Если будут какие-либо детали, пожалуйста, сообщите.

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

 

Ошибка возникает, если до этого появилась ошибка при работе с объектами и не была считана через GetLastErrors()

Очевидно, что это и была последняя ошибка, сохранившаяся в функции GetLastErrors() :

в моём примере ( #4202 - объект не найден)


При обнулении переменной в функции GetLastErrors() ошибка с глобальными переменными пропадает

 
wlad:

Ошибка возникает, если до этого появилась ошибка при работе с объектами и не была считана через GetLastErrors()

Очевидно, что это и была последняя ошибка, сохранившаяся в функции GetLastErrors() :

в моём примере ( #4202 - объект не найден)


При обнулении переменной в функции GetLastErrors() ошибка с глобальными переменными пропадает


один из методов борьбы это найти место где она возникает!

--

если же хотите что бы ЧИСТАЯ ФУНКЦИЯ НАПИСАННАЯ ЯВНО БЕЗ ОШИБОК

не мучалась с ошибкой которая лежит в буфере

делайте так


функция GelLastError() читает ошибку и обнуляет ее во внутренних буферах

прочитайте ошибку перед вызовом модуля в коттором ГАРАНТИРОВАННО не бывает ошибок ПОДОБНЫХ



//+------------------------------------------------------------------+
// int TradeIsBusy( int MaxWaiting_sec = 30 )                        |
// Функция меняет значение глобальной переменной TradeIsBusy с 0     |
// на 1.                                                             |
// Если в момент запуска TradeIsBusy = 1, функция ждёт, пока         |
// TradeIsBusy станет = 0, и только потом меняет.                    |
// Если глобальной переменной TradeIsBusy не существует, функция     |
// создаёт её.                                                       |
// Коды возвратов:                                                   |
//  1 - успешное завершение. Глобальной переменной TradeIsBusy       |
// присвоено значение 1                                              |
// -1 - в момент запуска функции TradeIsBusy = 1, ожидание было      |
// прервано пользователем (эксперт удалён с графика, закрыт          |
// терминал, изменился период и/или символ графика, ... )            |
// -2 - в момент запуска функции TradeIsBusy = 1, истекло            |
// максимальное время ожидания (MaxWaiting_sec)                      |
//+------------------------------------------------------------------+
int TradeIsBusy(int MaxWaiting_sec = 30)
  {
// при тестировании нет смысла в разделении торгового потока - просто
// завершаем работу функции

      int _GetLastError = 0;
             
      _GetLastError = GetLastError();  // прочитать ошибку которая может быть в буфере

      GetLastError  = 0; // обнулим ошибку сделануу в другом БЕЗДАРНОМ модуле

// что бы модули от профи не мучались с чужими ошибками


      if(IsTesting()) 
          return(1);




      int  StartWaitingTime = GetTickCount();
//+------------------------------------------------------------------+
//| Проверяем, существует ли гл. переменная и, если нет, создаём её  |
//+------------------------------------------------------------------+
      while(true)
        {
             // если эксперт был остановлен пользователем, прекращаем работу
             if(IsStopped()) 
               { 
                 Print("Эксперт был остановлен пользователем!"); 
                 return(-1); 
               }