日本語

EAを放置している人はご注意を!MT4を50日以上連続稼働させてはいけない理由

EAを放置している人はご注意を!MT4を50日以上連続稼働させてはいけない理由

EAを使うメリットはなんといっても、ほったらかしでお金を稼いでくれる点ですよね。
EA利用者の中には、VPSを契約して放置し続けている方も多いのではないでしょうか?

しかしあまりに長い期間放置すると、プログラム的に問題があります。






原因はGetTickCount関数


GetTickCountがどのような関数かと言いますと、MT4PCが起動してからの経過時間をミリ秒単位で教えてくれる関数です。
GetTickCountについて

割りと使い勝手が良い関数で、エントリーや決済に失敗した時のリトライ処理によく使われていたりします。
こんなにも普及しているのは、私のMQL4の師匠(勝手に言ってます)である豊島先生の著書の中で、リトライ処理にGetTickCountが使われているためだと解釈しております。

少しだけ専門的な話になりますが、このGetTickCount関数の戻り値はuint型です。
uint型というのは0 ~ 4,294,967,295までの数値しか取ることができません。
整数値型について
普通は43億なんて数値使わないと思うかもしれませんが、じつは意外とあっさり到達します。

1日をミリ秒で表すと。
24×60×60×1,000=86,400,000ミリ秒

uintの最大値である、4,294,967,295を86,400,000で割ると、
4,294,967,295÷86,400,000=49.71・・・・

50日弱でuintの最大値である43億に達してしまします。






50日経過するとどうなるか?


エントリー・決済のリトライ処理にwhile文でループ→GetTickCountを見て一定時間でbreakとかやっているEAの場合は、いつまでもリトライし続ける可能性があります。
いわゆる無限ループですね。
そのままMT4自体固まって落ちてくれればまだマシですが、エントリーシグナルから1時間後とかに突然エントリーされるのが怖いです。

私が以前作成したプログラムでも、GetTickCountの値で前回の処理からの経過時間を見て、
一定時間以上経過していたらデータを送信するツールがあったのですが、
長い時間連続稼働しているとデータが送られてこなくなりました。
今思うとGetTickCountの値が最大値に達していて、経過時間の計算がおかしくなっていたのだと思います。






対策は?


この問題を解決する方法は比較的簡単です。
ようはMT4PCを再起動しちゃえばOKです。
土日の相場が動いてない時間帯などにMT4やPC、VPSを再起動する習慣を付けるのが良いでしょう。
1、2週位なら再起動を忘れても問題ないので比較的楽です。

私のように心配症な開発者の方は、プログラムで通知するのも一つの手です。

void OnTimer(){
MqlDateTime local;
TimeLocal(local);
if(local.day_of_week == 0){
uint run_limit_time = (uint)30 * (uint)24 * (uint)60 * (uint)60 * (uint)1000;
if(GetTickCount() > run_limit_time){
string title, body;
title = MQLInfoString(MQL_PROGRAM_NAME);
body = "PCが起動から30日以上経過しています。" + "n"
+ "PCを再起動してください。" + "n";
body += TerminalInfoString(TERMINAL_COMPANY) + ":" + IntegerToString(AccountNumber()) +"n"
+ TerminalInfoString(TERMINAL_PATH);
SendMail(title, body);
}
}
}

このコードはMT4PCが起動から30日以上経過していたら、日曜日に警告メールを送りつけるという処理です。


ぶっちゃけ50日も連続稼働できる環境を構築している人は稀だと思いますが、知っていて損は無い情報だと思います~