English

MQL5の書き方(for MQL4デザイナー)

 

2024.01

林貴晴/AMSER Inc.

while, do whileループ

プログラミングにおけるループは、繰り返し処理を実装する基本的な構造です。MQL5では、whileとdo whileループを用いて、条件が真(true)の間、ブロックを繰り返し実行することができます。これらのループは、条件が動的に変化する場合や、事前にループの回数を特定できないシナリオに特に有用です。ここでは、これらのループの使用法と無限ループの危険性について紹介します。

 
whileループ

whileループは、条件が真(true)である限り、ブロックを繰り返し実行します。「条件」はループの各回で評価され偽(false)になるまでループは続けられます。
基本的な構文は次のとおりです。

while (条件) {
  // コード
}
                     

実際に0から9までを出力するコードは次のようになります。

int i = 0;
while (i < 10) {
  Print(i);
  i++;
}
                    
 

解説)
変数iを宣言し0で初期化します。

whileループが始まり、条件i < 10が真(true)であるかどうかを評価します。最初の時点では、iは0なので条件は真(true)です。

条件が真(true)であるため、ブロック内のコードが実行されます。
Print(i)により、iの現在値が出力されます。
i++によってiの値が1増加し、次にwhileの条件判定へと戻ります。

このプロセスがiの値が10になるまで繰り返されます。
iが10になった時点でi < 10の条件は偽となり、ループは終了します。

 
do whileループ

do whileループは、whileループのバリエーションで、違いはブロックが少なくとも1回は実行される点です。
基本的な構文は以下のようになります。

do {
  // コード
} while (条件);
                    
 

この構文では、まずdoに続くブロック内のコードが実行され、その後でwhileに記述された条件が評価されます。この条件が真(true)である限り、ループは繰り返されます。

例えば、0から9までの数字を出力するプログラムをdo whileループを使用して記述すると、次のようになります。

int i = 0;
do {
  Print(i);
  i++;
} while (i < 10);
                    
 

解説)

変数iを0で初期化します。
doブロック内のPrint(i)を実行して、iの値を出力します。
iの値を1増加させます。
while (i < 10)の条件を評価します。この条件が真(true)である場合、ループが繰り返されます。

do whileループの特徴は、条件が初めから偽(false)であったとしても、ループ内のコードが少なくとも一度は実行される点にあります。これは、プログラムが最低限の動作を保証する必要があるシナリオで特に有用です。whileループは条件を確認後にブロックの「コード」を実行します。
そのため、はじめから条件が偽(false)の時には「コード」は一度も実行されません。

 
無限ループの危険性

whileとdo whileループを使用する際には、無限ループに陥らないよう注意が必要です。無限ループはメタトレーダーやコンピュータのクラッシュを招くことがあります。条件式が必ず偽(false)になることを確認し、必要に応じてループ内で条件を変更するコードを含めることが重要です。

 
while/do whileの利点

条件が事前に不明な場合や、ループの回数を事前に設定できない場合に適しています。
また、条件がループの先頭または末尾に明示的に記述されるため、読みやすいコードになります。特にdo whileループは、条件を評価する前に最低一回は処理を実行する必要がある場合に有効です。

 
明示的な条件の例

ライプニッツの公式を用いて円周率の近似値を計算しています。
この方法では、計算を繰り返す回数が多いほど、求める円周率の精度が向上します。
ここでは100,000回の計算を行っており、これはコード中のwhileループを見ることで直ちに理解できます。

double pai=0,i=0;
   while(i < 100000)
      {
      pai += 1 / (i + 1) - 1/ (i + 3);
      i+=4;
      }
   Print("円周率の近似値", pai * 4);                       
                    
 

結果)円周率の近似値3.141572653589808

MQL5でのwhileとdo whileループは、特定の条件下で非常に有効なツールです。ただし、無限ループのリスクを避けるためには、適切な終了条件の設定と変数の更新が必須です。forループと比較して、これらのループはより柔軟で、条件が動的に変化する場合や、ループの繰り返し回数が不明な場合に適しています。適切に使用すれば、MQL5プログラミングの効率と可読性を高めることができます。

 

執筆者紹介
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役。