ここでは、前回記事【EAの休止日時をcsvファイルで指定する方法】で紹介したサンプルEAのコードについて解説します。
前回記事をまだ見ていない方やサンプルファイルをダウンロードしていない方は、まずはそちらからご覧ください。
サンプルEAのコード
Dr.EA
サンプルEA【NoTrade_ReadFile_EA.mq4】のコードがこちら
#property strict extern int NoTradeBeforeMin = 20; extern int NoTradeAfterMin = 30; extern string NoTradeFileName = "NoTradeTime.csv"; int data_cnt; datetime no_trade_datetime[]; //+------------------------------------------------------------------+ int OnInit() { // EA休止日時データ読み込み int handle = FileOpen(NoTradeFileName, FILE_READ|FILE_CSV, ","); if (handle < 0) { Alert("FileOpen error: " + NoTradeFileName); return(INIT_FAILED); } data_cnt = 0; while(FileIsEnding(handle) == false) { data_cnt++; ArrayResize(no_trade_datetime, data_cnt); no_trade_datetime[data_cnt-1] = StrToTime(FileReadString(handle)); } FileClose(handle); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ void OnTick() { int i; datetime now = TimeCurrent(); // EA休止時間判定 bool ea_sleep = false; for (i=0; i<data_cnt; i++) { if (no_trade_datetime[i] - NoTradeBeforeMin * 60 > now) continue; if (no_trade_datetime[i] + NoTradeAfterMin * 60 <= now) continue; ea_sleep = true; break; } // EA休止中の処理 if (ea_sleep == true) { Comment("No Trade Time Now."); return; } // 以降、EA休止中ではない場合の処理 Comment("Trade OK."); }
パラメーター
前回記事にも書きましたがサンプルEAには、次の3つのパラメーターを設置しています。
extern int NoTradeBeforeMin = 20; extern int NoTradeAfterMin = 30; extern string NoTradeFileName = "NoTradeTime.csv";
NoTradeBeforeMin | 指定日時から設定(分)前からEA休止開始 |
---|---|
NoTradeAfterMin | 指定日時から設定(分)後にEA休止終了 |
NoTradeFileName | 指定日時データcsvファイル名 |
グローバル変数
グローバル変数には、日時データ個数格納用変数と日時データ格納用配列を宣言しています。
int data_cnt; datetime no_trade_datetime[];
日時データcsvファイル読み込み
OnInit()関数内で、次のように日時データcsvファイル読み込みをしています。
int handle = FileOpen(NoTradeFileName, FILE_READ|FILE_CSV, ","); if (handle < 0) { Alert("FileOpen error: " + NoTradeFileName); return(INIT_FAILED); } data_cnt = 0; while(FileIsEnding(handle) == false) { data_cnt++; ArrayResize(no_trade_datetime, data_cnt); no_trade_datetime[data_cnt-1] = StrToTime(FileReadString(handle)); } FileClose(handle);
NoTradeFileNameで指定したcsvファイルを「読み込みモード」「csvモード」で開く FileOpen()関数でファイルオープンに失敗したら エラーアラートを出して EA実行を終了する データ数を0にしておいて ファイルの最後まで繰り返す データ数に1を足す 配列no_trade_datetime[]の要素数をdata_cnt個にする 配列no_trade_datetime[]のインデックスdata_cnt-1 に日時データをdatetime型に変換した値を格納する ファイルを閉じる
EA休止時間判定
OnTick()関数内で、次のようにEA休止時間を判定して、EA休止中時間内に当てはまる場合にはbool型変数ea_sleepをtrueにするようにしています。
int i; datetime now = TimeCurrent(); bool ea_sleep = false; for (i=0; i<data_cnt; i++) { if (no_trade_datetime[i] - NoTradeBeforeMin * 60 > now) continue; if (no_trade_datetime[i] + NoTradeAfterMin * 60 <= now) continue; ea_sleep = true; break; }
あとがき
経済指標発表前後にEAを休止させたりするのに役立ちそうですね。逆に、指定時間前後のみEAを稼働させるようにカスタマイズしても面白そうですね^^
公開いただきました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形式でデータを配布しているので、これらを使ってうまく改造できませんでしょうか?
ご多忙の所恐れ入ります。宜しくお願い致します!
こんにちわ!
じーくさん>
指標を重要度別にEAを止める場合、Forex Event Defender
http://projectv-japan.com/tools/forexeventdefender.php
が便利です^^
また、ProjectVでは、指標データを自動で蓄積するシステムを構築していますので、それを利用するのもよいかもしれません。(まだ配布していません^^;)
http://projectv-japan.com/tools/fedfullpkgmodule.php
ご返答ありがとうございます。
例えば、ForexFacrotyが配布しているXMLデータはFFCALをアタッチしておくとファイルで取得できますが、このXMLファイルをSample_NoTrade_ReadFile.mq4で読み込ませる場合、どうカスタマイズしたら良いでしょうか?
こんにちわ^^
じーくさん>
FFCALのXMLファイルの読み込み部分を参考にしてみてください^^