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

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

 

2010年08月09日(月)

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



今回は、MQL5でカスタム指標プログラムを作ってみましょう。と言っても、色々と準備する必要があるので、何回かに分けて説明します。

まずは、メタエディターのFileメニューのNewから「Custom Indicator」を選んで、新規プログラムを作成してみましょう。

#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+

このプログラム中では、OnInit()OnCalculate()という2つの関数が定義されています。どちらもMQL4にはなかったものです。

OnInit()という関数は、MQL4におけるinit()と同じ働きをするもので、プログラムをチャートにアタッチして最初に実行される関数です。

OnCalculate()は、MQL4におけるstart()と同じ働きをするもので、価格が変化して指標計算が必要になったときに実行される関数です。

ただ、OnCalculate()関数には引数がたくさんあってちょっと驚くかもしれません。

引数の名前から判断すると、time[]、open[]、high[]、low[]、close[]、volume[] は、MQL4におけるTime[]、Open[]、High[]、Low[]、Close[]、Volume[]
と同じものだと推測できます。

つまり、MQL5のカスタム指標プログラムでは、チャート上のバーの4本値は、関数の引数で与えられるということなのです。

引数の変数名は変えられるので、もし、MQL4と同じように使いたければ、次のように引数を大文字から始めるようにすればいいでしょう。
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[])

ここで、関数の引数にそれぞれ「const」とついていますが、今の時点では特に気にする必要はありません。4本値などの値がプログラム中で勝手に変更できないようなおなじまいだと思ってください。

これでOnCalculate()関数中で Open[]、High[]、Low[]、Close[]の4本値の配列を利用できるようになったので、MQL4と同じようなプログラムが書けるかというと、・・・もう少し調べた方がいいところがあります。

とりあえず、次のようなプログラムを書いて適当なチャートにアタッチしてみましょう。
#property indicator_separate_window

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[])
{
Print("rates_total = ", rates_total);
Print("prev_calculated = ", prev_calculated);
Print("Close[0] = ", Close[0]);
Print("Close[rates_total-1] = ", Close[rates_total-1]);

return(rates_total);
}

これは何のためのプログラムかというと、OnCalculate()の引数である、「rates_total」と「prev_calculated」の値、および、Close[]などの配列がどういう順番で格納されているかを確認するためです。

このプログラムを適当なチャートにアタッチすると、指標は何も表示されませんが、ToolboxウィンドウのExperts タブの画面に、Print()関数で指定した変数の値が表示されます。

MT5では、Expertsタブの内容を内蔵のビューアで参照することができるようになっています。

Expertsタブの画面で右クリックすると、サブメニューが現れるので、そこで「Viewer」を選ぶと下の図のように出力結果が参照できます。

画像(450x210)・拡大画像(773x362)

ここで探したいキーワードや、ログの日付などを指定して右上の「Request」ボタンを押すと、表示される内容を絞ることもできます。

これを見ると、「rates_total」は、新しいバーができるまで値は変わらないので、チャート上のバーの総数だと推測できます。

また「prev_calculated」は、最初は0ですが、次から rates_total と同じ値になっています。

このことから、これらの変数は、MQL4における BarsIndicatorCounted()と同じような働きをしていることがわかります。(正確には全く同じではないのですが、詳しくは別の機会に。)

さて、rates_total がチャート上のバーの総数だとすると、それぞれのバーの終値は、Close[0]からCLose[rates_total-1]で表されることが推測できると思います。

ただ、ここで注意することは、Close[]のインデックスがどういう順番で振られているかということです。

MQL4の場合、Close[0]は最新のバーの終値、Close[1]は1本前のバーの終値というように、最新のバーから過去にさかのぼる形でインデックスが振られていました。

ところが、MQL5の場合、Close[0]は毎回同じ値を示しているのに、Close[rates_total-1]は毎回変化していることから、Close[rates_total-1]が最新のバーの終値だということがわかります。

すると、Close[0]は、チャートを最初までさかのぼればわかると思いますが、チャートの最初の(一番古い)バーの終値だということになります。

つまり、インデックスの振り方が全く逆になっているわけです。

これは、MQL4のプログラムに慣れた人からすると、かなり混乱することだと思います。このままだと、MQL4のプログラムをMQL5に移植するのもかなり大変です。

そこで、MQL4のように新しい方から古い方に向かってインデックスを振るような配列(時系列配列)に変換するための関数が用意されています。(これはMQL4の頃からあります)

ArraySetAsSeries(Close, true);

のように最初の引数に配列の名前、2番目に「true」と代入することで、Close[]の配列を時系列配列に変えてくれます。

これをOnCalculate()関数の最初に書いておくと、MQL4のようにClose[0]が最新のバーの終値となります。

このようにMQL5では、通常の配列と時系列配列が混在するので、配列の扱いに注意する必要があります。

長くなったので、続きはまた次回。


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




Posted at 15時28分


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

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

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

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

カテゴリーリスト

最近の記事

検索


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

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

RSS1.0

[Login]


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