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.
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?
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?
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?
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
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))
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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.