【超入門】MQL5 EA講座 第18回「配列(Array)について」【EAの作り方】

MQL5でEA作ろう講座

前回定数について解説しました。

改めて前回の内容をおさらいをしておくと、

  • 変数では、新しい値を代入することによって、値を変えることができたが、定数ではそれができない。

  • 定数には、#define命令で作る方法と、const特定子で作る方法、2パターンある

ということをお伝えしました。

今回は配列について解説していこうと思います

MQL5でEAを作るにあたっては、MT5メタエディターがお使いのパソコンにインストールされている必要があります。

もし、まだMT5のダウンロードが完了していない方は、

こちらからデモ口座の開設とMT5のダウンロード・インストールを完了して頂ければと思います。

スポンサーリンク
スポンサーリンク

配列とは?

配列とは端的に言うと、

変数が複数連なったもの

になります。

第9回の講座記事変数を取り上げて以降、変数

変数は、データを入れておける箱のようなもの

という説明をしてきましたが、それでいくと配列というのはロッカーのようなもと考えればいいかと思います。

物も数や種類が増えてくると、箱がたくさん必要になってくるように、

プログラムでも、複雑な処理を担わせるようになると必然的に扱うデータの量・種類も増えてきます。

その際に、いちいち変数を用意して作らなくてもいいように配列という仕組みを使ってまとめて管理してしまえば、プログラム的に管理が楽、というわけです。

配列の作り方・使い方

先ほども説明した通り、

配列変数が複数連なったもの

なので、本質的には配列変数と同じです。

変数の数が増えただけなのでそんなに難しく考える必要はありません。

普段行っている、変数をつくる記述に、配列を作る記述を足すだけです。

//3つのデータが入るint型の配列「Array」を作る
int Array[3];

↑これが配列の作り方の基本形です。

データ型 変数名[データを格納する変数の数]

という記述の仕方をします。

データ型変数名の後に[](四角カッコ=square bracket)をつけて、その中に必要なデータ格納数を記述する。

という手順を踏みます。

上記のサンプルコードでは3つのint型 変数が用意できたことを意味します。

配列が用意できたところで、それぞれの変数に値を格納してみましょう。

void OnStart()
  {

           //3つのデータが入るint型の配列「Array」を作る
            int Array[3];
            
            //配列の1番目の変数に値「5」を入れる
             Array[0]=5;
             
            //ログ出力
            Print("配列の1番目の値=",Array[0]);
            
             //配列の2番目の変数に値「10」を入れる
             Array[1]=10;
             
            //ログ出力
            Print("配列の2番目の値=",Array[1]);
            
             //配列の3番目の変数に値「15」を入れる
             Array[2]=15;
             
            //ログ出力
            Print("配列の3番目の値=",Array[2]);
         
           

  }

↑のような形で、配列の個別の変数に値を代入していきます。

文章にすると

変数配列名の後ろの[]の中に、「配列何番目の変数を使うのか」、数を指定する。

3つ変数が使える配列を用意した↓

配列1番目の変数に値を代入したい→Array[0]

配列2番目の変数に値を代入したい→Array[1]

配列3番目の変数に値を代入したい→Array[2]

このように記述します。

「あれ?なんで1番目の変数を表すのに、[0]ってなっているの?1つ少なくない?( ゚Д゚)」

と思われる方もいらっしゃるかもしれません。

配列の何番目の変数を扱うか、という[]の中の数字(インデックス、と呼んだりします)は0をスタート地点からの移動値(オフセット値、なんて呼んだりします)で指定する決まりになっています。

簡単に言えば、

1番目の変数→0から0個移動した→Array[0]

2番目の変数→0から1個移動した→Array[1]

3番目の変数→0から2個移動した→Array[2]

という感じです。

ひょっとしたら、混乱させてしまっているかもしれません(-_-;)

でもプログラミングにおいては大事な考え方になります。

あまり難しく考えず、使いたい順番の1つマイナスの数字を[]の中に入れる

と覚えておけばいいと思います。

ファイルの内容を実行してみましょう。↓

想定通りの結果が返ってきました。

「要素」という言葉について

配列の何番目の変数を扱うか、という[]の中の数字をインデックスと呼ぶ、ということを先程お伝えしました。

配列を扱うにあたり、インデックスと一緒によく使われる言葉に「要素」というものがあります。

要素というのは、配列の各インデックスに格納されている値の事です。

プログラミングを学んでいる最中の方は、混乱の度合いを深めてしまうかもしれませんが、落ち着いて一つ一つの言葉を読み解いていけば決して難しいものではありません。

おさらいしましょう。

まず配列変数が連なったものです。

そして、変数はデータを格納しておける箱のようなもの、でした。

インデックスは箱の順番を示すもの(その順番は0から数える事に注意)でしたね。

以上を踏まえると、

要素というのは「配列の構成する各変数の中身の事」、と言い換えることもできます。

先程のサンプルコードで言えば、配列「Array」におけるインデックス「0」の要素は「5」、インデックス「1」の要素は「10」、インデックス「2」の要素は「15」、という事になります。

音楽サービスで言うと、

配列=プレイリスト

インデックス=プレイリストの曲順番号

要素=具体的な曲名

という事が言えるかと思います。

範囲外アクセスエラー(array out of range)エラーについて

もしこのサンプルコードに、4番目の変数=[3]へのアクセスをするようなコードを足してみるとどうなるでしょう?



 
void OnStart()
  {

           //3つのデータが入るint型の配列「Array」を作る
            int Array[3];
            
            //配列の1番目の変数に値「5」を入れる
             Array[0]=5;
             
            //ログ出力
            Print("配列の1番目の値=",Array[0]);
            
             //配列の2番目の変数に値「10」を入れる
             Array[1]=10;
             
            //ログ出力
            Print("配列の2番目の値=",Array[1]);
            
             //配列の3番目の変数に値「15」を入れる
             Array[2]=15;
             
            //ログ出力
            Print("配列の3番目の値=",Array[2]);
            
            //配列の4番目の変数に値「20」を入れる
             Array[3]=15;
             
             
            //ログ出力
            Print("配列の4番目の値=",Array[3]);
            
            
         
    
  }

コンパイルしても、

特にコンパイルエラーは発生しませんでした。

ではMQL5 Program Fileを実行してみましょう。

「array out of range ~~」

というエラーメッセージが出てしまいました。

これは範囲外アクセスエラーといって、

配列宣言の際に、事前に決めた個数以上の変数を使おうとしてしまってますよー」

というエラーです。

もともと配列は3個しか使わないって言っていたのに、4個目を使おうとするのはルール違反

という訳です。

「あれ?でも、Array[3]って表記、コードの中に見た気がするけど・・・(‘ω’)」

確かに,

int Array[3];

という記述が、コードの最初の方にありますね。

でも、その上のコメントアウトしている説明を読んでみてください。

//3つのデータが入るint型配列「Array」を作る

と書いてありますね?

この

int Array[3];

というのはあくまで

変数を3個使う配列を作りますよー」

という宣言であって、配列内の特定の変数にアクセスする記述ではないんです。

配列名の前に、データ型があるのが違いですね)

ややこしいので、最初のうちは間違えがちですが、注意しておきましょう

範囲外アクセスエラーはプログラムが作動停止してしまう重大なエラーになってしまいます。

配列宣言時にまとめて値を入れる

配列を作った(=宣言した)際に、まとめて最初の値(初期値)を代入することもできます。



 
void OnStart()
  {

            //3つのデータが入るint型の配列「Array」を作る
            //配列の1番目の変数に値「5」を入れる
            //配列の2番目の変数に値「10」を入れる
            //配列の3番目の変数に値「15」を入れる
            
             int Array[3]={5,10,15};
            
             
            //ログ出力
            Print("配列の1番目の値=",Array[0]);
            Print("配列の2番目の値=",Array[1]);
            Print("配列の3番目の値=",Array[2]);

  }

↑のように、

配列宣言時、{}(波カッコ curly brcket)の中に左から、順番に1番目の変数に入れる値を入れ、コンマで区切って次は2番目の変数に値を入れ、コンマで区切って次は3番目の変数に値を入れる・・・

という手順の記述をすることによって、まとめて配列内の個々の変数に値を渡すことができます。

MQL5 Program Fileを実行してみましょう。↓

最初に、1個づつ値を代入していった時と同じ結果が得られました。

コード内容もシンプルになりましたね(*^^)v

今回はいったんここまでにしますが、次回配列の話が続きます。

まとめ

今回は配列について解説しました。

今回の記事では以下のことを学びました

  • 配列にまとめて初期値を入れるときには、配列宣言時、{}の中に左から、順番に値をコンマで区切って入力していく。

MQL5での配列の理解と適切な使用は、より洗練されたEAカスタムインジケ-タの開発を可能にします。

配列を適切に使いこなすことには、単にデータを格納する以上の意味を持ち、データ駆動型のアプローチで市場を分析し、より情報に基づいた取引決定を下すための鍵となります。

MQL5において配列は、複雑な市場の動きを捉え、トレーディングの精度を高めるための強力なツールです。

次回配列の話が続きますが、是非上記のような可能性に胸を膨らませながら配列について学んで頂ければ、と思います。

今回は以上とさせていただきます。

—————————————————————

コメント

タイトルとURLをコピーしました