MT4再起動時のEAの対策

VPSでEAのデモ運用を開始していますが、稼働開始したばかりということもあって、EAをどのくらい稼働させても良いかわからず、MT4から応答がなくなることがしばしば発生していました。

これまで作成したEAはEA実行中に取引に関するデータをグローバル変数のみに保存していました。グローバル変数に入れたデータはEAを再起動させると初期値に戻ってしまいます。

MT4から応答がなくなる状況はレアケースと考えていたため、特に処理を入れていませんでしたが、そこそこの頻度で発生しそうな環境ですので、CSVファイルに書き込む方法を実装しました。

MT4でのCSVファイル書き込み方法

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します。

MT4でのCSVファイル読み込み方法

保存した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ファイルを削除する等の注意が必要になります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です