『新メタトレ入門本』カスタム指標:新規ファイルの作成・基本プログラム
『新MT4対応 FXメタトレーダープログラミング入門』(新メタトレ入門本)連動企画です。
今回より第2章「カスタム指標のプログラミング」に入ります。この記事では、「3-1 新規ファイルの作成」と「3-2 カスタム指標の基本プログラム」を扱います。
【目次】
第1章 メタトレーダーの紹介
第2章 スクリプトのプログラミング
第3章 カスタム指標のプログラミング
3-1 新規ファイルの作成
3-2 カスタム指標の基本プログラム
3-3 指標の色や線種を変える
3-4 指標の計算式の書き方
3-5 繰り返しを使ったチャート全体へのプロット
3-6 組み込みテクニカル指標関数の使い方
3-7 独自のテクニカル指標の作り方
3-8 カスタム指標のデバッグ
第4章 エキスパートアドバイザー(EA)のプログラミング
本書アップデート情報
このセクションでは、本書内容のアップデートはありません。
関連するMT5情報
新規ファイルの作成
メタエディターの新規作成で作成されたカスタム指標のプログラムは、MQL4とMQL5とでほぼ同じです。
1行違うのは、スクリプトのときと同様、「#property strict」の有無です。MQL5では、「#property strict」は必要ありません。
基本プログラム
サンプルプログラムex1_ind.mq4は、拡張子を「mq5」に変えただけでは、コンパイルでエラーが出ます。
エラーの原因は、MQL5では、Open[]、High[]、Low[]、Close[]といった四本値の定義済み配列がないためです。MQL5では、Close[]ではなく、OnCalculate()関数の引数であるclose[]を使います。
先頭文字が大文字か小文字化かの違いですが、プログラム上は全く違う変数と見なされるので、注意してください。
この修正で、コンパイルは通りますが、実行しても何も表示されません。MQL4とMQL5とで標準の仕様が異なるため、いくつか命令を追加する必要があります。
まず、プリプロセッサ命令として以下の3文を追加します。
#property indicator_plots 1 //表示させる指標バッファの数
#property indicator_type1 DRAW_LINE //指標の種類
#property indicator_color1 clrBlack //ラインの色
MQL5では、使用するバッファの数のほかに、表示させる指標バッファの数を指定する必要があります。「#property indicator_plots 1」で、表示させる指標バッファが1個であることを指定します。
「#property indicator_type1」と「#property indicator_color1」は、指標の種類と色の指定です。MQL4ではこれを指定しなくても指標の種類が「ライン」で色が「黒」になっていましたが、MQL5では何も指定しないと何も表示されません。この命令の詳細は、次のセクションで取り上げます。
もう一つ、追加する必要があるのは、Buf[]やclose[]といった配列を時系列配列にセットすることです。
MQL4では標準で時系列配列になっていたので、何も指定する必要はなかったのですが、MQL5では指定しないと配列は非時系列配列となっています。
つまり、Buf[0]、close[0]が、チャート上の一番左側のバーを表すことになり、表示する位置がまったく逆になってしまうのです。
そのため、ArraySetAsSeries()という関数を使って、配列を時系列配列に変換する必要があるのです。
サンプルプログラムex1_ind.mq4をMQL5用に書き換えたプログラムを以下に示します。
追加した箇所は、3行目から5行目のプリプロセッサ命令と、Buf[]、close[]を時系列配列に設定した13行目と29行目です。
ArraySetAsSeries()は、最初の引数に配列名を指定し、2番目の引数は時系列配列にする場合「true」を入れます。
これは、プログラム中に1回だけ実行すればよいので、関数の外部で宣言されているBuf[]に対しては、OnInit()関数に書いておけばいいです。
ただし、close[]はOnCaluculate()関数の引数で、その関数内のみで有効なので、OnCalculate()関数内に記述しなくてはいけません。
なお、今回の記事では、MQL4のサンプルプログラムをMQL5用に修正しましたが、修正したMQL5のプログラムは、拡張子を「mq4」に戻すとMT4でコンパイル、動作させることができます。
つまり、MQL4では暗黙の了解だった部分をMQL5では明記しなくてはいけなかっただけで、MQL5で追加した部分はMQL4として間違いというわけではないということです。