MT4 зависает, не вызывает start() снова

 

Здравствуйте,

Я столкнулся с неприятной проблемой:

после нескольких итераций функция start() моего индикатора не возвращается после вызова return(), т.е. MT4 зависает в цикле, пожирая процессор, не вызывая start() снова.

Интересно, не разрушил ли я каким-то образом стек вызовов функции?

Что, по вашему мнению, мне следует искать, чтобы найти причину?

Я отлаживаю уже целую неделю. Это 72 страницы кода.

Я не использую никаких вызовов DLL, только плоский MQL.

Спасибо.

 
Вы не возвращаетесь с самого начала. Вам нужно исправить свой код. Возьмите dbgView и добавьте вызовы Log в начале и возврате каждой функции и отследите бесконечный цикл.
 

Я уже регистрирую отладочную информацию.

Я не вижу бесконечного цикла.

Последнее, что я вижу в журнале, это когда я вызываю return() в последней строке start().

После этого start() больше никогда не вызывается.

Это должно быть что-то другое.

 
Вести журнал где/как? Вы НЕ можете использовать Print/Alert, потому что вы вешаете поток GUI, вывод не будет записан.
 

Я знаю, я использую свою собственную функцию PrintDebug() с FileWrite(), FileFlush.

 

Как вы думаете, достаточно ли моего способа печати отладочной информации?

 
mt4forum:

Я уже регистрирую отладочную информацию.

Я не вижу бесконечного цикла.

Последнее, что я вижу в журнале, это когда я вызываю return() в последней строке start().

После этого start() больше никогда не вызывается.

Это должно быть что-то другое.


Вы выводите что-то в журнал в качестве первой строки start()?
 

Да, я записываю в журнал первую и последнюю строки.

Могу ли я быть уверен, что мой способ ведения журнала не пропускает никакой информации о журнале?

 
mt4forum:

Да, я записываю в журнал первую и последнюю строки.

Могу ли я быть уверен, что мой способ ведения журнала не пропускает никакой информации о журнале?

Если вы не уверены, просто используйте стандартную функцию Print() и проверьте файл журнала, а не только вкладку эксперта. Мы не видели ваш способ ведения журнала.

Используете ли вы какие-либо индикаторы через вызовы iCustom()? Если да, то, возможно, они забирают циклы процессора. . .
 

Вот моя функция log:

void PrintDebug(int F, string DebugStr1, string DS2 = "", string DS3 = "", string DS4 = "", string DS5 = "", string DS6 = "", string DS7 = "", 
   string DS8 = "", string DS9 = "", string DS10 = "", string DS11 = "", string DS12 = "", string DS13 = "", string DS14 = "", string DS15 = "", 
   string DS16 = "", string DS17 = "", string DS18 = "", string DS19 = "", string DS20 = "")
{
   FileWrite(F, CommonIdentStr() + Blank + DebugStr1 + DS2 + DS3 + DS4 + DS5 + DS6 + DS7 + DS8 + DS9 + DS10 
               + DS11 + DS12 +DS13 + DS14 + DS15 + DS16 + DS17 + DS18 + DS19 + DS20);
   FileFlush(F);
}

А вот моя функция start:

int start()
  {     
   int TFInd;
   int k;  
   
   if (CheckDebug(DebugStart, 2))
      {
         DebugStr = "DebugStart: " + "begin: " + " InitialGapFound: " + BoolToString(InitialGapFound);
         PrintDebug(DebugFile, DebugStr);
      }
   
   if (InitialGapFound)        
      {                                             
         if (TimeLocal() >= LastInitialGapCloseCheck + HistoryDownloadCheckInterval)                                  // zzz
            {
               LastInitialGapCloseCheck = TimeLocal();
               
               if (InitialHistoryGapClosed())
                  {
                     if (CheckDebug(DebugStart, 2))
                        {
                           DebugStr =  "DebugStart: " + " InitialHistoryGapClosed ";
                           PrintDebug(DebugFile, DebugStr);
                        }
                  
                     ReInit = true;
                     InitialGapFound = false;

                     MyInit();
                  }        
            }

         if (CheckDebug(DebugStart, 2))
            {
               DebugStr = "DebugStart: " + " last return in InitialGapFound";
               PrintDebug(DebugFile, DebugStr);
            } 
            
         return(OK);
      
      }  // if InitialGapFound

   if (CheckDebug(DebugStart, 2))
      {
         DebugStr = "DebugStart (): last return: ";
         
         PrintDebug(DebugFile, DebugStr);
      } 
 
              
   return(0);
  }

Я записываю в журнал начало start и конец.

Функция CheckDebug() не оказывает никакого влияния, поскольку она всегда возвращает true.

Ниже приведен сгенерированный файл журнала.

Вы можете видеть, что последняя запись - "DebugStart: last return in InitialGapFound" - это последний оператор, выполненный в функции start().

Следующая запись в файле журнала должна быть "DebugStart: begin: ...", первый оператор функции start().

Но функция start() больше не запускается. Вместо этого MT4 зависает в цикле.

Я не вижу никакого цикла в логике моей программы. Я не использую DLL, никаких iCustom, ...

2013.11.15 12:33:14 Test reduced 0: USDJPY M15 Debug Init() begin:
2013.11.15 12:33:14 Тест уменьшен 0: USDJPY M15 DebugMyInit begin:
2013.11.15 12:33:14 Тест уменьшен 0: USDJPY M15 Debug Init() return:
2013.11.15 12:33:14 Тест уменьшен 0: USDJPY M15 DebugStart: begin: InitialGapFound: True
2013.11.15 12:33:14 Тест уменьшен 0: USDJPY M15 DebugStart: последний возврат в InitialGapFound
2013.11.15 12:33:15 Тест уменьшен 395052: USDJPY M15 DebugStart: begin: InitialGapFound: True
2013.11.15 12:33:15 Тест уменьшен 395052: USDJPY M15 DebugStart: последний возврат в InitialGapFound
2013.11.15 12:33:16 Тест уменьшен 395052: USDJPY M15 DebugStart: begin: InitialGapFound: True
2013.11.15 12:33:16 Тест уменьшен 395052: USDJPY M15 DebugStart: InitialHistoryGapClosed
2013.11.15 12:33:16 Тест уменьшен 395052: USDJPY M15 DebugMyInit begin:
2013.11.15 12:33:16 Тест уменьшен 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 1 nach CreateHistory()
2013.11.15 12:33:17 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 2 nach CreateHistory()
2013.11.15 12:33:18 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 3 после CreateHistory()
2013.11.15 12:33:19 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 4 nach CreateHistory()
2013.11.15 12:33:20 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 5 nach CreateHistory()
2013.11.15 12:33:21 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 6 nach CreateHistory()
2013.11.15 12:33:22 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 7 nach CreateHistory()
2013.11.15 12:33:22 Test reduced 395052: USDJPY M15 DebugMyInit return InitialMyInitCalls: 0 IndexCount: 8
2013.11.15 12:33:22 Тест уменьшен 395052: USDJPY M15 DebugStart: последний возврат в InitialGapFound

 
mt4forum:

Вот моя функция log:

А вот моя функция start:

Я записываю в журнал начало start и конец.

Функция CheckDebug() не оказывает никакого влияния, поскольку она всегда возвращает true.

Ниже приведен сгенерированный файл журнала.

Вы можете видеть, что последняя запись - "DebugStart: last return in InitialGapFound" - это последний оператор, выполненный в функции start().

Следующая запись в файле журнала должна быть "DebugStart: begin: ...", первый оператор функции start().

Но функция start() больше не запускается. Вместо этого MT4 зависает в цикле.


Что нормально в ...

      return(OK);


Предположим, что отладка вызывает проблему, пожалуйста, добавьте следующее после объявления переменных в start() run и отчитайтесь, показав журнал и выдержку из журнала, как указано выше. ...

int start()
  {     
   int TFInd;
   int k;  
   
   Print("start():  started . . .");  // <-----  add this line here
   
   if (CheckDebug(DebugStart, 2))
Причина обращения: