『新メタトレ入門本』カスタム指標:組み込みテクニカル指標関数の使い方
『新MT4対応 FXメタトレーダープログラミング入門』(新メタトレ入門本)連動企画です。
今回は、本書の第3章「カスタム指標のプログラミング」の「3-6 組み込みテクニカル指標関数の使い方」を取り上げます。
【目次】
第1章 メタトレーダーの紹介
第2章 スクリプトのプログラミング
第3章 カスタム指標のプログラミング
3-1 新規ファイルの作成
3-2 カスタム指標の基本プログラム
3-3 指標の色や線種を変える
3-4 指標の計算式の書き方
3-5 繰り返しを使ったチャート全体へのプロット
3-6 組み込みテクニカル指標関数の使い方
3-7 独自のテクニカル指標の作り方
3-8 カスタム指標のデバッグ
第4章 エキスパートアドバイザー(EA)のプログラミング
本書アップデート情報
このセクションでは、本書内容のアップデートはありません。
関連するMT5情報
MQL5にもテクニカル指標関数はありますが、使用方法がMQL4とまったく異なります。
移動平均(iMA)
サンプルプログラムex6_ind.mq4は、チャートウィンドウに表示する指標値が一つのテクニカル指標の例です。
移動平均を算出するテクニカル指標関数として、MQL4と同じくiMA()を利用しますが、MQL5のiMA()は以下のような書式で定義されています。
int iMA(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
int ma_period, // 平均期間
int ma_shift, // 水平シフト
ENUM_MA_METHOD ma_method, // 平滑化の種類
ENUM_APPLIED_PRICE applied_price // 価格の種類かハンドル
);
引数が6個ありますが、これらはMQL4のiMA()の最初の6個の引数と同じ役割です。最後の「shift」という引数はありません。
また戻り値の型が「int」であることもMQL4と違う点です。つまり、MQL4のように、ある「shift」の位置における移動平均の値を戻り値で返すといった使い方はしないのです。
MQL5のテクニカル指標関数の考え方は、iMA()を最初に一度だけ実行して移動平均のバッファを作成します。そして、指標値が必要なところで、そのバッファから配列にコピーするという形をとります。
iMA()を最初に一度実行するために、OnInit()関数中で呼び出します。そして、その戻り値(「ハンドル」と呼びます)を変数に保存しておきます。コードは以下のようになります。
int hMA; //テクニカル指標ハンドル
int OnInit()
{
SetIndexBuffer(0, Buf); //配列を指標バッファに関連付ける
ArraySetAsSeries(Buf, true); //時系列配列に設定
hMA = iMA(_Symbol, 0, MAPeriod, 0, MODE_SMA, PRICE_CLOSE); //テクニカル指標の初期化
return(INIT_SUCCEEDED);
}
ここで、「hMA」が指標ハンドル用の変数ですが、あとでOnCalculate()関数で利用するので、外部変数として宣言します。
OnCalculate()では、Buf[]の配列に指標値を求めますが、ここではfor文を使って一つずつ求めるのではなく、CopyBuffer()という関数を使ってまとめて求めます。
CopyBuffer()関数の書式は以下のように定義されています。
int CopyBuffer(
int indicator_handle, // 指標ハンドル
int buffer_num, // 指標バッファ番号
int start_pos, // 開始位置
int count, // 複製する量
double buffer[] // 受け取り側の配列
);
最初の引数には指標ハンドル「hMA」を代入します。2番目の引数は、指標値が一つしかない場合は「0」を代入します。3番目の引数と4番目の引数でコピーする範囲を指定しますが、コピーする範囲が0からlimit個であれば、それぞれ「0」「limit」を指定します。最後の引数はコピー先の配列名「Buf」を指定します。
以上のコードは次の1行で表せます。
CopyBuffer(hMA, 0, 0, limit, Buf); //指標バッファのコピー
以前のサンプルプログラムと同様に、プリプロセッサ命令、時系列配列にセットする関数を追加すると、全体のコードは以下のようになります。
モメンタム(iMomentum)
サンプルプログラムex7_ind.mq4は、サブウィンドウに表示する指標値が一つのテクニカル指標の例です。
モメンタムを算出するテクニカル指標関数もMQL4と同じくiMomentum()ですが、MQL5では以下のような書式になっています。
int iMomentum(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
int mom_period, // 平均期間
ENUM_APPLIED_PRICE applied_price // 価格の種類かハンドル
);
先ほどのiMA()と同じく、最後のshiftという引数がなく、戻り値がint型となっています。使い方はiMA()と同じです。
ex7_ind.mq4をMQL5用に修正したコードを以下に示します。
ボリンジャーバンド(iBands)
サンプルプログラムex8_ind.mq4は、指標値が複数あるテクニカル指標の例です。
ボリンジャーバンドを算出するテクニカル指標関数は、MQL4と同じくiBands()ですが、MQL5では以下のような書式になっています。
int iBands(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
int bands_period, // 平均線の計算の期間
int bands_shift, // 指標の水平シフト
double deviation, // 標準偏差の数
ENUM_APPLIED_PRICE applied_price // 価格の種類かハンドル
);
MQL4との違いとして、ほかの関数と同様、「shift」の引数がないことに加えて、その前の「mode」という引数もありません。
また、これはiBands()だけの問題ですが、引数の順番が違っている箇所があるので注意してください。MQL4では、「bands_pereid」と「bands_shift」の順番が逆になっています。
ボリンジャーバンドのように指標値が複数あるテクニカル指標は、MQL4では「mode」という引数で区別していました。
MQL5では「mode」という引数がない代わりに、CopyBuffer()関数の2番目の引数に異なる定数を指定して複数の指標を区別します。
iBands()の場合、メインラインは「BASE_LINE」、上位ラインは「UPPER_BAND」、下位ライン「LOWER_BAND」はという定数をそれぞれ指定します。
ex8_ind.mq4をMQL5用に修正したコードを以下に示します。指標値が3つあるところに注意してください。
なお、以前の記事で紹介したex1_ind.mq5からex5_ind.mq5までのサンプルプログラムは、拡張子を「mq4」に変えることでMT4でも動作しました。
しかし、今回紹介したサンプルプログラムでは、テクニカル指標関数の使い方がMQL4とMQL5とで互換性がないため、拡張子を「mq4」にしてもMT4では動作しません。
もし、MQL5のテクニカル指標関数の使い方がわかりにくい、MQL4と同じ方法でテクニカル指標関数を利用したいということでしたら、是非、以下のkindle本の「共通ライブラリ」をご検討ください。