English

MQL5の書き方(for MQL4デザイナー)

 

 

インジケーターの計算値取得方法

MQL4では、iRSI()やiBands()などのテクニカル指標関数を使用して、条件に応じた計算値を取得することができます。一方、MQL5では、テクニカル指標関数の戻り値はハンドルとなります。このハンドルを元に、配列を用意し、インジケーターの値を配列にコピーすることで参照できます。

 

MQL5におけるインジケーターの計算値取得の流れは以下の通りです。

  1. テクニカル指標関数からハンドルを取得する。
  2. 配列を宣言する。
  3. インジケーターの値を配列にコピーする。
  4. 必要に応じて、配列の順番を変更する。
  5. ハンドルを解放する。

以下は、MQL5におけるインジケーターの計算値取得の使用例です。

//テクニカル指標関数からハンドルを取得する

int Handle = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_SMA, MODE_CLOSE);

//配列の宣言
double MAbuffer[];

void OnTick(){
    //インジケーターの値を配列にコピーする
    CopyBuffer(Handle, 0, 0, 10, MAbuffer);

    //配列の順番の変更する
    ArraySetAsSeries(MAbuffer, true);

    //最新の移動平均線の値をコメントに表示する
    Comment(MAbuffer[0]);

}

void OnDeinit(const int reason){
    //ハンドルの解放
    IndicatorRelease(Handle);
}

 

解説)

int Handle = iMA(_Symbol, PERIOD_CURRENT, 20, 0, MODE_SMA, MODE_CLOSE);

 

Handleを宣言しiMAのハンドルを代入します。

※ハンドルは識別子です。複数のテクニカル指標関数を使用する時に区別するための値で、MT5から割り振られます。

double MAbuffer[];

 

テクニカル指標関数の計算結果を入れる配列を宣言します。配列は動的配列を使用します。
※動的配列とは[]にサイズを入れずに宣言をする配列のことです。

CopyBuffer(Handle, 0, 0, 10, MAbuffer);

 

テクニカル指標関数の計算結果をMAbufferに代入します。
今回は0個目から10個代入しています。

ArraySetAsSeries(MAbuffer, true);

MQL4では常に最新の値が0、過去にむかって数字が増えましたが、CoppyBuffer()で代入した直後のMAbufferは最も古い値が0で現在に向かって数字が増えていきます。
ArraySetAsSeries()関数でMQL4と同じように最新の値が0に順番を変えます。

Comment(MAbuffer[0]);

 

確認の為コメントに最も新しいMAの値を表示しています。

IndicatorRelease(Handle);

 

終了処理OnDeinit()でハンドルを開放しています。
※ストラテジーテスターではIndicatorRelease()は実行されません。

MQL5は複数のシフトのインジケーターの計算値が同時に取得できます。
今回はArraySetAsSeries()で順番を入れ替えていますが、CopyBuffer()で1個だけ取得する場合には不要な作業です。
更新のタイミングはティック動作毎ではなく、1分間に数回程度です。

 

執筆者
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役、株式会社トリロジー他で役員を兼任。