MT4入門(7) – カスタムインディケータの作り方(4)

MetaTrader4入門の第7回目です。
今回の題目は
「カスタムインディケータの作り方(4) – オシレータ系インディケータの作成」
です。
移動平均のようにチャート上のプライスとの関係を表すインディケータはチャート上に表示させますが、プライスと直接関係のないオシレータ系のインディケータはチャートとは別ウインドウに表示させます。
その方法は簡単です。
#property indicator_chart_window
の代わりに
#property indicator_separate_window
と書き換えるだけです。
オシレータ系の中で最も簡単なのはn日前との差を取ったモメンタムでしょう。
ここで、n がパラメータとなるので、前回同様に Mom_Period という外部変数として指定すれば、インディケータのプログラムはこのようになります。
Sample4_1.png
終値 Close[i] と、Mom_Period 日前の終値 Close[i+Mom_Period] との差を取ればいいだけです。
これを適当なチャートにアタッチするとこんな感じになります。

特に問題はありませんが、ここでちょっと [Home] キーを押してチャートの最初に戻ってみます。

最初の方が極端に大きい値になっておかしいですね。これはチャートの最初の部分では、過去のデータをすべてとして計算してしまっているので、差が大きな値になってしまったのです。
このように値がおかしくなる部分は表示させない方法と、そういう部分を最初から計算させないという方法とがあります。簡単なのはおかしいところを表示させない方法で init() 関数中に次のような命令を書いておきます。
SetIndexDrawBegin(0, Mom_Period);
これは、0番目のインディケータをチャートの最初からカウントしてMom_Period 番目から表示するという意味です。Buf0[i]の i の位置とは違うので注意してください。
すると、正しくモメンタムが計算された部分から表示させることができます。

今日はここまで、ではつまらないので、もう一つオシレータのサンプルを作ってみます。
今度はちょっと複雑になりますが、ストキャスティックスです。
その中でも、いわゆるファストストキャスティックスと呼ばれている、各バーの終値が過去nバーのうちの最安値と最高値のレンジの中でどのくらいに位置するのかを表すインディケータです。
過去nバーの最安値、最高値を求める関数もあるのですが、ここでは、if文を使って計算させてみます。
Sample5_1.png
ちょっと変数を宣言する位置が変わっていて混乱する人がいるかもしれませんが、MQL4では、変数の宣言はC言語のように関数のはじめにまとめて書くこともできますが、C++言語のように使う場所で宣言することもできるようです。
個人的には使う場所で宣言する方がわかりやすいと思うのですが、よくわからない人は真似をする必要はありません。
このプログラムでは、HH, LL にそれぞれ、ST_Period の数のバーの間で最高値、最安値を求めています。
最初に HH=0, LL=10000 と具体的な数値を代入していますが、この数には意味はありません。高値、安値を順次更新していくので、最初の高値には十分に小さい値、安値には十分に大きい値を入れておけば、必ず更新されるということです。
if文の説明も詳しいことはまたの機会に回しますが、ここでは、j という変数でバーの位置をずらしていきながら、高値が HH を上回れば、HH を更新、安値が LL を下回れば、LL を更新していき、これを ST_Period の数だけ繰り返すと、 HH, LL にそれぞれ最高値、最安値が計算されていることになります。
そしてその後に
Buf0[i] = (Close[i]-LL) / (HH-LL) * 100;
という式で終値が HH と LL の間のどのくらいの位置にくるかを%で表します。
LL に近ければ0に近づき、HHに近ければ、100に近づきます。
これをチャートにアタッチするとこんな感じになります。

このように%表示されるインディケータではよく、80%以上になったら、とか20%以下になったらという基準レベルを設定する場合が多いですね。
そのようなラインはどうやったら表示されるでしょうか。
ラインを別のインディケータとして書かせる方法もあるでしょうが、ここでは簡単に #property 命令で次のように書くことができます。
#property indicator_level1 20
#property indicator_level2 80

これで、20と80のところにラインが引けます。ついでに最大値最小値が決まっているときは、次のように書くことができます。
#property indicator_minimum 0
#property indicator_maximum 100

するとチャートの一番下が0、一番上が100となります。

これでちょっとは見やすくなったのではないでしょうか。
今回扱ったサンプルプログラムを Sample4_Ind.mq4, Sample5_Ind.mq4 としてアップロードしておきます。
Download Sample4_Ind.mq4
Download Sample5_Ind.mq4
次回は組込み関数の便利な使い方について説明する予定です。
にほんブログ村 為替ブログへ為替ブログランキング 現在25位
「次の記事も読んでみたい!」
と思った方はクリックにご協力ください。↑



コメントは受け付けていません