2006年05月07日

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位
最新のテクニカル分析やトレーディングシステムの記事が満載です。

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

このエントリーのトラックバックURL: 

"MT4入門(13) - シグナルインディケータの作り方(1)"へのトラックバックはまだありません。

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

時系列のデータはどこからダウンロードすればいいでしょうか?
インフォシークなどですと時系列が新しい順になっていて古い順にしたいんですが、何か良い方法ないでしょうか?

  •   ひろ
  • 2006年09月05日 20:14

FXのデータならMataTraderから取り出すことができます。Tools-History Center からシンボルとタイムフレームを選んでExportボタンを押せば、csvファイルとしてダウンロードできます。Exportされたデータは古い順になっています。

  •   toyolab
  • 2006年09月06日 15:48

今年から、FXを本格的に始めました。少し利益が出ては、大損を繰り返して、現在、かなり損失が膨らんでいってしまっています。
そこで、感情に左右されないシステムトレードに興味をもち、このサイトにたどり着きました。
移動平均のクロスでシグナルが出るインディケーターを私が見たサイトの中では唯一公開されており、これだっ!と思い、さっそくMT4に取り入れました。
公開されているだけで、とても感謝するべきことなのですが、差支えがなければ、下記のことを教えていただけないでしょうか?

シグナル発生時に、音がなり、E-mailにも送信できるようにするには、どのようにしたらいいのでしょうか?

もし、よろしければ教えてください。よろしくお願い致します。

  •   M初心者
  • 2007年07月22日 01:03

音を出す関数はAlert()、メールを送るのはSendMail()関数を使います。以下の記事を参考にしてください。

http://forex.toyolab.com/archives/2006/04/mt49_-_2.html
http://forex.toyolab.com/archives/2006/04/mt410_-_3.html

シグナルインジケータに組み込むためには、シグナル発生時に一度だけ呼び出される必要があります。そのためのチェックとしては Volume[0]が0かどうかを見る方法とか、フラグを立てる方法とかあります。

このあたりは現在執筆中の本に盛り込む予定ですので、詳しいことはそちらをご覧ください。

  •   toyolab
  • 2007年07月23日 11:18

Tools -> History Center から データを Export できますが、
複数のシンボルとタイムフレームを同時に指定する事は可能ですか?

たとえば、EURUSD,USDJPY,EURJPYの日足のcsvを、あるフォルダに
同時にエクスポートするスクリプトを書く事は可能か、という質問です。

もしご存じでしたら、それをするために用いる
スクリプトの関数などをお教えいただければ嬉しいです。

  •  [TypeKey Profile Page] 時雨
  • 2007年08月23日 11:53

時雨さん、こんにちは。
ヒストリーセンターを直接操作できる関数はありませんが、ヒストリーファイル(historyフォルダーの下の*.hstファイル)をオープンする関数はあります。

int FileOpenHistory( string filename, int mode, int delimiter=';')

これと FileRead、FileWrite 関数を使えばスクリプトが組めるかもしれません。

残念ながら、現在執筆中のMT4本にはファイル操作の説明までは書いていません。

  •   toyolab
  • 2007年08月23日 16:52

円高ではなくその前の円安で8割ほどの資産を失った初心者です。FXを始めて半年もたたないのに自動売買システム制作に関心を持っています。MT4入門を楽しく拝見させていただいていますが、目がチカチカしてきました。本にして出版されるとか、そういう計画があったような・・そういう予定はございますか。

  •   y/y
  • 2007年08月24日 18:57

y/yさん、こんにちは。
MT4入門本、鋭意執筆中です。年内に出版できるかと思います。

  •   toyolab
  • 2007年08月24日 20:03