while文の書式を覚えても、実際に自分のインジケーターやEAでどう使えばいいのか分からない——という人向けの記事です。この記事では、while文・do while文の基本に加えて、実際にMetaEditorでコンパイルして確認できるサンプルコードと、初心者がよくハマる無限ループの注意点を紹介します。

while文とは

MQL プログラミング基礎 while文

if文などの条件分岐が一般的ですが、while文と呼ばれるものもあります。

while文とは与えられた条件を満たしている場合に処理を繰り返します。

while文の書式

while文は以下のように記述します。

while(条件式) {
処理
}

while文は最初に条件式が評価されて、条件式を満たしている時に処理が実行されます。

条件式を満たしている限りカッコの中に書かれている処理を繰り返しますが、

条件式を満たさなくなった場合に繰り返し処理を終了します。

無限ループに注意する

while文で最も注意したいのが、条件式がいつまでもtrueのままになってしまう無限ループです。ループの中で条件式に使っている変数を更新し忘れると、処理が終わらなくなり、MT4がフリーズする原因になります。while文を書いたら、ループの中で必ず条件式の変数が変化しているか確認してください。

do while文

do while文とは、while文と同様に条件を満たしているときだけ処理を繰り返します。

while文は条件を満たしているかどうかを判断するタイミングが処理の実行前に行うため、

条件を満たさずに1度も実行されないことがあります。

しかし、do while文では条件を満たしているかどうかを処理の実行後に判断するため、

最低でも1度は処理が実行されるということです。

MQL プログラミング基礎 do while文

  • while文:処理が1度も実行されないこともある。
  • do while文:処理が最低1度は実行される。

書式は以下のとおりです。

do{
実行する処理
} while(条件式)

break文

break文とは、while文やfor文のループを脱出することができます。

break文の書式は次のようになっています。

break;

while文の繰り返しの途中でbreak文が実行されるとwhile文を終了されて次の処理へ移ります。

while (条件式){
  ...
  if (条件式){
    break;
  }
  ...
}

for文とwhile文の使い方の違い

while文以外にもfor文も繰り返し処理に用いられます。

for文とwhile文の使い方の違いですが、for文は繰り返しの回数が決まっている場合に使用され、

while文は繰り返し回数が決まっておらず、条件を満たしている限りは処理を繰り返す場合に使用されます。

  • while文:条件毎に値を処理に適している。
  • for文:繰り返し回数を指定したい処理に適している。

実際にコンパイルして確認する

「直近の陽線が何本連続しているか」を数えるインジケーターで、while文の動きを確認してみましょう。連続本数は毎回変わるため、for文のように回数を固定できない、while文が向いている典型例です。

//+------------------------------------------------------------------+
//|                                              WhileStatement.mq4   |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   Comment("");
  }

void OnTick()
  {
   int shift = 0;//何本前の足を見ているか
   int up_streak = 0;//連続陽線の本数

   while(Close[shift] > Open[shift])//この足が陽線である間は繰り返す
     {
      up_streak++;
      shift++;//次に古い足へ移動(条件式で使う変数を必ず更新する)

      if(shift >= Bars) //チャートの端まで来たら強制的に抜ける(安全装置)
        {
         break;
        }
     }

   Comment("直近の陽線連続本数: ", up_streak, "本");
  }
//+------------------------------------------------------------------+
Copy

ループの中で必ずshift++を実行しているのがポイントです。もしこれを書き忘れると、Close[shift]の値がいつまでも変わらず、条件が永久にtrueのままになる無限ループになります。また、チャートの端まで遡っても陽線が続いていた場合に備えて、if(shift >= Bars) break;という安全装置を入れています。

まとめ

今回はwhile文をご紹介しました。

for文が一般的には活用されますが、場合によってはwhile文が必要な場合もありますので、

しっかりと違いを理解しましょう。

ポイント

while文:条件が満たされている間は何度でも繰り返す
do While文:最低でも1度は処理が実行される
break文:while文やfor文のループを脱出することができる

関連記事