MQL4では、iRSI()やiBands()などのテクニカル指標関数を使用して、条件に応じた計算値を取得することができます。一方、MQL5では、テクニカル指標関数の戻り値はハンドルとなります。このハンドルを元に、配列を用意し、インジケーターの値を配列にコピーすることで参照できます。
MQL5におけるインジケーターの計算値取得の流れは以下の通りです。
以下は、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株式会社代表取締役、株式会社トリロジー他で役員を兼任。