【超入門】MQL5 EA講座 第38回「while文について」【EAの作り方】

MQL5でEA作ろう講座

前回は switch文 について解説しました。

改めて前回の内容をおさらいをしておくと、

  • switch演算子が指定する値とcase演算子の構成する定数リストの各値を比較して、その2つの値が等しい(true)か、等しくない(false)かの条件判定を行い、条件判定がtrueの時に、処理文に書かれている記述内容を実行する。

  • break演算子を使うと、プログラムは直近の{}内を離脱し、{}で括っている部分の処理を、break演算子の記述以降は行わない。

ということをお伝えしました。

今回は while文 についてお話ししたいと思います。

スポンサーリンク
スポンサーリンク

while文とは?

プログラムの挙動に関する、重要な原則として

  • 順次進行(書かれている順番に上から下へ処理を行っていく。※一部例外あり)
  • 条件分岐(「Aの場合は、Bの処理をする。Cの場合は、Dの処理をする」といったように条件に応じて処理が分かれていく)
  • 繰り返し(同じ処理を複数回繰り返し行う)

というものがあります。

突き詰めていくと、プログラムというのは、「これだけやっている」とさえ、言えるかもしれません。

while文はそのうちの、

「繰り返し処理」命令をする記述の1つです。

「繰り返し処理」命令をする記述には、while文の他に、この後講座記事で取り上げる

do-while文

for文

があります。

while文の使い方

while文

3つの「繰り返し処理」命令をする記述のうち、もっともシンプルなループ構造になっています。

↓のサンプルコードをご覧ください。


void OnStart()
  {   //変数「loopCondition」を宣言し、trueを代入
     bool loopCondition=true;
     
     //ループカウント用の整数型変数「counter」を用意
     int counter=1;
     
     //loopConditionがtrueである間はループする。
     while (loopCondition==true)
     {
         //ログ出力
         Print(counter);//1,2,3,4,5が出力される
         
         
         //counterが5になったら、loopConditionにfalseを代入
         if(counter==5)loopCondition=false;
         
         //現在の格納値にプラス1する(インクリメント)
         counter++;
        
     }
  }
//+------------------------------------------------------------------+

while文を作るには、まず最初に

while演算子を記述し、その後()内にループ継続を判定する条件を記述します。

 //loopConditionがtrueである間はループする。
     while (loopCondition==true)

()内にループ継続を判定する条件を記述した後は、

{}内に、繰り返しておこなう処理内容を記述していきます。

()内の条件を満たしている間は、{}内の一番下まで進んでも、それより下の記述は読み込まず、また{}内の頭から同じ処理を繰り返します。

サンプルコードでは

ループ継続を判定する条件は

(loopCondition==true)//loopConditionがtrueである間は・・・

と設定しています。言い換えれば、もし

(loopCondition==false)

となったら、ループは終了するような記述となっております。

 {
         //ログ出力
         Print(counter);//1,2,3,4,5が出力される
         
         
         //counterが5になったら、loopConditionにfalseを代入
         if(counter==5)loopCondition=false;
         
         //現在の格納値にプラス1する(インクリメント)
         counter++;
        
     }

最初は、

Print関数を使って変数「counter」に格納されている値をログ出力します。

変数「counter」には、最初「1」が入っているのですが、

{}内の一番下に

counter++;

というインクリメント(現在の格納値にプラス1する処理)が入っていますから、

ループするたびに、変数「counter」の値は、2,3,4・・・と増えていきます。

インクリメントについてはコチラ

{}内の真ん中にあるif文の記述↓は

 //counterが5になったら、loopConditionにfalseを代入
         if(counter==5)loopCondition=false;

変数「counter」が5になった後の、該当箇所記述によって

bool型変数「loopCondition」がtrueからfalseに変わることを意味します。

(loopCondition==true)がループ継続の条件でしたから、これでループは終了です。

※ちなみに、ループ終了時変数「counter」の値はいくつになっているでしょうか?

・・・答えは「6」です。

順次進行の原則に注意を払ってもう一度コードをよく見てみると・・・

 {
         //今、counterの値が「5」であると仮定する
         
         
         //counterが5なので、loopConditionはfalseとなり、ループ終了は決定
         if(counter==5)loopCondition=false;
         
         //まだ、最後のループを抜けていないのでインクリメントは有効
         counter++;//インクリメントにより「6」になって、ループ終了
        
     }

変数「counter」の変遷は以上のようになっています。

このサンプルコードは

ループ継続を判定する条件にtrue,false真偽値を指定したパターン

でしたが、

関係演算子を用いて記述することもできます。

関係演算子を用いたwhile文のパターン

関係演算子を用いwhile文のパターンを説明する前に!

・・・関係演算子は覚えていらっしゃいますか?

関係演算子とは

「AよりBが大きい」

とか

「AとBは等しい」

とか

「AとBは等しくない」

など、

2つの値の関係性を明示するための記述群を指します。詳しくは↓の記事をご覧ください

では、関係演算子を用いたwhile文のサンプルコードをみていきましょう。↓

void OnStart()
  {   
     
     //ループカウント用の整数型変数「counter」を用意
     int counter=1;
     
     //counterが5以下である間はループする。
     while (counter<=5)
     {
         //ログ出力
         Print(counter);//1,2,3,4,5が出力される
         counter++;
     }
     
     
  }

ループ継続を判定する条件

変数「counter」が5以下(5と等しいか、5より小さい)である間は

としました。

したがって、変数「counter」インクリメントによって、5に達するまではループが継続し、6になった段階でループが終了します。

最初のサンプルコードとは記述内容は違いますが、

Print関数によって、1,2,3,4,5が出力される

という同じ結果が導き出されました。

while文を使う上での注意 -無限ループについて-

while文では()内に、ループを継続するか判定する条件を記述するわけですが、

ループを終了させる条件記述がなかったり、記述が適切でなかった場合、ループが終了せずに無限ループになってしまう可能性があるため記述には注意を払いたいところです。

例えば

//loopConditionがtrueである間はループする。
     while (loopCondition==true)
     {
         //ログ出力
         //Print(counter);//1,2,3,4,5が出力される

         //現在の格納値にプラス1する(インクリメント)
         counter++;
         Print(counter);
        
     }
     

上記のようなサンプルコードの場合、ループ継続の条件が

loopCondition==true

としているのに、

{}内に、loopConditionがfalseになるような条件式がない為、無限ループとなります。

このサンプルコードを実行すると・・・↓

インクリメントしたcounterの値をずっとログ出力し続けることになってしまいます。

もっとも条件文に無限ループとなるような記述をする事が必ずしも悪い訳ではありません。

繰り返し処理を規定する{}内に、特定の条件を満たしたらbreak演算子でループを離脱するような記述をする事も可能です。詳しい事は

MQL5 EA講座 第41回「breakとcontinue」

で解説予定ですのでお待ちください

まとめ

今回は while文 について解説しました。

今回の記事では以下のことを学びました

  • while文は、プログラムに「繰り返し処理」命令をする記述の1つである。

  • while文を作る際は、while演算子を記述し、その後()内にループ継続を判定する条件を記述する

  • ()内にループ継続を判定する条件を記述した後は、{}内に、繰り返しておこなう処理内容を記述する。

  • ループ継続を判定する条件の記述は、真偽値を用いたた記述以外に、関係演算子を用いた記述も可能。

  • ループを終了させる条件記述がなかったり、記述が適切でなかった場合、ループが終了せずに無限ループになってしまう可能性があるため記述には注意

今回は以上になります。

最後までお読みいただきありがとうございました<m(__)m>

【超入門】MQL5 EA講座 第37回「switch文」【EAの作り方】←

        →【超入門】MQL5 EA講座 第39回「do-while文について」【EAの作り方

コメント

タイトルとURLをコピーしました