MT4入門(13) – シグナルインディケータの作り方(1)

MetaTrader4入門の第13回目です。
今回からはカスタムインディケータの別の使い方を紹介します。
簡単に言ってしまえば、売買シグナルをチャート上に表示させるためのカスタムインディケータの使い方です。
ここでは最も基本的な移動平均のクロスで売買するシステムを考えてみます。
まず、インディケータ用バッファとして短期と長期の2種類の移動平均用バッファと、買いと売りの2種類のシグナル用バッファを定義します。
//—- インディケータバッファ
double BufFastMA[]; //短期MA
double BufSlowMA[]; //長期MA
double BufBuy[];   //買いシグナル
double BufSell[];  //売りシグナル
移動平均用のバッファについてはラインを引くだけなので、これまで説明した通りです。
シグナル用のバッファについては、シグナルのあるところだけ値があり、それ以外の場所ではとなります。またシグナルもただの点だけではわかりにくいので、もっとわかりやすい記号や絵文字を表示させたいところです。
そのためにシグナル用バッファの初期化の際に次のような書き方をします。
//—- インディケータの種類の設定(Buyシグナル)
SetIndexBuffer(2, BufBuy);
SetIndexStyle(2, DRAW_ARROW, STYLE_SOLID, 1, Blue);
SetIndexArrow(2,233);
SetIndexEmptyValue(2,0);

これまでと違う点は、SetIndexStyle()DRAW_ARROW を指定する点です。
そして、SetIndexArrow() で記号の種類として233 を指定します。ここで、233って何かというと、Wingdings という絵文字フォントの番号で、他にも次の表にのようなものが使えます。

これを見ると、233上矢印の記号となっていることがわかります。
最後に SetIndexEmptyValue(2,0) で、バッファの値をすべてにクリアしてあります。これは、後でシグナルのところだけ値を入れるので、他の部分は0にしておかないとシグナルでないところに記号が表示されたりするためです。
売りシグナルについても同様に記述します。
//—- インディケータの種類の設定(Sellシグナル)
SetIndexBuffer(3, BufSell);
SetIndexStyle(3, DRAW_ARROW, STYLE_SOLID, 1, Red);
SetIndexArrow(3,234);
SetIndexEmptyValue(3,0);

次に実際のインディケータの計算部分について見てみます。start()関数に記述すべき内容は以下の通りです。
sample10_src.png
for文の中でそれぞれのバッファを計算するのはこれまでと同じです。
最初の2行は短期と長期の移動平均の計算です。FastMA_PeriodSlowMA_Period はそれぞれ後からでも変えられるように extern 宣言されています。
初期値としては
//—- パラメータ
extern int FastMA_Period = 10;
extern int SlowMA_Period = 20;

となっています。
そして、その次の2行がシグナルの計算です。ここでは条件判別のために if 文を使っています。わかりやすいように買いシグナルの条件を図に示してみます。
Crossup_Signal.png
図の中で丸で囲んだ部分が買いシグナルを出したい場所です。
移動平均のクロスをどう表せばよいかというと、まず、クロスする直前では、短期移動平均(BufFastMA)は長期移動平均(BufSlowMA)より下です。そしてクロスした直後では、上下関係が逆転します。
つまり、クロスした直後がi番目のバーの位置だとすると、
BufFastMA[i] > BufSlowMA[i]
と表せます。そして、その前の(i+1)番目のバーでは、
BufFastMA[i+1] < BufSlowMA[i+1]
または
BufFastMA[i+1] = BufSlowMA[i+1]
となっているはずです。MQL4ではC言語と同様、等号と不等号は一つで表せるので、
BufFastMA[i+1] <= BufSlowMA[i+1]
となります。これら二つの条件をANDを表す && という論理演算子で結んであげたものが買いシグナルの条件となります。
ここでは、バーの終値の位置にシグナルを表示させるために BufBuy[i] = Close[i] としています。
売りシグナルの場合は全く逆なので if 文中での不等号の向きを逆にすればいいだけです。
今回のプログラムを Sample10_Ind.mq4 としてアップロードしておきます。
Download Sample10_Ind.mq4
あと、プログラム中に
//—- データウィンドウのラベル
SetIndexLabel(0,”FastMA”);
SetIndexLabel(1,”SlowMA”);
SetIndexLabel(2,”BuySignal”);
SetIndexLabel(3,”SellSignal”);

という部分があります。
これはMetaTraderのメニューから [View]-[DataWindow]を選んだときに表示されるウィンドウにインディケータの値が表示されますが、そのラベルをわかりやすいように設定するためのコードです。データウインドウに表示させたくなければ、空白(“”)を設定すればOKです。
今回のプログラムをチャートにアタッチするとこんな感じになります。
どうしても移動平均のクロスだとシグナルが出るのが遅れてしまうので、もみ合いでは勝てませんが、トレンドが出れば大きく勝てることがよくわかります。

ちょっと長くなったので、今日はこのへんで。
次回はレンジブレイクアウトシステムを例にシグナルインディケータの話を続けます。
にほんブログ村 為替ブログへ為替ブログランキング 現在6位
最新のテクニカル分析やトレーディングシステムの記事が満載です。



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