pekonoriブログ関連

Expert Advisor Programming for MetaTrader5【日本語訳 第四章】条件&ループ演算子

  1. HOME >
  2. pekonoriブログ関連 >

Expert Advisor Programming for MetaTrader5【日本語訳 第四章】条件&ループ演算子

条件付き&ループ演算子 P39

条件演算子 P39

プログラムのもっとも基本的な機能の1つは意思決定です。条件演算子は、真/偽の条件を評価して決定を下すために使用されます。MQL5には3つの条件演算子があります。if-else演算子、三項演算子、swich-case演算子です。

if演算子 P39

if演算子についてはすでに紹介しました。if演算子はMQL5で最も一般的な条件演算子であり、頻繁に使用するものです。これは複合演算子です。つまり、通常、演算子内に複数の式が含まれます。

if演算子は、条件をtrueまたはfalseとして評価します。条件は、リレーショナル演算またはブール演算にすることができます。条件が真の場合、複合演算子内の式が実行されます。条件がfalseの場合、制御はコードの次に渡されます。簡単なif式を見てみましょう。

                  bool condition == true;

                  if(condition == true)     // 括弧内の条件が真の場合・・・

                  {

    Print(true);            // 括弧内のコードを実行

}

conditionという名前のブール変数を宣言し、その値をtrueに設定します。次に、if演算子でブール条件を評価します。この場合、条件==trueであるため、括弧内のコードを実行すると、trueの値がログに出力されます。

if複合演算子に式が1つしかない場合は、大括弧({})を省略して、if演算子と同じ行に配置できます。次の行に式を配置することもできます。これは単一の式でのみ機能し、その式はセミコロンで終了する必要があることに注意してください。

                  //単線

                  if(condition == true) Print(true);

                  //複数行

                  if(condition == true)

                     Print(true);

複数のif式を並べて指定できます。各if式は個別に評価されます。以下の例では、2つのif演算子が関係演算を評価しています。2は1より大きく3より小さいため、両方のPrint()関数が実行されます。

                  int number = 2;

                  if(number > 1) Print(“number is greater than 1”);

                  if(number < 3) Print(“number is less than 3”);

                  // 結果 : 数値が1より大きい

                  //            数値が3より小さい

else演算子 P40

else演算子は、if演算子の仲間です。if演算子の後にelse演算子を置きます。if演算子がfalseと評価されると、else演算子内の式が代わりに実行されます。

                  bool condition = false;

                  if(condition == true) Print(true);        //条件が真の場合

                  else Print(false);                     //条件が偽の場合

                                            // 結果 : false

この例では、if演算子がfalseと評価されるため、else演算子内の式が実行され、falseの値がログに出力されます。else演算子はほかのすべての条件がfalseのときに実行する既定のアクションがある場合に便利です。

else演算子はif演算子と組み合わせることができ、複数の条件を評価できます。1つ以上のelse if演算子がif-elseブロックに配置されている場合、最初のtrue条件によってif-elseブロックの実行が終了します。else if演算子は、最初のif演算子の後、else演算子の前に配置する必要があります。

                  int oneOrTwo = 2;

                  if(oneOrTwo == 1)

                     Print(“oneOrTwo is 1”);

                  else if(oneOrTwo == 2)                 // 前のif演算子がfalseの場合

                     Print(“oneOrTwo is 2”);

                  else                                  // 両方のif演算子がfalseの場合

                     Print(“oneOrTwo is not 1 or 2”);       // 結果 : oneOrTowは2です

この例では、整数変数oneOrTwoを宣言し、値2を割り当てます。if演算子の条件oneOrTwo==1はfalseであるため、else if演算子に進みます。else if演算子条件oneOrTwo==2が真であるため、文字列「oneOrTwo is 2」がログに出力されます。

ifおよびelse if演算子は、いずれかが trueと評価されるまで順番に評価されます。 ifまたは else if演算子がtrueと評価されると、演算子内の式が実行され、プログラムはif-elseブロックの後で実行を再開します。ifまたはelse演算子のいずれもtrueと評価されない場合は、else演算子内の式が代わりに実行されます。

例えば、oneOrTwoに値1が割り当てられている場合、最初のif演算子の式oneOrTwo==1はtrueになります。「oneOrTwo is 1」というメッセージがログに出力されます。次のelse ifおよびelse演算子は評価されません。プログラムはelse演算子の後に実行を再開します。

ifおよびelse if演算子がすべてfalesの場合、else演算子の式が実行されます。この場合、「oneOrTwo is not 1 or 2」というメッセージがログに出力されます。

                  int oneOrTwo = 3;

                  if(oneOrTwo == 1)

                     Print(“oneOrTwo is 1”);

                  else if(oneOrTwo == 2)

                     Print(“oneOrTwo is 2”);

                else                               // 結果 : oneOrTwoは1または2ではありません。

                     Print(“oneOrTwo is not 1 or 2”);

if-elseブロックでは、else演算子は必要ないことに注意してください。存在する場合は、ifまたはelse if演算子の後にくる必要があります。複数のelse if演算子を使用することも、全く使用しないこともできます。それはすべてあなたの要件に依存します。

三項演算子 P41

三項演算子はif-else演算子の単一行のショートカットです。三項演算子は3つの部分で構成されます。最初の部分は、評価される真/偽の条件です。2番目の部分は、条件が真の場合に実行される式です。3番目の部分は、条件がfalseの場合に実行される式です。式の結果は変数に割り当てられます。次に例を示します。

                  bool condition = true;

                  bool result = condition ? true : false;

                  Print(result);                         // 出力 : true

conditionという名前のブール変数を宣言し、値をtrueに設定します。この変数は、三項演算子の条件として使用されます。疑問符(?)は、条件と式を区切ります。最初の式は真の値をブール変数の結果に割り当てます。2番目の式はfalseの値を変数resultに割り当てます。式はコロン(:)で区切られます。

この場合、条件==trueであるため、最初の式trueが変数resultに割り当てられます。if-else演算子を使用してこれを表現する方法を次に示します。

                  bool condition = true;

                  bool result;

                  if(condition == true) result = true;

                  else result;

                  Print(result);          //出力 : true

三項演算子を使用して2行のコードを保存しました。どちらを使用するかはあなた次第です。

演算子の切り替え P42

switch演算子は、case演算子を使用して式を定数値のリストと比較します。定数値が一致すると、付随する式が実行されます。次に例を示します。

                  int × = 1;

                  switch(x)

                  {

                      case 1:

                                   Print(“x is 1”);             //出力 × is 1

                     case 2:

                                   Print(“x is 2”);

                                   break;

                     default:

                                   Print(“x is not 1 or 2”);

}

整数変数xを宣言し、値1を割り当てます。スイッチ演算子には、評価する式が含まれています。この場合、式は変数xです。ケース演算子はラベルであり、それぞれに異なる定数値が割り当てられています。xは1に等しいため、文字列“x is 1”がログに出力されます。break演算子は、switch演算子の実行を終了します。

switch演算子内の式がどのcase演算子とも一致しない場合は、代わりにオプションのdefault演算子が実行されます。例えば、xが、どのケース演算子にも一致しない場合、デフォルト演算子の後の式が代わりに実行されます。したがって、xに値3が割り当てられた場合、文字列「xは1または2ではありません」がログに出力されます。

if-elseブロックとは異なり、switch演算子ブロックの実行は、ケース定数が一致しても停止しません。break演算子が検出されない限り、switch演算子の残りのすべての式が実行されるまで実行が続けられます。次に例を示します。

                  int x = 1;

                  switch(x)

{

                     case1:

 case2:

case3:

    Print(“x is 1, 2 or 3”);       // 出力 : x is 1, 2 or 3

    break;

default:

    Print(“x is not 1 ,2 or 3”);

    break;

ケース1またはケース2レベルの後に式が無いことに注意してください。これらのラベルのいずれかが一致する場合、プログラムは、break演算子に遭遇するか、default演算子に遭遇するか、switch演算子が終了するまで、ケースラベルに続く式の実行を開始します。

この例では、変数xの値は1です。式xは最初のケースレベルに一致します。実行ケース3ラベルを過ぎてPrint()関数まで続きます。文字列“x is 1 ,2 or 3”がログに出力され、break演算子がswitchブロックを終了します。Xがどのケースラベルとも一致しない場合は、代わりにdefault演算子の式が実行されます。

switch演算子は、いくつかの特定の状況で役立ちます。ほとんどの場合、if-elseブロックも同様に機能しますが、switch-caseブロックの方が効率的でコンパクトな場合があります。switch-caseブロックの便利な例を次に示します。このコードはチャート期間を分単位で評価し、チャート機関がいくつかの一般的なチャート機関と一致する場合は文字列を返します。

                  int period = _Period;

                  string printPeriod;

                  switch(period)

                  {

            case 60:

                                   printPeriod = “H1”;

                                   break;

                      case 240:

                                   printPeriod = “H4;

                                   break;

case 1440:

                                   printPeriod = “D1

                                   break;

                      dfault:

                                   printPeriod = “M” + period;

}

整数変数periodには、事前定義された_Period変数を使用して、現在のチャートの期間(分単位)が割り当てられます。switch演算子は、期間をH1、H4、D1などのいくつかの一般的なチャート期間と比較します。期間が一般的なチャート機関のいずれかに一致する場合、適切な文字列が文字列変数printPeriodに割り当てられます。これらのチャート期間のいずれも一致しない場合、接頭辞「M」と分単位の期間を使用してチャート期間、文字列が作成されます。

たとえば、期間が240の場合、変数printPeriodには文字列「H4」が割り当てられます。期間が15の場合、default演算子に続く 式が実行され、printPeriodに文字列「M15」が割り当てられます。変数printPeriodを使用して、わかりやすいチャート期間をログまたは画面に出力できます。

ループ演算子 P44

プログラムでアクションを何度も繰り返す必要がある場合があります。このために、ループ演算子を使用します。MQLには、while、do-whileおよびforの3つのループ演算子があります。

Whil演算子 P44

WhileループはMQLで最も簡単なループです。While演算子は、ブール条件または関係条件をチェックします。条件が真の場合、括弧内のコードが実行されます。次に例を示します。

                  bool loop = true;

                  int count = 1;

                  while(loop == true)

                  {

                      Print(count);                // 出力 : 1 ,2 ,3 ,4 ,5

                      if(count == 5) loop = false;

                      count++;

}

まず、ループ条件として使用するloopという名前のブール変数を宣言します。また、countという名前の整数変数を宣言し、それを1に初期化します。While演算子は、変数loop==trueかどうかを確認します。その場合、括弧内のコードが実行されます。count変数の値をログに出力します。次に、count==5かどうかを確認します。そうであれば、loop=falseを設定します。最後にcountを1インクリメントし、ループ条件を再度チェックします。このループの結果、1~5の数字がログに出力されます。

count == 5の場合、ループ変数はfalseに設定され、while演算子の条件はtrueではなくなります。したがって、ループは実行を停止し、制御は閉じ括弧の後の式に渡されます。関係条件を使用した2番目の例を見てみましょう。

                  int count = 1;

                  while(count <= 5)

                  {

                  Print(count);             //出力 : 1 ,2 ,3 ,4 ,5

                  count++;

}

このコードは上記のループと同じ結果を生成します。この例ではcount変数がループ条件として使用されます。countが5以下の場合、ループが実行されます。ループが実行されるたびにcountが1づつインクリメントされ、結果がログに出力されます。countが5を超えると、ループは終了します。

whileループの条件は、ループの開始時にチェックされます。条件がfalseの場合、ループは実行されません。ループの最後で条件を確認する必要がある場合、またはループを少なくとも1回実行する必要がある場合は、do-whileループを使用します。

do-while演算子 P45

do-while演算子は、ループの開始時にチェックします。これは、ループが常に少なくとも1回は実行されることを意味します。

                  int count = 1;

                  do

                  {

                      Print(count);       // 出力 : 1 ,2 ,3 ,4 ,5

                      count++;

}

while(count < 5)

繰り返しますが、これは前のwhileループの例と同じですが、この場合はcountの値が少なくとも1回ログに出力されます。たとえば、count==1の場合、1~5の数字がログに出力されます。count==6の場合、数値6がログに出力されます。

whileループとdo-whileループの両方で、ループの実行を停止する条件は、ループ中のある時点で発生するか、ループとは無関係に発生する必要があります(外部イベントなど)。ループを停止する条件が発生しない場合、無限ループが発生し、プログラムがフリーズします。次に例を示します。

                  bool loop = true;

                  int count;

                  do

                  {

                      Print(count);

                      count++;

}

while(loop == true)

変数loopは常にtrueであるため、この例は無限にループします。

ループを何回実行する必要があるかわからない場合、またはループ条件としてブール条件を使用する必要がある場合は、whileループを使用します。ループを実行する必要がある回数がわかっている場合、またはより高度な反復が必要な場合は、代わりにforループを使用してください。

for演算子 P46

整数変数を使用してル-プを反復処理する場合(前の例のcount変数など)、forループを選択することをお勧めします。for演算子には、セミコロンで区切られた3つの式が含まれています。

  • 最初の式は、ループの開始時に初期化する変数です。この変数は通常、ループを反復処理するために使用されます。
  • 2番目の式はループ条件です。これは一般的に関係式です。この式がtrueの場合、ループが実行されます。falseの場合、ループは終了します。
  • 3番目の式は、各ループの最後に実行されます。これは、通常イテレータ変数をインクリメントするための数式です。

forループの例を次に示します。

                  for(int count = 1; count <= 5; count++)

                  {

                      Print(count);

}

for演算子の最初の式int count=1はcountという整数変数を宣言し、それを1に初期化します。2番目の式count<=5はループ条件です。countが5以下の場合、ループが実行されます。3番目の式count++は、各ループの最後に実行されます。この式はcount変数を1づつ増やします。最初と2番目の式の後にセミコロンがあることに注意してください。3番目の式の後にはありません。

前の例と同様に、このコードは1~5の数字をログに出力します。上記のコードを前のページのwhileループの例と比較すると、forループの方がコード行数が少なくて済みます。whileループでできることはほぼすべてforループでも実行できます。

forループ内の3つの式はどれも省略できますが、式を区切るセミコロンはそのままにしておく必要があります。2番目の式を省略すると、ループは常に真であるとみなされるため、無限ループになります。

forループの最初の式で複数の変数を宣言したり、forループの3番目の式で複数の式を計算したりできます。追加の式はコンマで区切る必要があります。

例えば:

                  for(int a = 1, b =2, a <=5; a++, b += 2)

                  {

                      Print(“a=”, a, “ b=”, b);      // 出力 : “a=1 b=2”, ”a=2 b=4”, etc..

}

2つの整数変数aとbを宣言し、それぞれ値1と2で初期化します。ループは、aが5以下の場合に実行されます。ループの反復ごとに、aは1ずつ増加しbは2ずつ増加します。aとbの値は、反復ごとにログに出力されます。

break演算子 P47

反復が完了する前、または特定の条件が満たされたときに、ループを終了する必要がある場合があります。break演算子は最も近いwhile、do-whileまたはforループをすぐに終了します。また、42ページで説明されているように、switchオペレータも終了します。

通常、break演算子は、特定の条件が満たされたときにループを終了するために使用されます。

例えば:

                  for(int count = 1; count <= 5; count++)

{

                      if(count == 3) break;

                      Print(count);          // 出力 : 1, 2

}

この例ではcount==3のときにbreak演算子が呼び出されforループが終了します。

continue演算子 P48

continue演算子はbreak演算子と同様に機能します。ループを完全に終了する代わりに、continue演算子はループの現在の反復を終了し、次の反復にスキップします。

                  int count = 1;

                  while(count <= 5)

{

                      if(count == 3) continue;

                      Print(count);          // 出力 : 1, 2, 4, 5

}

この例では、3を除くすべての値について、countの値をログに出力します。

≪≪【日本語訳 第三章】操作

【日本語訳 第五章】≫≫

-pekonoriブログ関連