まずMQL4とMQL5ではiMA等のテクニカル指標関係の関数の使い勝手が大幅に変わってる。
例えば期間75のEMAと期間200のEMAの2つのiMAを使うなら、MA075handleとMA200handleみたいにint型変数を用意しなきゃいけないらしい。
EAにしろカスタムインジケーターにしろひとつハンドルを作ったら同プログラム内で使い回すことになるだろうから、グローバルで宣言するのがよろしいっぽいな
MQL4では関数を呼び出したらその都度計算してる訳で、過去の足の値を参照するにも毎度計算してるから重いっつーことで、一度計算した値はバッファ配列に放り込めば過去の値は読み出すだけで済むようになったらしい。
動的配列(すなわち最初のインデックスを数値なしでの宣言、具体例は double MA075buffer[]; という形での宣言)でないとだめで、ArraySetAsSeries関数で時系列並び(具体例は ArraySetAsSeries(MA075buffer,true); )にするべきだろう。
では、移動平均では指標がひとつしかなくて参考になりづらいので、MACD(メイン線とシグナル線)でやってみよう。
double MacdMainBuffer[]; //MACDのメイン線バッファ
double MacdSignalBuffer[]; //MACDのシグナル線バッファ
int OnInit()
{
MacdHandle = iMACD(NULL,0,12,26,9,PRICE_CLOSE); // MacdHandleにiMACDのハンドルが代入される。この時点ではメイン線・シグナル線の区別をつけないことに注目
return(0);
}
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);
void OnDeinit()
{
}
ってやらないといつまでもメモリを確保したまんまになっちゃうらしい。
MQL4と違って扱いはなにかと面倒くさくはなってるなーという印象
儲かってるかい?