ティックごと1回のみアラートを表示させる
みなさんはあるインディケーターの条件を満たした時にアラートがなってくれたら良いなと考えたことはありませんか?
僕はそのためにメタトレーダーを始めたといっても過言ではありません。
今回は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
僕はそのためにメタトレーダーを始めたといっても過言ではありません。
今回は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