最適化を最適化する・・・//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では、他の部分でもっと時間が掛かるので、劇的に速くなるわけではないのですが、時刻の数値処理は慣れれば分かりやすいコードなのでお勧めします。