どうも、こっこです。
今回はMQL4開発において表示される「array out of range」の原因調査とその解決方法を解説していきます。
コンパイル時にエラーが出ることは多々ありますが、そのエラーは何行目でどういう原因なのかすぐわかります。ただこの「array out of range」はインジケーターをチャートに挿入した時に表示されるエラーで、エラー行数は表示されるものの原因がよくわからないことが多くあったので解決方法の候補をいくつか紹介していきます。
目次
「array out of range」の意味
「array out of range」は直訳すると
配列が範囲外
とのことです。
FXEA開発と違い、インジケーター開発では過去チャートへ矢印やラインの描画、バイナリーであれば勝率の計算も行うので配列での処理をよく使います。
自分で用意した配列に数値を入れ込むこともあれば、MQL4に備わっている入れる(High[]、Low[]、Time[]等)こともよくあります。今回のエラーである「array out of range」はその配列関係でのエラーです。
エラー「array out of range」複数の原因
開発側は正常に表示されているのにお客さんからこのエラーが出たと報告をもらい、よくあるパターンとして原因と解決方法を大きく4つに分けて紹介していきます。
単純に開発側の問題(配列の参照ミス)
配列としてデータを用意したものの、そのデータが足りないor参照の範囲外の場合は流石にエラーが出ます。この問題はこれ以外の3つの問題解決につながることなので、配列の使い方は正確に行っていきましょう。
例えばAという配列に30個のデータが入っていたとします。ただ計算上で31個めをチェックしようとしたときにエラーとして「array out of range」と表示されるのです。
MQL4のコンパイル時ではなく、MT4のチャートにインジケーター挿入時にエラーが表示され、どこが対象の行数なのかも出ますのでしっかりチェックし直しましょう。
Initでバッファと配列名の連携ができていない
自分が開発をする上で一番よくあったミスです。関数外で配列の宣言をし、メイン処理で配列にデータ格納するときにエラーとして表示されていました。
配列の宣言をしたらinit関数(OnInit関数)内で連携をする必要があります。これはチャート上になにか描画をするときでも、計算上だけの使用で描画しないとしても連携が必須です。これを忘れてよくエラーを起こしていました。
double rsi[]; // RSI格納用バッファ //+------------------------------------------------------------------+ int OnInit(void) { SetIndexBuffer(0,rsi); SetIndexStyle(0,DRAW_LINE); return(INIT_SUCCEEDED); }
この例のようにSetIndexBuffer()を使って、バッファ番号と配列名の連携をInit内で行わないと連携できていために「そんな配列はないよ」とエラーが吐き出されてしまいます。
MT4オプションのチャート最大バー数が足りない
開発側が想定している計算ローソク足本数と、お客さんのMT4環境の最大表示バー数が合わない時にもエラーが表示されます。
MT4の動作が重い時に「チャートの最大バー数」を少なくすれば軽くなるよ、と案内する業者が多いようで極端に数字を少なくするMT4利用者がいるようです。
MT4の上部「ツール」→「オプション」→「チャート」タブの右下で「チャートの最大バー数」が今いくつになっているのかチェックすることができます。
開発側が何かの条件で計算するローソク足の本数を指定しなければならないとき、ここの最大バー数が少ないときは配列参照ができずに「array out of range」エラーが表示されてしまいます。
MQL4上では「Bars」を使うことでその人の設定している最大バー数を取得することができるので、Init内で想定ローソク足本数と「Bars」を比較して、数字が足りなければINIT_FAILEDにして初期化不可にしつつAlert()やComment()で数が足りない旨を伝えてあげましょう。
ヒストリカルデータが足りない
これも3つ目の問題と似たような原因ですが、ヒストリカルデータが足りないためにデータ参照ができずにエラー表示されることがあるようです。
インジケーターによっては5分足でチャートを表示していても他時間足の計算を行ったりすることがあり、できれば通貨ごとにすべての時間足のヒストリカルデータを取れていることが望ましいです。
MT4をインストールしてすぐの人はヒストリカルデータが少ないのでヒストリカルデータのダウンロードが必要となります。MT4上部の「ツール」→「ヒストリーセンター」にて様々な通貨でデータが足りているのかどうかチェック可能です。
ただこの問題はMQL4開発者の問題というよりは開発したシステムを提供する業者が案内すれば良いだけのことですね。
まとめ
いかがだったでしょうか?
今回はMQL4開発における「array out of range」の原因と解決方法をいくつか紹介してきました。
MQL4開発をしていると1度はこのエラーと直面したことがあるのではないでしょうか?自分はまだまだ初心者の頃にずっと悩まされていたこのエラーですが、今となってはこのエラー表示になったとしても対応方法がわかったのですぐに対処できるようになりました。
もしもこれらの解決方法でも解決しない場合はコメントで教えていただければ私が対応できるかもしれません。連絡してみてくださいね。
ではまた!
【広告枠】初心者向けMQL4開発ができる格安パソコン
・Let’s note(CF-SZ5) 価格:39800円
https://amzn.to/3ktKsay
└中古品、軽量コンパクト、画面サイズ小さめ
・Think Pad(L580) 価格:37230円
https://amzn.to/3krdIip
└中古品、CPU第8世代i5とだいぶ新しい、画面サイズが15.6インチなのでちょっと大きめ
・NEC(VK26) 価格:42880円
https://amzn.to/3QN88mB
└中古品、CPUが第7世代i7なので心配無し、画面サイズが15.6インチなのでちょっと大きめ、ディスクドライブ付きなので分厚い
※各価格は掲載当時の価格になります。