while()文

1.while()文とは

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

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

while(条件式)
        {
          処理内容
        }

2.具体例(その1)

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


#property show_confirm

#property strict

void OnStart()
{
 int i = 1;
 
 while(i <= 5)
      {
       Print("メッセージ");
       
       i++;
      }
}

Example Result

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

  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()文を抜けてプログラムは終了します。

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

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

3.具体例(その2)

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


//変数の宣言
input uint Waiting_Time = 10;
……
void OnTick()
{
 ……
 //エントリー処理
 //ロングエントリー
 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);
         }
   }
 //ショートエントリー
 ……
}
  • if()文の詳細については「こちら」を参照してください。
  • OrdersTotal()関数の詳細については「こちら」を参照してください。
  • GetTickCount()関数の詳細については「こちら」を参照してください。
  • Alert()関数の詳細については「こちら」を参照してください。
  • OrderSend()関数の詳細については「こちら」を参照してください。
  • Sleep()関数の詳細については「こちら」を参照してください。

4.注意点

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

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

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

5.関連ツール

インジケーターつくーる

インジケーターつくーる
MQL言語の学習ができ、裁量トレーダーもインジケーター開発が可能に
MQL言語の学習ができ、裁量トレーダーもインジケーター開発が可能に?|?fx-on.com
fx-onで購入する

 プログラミングの知識がなくても、ほぼマウスで選ぶだけで独自のインジケーターを作成することができるツールです。

 以下は、「インジケーターつくーる」の紹介動画です。

EAつくーる

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

 MT4で作動するEAをプログラミング不要で作成するためのツールです。

特 徴

  • インジケーターを組み合わせることで、EAを簡単に作ることができます。
    インジケーターは、MT4に標準で装備されているもののほか、市販のものも使用することができます
  • EAはmq4ファイルで作成されるので、mqlの学習にも役立ちます。
  • 作成したEAの著作権は本ツールを使用してEAを作成した本人に属し、販売なども自由です
  • シンプルなロジックのEAから高度なオプション付きのEAまで、簡単に作成することができます。

セット

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

 「インジケーターつくーる」と「EAつくーる」をそれぞれ単品で購入すると、合計34,600円(税込)必要となるところ、両者をセット購入することによって、13%OFFの29,800円(税込)で購入することができます。