最適化を最適化する・・・//MQL4の高速化(4) 時刻を数値のまま計算する
先日、豊嶋先生のコードの記事を書いたら、意外に参考されている人が多かったようなので、その中で使われているタイムフィルターの高速化について紹介します。
まず、、MQL4 の文字列同士の足し算は、かなり遅いです..。文字列の足し算は、
StrToTime(sdate+" "+StartTime);
↑この部分で使われています。ヘルプを熟読すると、「文字列結合は、StringConcatenate が faster ですよ..」と書かれているのですが、実際に StringConcatenate を使用すると逆に遅くなることが多いです。^^;
(つまり、どんなマニュアルも、私のブログも記述を鵜呑みにしてはダメということです..
そこでどうするか?というと、、表題のとおり、時刻は数値のまま計算させるようにします。
まず、初期化時に init関数内で文字列表記の時刻を秒表記に変換します。
StartTime = "9:30";
↓
dtStartTime = StrToTime(TimeToStr(0, TIME_DATE)+" "+StartTime);
init は1回しか実行されないので、そこでは素直に文字列結合を行います。
(入力を 9 と 30 のように数値入力するようにすれば、最適化も楽ですし、この部分も数値計算だけで済みますが、ユーザフレンドリーな設定方法ではないので...一長一短です。
次に、その日の午前0時0分の時刻を数値計算だけで求めます。
TimeToStr(TimeCurrent(), TIME_DATE)
↓
MathFloor(TimeCurrent()/86400)*86400
1日は86400秒なので、86400で割って切り捨ててから 86400を掛ければ良いのです。
これで、 FilterSignal 内の文字列結合は無くすことができます。
この改造で FilterSignal は約10倍高速化します..。単純に FilterSignal に1時間費やすバックテストや最適化がわずか6分で済む感じです。実際のEAでは、他の部分でもっと時間が掛かるので、劇的に速くなるわけではないのですが、時刻の数値処理は慣れれば分かりやすいコードなのでお勧めします。