この記事ではwhile()文についての解説やプログラム書き方やサンプルコードを紹介致します。
1.while()文とは
while()文とは、回数を指定せずに、一定の処理を繰り返して実行させるために使用するものです。
while()文の書式は、以下のとおりです。
{
処理内容
}
2.サンプルコード(その1)
以下のようなスクリプトを作成して実行すると、「ターミナルウィンドウ」の「エキスパート」タブに、「メッセージ」という文字列が5回表示されます。
#property strict
#property show_confirm
void OnStart()
{
int i = 1;
while(i <= 5)
{
Print("メッセージ");
i++;
}
}
上記プログラムは、以下のような動作をしています。
- カウンタ変数に初期値を代入する
while()文は、for()文とは異なって、それ自体の書式では一定の処理を繰り返す回数が指定されません。
(for()文の詳細については「こちら」を参照してください。)
そこで、while()文を用いて、一定の処理を繰り返す回数を指定したい場合は、あらかじめ一定の処理を繰り返す回数をカウントする変数を宣言しておく必要があります。
上記具体例においては、変数「i」に「1」が代入されます。 - 条件式による比較がなされる
「i」には「1」が代入されているので、条件式「i <= 5」(「i」は「5」以下)を満たしています。 - 処理内容が実行される
「Print(“メッセージ”);」という処理が実行され、その後、「i++」の実行により、「i」には「2」(=1+1)が代入されます。
(Print()関数の詳細については「こちら」を参照してください。) - 条件式による比較がなされる
「i」には「2」が代入されているので、条件式「i <= 5」(「i」は「5」以下)を満たしています。 - 処理内容が実行される
「Print(“メッセージ”);」という処理が実行され、その後、「i++」の実行により、「i」には「3」(=2+1)が代入されます。 - 以降は、「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秒間以上、注文が約定しなかった場合には、何らかのエラーが発生しているものとして、発注を止めることができます。
#property strict
//変数の宣言
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)自体を強制終了させなければ、プログラムの実行を終了させることができなくなります。
したがって、繰り返し処理を実行させる場合は、無限ループを生じさせないように、条件式等を設定する、という点に注意する必要があります。