O MT4 fica pendurado, não chama o início() novamente

 

Hi,

Estou enfrentando um problema muito feio aqui:

depois de algumas tentativas, a função start() do meu indicador não volta depois da chamada(), ou seja, o MT4 fica pendurado em loop, comendo a CPU, sem chamar o start()novamente.

Será que de alguma forma eu destruí a pilha de chamadas de função?

O que o senhor acha que eu deveria procurar principalmente para encontrar a causa?

Eu já estive depurando a semana inteira. São 72 páginas de código.

Não estou utilizando nenhuma chamada DLL, apenas MQL de avião.

Do que o MQL.

 
Você não vai voltar desde o início. Você precisa consertar seu código. Obtenha dbgView e adicione chamadas de Log no início e no retorno de cada função e rastreie seu loop infinito.
 

Já estou registrando informações de depuração.

Não consigo ver um loop indefinido.

A última coisa que eu vejo no arquivo de log é quando eu chamo retorno() na última linha de início().

A partir daí o start() nunca mais é acionado.

Deve ser algo mais.

 
Registrando onde/como? Você NÃO pode usar a impressão/alerta porque você está pendurando o fio GUI, a saída não será escrita.
 

Eu sei, estou usando minha própria função PrintDebug( ) com FileWrite(), FileFlush.

 

Você acha que minha maneira de imprimir informações de depuração é suficiente?

 
mt4forum:

Já estou registrando informações de depuração.

Não consigo ver um loop indefinido.

A última coisa que eu vejo no arquivo de log é quando eu chamo retorno() na última linha de início().

A partir daí o start() nunca mais é acionado.

Deve ser algo mais.


Você imprime algo no registro como a primeira linha de início() ?
 

Sim, eu estou registrando a primeira linha e a última linha.

Posso ter certeza de que minha maneira de registrar não perde nenhuma informação de registro?

 
mt4forum:

Sim, eu estou registrando a primeira linha e a última linha.

Posso ter certeza de que minha maneira de registrar não perde nenhuma informação de registro?

Se você não tiver certeza se você apenas usa uma impressão padrão() e verifica o arquivo de log e não apenas a guia de especialista . . ainda não vimos sua forma de registro.

Você usa algum Indicador através de chamadas iCustom() ? se você fizer isso, talvez eles estejam tomando os ciclos da CPU . . .
 

Aqui está minha função de registro:

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);
}

E aqui está a minha função de início:

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);
  }

Estou registrando o início do início e o fim.

A função CheckDebug() não tem nenhuma influência, já que sempre retorna verdadeiro.

O seguinte é o arquivo de log gerado.

Você pode ver que a última entrada é "DebugStart: último retorno em InitialGapFound", que é a última declaração executada na função start().

A próxima entrada no arquivo de log deve ser "DebugStart: begin": ...", a primeira declaração da função start().

Mas a função start() nunca mais é acionada. Em vez disso, o MT4 fica pendurado em um loop.

Eu não consigo ver nenhum loop na lógica do meu programa. Não estou usando DLLs, nenhum iCustom, ...

2013.11.15 12:33:14 Teste reduzido 0: USDJPY M15 Debug Init() começa:
2013.11.15 12:33:14 Teste reduzido 0: USDJPY M15 DebugMyInit começa: ..:
2013.11.15 12:33:14 Teste reduzido 0: USDJPY M15 Debug Init() retorno:
2013.11.15 12:33:14 Teste reduzido 0: USDJPY M15 DebugStart: início: InitialGapFound: Verdadeiro
2013.11.15 12:33:14 Teste reduzido 0: USDJPY M15 DebugStart: último retorno em InitialGapFound
2013.11.15 12:33:15 Teste reduzido 395052: USDJPY M15 DebugStart: iniciar: InitialGapFound: Verdadeiro
2013.11.15 12:33:15 Teste reduzido 395052: USDJPY M15 DebugStart: último retorno em InitialGapFound
2013.11.15 12:33:16 Teste reduzido 395052: USDJPY M15 DebugStart: iniciar: InitialGapFound: Verdadeiro
2013.11.15 12:33:16 Teste reduzido 395052: USDJPY M15 DebugStart: InitialHistoryGapCapClosed
2013.11.15 12:33:16 Teste reduzido 395052: USDJPY M15 DebugMyInit começa:
2013.11.15 12:33:16 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 1 nach CreateHistory()
2013.11.15 12:33:17 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 2 nach CreateHistory()
2013.11.15 12:33:18 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 3 nach CreateHistory()
2013.11.15 12:33:19 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 4 nach CreateHistory()
2013.11.15 12:33:20 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 5 nach CreateHistory()
2013.11.15 12:33:21 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 6 nach CreateHistory()
2013.11.15 12:33:22 Teste reduzido 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 7 nach CreateHistory()
2013.11.15 12:33:22 Teste reduzido 395052: USDJPY M15 DebugMyInit Return InitialMyInitCalls: 0 IndexCount: 8
2013.11.15 12:33:22 Teste reduzido 395052: USDJPY M15 DebugStart: último retorno em InitialGapFound

 
mt4forum:

Aqui está minha função de registro:

E aqui está a minha função de início:

Estou registrando o início do início e o fim.

A função CheckDebug() não tem nenhuma influência, já que sempre retorna verdadeiro.

O seguinte é o arquivo de log gerado.

Você pode ver que a última entrada é "DebugStart: último retorno em InitialGapFound", que é a última declaração executada na função start().

A próxima entrada no arquivo de log deve ser "DebugStart: begin": ...", a primeira declaração da função start().

Mas a função start() nunca mais é acionada. Em vez disso, o MT4 fica pendurado em um loop.


O que está bem em . . .

      return(OK);


Vamos assumir que sua depuração está causando o problema, por favor adicione o seguinte após as declarações das variáveis em start() run e reporte mostrando o log e seu extrato de log como acima . .

int start()
  {     
   int TFInd;
   int k;  
   
   Print("start():  started . . .");  // <-----  add this line here
   
   if (CheckDebug(DebugStart, 2))