
MT5の噂は本当か検証するよ(MT5はMT4より高速!?)
1.噂は本当か?
巷ではMT4からMT5への移行に踏み出せない人がなんと多いことか!
(チコちゃんに叱られる!のナレーション調に読んでね💖)
ネット上では、MT5がMT4より優れているという情報に溢れています。でもMT4を長く使い、MQL4でのEAやインジ開発に慣れた人には抽象的な情報は響きません。もっとオイラの心の琴線に触れてくれよ!って方が多いはずです💦そうなんです💦そういうことにしましょう💦💦
で、ネットに溢れている情報の中でよく見る
『MT5はMT4よりも高速』
この情報、文字の説明だけで以上終了してるものばかり!
みんな思ってるはずです。
ほんとなん?こっちが知らないと思って騙そうとしとるやろ!?
FXという荒波にもまれまくって、スレまくってる我々は
妄信せずに猛進する💦じゃなかった・・・検証する癖がついてます。
ということで、この噂、本当かどうか検証してみましょう。
2.レッツ検証!
という訳で早速検証しましょう。スレまくって斜に構えるトレーダーの同志みなさまが自身でも検証できるように検証したプログラムコードも公開したいと思います。
<検証環境>
①同一PCで検証(VPSでなくローカルPC)
②外為ファイネストを使用(MT4/MT5の両方ある業者なので)
・MT4のリアル口座
・MT5のリアル口座
③スクリプトにして実行
それでは、レッツ検証!
(1)整数演算の時間を測定
整数演算を10億回実行(MQL4/MQL5ともにコードは同じ)
void OnStart() {
uint start = GetTickCount();
long sum = 0;
for(int i=0; i<1000000000; i++) {
sum += i;
}
Print("Integer Math Time: ", GetTickCount() - start, " ms (Result: ", sum, ")");
}<MT4>
1回目:1172ms、2回目:1297ms、3回目:1329ms 平均:1266ms
※ms=ミリ秒(1000分の1秒)

<MT5>
1回目:0ms、2回目:0ms、3回目:0ms 平均:0ms
えぇぇぇ・・・なんコレ・・・

(2)浮動小数点演算の時間を測定
浮動小数点演算を10億回実行(MQL4/MQL5ともにコードは同じ)
void OnStart() {
uint start = GetTickCount();
double result = 1.0;
for(int i=1; i<1000000000; i++) {
result *= 1.0000001;
result /= 1.00000005;
}
Print(
"Floating Point Math Time: ", GetTickCount() - start,
" ms (Result: ", result, ")"
);
}<MT4>
1回目:5625ms、2回目:5609ms、3回目:5610ms 平均:5615ms
※ms=ミリ秒(1000分の1秒)

<MT5>
1回目:3735ms、2回目:3750ms、3回目:3750ms 平均:3745ms

(3)文字列結合の時間を測定
文字列結合を10万回実行(MQL4/MQL5ともにコードは同じ)
void OnStart() {
uint start = GetTickCount();
string text = "";
for(int i=0; i<100000; i++) {
text += "a";
}
Print(
"String Concatenation Time: ", GetTickCount() - start,
" ms (Length: ", StringLen(text), ")"
);
}<MT4>
1回目:0ms、2回目:0ms、3回目:0ms 平均:0ms
※ms=ミリ秒(1000分の1秒)
えぇぇぇ・・・なんコレ・・・

<MT5>
1回目:3437ms、2回目:3453ms、3回目:3485ms 平均:3458ms

(4)終値取得時間を測定
①iCloseを100万回実行(MQL4のお作法)
※iCloseはMQL5でも存在するが互換性のために用意されたラップ関数
void OnStart()
{
int loop = 10000000; // 1000万回
uint start = GetTickCount();
double sum = 0;
for(int i=0; i<loop; i++)
{
// キャッシュを避けるため、i % 1000 で参照箇所を常に動かす
sum += iClose(_Symbol, PERIOD_M1, i % 1000);
}
uint end = GetTickCount();
PrintFormat("MT4 iClose Speed Test: %d ms (Sum: %f)", end - start, sum);
}<MT4>
1回目:422ms、2回目:421ms、3回目:422ms 平均:422ms
※ms=ミリ秒(1000分の1秒)

<MT5>
1回目:485ms、2回目:469ms、3回目:484ms 平均:479ms

この検証はちょっともの言いを入れます。
理由は、iClose の実装構造の違いです。
MT4:iClose は「単一の値を返す」ための専用関数として最適化されています。内部の配列にダイレクトにアクセスするような構造のため、1回ずつの呼び出し負荷が非常に低いです。
MT5: MQL5の iClose は、実はMQL4との互換性のために用意されたラップ関数(ラッパー)です。内部的には CopyClose などのより複雑なプロセスを介してデータを取得しているため、1回ごとの呼び出しにオーバーヘッド(余計な処理)が発生します。
よって、MT5(MQL5)のお作法にて再度検証してみます。
②MQL5お作法コードで検証(MQL4でも同じコードで動作するので検証)
CopyCloseを使用して終値を1000万回取得(10倍界王拳!)
void OnStart()
{
double dest[];
double sum = 0;
uint start = GetTickCount();
CopyClose(_Symbol, PERIOD_M1, 0, 1000, dest); // 1000本一気に取得
for(int i=0; i<10000000; i++) {
sum += dest[i % 1000]; // 配列アクセス
}
uint end = GetTickCount();
PrintFormat("MT5 iClose Speed Test: %d ms (Sum: %f)", end - start, sum);
}<MT4>
1回目:47ms、2回目:47ms、3回目:47ms 平均:47ms
※ms=ミリ秒(1000分の1秒)

<MT5>
1回目:15ms、2回目:16ms、3回目:15ms 平均:15ms

3.検証結果考察
鉾盾対決の結果は以下の通り。
①整数演算対決 →MT5の圧勝!(MT4:1266ms ⇔ MT5:0ms)
②浮動小数点演算対決→MT5の勝利!(MT4:5615ms ⇔ MT5:3745ms)
③文字列結合対決 →MT4の圧勝!(MT4:0ms ⇔ MT5:3458ms)
④終値取得対決
a)MQL4お作法 →MT4の勝利!(MT4:422ms ⇔ MT5:479ms)
b)MQL5お作法 →MT5の勝利!(MT4:47ms ⇔ MT5:15ms)
3勝2敗でMT5の辛勝。

4.最後に
MT5はMT4より高速!という誰も検証せずに「そだね~」と流していたことを検証してみました。やってみてちょっと驚きでした。これ結構面白いネタじゃないでしょうか、MT4/MT5利用者のみなさま。
私は、速度面でMT5が全てにおいてMT4を凌駕するというイメージでした。
検証した結果はちょっと違って
・計算(整数計算、浮動小数点計算)はMT5が圧倒的に高速
・反面、文字列結合はMT5はMT4よりかなり遅い!
・MT5でMT4のお作法で実装するとMT4よりも遅くなる!
検証結果から言えることは
①MT5で速度にこだわるなら文字列結合や文字列操作を極力減らす
②MT5で速度にこだわるならMT5のお作法を守る

この結論を検証結果を交えて発信しているネタを見たことがありません。
自画自賛できるネタを提供できました。はい。
・MT5のお作法を守り
・MT5のメリットである非同期処理による一括クローズする
そんなEA欲しくないですか?
ここにあります!
リアルフォワードも公開してるよ!
ここで自商品を紹介するのが商材屋魂🔥
MT5の速度を生かせるEAもここにあります!
リアルフォワードも公開してるよ!