EA Sample_NoTrade_ReadFile.mq4の解説

EA Sample_NoTrade_ReadFile.mq4の解説


今回のテーマは、

EAの休止時間をcsvファイルで指定する方法

で紹介したサンプルEAファイルの説明です。

→Sample_NoTrade_ReadFile.mq4とNoTradeTime.csvをダウンロード

Sample_NoTrade_ReadFile.mq4の解説

まずは、『NoTradeTime.csv』ファイルを見てみましょう。

2010.02.18 01:30
2010.02.18 03:00
2010.02.18 04:30

というように、『yyyy.mm.dd hh.mm』の日付フォーマットで、
トレードしない時間が入力してあります。

『Sample_NoTrade_ReadFile』は、
この時間データを読み取り、その前後の何分間は、
No Trade Time Zone
とチャート上に表示させるようになっています。

早速、メタエディタでSample_NoTrade_ReadFile.mq4の中身を見てみましょう^^

パラメータ

extern int     NoTradeBeforeMin  = 20;
extern int     NoTradeAfterMin   = 30;
extern string  NoTradeFileName   = "NoTradeTime.csv";
NoTradeBeforeMin ・・・ 指定時間の何分前からかを指定
NoTradeAfterMin  ・・・ 指定時間の何分後までかを指定
NoTradeFileName  ・・・ データのファイル名を指定

です。

そして、記憶用変数(グローバル変数)で

int BeforSecond;
int AfterSecond;

パラメータ『NoTradeBeforeMin』と『NoTradeAfterMin』の
『分指定』を『秒指定』に変換したものを格納しておく変数です。

その下に、どの関数からも共通で使える変数(グローバル変数)で

datetime LastNoTradeData;
datetime NextNoTradeData;

『LastNoTradeData』は、
csvファイルで指定した時間データのうち、
過去のもので現在の時間に一番近い時間データを格納しておく変数です。

『NextNoTradeData』は、
csvファイルで指定した時間データのうち、
未来のもので現在の時間に一番近い時間データを格納しておく変数です。

その下に、

bool NoData;
datetime Now;

『NoData』は、
もうcsvファイルの指定時間をチェックする必要がなくなったら、
NoDataをtrueにして、ファイルを開かないようにするための変数です。

『Now』は、
現在の時間データを代入する変数です。

次は、EA開始時に1度だけ実行されるinit()関数です。

int init()
{
   BeforSecond = NoTradeBeforeMin * 60;
   AfterSecond = NoTradeAfterMin  * 60;
   
   LastNoTradeData = -1;
   NextNoTradeData = -1;
   
   NoData = false;
   return(0);
}

『BeforSecond』『AfterSecond』に、
パラメータ『NoTradeBeforeMin』『NoTradeAfterMin』の、
秒に換算したものを代入します。

今後、時間の比較を、秒単位で進行する時間データで行うためです。

パラメータ『NoTradeBeforeMin』『NoTradeAfterMin』の役割は、
ここで終了し、もう使いません^^;

『LastNoTradeData』『NextNoTradeData』に、マイナス値を入します。
これらの変数にマイナス値が入っている場合は、
それに対応するデータが空っぽというルールにするためです。

『NoData』にfalseを代入しておきます。

ここで、グローバル変数の宣言部分に初期値を代入しておくのと、
init()関数内で値を代入するのでは、若干動作が違います。

グローバル変数は、記憶力を持った変数で、
EAをチャートから外したときに、はじめて格納されている値がなくなります。

もし、仮に『NoData』を、
グローバル変数宣言
bool NoData = false;
として、init()関数ではfalseを代入しなかった場合、
EA稼動中、NoDataがtrueになったあと、 csvファイルの時間データを更新して、 再読込させようと、EAのパラメータ等を入力するプロパティウィンドウを開き、 OKボタンで再スタートさせたとします。
しかし、EAは前回稼動していたグローバル変数の値が残っていますので、 NoDataがtrueのままで、csvファイルを読まないようになってしまいます。

そうならないためにも、init()関数の中で
稼動開始時にグローバル変数に入っていて欲しい値を代入しておきます。

次に、ティック毎に実行されるstart()関数です。

int start()
{
   Now = TimeCurrent();

一番最初に、『Now』に現在の時間データ(時刻1秒ごとに付けられている整数)を代入しておきます。

次に、

   if(Now >= NextNoTradeData && !NoData) SetNoTradeData();

として、

もし現在の時間が、前回記憶していた『未来の直近の時間データ』に到達し、
かつ、まだファイルをチェックする必要がある場合は、
 SetNoTradeData()関数を実行する。

という意味です。
SetNoTradeData()関数では、時間指定のcsvファイルを開いて、
『LastNoTradeData』『NextNoTradeData』『NoData』に
それぞれの値を代入する関数として、start()関数の下に作ってあります。
後で、見てみましょう。

次に、

   static datetime PrintData;
   if(NextNoTradeData > 0 && NextNoTradeData != PrintData)
   {
      Print("No Trade: ", TimeToStr(NextNoTradeData - BeforSecond, 
                 TIME_DATE | TIME_MINUTES), " - ",
                          TimeToStr(NextNoTradeData, 
                 TIME_DATE | TIME_MINUTES), " - ",
                          TimeToStr(NextNoTradeData+AfterSecond, 
                 TIME_DATE | TIME_MINUTES));
      PrintData = NextNoTradeData;
   }

として、

記憶用変数『PrintData』を宣言。
もし、『NextNoTradeData』に指定時間が入っていて、その値が『PrintData』と違う場合、
 『No Trade: 取引停止開始時刻 - 取引停止指定時刻 - 取引停止終了時刻』を出力。
 『PrintData』に『NextNoTradeData』の値を代入。

という意味です。
新しく『未来の直近の時間データ』になった場合は、
1度、操作履歴にその時刻と停止開始・終了時刻を出力するということです。

次に、

   if(IsNoTradeTime()) return(0);
IsNoTradeTime()関数がtrueを返したら、ここで実行終了。

という意味です。

IsNoTradeTime()関数は、それぞれの時間データから
現在取引停止の時間かどうかを判断し、停止の時間の場合、
チャート上に『No Trade Time Zone』と表示させ、trueを返します。
そうでない場合は、falseを返します。後で、見てみましょう。

そして、return(0)で実行終了とならなかった場合は、次の

   Comment("Trade Time Zone");

チャート上に『Trade Time Zone』と表示させます。

これで、start()関数は終了ですね。

つぎは、SetNoTradeData()関数とIsNoTradeTime()を見ていきます^0^

つづく^^

タグ

2010年10月 1日|コメント (4)

カテゴリー:EAの作成方法

コメント (4)

公開いただきましたSample_NoTrade_ReadFile.mq4を愛用させていただいています! いつも有用な情報ありがとうございます!

本日はSample_NoTrade_ReadFile.mq4についてカスタマイズをいただきたくご相談させていただきました。

私は自分でかき集めてきた2007年から現在までの指標発表データを持っているのですが、これを毎週更新(既存のCSVに貼り付け更新する)のは異常な程面倒なのと、更新し忘れ(多忙で作業できずという場合もあり)などの恐れもあり、これらの作業を自動化してくれる機能を追加できないものかと模索しています。

あとは
・重要度(Low,Mid,High)別のトレード休止させる選択機能
・それぞれ重要度別のNoTradeBeforeMin・NoTradeBeforeMaxの設定機能
・CSVデータとMT4運用環境のGMTオフセットを調整させるGMT補正機能(通常のEAと同様に数値をユーザー側で指定出来るようにだけしたい)

という感じで、ブログで公開いただきましたSample_NoTrade_ReadFile.mq4のカスタマイズ版のようなコードを作っていただけませんでしょうか?

***Dailyfx.comなどでCSV形式でデータを配布しているので、これらを使ってうまく改造できませんでしょうか?

ご多忙の所恐れ入ります。宜しくお願い致します!

投稿者:じーく |2013年3月31日 23:41

こんにちわ!

じーくさん>

指標を重要度別にEAを止める場合、Forex Event Defender
http://projectv-japan.com/tools/forexeventdefender

が便利です^^

また、ProjectVでは、指標データを自動で蓄積するシステムを構築していますので、それを利用するのもよいかもしれません。(まだ配布していません^^;)
http://projectv-japan.com/tools/fedforbacktest

投稿者:keiji Author Profile Page|2013年4月 1日 17:47

ご返答ありがとうございます。

例えば、ForexFacrotyが配布しているXMLデータはFFCALをアタッチしておくとファイルで取得できますが、このXMLファイルをSample_NoTrade_ReadFile.mq4で読み込ませる場合、どうカスタマイズしたら良いでしょうか?

投稿者:じーく |2013年4月 5日 12:26

こんにちわ^^

じーくさん>

FFCALのXMLファイルの読み込み部分を参考にしてみてください^^

投稿者:keiji Author Profile Page|2013年4月 6日 18:55

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。