【MQLプログラミング基礎】配列の使い方をマスターしよう!プログラム例あり

【初級編】MQLプログラミング基礎
朝日奈りさ
朝日奈りさ

配列は、変数の集合体!電車の連結をイメージしよう!

配列とは?

「プログラミングって、変数をたくさん作らないといけないから大変だなぁ」と思っている方は、ぜひ配列を学習しましょう!

配列とは、同じ型の変数を1列に並べたものです。

イメージとしては、電車をイメージすると分かりやすいと思います。

電車の車両のように、変数同士を繋げたり、切り離したりできます。

 

また、変数は1つの値しか代入できませんが、配列にはたくさんの値を代入することができます。

そのため配列は、複雑なプログラムをスッキリさせたり、大量のデータを一度に処理させたりできます。

「変数がわからないよ!」という方は、先に下の記事を読んでみると、分かりやすいです。

 

配列の書き方

配列の書き方は以下のパターンが多いです。

・配列のデータ型の宣言
・配列の初期化

・配列に値を代入

1つずつ見ていきましょう。

 

配列のデータ型の宣言する方法

まず初めに、配列のデータ型の宣言をします。

これは変数の時と同じですね。

よく使うのは「int型」「double型」「string型」です。

宣言するやり方は、パターンが決まっているので、覚えてしまいましょう。

「データ型をよく知らない」という方は、こちらが参考になります。

 

配列の宣言は以下のように書きます。

//配列の宣言
   int array[3];

 

これは3つの変数が入る、arrayという名前の配列を宣言しています。

ここでは「int型」です。

「array[]」のカギ括弧の数値を変えることで、任意の個数が入る配列を宣言することができます。

例えば、「array[1000]」のように宣言すると、1000つの変数が入る配列を作成できます。

このように配列は、カギ括弧に数値を入れる必要がありますが、基本的には変数と同じように宣言することが分かると思います。

 

【中級者編】静的配列と動的配列


静的配列は上記の例のように、数値を入れた配列です。
int array[3]のように宣言します。

動的配列は、数値を入れない配列です。
int array[]のように宣言します。

違いは、データの量を制限するかしないかです。
動的配列は、何個でもデータを入れることができます。
しかし、特殊な関数を使うため、静的配列で慣れてから使うことをオススメします。

 

配列を初期化する方法

配列は宣言したら、次に初期化を行いましょう。

実は初期化しなくても大丈夫なのですが、配列に何もデータが入っていない状態だと、エラーが出てしまうため、初期化はやっておいた方が無難です。

int型の場合、初期化とは配列の全てに「0」を入れることです。

 

今回は、以下の書き方を紹介します。

//配列の初期化
   ArrayInitialize(array,0);

 

「ArrayInitialize」という関数を使っています。

この関数は、MQLに組み込まれている関数なので、自分で作成する必要はありません。

いつでも使うことができます。

 

ArrayInitializeは引数が2つあります。

・1つ目には「array」が入っています。先程宣言した配列です。
・2つ目には「0」が入っています。この数値を配列全てに代入します。

つまり、「ArrayInitialize(array,0)」と書くだけで、以下のプログラムを実行したことになります。

//配列全てに「0」を代入
array[0] = 0;
array[1] = 0;
array[2] = 0;

 

このように配列の初期化は「ArrayInitialize」だけ覚えていれば、問題ないため、覚えておくと良いでしょう。

ちなみに、今回は「int型」の初期化を行いましたが、どのデータ型でも「ArrayInitialize」で初期化できます。

その場合は「0」ではなく、データ型に合った値を書いてください。

例えば、string型なら「ArrayInitialize(array, “”);」といった感じです。

配列の番号は0からスタートします。
なぜ0から始まるのかは、難しすぎるので割愛します。

 

配列に値を代入する方法

初期化の後は、値を代入していきます。

具体的には、以下の2つの方法があります。

・1つ1つ代入する
・for文と組み合わせる

それぞれ見ていきましょう。

 

1つ1つ代入する

このやり方が一番簡単ですが、どうしても書く量が多くなってしまうため、ミスに注意しましょう。

メリットは、自由な値を代入できることです。

そのため、文字列を配列として使いたい時などに、この方法でやると良いでしょう。

書き方は、以下のように1つ1つ代入します。

//配列に値を代入
array[0] = "りんご";
array[1] = "ゴリラ";
array[2] = "ラッパ";

 

このように、配列の要素に1つ1つ代入します。

今回は3つしか書いていませんが、配列の量が多くなると、そのぶん書く量が増えます。

 

for文と組み合わせる

こちらがオススメの方法です。

配列を使う場合、計算結果を代入することが多いです。

具体的には以下のようなプログラムです。

//配列に値を代入
   for(int i = 0; i < 3; i++)
     {
      array[i] = i+1;
     }

 

今回は、「i+1の計算結果を、配列に代入する」というプログラムを作成しました。

このように、一定の計算の結果を代入する場合は、for文と組み合わせると良いでしょう。

ちなみに、ほとんどのプログラムは、この方法で書かれています。

for文をマスターしていないかたは、こちらの記事を参考にしてください。

 

配列を使うと何が便利なのか

配列が便利なのは以下3点ができるからです。

・複雑なプログラムがスッキリする
・大量のデータを処理できる
・順番が重要なデータを扱いやすい

それぞれ解説します。

 

複雑なプログラムがスッキリする

たくさんの変数を使う場合を考えます。

そのときプログラムは、以下のように複雑なものになるでしょう。

//変数を宣言し、代入する
int hensu1 = 1;
int hensu2 = 2;
int hensu3 = 3;
int hensu4 = 4;
int hensu5 = 5;
int hensu6 = 6;
int hensu7 = 7;
int hensu8 = 8;
int hensu9 = 9;
int hensu10 = 10;

//変数の値を表示する
Print(hensu1);
Print(hensu2);
Print(hensu3);
Print(hensu4);
Print(hensu5);
Print(hensu6);
Print(hensu7);
Print(hensu8);
Print(hensu9);
Print(hensu10);

 

10個の変数を宣言し、値を代入した後に、表示するプログラムです。

この例だと、複雑に見えないかもしれません。

しかしプログラミングのレベルが上がってくると、ものすごく複雑で、読み辛いプログラムになってきます。

配列を使わないと、何をプログラムしているのか分からなくなるというレベルです。

 

これを配列を使って書くと、以下のようになります。

//配列の宣言
   int array[10];

//配列に値を代入
   array[0] = 1;
   array[1] = 2;
   array[2] = 3;
   array[3] = 4;
   array[4] = 5;
   array[5] = 6;
   array[6] = 7;
   array[7] = 8;
   array[8] = 9;
   array[9] = 10;

//配列の値を表示
   Print(array[0]);
   Print(array[1]);
   Print(array[2]);
   Print(array[3]);
   Print(array[4]);
   Print(array[5]);
   Print(array[6]);
   Print(array[7]);
   Print(array[8]);
   Print(array[9]);

 

先程とほとんど変わってないように見えます。

むしろ配列を使ったために、分かりにくくなっているように思えます。

ちなみにarray[]が配列です。今回は10個の変数の集合体です。

 

このような配列は、for文と組み合わせることで、下のようなスッキリとしたプログラムになります。

//配列の宣言
   int array[10];

//配列の初期化
   ArrayInitialize(array,0);

//配列に値を代入
   for(int i = 0; i < 10; i++)
     {
      array[i] = i+1;
     }

//配列の値を表示
   for(int i = 0; i < 10; i++)
     {
      Print(array[i]);
     }

 

行数が減り、少しスッキリしたように見えませんか?

プログラムを書く量が減り、疲れも溜まりにくいでしょう。

ちなみに、このプログラムを書いていて気づきましたが、配列を使った方が書くスピードが圧倒的に早いです。

というのも、「代入」と「表示」の部分はコピペで済んだからです。

このようにプログラムの見た目がスッキリするだけでなく、書くスピードも格段にアップさせることができるのが配列です。

 

大量のデータを処理できる

先程のプログラム例では、10個の変数を使っていましたが、今回は1,000,000個の変数を使う場合を考えます。

当然ながら、手動で1,000,000個の変数を宣言することは不可能だと思います。

宣言できたとしても、取り扱うことは難しいでしょう。

この場合でも配列を利用すると、とても便利です。

 

以下のプログラム例を見てください。

//配列の宣言
   int array[1000000];

//配列の初期化
   ArrayInitialize(array,0);

//配列に値を代入
   for(int i = 0; i < 1000000; i++)
     {
      array[i] = i+1;
     }

//配列の値を表示
   for(int i = 0; i < 1000000; i++)
     {
      Print(array[i]);
     }

 

先程のプログラム例とほとんど同じです。

しかし、今回のプログラムは1,000,000個の変数の集合体です。

2行目を見てください。以下のプログラムが書かれています。

int array[1000000];

 

1,000,000個の値を代入できる配列を宣言しています。

この1行だけで、1,000,000個の変数を宣言したことと同じなのです。

このように配列を使うと、手動では到底できないプログラミングを、とても簡単に書くことができます。

 

順番が重要なデータを扱いやすい

順番が重要なデータを扱いやすいことも、配列の特徴です。

例えば「時間」です。

1時 → 2時 → 3時 → ・・・ → 12時 と、順番がとても重要です。

2時 → 1時 は絶対にあり得ません。

この場合でも配列が役に立ちます。

 

下のプログラム例を見てください。

//配列の宣言
   int times[12];

//配列の初期化
   ArrayInitialize(times,0);

//配列に値を代入
   for(int i = 0; i < 12; i++)
     {
      times[i] = i+1;
     }

//配列の値を表示
   for(int i = 0; i < 12; i++)
     {
      Print(times[i+1]);
     }

 

またまたプログラムの使い回しです(汗)

今回は、意味のない1,000,000個の配列ではなく、「時間」という順番に意味のある配列です。

 

少し詳しく見ていきましょう。

times[]という配列は、12個の変数の集合体です。

times[0]~times[11] までの配列です。

times[0]、times[1]、・・・times[11] がそれぞれ変数と同じ機能です。

そのため、それぞれに値を代入することができます。

 

次に配列の意味を見ていきましょう。

・times[0] は1時を表現している
・times[1] は2時を表現している
・times[2] は3時を表現している

というように、今回は配列に意味があります。

プログラミングする時には、何を表現しているのかを常に考えましょう。

ちなみに代入するものは、適切なものを代入してください。

例えば、「times[2]は3時を表現しているため、”おやつの時間”という値を代入」という感じです。

 

配列のプログラム例

配列のプログラム例は、こちらになります。

//+------------------------------------------------------------------+
//|                                              SampleMQL_Array.mq4 |
//|                                    Copyright 2021, 朝日奈りさFXchannel |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, 朝日奈りさFXchannel"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//配列の宣言
   int array[10];

//配列の初期化
   ArrayInitialize(array,0);

//配列に値を代入
   for(int i = 0; i < 10; i++)
     {
      array[i] = i+1;
     }

//配列の値を表示
   for(int i = 0; i < 10; i++)
     {
      Print(array[i]);
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---


  }
//+------------------------------------------------------------------+

 

プログラム例を、OnInit関数に書きました。

このプログラムを動かすと、コンソールに1~10までの数字が出力されます。

コンソールは MT4 > ターミナル > エキスパートタブ から確認することができます。

 

実行結果は以下のようになります。

ちゃんと1~10までの値が出力されていることが分かります。

 

まとめ

配列はパッと見、難しそうですが、変数を順番に繋いでいるだけと考えましょう。

また、配列の使い方は3ステップあり、これを完了することで、配列を使えるようになります。

・配列のデータ型の宣言
・配列の初期化
・配列に値を代入

特にfor文と組み合わせることができるようになると、プログラミングが楽になって来ますので、マスターすることをオススメします。

まずは1つ1つ代入してみて、配列のコツを掴んでください!

 

コメント