VPSでEAのデモ運用を開始していますが、稼働開始したばかりということもあって、EAをどのくらい稼働させても良いかわからず、MT4から応答がなくなることがしばしば発生していました。
これまで作成したEAはEA実行中に取引に関するデータをグローバル変数のみに保存していました。グローバル変数に入れたデータはEAを再起動させると初期値に戻ってしまいます。
MT4から応答がなくなる状況はレアケースと考えていたため、特に処理を入れていませんでしたが、そこそこの頻度で発生しそうな環境ですので、CSVファイルに書き込む方法を実装しました。
Table of Contents
EAで使用しているグローバル変数を、グローバル変数の更新時と、EAの終了時にCSVファイルに書き込みます。
CSVファイルへ書き込むプログラムは以下のようになります。
void CsvWrite() { int handle; string filename; filename = "StrategyEdit_DATA" + IntegerToString(Magic) + ".csv"; handle=FileOpen(filename, FILE_CSV|FILE_WRITE, ';'); if(handle>0) { FileWrite(handle, Zscorestop, Atrstop, Zscorelimit, Atrlimit, bandaccelgear, bandaccelprofit, iOrderCheckBuy, tOrderTimeBuy, iOrderCheckSell, tOrderTimeSell, iCloseCheck, tCloseTime); FileClose(handle); } }
関数「CsvWritre()」をグローバル変数更新時と、OnDeinit関数実行時に呼び出します。
CsvWrite関数内ではまず、ファイル名を作成します。ファイル名にはMagicナンバーを入れることで、Magicナンバーごとにファイルが作成されることになります。
次にファイル名、ファイルタイプ:CSV、書き込み属性、区切り文字を指定してファイルをオープンします。
ファイルハンドルに値が入っていればファイルオープン成功になりますので、FileWrite関数を使ってグローバル変数を書き込みます。グローバル変数はZscorestop~tCloseTimeまでが私のEAでは対象です。変数の型はdouble,int,datetime型ですが、ここでは何も処理せずに指定することができます。
書き込み終了後には忘れずFileCloseします。
保存したCSVファイルからグローバル変数に値を読み出します。読み出し箇所はOnInit関数実行時となります。OnInit関数はEA初回セット時に呼び出しされる関数です。
CSVファイルから読み出しするプログラムは以下になります。
void CsvRead() { int handle; string filename; filename = "StrategyEdit_DATA" + IntegerToString(Magic) + ".csv"; handle=FileOpen(filename, FILE_CSV|FILE_READ, ';'); if(handle>0) { Zscorestop=FileReadNumber(handle); Atrstop=FileReadNumber(handle); Zscorelimit=FileReadNumber(handle); Atrlimit=FileReadNumber(handle); bandaccelgear=FileReadNumber(handle); bandaccelprofit=FileReadNumber(handle); iOrderCheckBuy=FileReadNumber(handle); tOrderTimeBuy=FileReadDatetime(handle); iOrderCheckSell=FileReadNumber(handle); tOrderTimeSell=FileReadDatetime(handle); iCloseCheck=FileReadNumber(handle); tCloseTime=FileReadDatetime(handle); FileClose(handle); } }
「CsvRead()」関数をOninit関数実行時に呼び出します。「CsvRead()」呼び出し後はPrint関数で変数値を出力すると確認ができて良いかと思います。
途中までの手順はCSV書き込みと同じです。
ファイル名、ファイルタイプ:CSV、読み取り属性、区切り文字を指定してファイルをオープンします。
値を取得したい変数の型がdouble,int型の場合はFileReadNumber関数を使用し、datetime型の場合はFileReadDatetime関数を使います。
int型へCSVファイルからFileReadNumberを使うとコンパイル時に警告がでますが、小数点以下が欠落するためで、書き込み時が整数であれば、問題とはなりません。
読み取りは書き込みしたときの変数の並び順に、読み取りを実行していきます。
グローバル変数にストップ値を持たせたり、オーダー制御用の値を持たせるときは、CSVファイル経由で行うのが簡単で良いのではないかと思います。
Magicナンバーに対応したCSVファイルとなりますので、EAを同じMagicナンバーで入れ替えるときにはCSVファイルを削除する等の注意が必要になります。