文系人間のためのシステムトレーダー養成所 アラート
--------

スポンサーサイト

上記の広告は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 : 株式・投資・マネー

2009-05-11

アラート関数の作り方

前回CodersGuruさんのアラート関数を読み、自分でいろいろ試行錯誤した結果、アラート関数をつくり出すことに成功しました!
今回は僕が作ったアラート関数を紹介したいと思います。

アラート関数作成法

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

というものでした。

前回の疑問の僕なりに出した答えはこちらです。
1,Libraryに保存します。
2,#import を使用したいコードの先頭で使用し、libraryに保存したコードを読み込みます。
3,分かりやすいアラートがならせるコードを探して応用する(こちらのBolliToucher.mq4 を参考にして作成しました。)

それでは関数を作っていきましょう。

ステップ1 Libraryに自作関数を保存する。

1,メタエディターのfile→Newをクリック。
2,Libraryをクリックして次へを選択。

Libra.png

3,NameにAlertOnceと入力→完了をクリック。

libra2.png


すると
//+------------------------------------------------------------------+
//| AlertOnce.mq4                    |
//| FXboy                      |
//| http://fxboyt.blog56.fc2.com/                  |
//+------------------------------------------------------------------+
#property copyright "FXboy"
#property link "http://fxboyt.blog56.fc2.com/"
//+------------------------------------------------------------------+
//| My function                      |
//+------------------------------------------------------------------+
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

このようなものが出てきたと思います。(#propertyの2行はコードに関係ないので表示が違っていても全く問題ありません)

コメントで記述されているMyFunctionは例文だと思います。
MyFunction(私の関数)と書かれているのでここに自作関数を作るというのは間違いなさそうです。

それでは記述していきましょう。

//+------------------------------------------------------------------+
//| AlertOnce.mq4                    |
//| FXboy                      |
//| http://fxboyt.blog56.fc2.com/                  |
//+------------------------------------------------------------------+
#property copyright "FXboy"
#property link "http://fxboyt.blog56.fc2.com/"
#property library

extern bool Use_Sound=true;
//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
void DoAlert()
{
if(!NewBar() || !Use_Sound)
return;
PlaySound("Alert2");
}

bool NewBar()
{
static datetime dt=0;
if(dt!=Time[0])
{
dt=Time[0];
return(true);
}
}
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+


記述する位置はどこでも良いのですがせっかくなのでMy functionと書かれている下から記述してみました。一番下の灰色のコメント部分は気になるようでしたら消しちゃってください。

このコードの概念としては前回の記事のCodersGuruさんのNewBarの判断の仕方と同じです。
ここではAlertではなく、音がなるだけですが、もしAlertになさりたければ、 PlaySound("Alert2");の部分をAlertに変更してください。

コードの解説は省きますが、
static変数は受け取った値を保持するという役割がある
! は「~でないなら」
|| は「もしくは」
NewBar関数を使ってDoAlert関数を機能させている。

ということを頭にいれておけばなんとなく理解できると思います。


先頭に#property libraryと記述しなければ、Start関数が無い(=何も動作をおこせない)じゃないかとコンパイラーが怒り出しますので注意してください。

以上で無事、アラート関数をつくり、保存することができました。

それでは次にこのアラート関数をどのようにして使うかを説明します。

ステップ2 アラート関数を呼び出す。
まずご自身のアラート関数を埋め込みたいと思われているインディケーターのコードをお開きください。
そしたらコードの先頭(init関数の始まる前)に

#import"AlertOnce.ex4"
bool NewBar();
void DoAlert();

を記述し、関数をよびだしてください(これで自分で作った関数が使えるようになります。)

あとはstart関数の中で自分がアラートを鳴らしたい場所にいれこんで頂ければ完了です。

参考までに僕が使用した例をのせておきます。

//+------------------------------------------------------------------+
//| TouchBB.mq4 |
//| FXboy |
//| http://fxboyt.blog56.fc2.com/ |
//+------------------------------------------------------------------+
#property copyright "FXboy"
#property link "http://fxboyt.blog56.fc2.com"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 CLR_NONE
#property indicator_color2 Red
#property indicator_color3 Red
#import "AlertOnce.ex4"
bool NewBar();
void DoAlert();


double BufMA[];
double BufUpper[];
double BufLower[];


extern int BandsPeriod = 20;
extern double BandsDeviationsHigh = 2.0;
extern double BandsDeviationsLow =2.0;

//+------------------------------------------------------------------+
//|Custom indicator intialization function |
//+------------------------------------------------------------------+
int init()
{
SetIndexBuffer(0,BufMA);
SetIndexBuffer(1,BufUpper);
SetIndexBuffer(2,BufLower);



return(0);
}

//+------------------------------------------------------------------+
//|custom indicator interation function |
//+------------------------------------------------------------------+
int start()
{
int limit = Bars-IndicatorCounted();
if(limit == Bars) limit -= BandsPeriod-1;

for(int i=limit-1; i>=0; i--)
{
BufMA[i] = iMA(NULL,0,BandsPeriod,0,MODE_SMA,PRICE_CLOSE,i);

double sum=0.0;
for(int a=0; a {
double newres = Close[i+a]-BufMA[i];
sum += newres*newres;
}
double deviation = MathSqrt(sum/BandsPeriod);
BufUpper[i] = BufMA[i]+BandsDeviationsHigh*deviation;
BufLower[i] = BufMA[i]-BandsDeviationsLow*deviation;

if(i<2)
{

if(BufLower[i] + 50*Point>Bid) DoAlert() ;
if(BufUpper[i] - 50*Point<Bid) DoAlert();

}

}
return(0);
}
//+------------------------------------------------------------------+

このように使います。ロジックとしてはボリンジャーバンドにローソク足が触れる直前でサウンドを鳴らすというものです。

もしよろしければこちらにAlertOnce関数と、ボリンジャーバンドに価格が近付くとアラートがなるインディケーターを置いておきましたのでDLしてください。

TouchBBはMetaTrader-expert -indicatorのフォルダに
AlertOnceはMetaTrader-expert-librariesのフォルダに
いれてくださいね。

長くなってしまいましたが以上です。何か質問がありましたらシステムトレーダー交流所の方へお越しください。


最後までお付き合い頂きありがとうございました。

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

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

2009-10-01

自分好みのアラートをならす。

皆さんお久しぶりです^^  
MT4を使って、自分好みのアラートを鳴らしたり、条件によって鳴らすアラートを使い分けられたら便利だと思いませんか?

実はできるんです。そういうことも。
そこで今回は、自分好みのアラートをならすにはどのようにすれば良いかについて取り上げていきます。


自分好みのアラートを鳴らす方法

概要
MT4でならせる音は、MetaTrader-sounds のフォルダに入っているalert1 alert2 connect・・・等のみになります。個人的なお勧めはnewsです。
ですので、soundsのフォルダにお好きなアラート音を入れ込めば、MT4で使えるようになるのですが、ここで1つ注意が必要です。
それは、wav形式のファイルでないとMT4は読み込まないということです。
ご自身のお気に入りの効果音の形式がmp3でしたらば、wavファイルに変換する必要があるというわけです。

以上を頭に入れておいて頂いた上で、具体的に順を追って説明していきましょう。

ステップ1 好きな効果音を探す。
ご自身のすきな効果音を探してください。
SoundEarthというサイトの効果音はどれもクオリティーが高いのでお勧めです。
ここでは、例としてワンフレーズアラートのb_015をダウンロードします。
ワンフレーズアラート


ステップ2 ファイル形式をwavファイルに変換する
ダウンロードしたファイルを右クリック→プロパティをご覧ください。
mp3ファイルの形式であることが分かると思います。
mp3.png
*ご自身のお好みの効果音がwavファイルである場合この作業は不要です。

wavファイルに変換しなければなりませんので、Rip!AudiCOをDLしてください。もちろん僕の大好きな無料です。
DLしたら早速起動して頂き、御自分のお好みの効果音のファイルをwav変換のところにドラッグしてください。
idou.png
無事wavファイルに変換することができましたね。
wawa.png

ステップ3 ファイルをメタトレーダーのsoundのフォルダに入れ込む。
それではステップ2によって変換したwavファイルをMetatrader-soundのフォルダにいれてください。
これで準備OKです。

ステップ4 アラート関数の変更
以前に作成したAlertOnceをお開きください。expert-libraryに入っているので注意してくださいね。もし分からない方はアラート関数の作り方をご覧ください。
開いたら、メタエディターのfileタブからSaveAsを選んでAlertOnce2と入力してください。
saveasu.png

こうすることによって、AlertOnceのコピーをAlertOnce2の名前で作り出したことになります。
AlertOnceを使えばAlert2が鳴る設定を使え、AlertOnce2を使えばご自身の好きな音(ここではb_015)を鳴る設定を使えます。
つまり、条件によってアラート音を使い分けれるようになるわけです。
変更点は一か所だけです。太字の赤色の箇所だけ変更してください。

//+------------------------------------------------------------------+
//| AlertOnce.mq4                    |
//| FXboy                      |
//| http://fxboyt.blog56.fc2.com/                  |
//+------------------------------------------------------------------+
#property copyright "FXboy"
#property link "http://fxboyt.blog56.fc2.com/"
#property library

extern bool Use_Sound=true;
//+------------------------------------------------------------------+
//| My function |
//+------------------------------------------------------------------+
void DoAlert()
{
if(!NewBar() || !Use_Sound)
return;
PlaySound("b_015");
}

bool NewBar()
{
static datetime dt=0;
if(dt!=Time[0])
{
dt=Time[0];
return(true);
}
}
// int MyCalculator(int value,int value2)
// {
// return(value+value2);
// }
//+------------------------------------------------------------------+

終わりましたらコンパイルしてください。
自然と変更点が保存されます。

あとはアラート関数の作り方をご覧頂きながら理解してほしいのですが、
#import"AlertOnce.ex4"の代わりに
#import"AlertOnce2.ex4"
と記述して頂ければ、ご自身の好きな音がならせるようになります。

繰り返しになりますが
AlertOnceを使えばAlert2の効果音が鳴り、
AlertOnce2を使えばご自身の好きな音(ここではb_015)が鳴るようになります。

以上のやり方を使うことによってご自身の好きな効果音を何個でも、好きな条件で鳴らすことができるようになります。


今回は以上です。お疲れ様でした! ちょっと解りづらかったかもしれませんが、これは便利だと思ってくださる方が一人でもおられましたら幸いです。

それとですね、もしお薦めのアラート音が御座いましたらシステムトレーダー交流所の方で報告頂けませんでしょうか。
報告して頂けたらこちらの記事に掲載させて頂きます。(もしHPやブログをお持ちの方でしたらHPやブログのURLもこちらで紹介します)

本日も最後までお読み頂きありがとうございました。


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

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

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