初めてお越しの方へ

一部のコンテンツはMTPlaceメールマガジンに登録していただくことで閲覧/ダウンロード可能となります。もちろん登録は無料、解除も簡単にできますのでMTPlaceメールマガジン登録よりお気軽にご登録下さい。記事の一覧はサイトマップを御覧ください。

Categories: MQL4の基本

MQL4での制御構造(for文による繰り返し処理)

今回はプログラミングを楽にする for文 の解説をして行きたいと思います。文字列、変数宣言に関しても解説していますので、プログラミング初心者のかたはぜひお読み下さい。
・前回作成した文字をチャートに出力するだけのソース TestIndicator
今回作っていくのは次のようなインジケーターです。

前回と同じく、左上に文字を出力するものです。ただし、今回は複数行の文字を出力していきます。

その前に、プログラミングの経験がない方にとってはあまり意識していないであろう点についてご説明しておきます。
先ほど、「今回は文字を出力する」と申しましたが、これはあまり正確な表現ではありません。
正確に言うと「今回は文字を出力する」となります。
プログラミングの世界では、文字と文字列は区別されています。具体的にはわかりやすく言うと以下のとおりです。

「文字」は半角文字1文字を表し、「文字列」は「文字」が複数集まったものを表す。

全角文字1文字は文字ではなく文字列であることに注意して下さい。今はなんとなくの理解で大丈夫です。ほとんどの場合は「文字列」を使用することになりますから。
では早速作って行きましょう。まずは start 関数を次のように改造してみましょう。

int start()
  {
   Comment("Hello MQL4");
   Comment("Hello MQL4");
   Comment("Hello MQL4");
   Comment("Hello MQL4");
   Comment("Hello MQL4");
   return(0);
  }

同じ文字列を5回出力するわけですから、こんな感じで良さそうですね。ではコンパイルしてチャートにセットしてみて下さい。
・・・1回しか出力されていませんね(^_^;)
これは Comment関数の仕様によるものです。コメント関数は複数回使用された場合、最後のもので上書きされてしまうのです。
従って、この場合は38行目の Comment関数以外は無意味だということです。
ではどうするか。それは「コメント関数を1度しか使わない」ようにすればよいのです。
以下のように書き換えてみましょう。

int start()
  {
   Comment("Hello MQL4 Hello MQL4 Hello MQL4 Hello MQL4 Hello MQL4");
   return(0);
  }

では早速コンパイルして・・・と言いたいところですが、結果がどうなるかは想像ができると思います。そうですね、改行されずに一行で表示されてしまうと思います。
改行するには、”\n”を使用します。改行というものは目で見えないため、プログラミングの世界では特殊なコードを使用して改行を表現するのです。
では、以上を踏まえて以下のようにソースを変更します。

int start()
  {
   Comment("Hello MQL4\nHello MQL4\nHello MQL4\nHello MQL4\nHello MQL4");
   return(0);
  }

どうでしょうか。これで思った通りの文字列を出力できましたね。

文字列中で改行するには
改行コードと呼ばれる”\n”を使用する。

しかし、今回は同じ文字列を5回表示するというものでしたが、これが100回、1000回だとどうでしょうか?ソースに”Hello MQL4\n”を1000回書きますか?
for文を使用すると、この例の場合では”Hello MQL4\n”は1回だけ記述すれば良くなります。

for文の解説に入る前に、「変数」について説明しておきます。「変数」はデータを入れておく箱のようなものです。変数を使うと柔軟なプログラムが書けるようになります。実際に使ってみればすぐに理解できると思いますので簡単な例を示します。
以下は先ほどの start関数を、変数を使用して書き換えたものです。

int start()
  {
   string moziretu;
   moziretu = "Hello MQL4\nHello MQL4\nHello MQL4\nHello MQL4\nHello MQL4";
   Comment(moziretu);
   return(0);
  }

35行目で変数”moziretu”に”Hello MQL4\n”を5個入れて、36行目のComment関数で使用しています。通常の算数では「A = B」というのはAとBは等しいという意味になりますが、プログラミングの世界では、「AにBを入れる(代入)」という意味になります。
ここで忘れてはならないのが、34行目の「変数宣言」の部分です。
変数”moziretu”の前に、”string”という記述がありますが、これは変数”moziretu”は”string”型の変数として使用しますという意味です。
“string”型とは”文字列”を表すデータ型です。
このように、変数を使用するには、まずその変数のデータ型を指定して変数宣言する必要があるのです。もし34行目の変数宣言が抜けていた場合、コンパイル時に「変数”moziretu”が宣言されていません」というエラーが出ます。また、ここで宣言したデータ型以外のものを入れようとしてもエラーが出ます。以下が変数宣言の形式です。

変数の型 変数名;

では、for文の解説に入りたいと思います。以下がfor文の形式です。

for(カウンタ変数の初期化; 継続条件; カウンタのアップまたはダウン)
{
   // 繰り返し処理の内容
}

例えば5回処理を繰り返したい場合、以下のようになります。

for(int i = 0; i < 5; i++)
{
   // 繰り返し処理の内容
}

また突然”int”なるものが出て来ましたね。1行目の “int i = 0″で、int型のiという変数を宣言しつつ、0で初期化しています。
int型というのは整数型という意味です。いったんは小数点の付かない数字とでも覚えておけばよいでしょう。もちろん-1や-2も整数です。
で、先ほどのfor文を日本語で表現すると以下のようになります。
「最初に変数iを0で初期化して、その後変数iを1づつ増やしながら、iが5未満である間”{“~”}”の処理を繰り返す」
i++というのは変数iの内容を+1するという意味です。最初は分かりにくいかもしれませんが、少しづつ慣れていきましょう。
では、最終的にfor文を使って5回同じ文字列を出力する場合のソースを見て行きましょう。

int start()
  {
   string moziretu = "";
   for(int i = 0; i 

34行目で"string"型の変数"moziretu"を宣言し、同時に文字列無しで初期化しています。
35行目で、カウンタ変数iを0で初期化しています。まず、変数iは0ですので、0は5より小さいという条件を満たしますから、for文の1回めの処理が開始されます。1回終わったら、変数iは0から1になり、1は5より小さいという条件を満たすので2回めの処理へ...と言った具合に繰り返されていきます。
37行目が実際の処理になります。この意味は、変数"moziretu"に、"moziretu"の内容と"Hello MQL4\n"を結合したものを入れる、という意味です。結果として、この処理が繰り返されるたびに変数"moziretu"の内容に"Hello MQL4\n"が追加されていきます。この場合の"+"記号は、普通の算数で言う「加算」ではありません。文字列と文字列の間に"+"が使用された場合、それらをつなぐという意味になります。
for文が5回繰り返されると、自動的に処理が下へと流れ、39行目の処理が実行されます。これで無事"Hello MQL4\n"が5回出力されました。
仮に1000回繰り返したい場合、for文の"for(int i = 0; i 複数行の文字をチャートに出力するソース TestIndicator

だいご