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

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

 

2010年08月17日(火)

MQL5でカスタム指標プログラム(2) [MetaTrader5]



OnCalculate()関数の引数の意味がわかったところで、今回は、簡単なカスタム指標プログラムを作ってみましょう。

といっても終値をラインで結んでいくという超簡単なものです。(実用性はありません^^;)

MQL5のプログラムは次のように書けます。


#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Close
#property indicator_label1 "Close"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2
//--- indicator buffers
double BufClose[];

int OnInit()
{
SetIndexBuffer(0, BufClose, 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[])
{
for(int i=0; i<rates_total; i++)
{
BufClose[i] = Close[i];
}

return(rates_total);
}

順番に説明していきます。

#property indicator_chart_window

これは、指標をチャートウィンドウに表示するための指定ですね。MQL4と同じです。
#property indicator_buffers 1
#property indicator_plots 1

これは、指標バッファの数を指定する命令です。MQL4では、indicator_buffersだけでしたが、MQL5では、indicator_plotsで、実際に表示させる指標の数も指定するようになりました。
#property indicator_label1  "Close"
#property indicator_type1 DRAW_LINE
#property indicator_color1 Red
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2

では、指標の表示スタイルを設定しています。indicator_color1indicator_style1indicator_width1などはMQL4と同じですが、MQL5では、indicator_label1indicator_type1で指標のラベルや指標の種類も指定できるようになりました。
double BufClose[]; 

これが指標バッファ用の配列で、MQL4と同じく外部変数として宣言します。

次にOnInit()関数で、
SetIndexBuffer(0, BufClose, INDICATOR_DATA); 

のように、BufClose[]という配列を指標バッファに割り当てます。この仕組みもMQL4と同じですが、この関数の引数がひとつ増えて、最後にINDICATOR_DATAを指定するようになりました。

MQL5では、指標バッファに格納されるのが指標の値だけでなく、指標の色も格納できるようになったので、どちらを格納するかを区別するための指定です。

最後にOnCalculate()中に、指標バッファに割り当てられた配列BufClose[]の各要素に、表示させたい指標の値を代入すれば完成です。

簡単には、チャート上のすべてのバーに対応する指標値を代入すればよいので、
for(int i=0; i<rates_total; i++)
{
BufClose[i] = Close[i];
}

と書けます。つまり、BufClose[0]からBufClose[rates_total-1]までにそれぞれのバーの終値を代入したことになります。

但し、前回説明したように、BufClose[rates_total-1]が最新のバーの指標値だということに注意してください。

このプログラムをコンパイルして、適当なチャートにアタッチすると、下のチャートのように終値を結んだ指標が表示されます。

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

ただ、このままでは、OnCalculate()を呼び出すたびにチャート上のすべての指標値を書き直すことになるので、2回目以降は最新のバーのみ書き直すようにすると無駄な処理を減らすことができます。

そのために、次のようにプログラムを追加します。

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

for(int i=limit; i<rates_total; i++)
{
BufClose[i] = Close[i];
}

指標値を代入するインデックスを0からではなく、limitから始めます。limit には、prev_calculatedを代入しておきます。

prev_calculated は、チャートにアタッチした直後は、0となっており、その後は前回計算したバーの総数が代入されます。

なので、prev_calculatedが0の場合は、limitも0のままで、0からrates_total-1までのバーの指標を表示します。

2回目以降は、prev_calculatedの値が0より大きいので limitを1だけ減らしておきます。これで、limit=rates_total-1 となるので、常に最新のバーの指標値を更新することができます。

このあたりのプログラムは色々な書き方があり、MQL4と同様、初心者向けに説明するのは難しいところです。

説明の仕方を考えながら、次回に続きます・・・


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




Posted at 13時13分


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

Sponsor AD

2010/8

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

ランダムウォークとランダムトレード(6)

ランダムウォークとランダムトレード(6)

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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