EA Sample_NoTrade_ReadFile.mq4の解説
今回のテーマは、
で紹介したサンプル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日|
カテゴリー:EAの作成方法


