MT4がハングアップし、start()を再度呼び出さない

 

こんにちは。

私は今、醜い問題に直面しています。

私のインジケータのstart()関数が 数回繰り返された後、return()呼び出しの後に再び戻ってきません。つまり、MT4はループの中でハングアップし、CPUを消費し、再びstart()を呼び出しません。

私は何らかの方法で関数呼び出しスタックを破壊したのでしょうか?

原因を見つけるために主に何を探せばいいのでしょうか?

もう一週間ずっとデバッグしています。72ページのコードです。

DLLコールは一切使っておらず、プレーンMQLだけです。

ありがとうございます。

 
スタートから戻りません。コードを修正する必要があります。dbgViewを取得し、すべての関数の開始とリターンでLog コールを追加して、無限ループを追跡してください。
 

もうデバッグ情報を記録している。

不定期ループは見当たりません。

ログファイルで最後に見るのは、start()の最後の行でreturn()を呼び出したときです。

そこからstart()が再び起動されることはありません。

それは何か他のものでなければなりません。

 
ログはどこで、どのように取るのですか?GUIスレッドをハングアップさせているため、Print/Alertを使用 することはできません。
 

そういえば、自作のPrintDebug()関数で FileWrite()、FileFlush.

 

デバッグ情報を表示する方法は、私の方法で十分だと思いますか?

 
mt4forum:

もうデバッグ情報を記録している。

不定期ループは見当たりません。

ログファイルで最後に見るのは、start()の最後の行でreturn()を呼び出したときです。

そこからstart()が再び起動されることはありません。

それは何か他のものでなければなりません。


start()の1行目として、ログに何か出力していますか?
 

はい、最初の行と最後の行をログに記録しています。

私のログの取り方が、ログの情報を見逃していないことを確認できますか?

 
mt4forum:

はい、最初の行と最後の行をログに記録しています。

私のログの取り方が、ログの情報を見逃していないことを確認できますか?

もし確信が持てないなら、標準のPrint()を使って、エキスパートタブだけでなく、ログ ファイルをチェックしてみて ください。私たちはあなたのロギング方法を見たことがありません。

iCustom()コールでインジケータを使用していますか? もし使用しているならば、CPUサイクルを消費しているかもしれません。. .
 

これが私の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);
  }

開始と終了のログを記録しています。

関数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 Test reduced 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:開始します。 InitialGapFound。真
2013.11.15 12:33:14 テストは0を削減:USDJPY M15 DebugStart:InitialGapFoundで最後の戻り値。
2013.11.15 12:33:15 テストは395052を削減しました:USDJPY M15 DebugStart:開始します。 InitialGapFound:真
2013.11.15 12:33:15 テストは395052を減らしました:USDJPY M15 DebugStart:InitialGapFoundの最後のリターン
2013.11.15 12:33:16 テストは395052を削減しました:USDJPY M15 DebugStart:開始します。 InitialGapFound:真
2013.11.15 12:33:16 テストは、395052を削減しました:USDJPY M15 DebugStart。 InitialHistoryGapClosed
2013.11.15 12:33:16 テストは、395052を削減:USDJPY M15 DebugMyInit開始。
2013.11.15 12:33:16 テストは395052を削減しました:USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()で1回
2013.11.15 12:33:17 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()実行時:2
2013.11.15 12:33:18 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()実行時:3
2013.11.15 12:33:19 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()実行時:4
2013.11.15 12:33:20 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()実行時:5
2013.11.15 12:33:21 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()実行時:6
2013.11.15 12:33:22 Test reduced 395052: USDJPY M15 DebugMyInit InitialMyInitCalls:0 IndexCount:CreateHistory()で7件
2013.11.15 12:33:22 Test reduced 395052: USDJPY M15 DebugMyInit return InitialMyInitCalls:0 IndexCount:8
2013.11.15 12:33:22 Test reduced 395052: USDJPY M15 DebugStart: InitialGapFoundで最後のリターン。

 
mt4forum:

これが私のlog関数です。

そして、これが私のstart関数です。

開始と終了のログを記録しています。

関数CheckDebug()は常にtrueを返すので、何の影響も及ぼさない。

以下は、生成されたログファイルです。

最後のエントリが「DebugStart: last return in InitialGapFound」であることがわかります。これは、start()関数内で実行された最後のステートメントです。

ログファイルの次のエントリは、"DebugStart: begin. "になっているはずです。..." という、start()関数の最初のステートメントがあるはずです。

しかし、start()が再び起動されることはありません。代わりに、MT4はループでハングアップします。


でOKなのは......。

      return(OK);


あなたのデバッグが問題を引き起こしていると仮定して、start() runの変数宣言の後に以下を追加し、上記のようにログとあなたのログの抜粋を表示して報告してください ... ...

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