配列の仕組みを図で理解できても、実際に自分のインジケーターやEAでどう使えばいいのか分からない——という人向けの記事です。この記事では、配列の基本に加えて、実際にMetaEditorでコンパイルして確認できるサンプルコードを紹介します。

配列

MQL プログラミング基礎 配列

配列は、同一の型のデータを一列に並べたものです。

  • 変数:箱
  • 配列:箱を一列に並べる

1つの変数には1つのデータしか入れることができませんが、

配列を使うことでより多くのデータを扱うことができます。

MQL プログラミング基礎 変数 配列

配列の宣言

配列は以下のように記述します。

データ型名 配列名[要素数];

たとえば,int型(整数型)の要素を10個持つ名前がaの配列は、次のように記述します。

int a[10];

配列の初期化

配列を宣言したように初期値を同時に設定して初期化することが可能です。

int a[3] = {10, 20, 30};//要素数3で初期値も同時に設定

要素

要素とは、配列中の各データのことを指します。

MQL プログラミング基礎 配列

配列にはたくさんの箱を持っています。そして一つ一つに値を格納することが可能です。

添字(インデックス)

添字(インデックス)とは配列に付けられている番号になります。

MQL プログラミング基礎 配列

配列の各要素には先頭を0として1,2,3と順に番号がついています。

先頭が0であるので要素数がN個の場合は配列の最後の要素はN-1番だということを注意しましょう(この境界を1つ間違えると「配列の範囲外です」というエラーの原因になります)。

添字(インデックス)を使うことで箱の値を取り出したりすることが可能です。

要素数を決めずに使う「動的配列」

int a[10];のように要素数を最初から固定する配列を静的配列と呼びますが、要素数があとから変わる場合は、要素数を空にした動的配列を使います。

int a[];//動的配列(要素数は後で決める)
ArrayResize(a, 10);//要素数を10に変更

ArrayResize()を呼ぶまでは要素数0の状態なので、値を代入する前に必ず呼んでおく必要があります。

2次元配列(多次元配列)

2次元配列(多次元配列)は行列や表のように2次元的な広がりを持って、

配置されたデータを取り扱うために使用されます。

MQL プログラミング基礎 配列

2次元配列(多次元配列)は以下のように記述します。

要素の型 配列名[行数][列数];

たとえば,int 型の要素が3行4列の形に並んだ2次元配列を作るには以下のように記述します。

int a[3][4];

このように記述された2次元配列(多次元配列)は各行と各列には0番から始まる番号がついています。

配列名[i][j] という形で表される。

第0列 第1列 第2列 第3列
第0行 a[0][0] a[0][1] a[0][2] a[0][3]
第1行 a[1][0] a[1][1] a[1][2] a[1][3]
第2行 a[2][0] a[2][1] a[2][2] a[2][3]

実際にコンパイルして確認する

過去5本のローソク足の高値を配列に格納し、その中の最大値をチャートに表示するインジケーターで、配列の使い方を確認してみましょう。

//+------------------------------------------------------------------+
//|                                                       Array.mq4   |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)
  {
   Comment("");
  }

void OnTick()
  {
   double recent_highs[5];//静的配列:直近5本分の高値を格納する箱

   for(int i = 0; i < 5; i++)
     {
      recent_highs[i] = High[i];//i番目の要素にi本前の高値を代入
     }

   double max_high = recent_highs[0];//配列の先頭(添字0)を仮の最大値にする
   for(int i = 1; i < 5; i++)
     {
      if(recent_highs[i] > max_high)
        {
         max_high = recent_highs[i];
        }
     }

   Comment("直近5本の最高値: ", max_high);
  }
//+------------------------------------------------------------------+
Copy

recent_highs[0]が一番新しい足の高値、recent_highs[4]が5本前の足の高値です。添字が0から始まる点を間違えると、ループの範囲がずれて「配列の範囲外です」というエラーになるので注意してください。

まとめ

今回は配列についてでした。プログラミングで配列は非常に重要なのでしっかりと理解しておきましょう。

ポイント

配列:同一の型のデータを一列に並べたもの
要素:配列中の各データのこと
添字(インデックス):配列の中にある変数ひとつひとつの番号
2次元配列(多次元配列):2次元的な広がりを持った配列

関連記事