メタトレーダー講義 第六回ループと分岐第二部 | ボブのブログ

メタトレーダー講義 第六回ループと分岐第二部

この文章はCodersGuruさんのMQL4Lesson4の訳文です。(翻訳しての転載に本人の許可はとってあります)              
                     MQL4講座                          
                     Coders'guru               
                      www.forex-tsd.com                                  
                           -6-
                     ループと分岐
                          第二部
                      -------------------

第六回目のMQL4講義にお越し頂きありがとうございます。
前回の授業は楽しんでいただけましたでしょうか?

前回の授業では、ループについてお話しいたしました。
そして、一般的な一番上から下へとプログラムを実行していく流れを変える方法は二つあり、ループはそのうちの一つだとお話しいたしました。二つはめは、分岐です。

分岐がプログラムの中にあると、一回だけ、式の値によって別のプログラム部分へと飛び越します。
今からMQL4で使用可能な分岐ステートメントを紹介していきます。


ifステートメント

ifステートメントは 最も単純なステートメントです。例えば
____________________________________________________________________________________________
if(x<100)
print("hi");
____________________________________________________________________________________________

ifキーワードの後には括弧が続きます。括弧の中身はテスト式x<100)が入ります。テスト式の値がtrue(真)だった時はif本体が(Print("hi"))を実行します。値がFalseだった時はコントロール(何を実行するかを決めるもの)はif区間から抜け出し後に続くステートメントに移行します。

これがifステートメントを示すフローチャートです。
ifflow.png


if本体の中の複数ステートメント

ループのように、大括弧で区切ることによって、2つ以上のステートメントをif本体の中にいれることができます。(本体とは実際に実行されるコードの部分のことを指します。例では{}で囲まれた部分が本体です。)

____________________________________________________________________________________________
if(current_price==stop_loss)
{
     Print("you have to close the order");
     PlaySounde("awrning.wav");
}____________________________________________________________________________________________
==の記号に注目してください。 これは第四回講義、演算子と式で学んだ関係演算子です。
これを代入演算子である=と間違えてエラーをすることが頻繁におこるので気をつけてください。

ネスティング(複数の命令群をひとまとまりの単位にくくり(まとまりをネストといいます。)、ネストを何段階にも組み合わせていくことでプログラムを構成すること。)

ループと分岐構造は、お互いを本体の中に縫い付けることができます。あなたはifステートメントの中にループステートメントをいれることもできますし、その逆もできますし、ifステートメントの中にifステートメントをいれたりすること等もできます。

これは例です。
____________________________________________________________________________________________
for(int i=2 ; i<10 ; i++)
     if(i%2==0)
{
         Print("It's not a prime nomber");
PlaySound("warning.wav");
}____________________________________________________________________________________________
この例では、forループの中に、if構造が入り込んでます。
あなたはループ本体の周りに大括弧が無いのに気がつくでしょう。これは、ifステートメントと、ステートメント本体(ここではループ本文)の中にあるステートメントは、一つのステートメントとして考えられているからです。

if...elseステートメント
ifステートメントはもし条件がtrue(真)だった時のみ、何か実行させるようにしますが、もしfalse(偽)が出た時に違うことを実行させたいとおもったならば、if...elseステートメントの出番になります。
記述の仕方は、ifステートメント後に続くステートメントやステートメントのまとまりを書き終えた後に、elseキーワードとそれに続く他のステートメントもしくはステートメントのまとまりを書き込むのです。
例を見るほうが早いのでこちらをご覧ください。
____________________________________________________________________________________________
if(current_price>stop_lose)
     Print("It's too late to stop,please stop!");
else
     Print("you playing well today!");
____________________________________________________________________________________________
もしifステートメントのテスト式がtrue(真)なら、プログラムは最初のメッセージを表示し、もしもtrueでないなら、後の方のメッセージを表示します。

これは、if...elseステートメントのフローチャートです。
ifif.png


if...elseのネスティング

if...elseステートメントの中にifステートメントをいれたり、if...elseステートメントの中にif...elseステートメントを入れることができます。

このような感じです。
____________________________________________________________________________________________
if(current_price>stop_lose)
     Print("It's too late to stop,please stop!");
if(current_price==stop_lose)
     Print("It's time to stop");
else
     Print("you playing well today!");
____________________________________________________________________________________________
if..elseステートメントをネスティングするとちょっとした問題があります。うっかりelseを、意図していなかったif文とくつけてしまうのです。

この問題を解決するためには、二つの方法がありすのでどちらかをお使い下さい。

1-if...elseを括弧でくくって自分の対応させたいifとペアにして分けてください。このように
____________________________________________________________________________________________
if(current_price>stop_lose)
{
     Print("It's too late to stop,please stop!");
if(current_price==stop_lose)
     Print("It's time to stop");
else
     Print("you playing well today!");
}____________________________________________________________________________________________

2-もしあなたが上の解決策ができない(たくさんのif...elseステートメントがあるもしくは、めんどくさくてわけたくない等)場合は、以下のルールを守ってください。
elseは一番近くにあるifとくっつきます(上の例では、if(current_price==stop_lose)が一番近いif文ですね。)


switchステートメント

もし大きな分岐構文があって、すべての分岐が同じ変数値を使っているときは、switchステートメントを使うのはいかがでしょうか。

以下例文です。
____________________________________________________________________________________________
switch(x)
{
case'A'