Я уже регистрирую отладочную информацию.
Я не вижу бесконечного цикла.
Последнее, что я вижу в журнале, это когда я вызываю return() в последней строке start().
После этого start() больше никогда не вызывается.
Это должно быть что-то другое.
Я знаю, я использую свою собственную функцию PrintDebug() с FileWrite(), FileFlush.
Как вы думаете, достаточно ли моего способа печати отладочной информации?
Я уже регистрирую отладочную информацию.
Я не вижу бесконечного цикла.
Последнее, что я вижу в журнале, это когда я вызываю return() в последней строке start().
После этого start() больше никогда не вызывается.
Это должно быть что-то другое.
Вы выводите что-то в журнал в качестве первой строки start()?
Да, я записываю в журнал первую и последнюю строки.
Могу ли я быть уверен, что мой способ ведения журнала не пропускает никакой информации о журнале?
Да, я записываю в журнал первую и последнюю строки.
Могу ли я быть уверен, что мой способ ведения журнала не пропускает никакой информации о журнале?
Используете ли вы какие-либо индикаторы через вызовы 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
Вот моя функция 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))
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте,
Я столкнулся с неприятной проблемой:
после нескольких итераций функция start() моего индикатора не возвращается после вызова return(), т.е. MT4 зависает в цикле, пожирая процессор, не вызывая start() снова.
Интересно, не разрушил ли я каким-то образом стек вызовов функции?
Что, по вашему мнению, мне следует искать, чтобы найти причину?
Я отлаживаю уже целую неделю. Это 72 страницы кода.
Я не использую никаких вызовов DLL, только плоский MQL.
Спасибо.