文系人間のためのシステムトレーダー養成所 ティック毎一回のみアラートを表示させる。
--------

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2009-05-11

ティック毎一回のみアラートを表示させる。

みなさんはあるインディケーターの条件を満たした時にアラートがなってくれたら良いなと考えたことはありませんか?
僕はそのためにメタトレーダーを始めたといっても過言ではありません。
今回はCodersGuruさんがAlertについて書かれていた記事を見つけたので翻訳してみました。

それではお楽しみください。
原文はhttp://www.metatrader.info/node/173です。


Alert Once Per Bar

やぁ兄弟。

Pink Floyedのアルバムで、"Brain Damage"という曲を聞いたことはありますか?聞く必要はありません! しかしMQL4のプログラミング脳で、Alertを一回だけ表示させるということは大変難しい挑戦になります。

1時間足で短期移動平均線が下から上に長期移動平均線を突き抜けた時、アラートを買い!と表示
させたい。素晴らしい!簡単? そうですね。しかし。。

上述した状況に出くわしたとき、まず一つのアラートが表示され、そして短期移動平均線が長期移動平均線の上にある間ずっとアラートが表示され続けます。

私は上述した状況の時、新しいティック(ローソク足)ごとにアラートを表示させたいと考えます。これが私がアラートを表示させる方法の記事を書いた理由です。

では、いつそれが新しいティック(ローソク足)だと言えるのでしょうか。

コードに、新しいティックだと告げるための二つの方法があります。
最初の方法は私が以前作成し、NewBar()と名付けた関数を使うことです。これは新しいティック(ローソク足)が届けられたらtrueを返し、そうでなければfalseを返します。

bool NewBar()
{
 static datetime lastbar ;
 datatime curbar = Time[0];
 if(lastbar!=curbar)
 {
  lastbar=curbar;
  return(true);
 }
 else
 {
   return(false);
 }
}

上記の関数は、最後の記憶されたティックの開始時間(ローソク足の始値が決まった時間)と、最新のティックの開始時間を比べます。もし、その時間が同じでないのならそれは新しいティックが届けられたことを意味し、trueの値を返します。そして、もし値が等しければ、そこには新しいティックは発見されなかったことを意味し、falseを返します。

この関数はもしあなたが一つの条件のみアラートを表示させたいのなら素晴らしいものになります。しかし、アラートを2つ以上の条件で表示させたい時があります。例えば以下の時に鳴らしたい場合

1-短期移動平均線が長期移動平均線を上に交差した時 買い!とアラートを表示させたい。

2-短期移動平均線が長期移動平均線を下に交差した時 売り!とアラーとを表示させたい。

3-二つ前のティックで短期移動平均線が長期移動平均線を上向きに交差した時、他のティックで買いが確認された!とアラートを表示させたい。

4-二つ前のティックで短期移動平均線が長期移動平均線を下向きに交差した時、他のティックで売りが確認にされた!とアラートを表示させたい。

私は4つのアラートが欲しいし、貴方はそれらを追いかけ続けなくてはなりません。そして、Alertはティック一本につき一回で良い!これがプログラミングのBrain Damageです :)!

それでは二つ目のタイプの新しいティックが届けられましたと報告する関数を見てみましょう。

static int LastAlert = 0;

if(LastAlert == 0 || LastAlert_1<Bars)
 {
    Alert(alert_msg);
    LastAlert=Bars;
 }

このコードは最後に保存されたバーの数と現在のバーの総数を比べているものです。もし、この総数が増えれば、それは新しいバーであるという意味を表します。私はこちらのコードの方をお勧めします。なぜなら、アラートよりもむしろ追跡する意味で使うからです。

アラートを一回だけ表示させるためのロジック。
このイメージ(10000語)。Alert一回関数の後ろにあるロジックをしるためにこのイメージをご覧ください(イメージはみれませんでした。原文はhttp://www.metatrader.info/node/173です。)

上のイメージでみれるように、このロジックはとても簡単です。

1-AlertOnce関数が呼び出された時、私たちはまず最初にこの関数が初めて呼び出されたものかをチェックします。そのようなとき、私たちはAlertのメッセージを表示させます。

2-もしそれは最初の呼び出しでなかった時、私たちは「最後のalertを発生させたローソク足は同じローソク足であるかどうか」をチェックします。これは新しいアラートにとって同じローソク足ですか?ということです。もしNoならアラートメッセージを表示させます。

イメージをコードに転換させましょう。

上記のイメージをコードに転換させる前に、新しい概念を付け加えたいと思います。Alertを表示させるための基準です。

私は4つのアラートを設定したいと思います。ですので、私はAlertを表示させる条件を加え、さらにそれぞれのアラートが一度限りで表示されるような関数を作りたいと思います。下に書いたコードがあなたの理解を進めるものになれば幸いです。

bool AlertOnce(string alert_msg, int ref)
{
static int LastAlert_1 = 0;
static int LastAlert_2 = 0;
static int LastAlert_3 = 0;
static int LastAlert_4 = 0;

switch(ref)
{
case 1:
if( LastAlert_1 == 0 || LastAlert_1 < Bars )
{
Alert(alert_msg);
LastAlert_1 = Bars;
return (1);
}
break;
case 2:
if( LastAlert_2 == 0 || LastAlert_2 < Bars )
{
Alert(alert_msg);
LastAlert_2 = Bars;
return (1);
}
break;
case 3:
if( LastAlert_3 == 0 || LastAlert_3 < Bars )
{
Alert(alert_msg);
LastAlert_3 = Bars;
return (1);
}
break;
case 4:
if( LastAlert_4 == 0 || LastAlert_4 < Bars )
{
Alert(alert_msg);
LastAlert_4 = Bars;
return (1);
}
break;
}
}

コードの説明
最初に私たちは4つのアラートの跡をつけました。ですので、私たちは
4つのstatic変数をそれぞれのアラートの値を保持させるために使用します。そして、switchキーワードをそれぞれのアラートに働くように使用します。こちらのほうが、すべてのアラームを設定するために4つの関数を使用するのよりも簡単だと思いませんか?

1-LastAlert_1(もしくは他の4つのアラートのうちの一つ)が0と等しい場合、それは私たちのalert_msgのアラートが初めて呼び出されたことを表し、LastAlert_1にチャートのローソク足の数字を割り当てます。

2-もしLastAlert_1がチャート上のローソク足より小さければ、私たちのalert_msgのアラートは新しいバーで行われた。

これだけです!    

どのように関数を呼び出すか:

これは簡単なことです。最初のアラートの種類(短期移動平均線が上向きにクロスした時に買う)を使用したい時は以下のようなコードを使ってください。

if (Cross(FMA ,SMA) == CROSS_UP)
AlertOnce ("We have to buy",1);

このアラートのリファレンス番号は1番だということを覚えておいてください。

これは便利だと思ってくださると幸いです。

Coders'Guru


翻訳は以上です。 
概念はわかりやすく説明されていたのですが、自分にはまだ疑問があって

1,関数はどこに保存したら良いのか
2.保存した関数をどうすれば読み込めるのか
3,時々わからない変数がでてくる

等があり僕の頭がBrain Damageになってしまいました。

自分で調べて作ってみたので次回、そのことについて触れてみたいと思います。


押していただけると大変励みになりますのでよろしくお願いします。 人気ブログランキングへ


theme : FXでシステムトレード
genre : 株式・投資・マネー

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。