WHILE演算子の妙な挙動 - ページ 3

 
FORを使えるのに、WHILEである必要があるのか?
 

when is this while starting and

停止中は?

while (StringHighStatus == "False" && SwingHighShift <= SwingBarCount)
 
これは決して真にはなりません(==オペランド。 - MQL4 forum)
if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift)
したがって、これは決して実行されません。
StringHighStatus="True";
その結果、無限ループになります。
while(StringHighStatus=="False" || ...
  1. if 文の前や中に変数やエントリーを出力していれば、このことに気がつくはずです。
  2. 文字列やintをbooleanの意味で使わないでください。
    string StringHighStatus = "False";
    while (StringHighStatus == "False" || SwingHighShift <= SwingBarCount){
       if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == ...{
          StringHighStatus = "True";
    
    bool String HighStatus = False;
    while (!String HighStatus || SwingHighShift <= SwingBarCount){
       if(iFractals(NULL, 0, MODE_UPPER, SwingHighShift) == ...{
          String HighStatus = True;
    

 
WHRoeder:
これは決して真にはなりません(==オペランド。 - MQL4 forum)
したがって、これは決して実行されません。
無限ループになります。

私もテストするまでは同じことを思っていました。意外なことに、if(double == double)の部分は動作するのですが、新しいビルドではdoubleの比較は別の方法で処理されるのでしょうか。

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   for(int i=0; i<100; i++)
   {if(iFractals(NULL, 0, MODE_UPPER, i) == iHigh(NULL, 0, i) && iFractals(NULL, 0, MODE_UPPER, i) > Close[0])
    Print("Fractals conditions met on bar ",i);
  }} 

EURUSD,M15: バー98でフラクタルの条件を満たしました。
EURUSD,M15: バー95でフラクタルの条件を満たしました。
EURUSD,M15: フラクタル条件がバー91で満たされました。
EURUSD,M15: フラクタル条件がバー81で満たされた場合
EURUSD,M15: フラクタル条件が満たされたバー77
EURUSD,M15: フラクタル条件がバー68で満たされる
EURUSD,M15: フラクタル条件がバー61で満たされる
EURUSD,M15: フラクタル条件がバー48で満たされる
EURUSD,M15: フラクタル条件が満たされたバー39
EURUSD,M15: フラクタル条件が満たされたバー24
EURUSD,M15: フラクタル条件が満たされたバー19
EURUSD,M15: フラクタル条件が満たされたバー12
EURUSD,M15: 4小節目でフラクタルの条件に合致

 
lord_hiro:

GumRaiさん、ありがとうございます。

私が間違っていて頭が固いのかもしれませんが、論理が理解できません...。

最初のIFで、ご指摘のようにSwinghHighShift=10で文字列を「真」にすると、そのサイクルではカウントは増えません。その後、制御はWHILEに戻ります。WHILEには論理和があり、その条件の1つが満たされているので、この時点でサイクルが終了するはずです。

逆に、変数がfalseのままなら、カウンタが最大値に達し、再び終了条件となるはずです。

AND演算子であれば、あなたの考察は正しいと思います。

あなたの解釈に従って、私はWHILEの中のORをスキップして、最初のIF条件を文字列の上に置くことができます:もし "true "になったら、ブレークがWHILEを終了させ、さもなければカウンターは最大値になるまで進みます。

そうでなければ、カウンタは最大値まで進みます。


しかし、これはまだ回避策であり、悲しいかな、なぜWHILEがORを処理しないのか(私には)説明できません。

WHILEや論理ORには何の問題もありません。WHILEの中に2つの条件があり、WHILEが終了する前にその両方が壊れる必要があります。

これが引っかかる理由です。

  • コードがWHILEループに入る。両方の条件は最初から真です。
  • コードは、IF条件を満たすフラクタルが あるバーが見つかるまで、SwingHighShift++を増分させながらWHILEループを循環させます。
  • フラクタルが条件を満たしたとき、コードは遅かれ早かれIF演算子に入る。
  • StringHighStatusをfalseに変更し、最初のWHILE条件が解除されます。
  • SwingHighShift++; は IF 演算子の ELSE 部分にあるため、インクリメントされません (IF 条件は満たされているので ELSE は無視されます)。
  • 2つ目のWHILE条件はまだ真なので、コードはまだ前回と同じバー上で再び循環します。
  • 同じフラクタルが前回と同じように IF 条件を満たします。
  • ELSE部分のSwingHighShift++はIF条件が真であるときに増分されないので、コードは今、IF条件を満たすフラクタルとそのバー上で永遠にループするように立ち往生している。

ループが終了する可能性はわずかで、それは100本のバー(SwingBarCount)全体に対してIF条件が満たされない場合なので、2番目のWHILE条件は1番目の前に壊れています。その後、フラクタルはIF条件を満たし、1番目のWHILE条件を解除するコード(StringHighStatusを変更)が実行されます。

SwingHighShift++; を ELSE から取り出し、それ自体を IF オペレータの後の while ループに入れる必要があります。

また、オブジェクトに別の名前をつける必要があり、そうしないと一度だけしか描画されません。(一度だけ描画させたい場合は別ですが)。

 
このスレッドでのあなたの投稿を読み返してみて、あなたの混乱がどこに生じているかがわかりました。あなたはWHILEとORの論理を逆に考えています。ORはWHILEを停止させるものではありません。どちらかの条件が成立したときに、それを継続させることです。例えば、2つの照明が点灯しているとします。あなたの指示は、ライト1またはライト2が点灯している間、何かをし続けることです。明らかに、どちらか一方だけでなく、両方のライトが消灯していなければ、終了することはできません。
 
SDC:

私はそれをテストするまで同じことを考えた、驚くべきことに、それの if(double == double) 部分は動作する、それはダブルの比較が新しいビルドで異なって処理されるのかどうか疑問に思う。

EURUSD,M15: Fractals conditions met on bar 98
EURUSD,M15: Fractals conditions met on bar 95
EURUSD,M15: Fractals conditions met on bar 91
EURUSD,M15: Fractals conditions met on bar 81
EURUSD,M15: Fractals conditions met on bar 77
EURUSD,M15: Fractals conditions met on bar 68
EURUSD,M15.Factals conditions met on bar 61 ユーロ米ドル(EURUSD)M15: フラクタルズ条件(EURUSD)M15:Fractals conditions met on bar 61
EURUSD,M15: Fractals conditions met on bar 48
EURUSD,M15: Fractals conditions met on bar 39
EURUSD,M15: Fractals conditions met on bar 24
EURUSD,M15: Fractals conditions met on bar 19
EURUSD,M15: Fractals conditions met on bar 12
EURUSD,M15: Fractals conditions met on bar 4


これがうまくいくのは、コードが効果的に同じ値を比較しているからです。

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)==iHigh(NULL,0,SwingHighShift) )

フラクタルバッファは 空の値を持つか、関連するバーの高値からその値を取ります。

このコードは事実上

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE && iHigh(NULL,0,SwingHighShift==iHigh(NULL,0,SwingHighShift) 

に置き換えることができない理由はないでしょう。

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE)
 
GumRai:

に置き換えることができない理由はないと思います。

if(iFractals(NULL,0,MODE_UPPER,SwingHighShift)!= EMPTY_VALUE)
そうですね......その方がいいと思います。
 
SDC:
このスレッドでのあなたの投稿を読み返したところ、あなたの混乱がどこに生じたかがわかりました。WHILEとORの論理を逆に考えているのですね。ORはWHILEを止めるためのものではありません。どちらかの条件が成立したときに、それを継続させることです。例えば、2つの照明が点灯しているとします。あなたの指示は、ライト1またはライト2が点灯している間、何かをし続けることです。明らかに、どちらか一方だけでなく、両方のライトが消灯していないと、終了できません。


これだけです。

恥ずかしながら... :-)

さらに、WHILEを使うのは初めてではないのですが、逆に考え始めてしまい、自分のループから抜け出せなくなってしまいました :-/。

そして、deVriesの提案した、||を&&に置き換えるというのは正解でした。

このトピックのおかげで、IF( == )がうまくいくかどうかなど、他にも気をつけるべきことがたくさん出てきました。

皆さん、私に理解させるために時間を費やしていただき、ありがとうございました。

 

私は、この方法で、whileループを中断するために、breakを使用する必要があります、それは正しいですか?

  int counter=0, MaxCount = 10000;
  while( true )
     {
      Print("Counter ", counter);
      counter++;
      if( counter == MaxCount ) break;
      }