2020-07-20

MQL5のテクニカル指標ハンドルバッファーの扱い(MQL5勉強中おぼえ

まずMQL4とMQL5ではiMA等のテクニカル指標関係関数の使い勝手が大幅に変わってる。

MQL5で必要なのは以下のとおり

ハンドル(int型)

ひとつ指標に対してひとつハンドル必要

例えば期間75のEMAと期間200のEMAの2つのiMAを使うなら、MA075handleとMA200handleみたいにint型変数を用意しなきゃいけないらしい。

EAしろカスタムインジケーターしろひとつハンドルを作ったら同プログラム内で使い回すことになるだろうからグローバル宣言するのがよろしいっぽいな

バッファ

MQL4では関数を呼び出したらその都度計算してる訳で、過去の足の値を参照するにも毎度計算してるから重いっつーことで、一度計算した値はバッファ配列に放り込めば過去の値は読み出すだけで済むようになったらしい。

動的配列(すなわち最初インデックスを数値なしでの宣言、具体例は double MA075buffer[]; という形での宣言)でないとだめで、ArraySetAsSeries関数時系列並び(具体例は ArraySetAsSeries(MA075buffer,true); )にするべきだろう。

EAでの実践

では、移動平均では指標ひとつしかなくて参考になりづらいので、MACD(メイン線とシグナル線)でやってみよう。

ハンドルバッファグローバル変数宣言

int MacdHandle; //MACD関数ハンドル

double MacdMainBuffer[]; //MACDのメイン線バッファ

double MacdSignalBuffer[]; //MACDシグナル線バッファ

OnInit()関数ハンドルを取得する

int OnInit()

{

MacdHandle = iMACD(NULL,0,12,26,9,PRICE_CLOSE); // MacdHandleにiMACDハンドルが代入される。この時点ではメイン線・シグナル線の区別をつけないことに注目

return(0);

}

OnTick()関数内での使い方

void OnTick()

{

CopyBuffer(MacdHandle,MAIN_LINE,0,10,MacdMainBuffer); // 2個目の引数でメイン線・シグナル線を切り替える。MQL4ではMODE_MAINとMODE_SIGNALだったがMQL5では表記が変わった模様

CopyBuffer(MacdHandle,SIGNAL_LINE,0,10,MacdSignalBuffer); //勿論メイン線なら0、シグナル線なら1と入力しても差し支えはないが、僕の場合可読性重視の為に可能な限り定数型で書く

//過去10本の足だけバッファコピーするようにした。EAならそんなに過去を参照することもないだろうし、ぶっちゃけ10もいらない気もする

ArraySetAsSeries(MacdMainBuffer,true); //時系列並びにするとインデックス番号0が現在の最新足の値になる

ArraySetAsSeries(MacdSignalBuffer,true);

OnDeinit()関数にてメモリ上のキャッシュを開放

void OnDeinit()

{

IndicatorRelease(MacdHandle);

}

ってやらないといつまでもメモリを確保したまんまになっちゃうらしい。

MQL4と違って扱いはなにかと面倒くさくはなってるなーという印象

記事への反応(ブックマークコメント)

ログイン ユーザー登録
ようこそ ゲスト さん