WHILE演算子の妙な挙動

 

皆さん、こんにちは。

私のEA(600以前のビルドでテストしたことはありませんが、コードは2年前のものです)は、ビルド625でWHILEの間にスタックしてしまいます。

実際、WHILEが始まるとき、式をチェックすることができないようです:その結果、それは決して出てきません。開始関数に 配置されます。

私は何が起こっているかを理解するために、非常に単純なEAを試してみました。


int counter=0, MaxCount = 10000; 

void start()
  {
  while( counter <= MaxCount )
   {Print("Counter ", counter);
   counter++;
   }
   return;
  }

さて、最初のカウンタ値は、通常、0からではなく、9500以上のランダムな値から始まります。

なぜでしょうか?何か提案はありますか?

 

もしかしたら、カウンタがEA内のどこかで別の値を取得するのかもしれません。

void start()
  {
  int counter=0, MaxCount = 10000;
  while( counter <= MaxCount )
   {Print("Counter ", counter);
   counter++;
   }
   return;
  }
 
lord_hiro:

皆さん、こんにちは。

私のEA(600以前のビルドでテストしたことはありませんが、コードは2年前のものです)は、ビルド625でWHILEの間にスタックしてしまいます。

実際、WHILEが始まるとき、式をチェックすることができないようです:その結果、それは決して出てきません。開始関数に配置されます。

私は何が起こっているかを理解するために、非常に簡単なEAを試してみました。

さて、最初のカウンタ値は、通常、0からではなく、9500以上のランダムな値から始まります。

なぜでしょうか?何か提案はありますか?

あなたはカウンターをグローバルに宣言しました。

OnStart()のコードで、counter++は、カウンタ値を10000まで押し上げます。

つまり、静的であるため、次のtickでは、カウンタは最初から10,000になっています。

 
SDC:

あなたは、カウンターをグローバルに宣言していますが、これは静的であることを意味します。

OnStart()のコード、counter++は、カウンターの値を10,000まで押し上げる。

ということは、静的なので、次のtickでは、カウンタは最初から10,000になっています。


と書いています。

lord_hiro:

さて、最初のカウンタ値は、通常0からではなく、9500以上のランダムな値から始まります。

なぜでしょうか?何か提案はありますか?


というわけで、これが私の答えです。


qjol:

多分、カウンターはEA内部の他のどこかで別の値を取得します。

void start()
  {
  int counter=0, MaxCount = 10000;
  while( counter <= MaxCount )
   {Print("Counter ", counter);
   counter++;
   }
   return;
  }
 
lord_hiro:

皆さん、こんにちは。

私のEA(600以前のビルドでテストしたことはありませんが、コードは2年前のものです)は、ビルド625でWHILEの間にスタックしてしまいます。

実際、WHILEが始まるとき、式をチェックすることができないようです:その結果、それは決して出てきません。開始関数に配置されています。

私は何が起こっているかを理解するために、非常に単純なEAを試してみました。


さて、最初のカウンタ値は、通常、0からではなく、9500以上のランダムな値から始まります。

なぜでしょうか?何か提案はありますか?



このような高速ループに対応できない「エキスパート」タブで見ている可能性が高いです。

実際のログファイルを開いてみてください。

 

ひとつ言えることは、コードのどこかでもう一度カウンタ変数を呼び出して、その値を10,001以下に戻さない限り、whileループは2回目には実行されないということです。変数のグローバルな宣言には注意が必要です。

 
lord_hiro: 最初のカウンタ値は通常9500以上のランダムな値から始まり、0から始まることはありません。何か提案はありますか?
ビルド600以前は、未初期化の変数は0に初期化されていました。現在では、初期化しない 限り、ランダムな値が格納されています。
 
初期化したのだから、何か他の原因でそのカウンタ変数の値が変わっているに違いない...。
 
GumRaiさんがおっしゃるように、ログはその速度に対応できないので、実際のデータのほとんどを飛ばして、一部の断片しか表示されません。
 

GumRaiさん、その通りです。ログには1から始まるすべての出力が報告されます。

変数宣言をOnStart()内ではなくグローバルスペースに置くことの違いは、最初のケースではループが一回実行されるのに対し、2番目のケースでは無限に繰り返されることです。

しかし...カウントサイクルがうまく実行されているので、私が間違ったデバッグ例を選択したことが明らかです。

すべては次のEAから始まった。

以下がそのコードです。

 extern int SwingBarCount = 100;
int start()



{

int SwingHighShift = 0;
string StringHighStatus = "False";
int SwingHigh = 0;


while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount)
   {
   
   if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == iHigh(NULL, 0, SwingHighShift) && iFractals(NULL, 0, MODE_UPPER, SwingHighShift) > Close[0])
      {
      StringHighStatus = "True";
      SwingHigh = SwingHighShift;
      ObjectDelete("SwingHigh");
      ObjectCreate("SwingHigh", OBJ_VLINE, 0, Time[SwingHigh], 0);
      ObjectSet("SwingHigh", OBJPROP_COLOR, Red);
      }
      else
      {
      SwingHighShift++;
      }

   }

}}

ブレークポイントを置いたので、WHILEまで実行されています。

WHILE条件が真で始まり、StringHighStatusが真になるかStringHighShiftがSwingBarCountに達するまでIF ELSEを循環させるはずです。

しかし、WHILEの後にCOMMENTとPRINTコマンドが続き、何も出力されないため、いつまでも終わらないのです。

StringHighStatusがfalseのままでも、カウンタがSwingBarCountに到達しなければならないのです。

私はそれが動作するために、このように変更する必要がありました。

while (!EndCycle)
   {
   
   if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == iHigh(NULL, 0, SwingHighShift) && iFractals(NULL, 0, MODE_UPPER, SwingHighShift) > Close[0])
      {
      StringHighStatus = "True";
      SwingHigh = SwingHighShift;
      ObjectDelete("SwingHigh");
      ObjectCreate("SwingHigh", OBJ_VLINE, 0, Time[SwingHigh], 0);
      ObjectSet("SwingHigh", OBJPROP_COLOR, Red);
      }
      else
      {
      SwingHighShift++;
      }
      if( StringHighStatus == "True" ) EndCycle = TRUE;
      if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
   }

なぜEndCycleを処理し、他の条件を処理しないのか理解できません。

ご回答ありがとうございました。

 
if( StringHighStatus == "True" ) EndCycle = TRUE;
else if( SwingHighShift > SwingBarCount ) EndCycle = TRUE;
try includeelse.