基礎から学ぶシステムトレード
シストレブログ人気ランキング  

シストレ徹底攻略シストレマスターへの道ワールド・トレーディング・エッジ基礎から学ぶシステムトレードシストレニュースシストレツールシストレナビTOPへ

 

2011年05月10日(火)

[MQL5]OnCalculate()関数の使い方 [MQL5]



前回の記事で、関数のオーバーロードの例として、カスタム指標プログラムの開始関数であるOnCalculate()に二つのパターンがあることを紹介しました。

今回はサンプルプログラムを使って違いをみていきます。簡単なサンプルプログラムとして、モメンタムを表示するカスタム指標プログラムを作ってみます。

まずは、パラメータの多い方のOnClculate()関数を使った例です。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Close
#property indicator_label1 "Mom"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- indicator buffers
double Buf[];
//--- input parameters
input int MomPeriod=20;

int OnInit()
{
SetIndexBuffer(0, Buf, INDICATOR_DATA);
return(0);
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{

int limit = prev_calculated+MomPeriod;
if(prev_calculated > 0) limit--;

for(int i=limit; i<rates_total; i++)
{
Buf[i] = close[i] - close[i-MomPeriod];
}

return(rates_total);
}

細かいところの説明は省略しますが、このプログラムでは、OnClculate()のパラメータである close[]という配列を使って、次のようにMomPeriod分だけ過去のバーにおける終値との差を計算させています。

Buf[i] = close[i] - close[i-MomPeriod];

ここでMQL4と違うところは、Buf[]という配列が時系列配列ではなく、通常の配列だということです。つまり、[]の中のインデックスが現在を0にして過去に遡る方向で増えるのではなく、チャートの左端の位置が0でそこから現在の方向に増えていくということです。

ですから、[i-MomPeriod]が、iに対してMomPeriod分過去の位置を表すということに注意してください。

このプログラムを実行すると、下図のようにサブウィンドウ上にモメンタムの指標が表示されます。

画像(450x337)・拡大画像(800x600)

モメンタムをとる場合、一般には終値を使うことが多いでしょうが、もし、終値以外の値を利用したい場合は、close[]のところをopen[]とか、(high[]+low[]+close[])/3 などと書き換える必要があります。

そこで、OnCalculate()のもう一つの形を利用したプログラムを作ってみます。

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Close
#property indicator_label1 "Mom"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- indicator buffers
double Buf[];
//--- input parameters
input int MomPeriod=20;

int OnInit()
{
SetIndexBuffer(0, Buf, INDICATOR_DATA);
return(0);
}

int OnCalculate(const int rates_total,
const int prev_calculated,
const int begin,
const double &price[])
{
int limit = prev_calculated+MomPeriod;
if(prev_calculated > 0) limit--;

for(int i=limit; i<rates_total; i++)
{
Buf[i] = price[i] - price[i-MomPeriod];
}
return(rates_total);
}

変わったところは、OnCalculate()のところと、

Buf[i] = price[i] - price[i-MomPeriod];
のように close[] をprice[] に書き換えたところです。

このプログラムでは、price[] に割り当てるデータはプロパティで選ぶことができるので、プログラムを修正することなく、始値や平均値に置き換えることができます。

場合に応じてCalculate()関数を使い分けるとよいでしょう。


>>“基礎から学ぶシステムトレード”全記事バックナンバーはこちらから




Posted at 11時56分


ページのトップへ ページのトップへ

Sponsor AD

2011/5

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

プロフィール

豊嶋久道

2003年よりFX取引を始め、システムトレードの道へ。最近ではFXオプション取引も含めたトレーディングシステムの研究を行っている。システムトレードを基礎から正しく理解するための情報を発信する予定。

PHOTO

値動きのヒストグラムからわかること

値動きのヒストグラムからわかること

カテゴリーリスト

最近の記事

検索


当サイトコメントについて

当コメントは情報提供のみを目的として作成されたものであり、投資に関してはご自身でご判断くださいますようお願い致します。また、当資料は著作物であり著作権法により保護されております。無断で全文または一部を転載することはできません。

RSS1.0

[Login]


powered by a-blog
Copyright (C) 2008 PhiConcept,Inc. All rights reserved.