while()文

1.while()文とは

 while()文とは、回数を指定せずに、一定の処理を繰り返して実行させるために使用するものです。

 while()文の書式は、以下のとおりです。

while-statement
while()文の書式

2.具体例(その1)

 以下のようなスクリプトを作成して実行すると、「ターミナルウィンドウ」の「エキスパートタブに、メッセージという文字列が5回表示されます。

while-statement-example
プログラムを作成してスクリプトを実行
Example Result
「メッセージ」が5回表示されれる

 上記プログラムは、以下のような動作をしています。

  1. カウンタ変数に初期値を代入する
    while()文は、for()文(詳細は「こちら」を参照してください。)とは異なって、それ自体の書式では一定の処理を繰り返す回数が指定されません
    そこで、while()文を用いて、一定の処理を繰り返す回数を指定したい場合は、あらかじめ一定の処理を繰り返す回数をカウントする変数を宣言しておく必要があります。
    上記具体例においては、変数「i」に「1」が代入されます。
  2. 条件式による比較がなされる
    「i」には「1」が代入されているので、条件式「i <= 5」(「i」は「5」以下)を満たしています。
  3. 処理内容が実行される
    「Print(“メッセージ”);」という処理が実行され、その後、「i++」の実行により、「i」には「2」(=1+1)が代入されます。
    Print()関数の詳細については「こちら」を参照してください。
  4. 条件式による比較がなされる
    「i」には「2」が代入されているので、条件式「i <= 5」(「i」は「5」以下)を満たしています。
  5. 処理内容が実行される
    「Print(“メッセージ”);」という処理が実行され、その後、「i++」の実行により、「i」には「3」(=2+1)が代入されます。
  6. 以降は、「i」の値が「6」になるまで条件式→処理内容→条件式→……という処理が繰り返されます
    このような繰り返し処理(Print()関数が「5」回実行される。)により、「i」の値が「6」になる(「5」回目のPrint()関数の実行後に、「i++」が実行され、「i」の値が「5+1」で「6」になる。)と、条件式「i <= 5」(「i」は「5」以下)を満たさなくなるので、while()文を抜けて「return(0);」が実行され、プログラムは終了します。

 以上をまとめると、while()文は、条件式→処理内容→条件式→処理内容→……という動作を、条件式を満たす限り繰り返す、という処理を実行する、ということになります。

 なお、上記具体例における処理は、for()文を用いても同じように実行させることができます(詳細は「こちら」を参照してください。)。

3.具体例(その2)

 「移動平均線のクロスで売買する」で紹介した「2MA Cross EA.mq4」のコードを以下のように変更すると、エントリー条件を満たしているにもかかわらず、10秒間以上、注文が約定しなかった場合には、何らかのエラーが発生しているものとして、発注を止めることができます。


//変数の宣言
extern uint Waiting_Time = 10;
……
int start()
{
 ……
 //エントリー処理
 //ロングエントリー
 if(OrdersTotal() == 0 &&
    FMA_2 <= SMA_2 && FMA_1 >SMA_1)
   {
    uint Start_Time = GetTickCount();
    while(Ticket <= 0)
         {
          if(GetTickCount() - Start_Time >
             Waiting_Time * 1000)
            {
             Alert("Time out.");
             break;
            }
          Ticket = OrderSend(……);
          Sleep(100);
         }
   }
 //ショートエントリー
 ……
 return(0);
}
  • if()文の詳細については「こちら」を参照してください。
  • OrdersTotal()関数の詳細については「こちら」を参照してください。
  • GetTickCount()関数の詳細については「こちら」を参照してください。
  • Alert()関数の詳細については「こちら」を参照してください。
  • OrderSend()関数の詳細については「こちら」を参照してください。
  • Sleep()関数の詳細については「こちら」を参照してください。

4.注意点

 上記具体例(その1)において「i++」の部分、及び具体例(その2)において「break;」の部分を記述しなかった場合は、常に条件式を満たすことになり、無限に処理内容を実行し続け(=無限ループ)、プログラムを終了させることができなくなります。

 無限ループを生じさせた場合は、MetaTrader4(MT4)自体を強制終了させなければ、プログラムの実行を終了させることができなくなります

 したがって、繰り返し処理を実行させる場合は、無限ループを生じさせないように、条件式等を設定する、という点に注意する必要があります。

5.関連ツール

MQL言語の学習ができ、裁量トレーダーもEA開発が可能になる!
『EAつくーる』
『EAつくーる』 | fx-on.com

『EAつくーる』
『EAつくーる』 | fx-on.com

 上記ツール(EAつくーる『EAつくーる』 | fx-on.com)の詳細については「こちら『EAつくーる』 | fx-on.com」を参照してください。

インジケーターつくーる
インジケーターつくーる
インジケーターつくーる | fx-on.com

インジケーターつくーる
インジケーターつくーる | fx-on.com

 上記ツール(インジケーターつくーるインジケーターつくーる | fx-on.com)の詳細については「こちらインジケーターつくーる | fx-on.com」を参照してください。

EAつくーる&インジケーターつくーるセット販売
EAつくーる&インジケーターつくーるセット販売
EAつくーる&インジケーターつくーるセット販売 | fx-on.com

EAつくーる&インジケーターつくーるセット販売
EAつくーる&インジケーターつくーるセット販売 | fx-on.com

 上記ツール(EAつくーる&インジケーターつくーるセット販売EAつくーる&インジケーターつくーるセット販売 | fx-on.com)の詳細については「こちらEAつくーる&インジケーターつくーるセット販売 | fx-on.com」を参照してください。


MT4の使い方からプログラミングまで、わかりやすく解説