MT5でEA(自動売買)を最適化する方法
2023.10
林貴晴/AMSER Inc.
EAの高速化 ①
高速化のメリットは、限られたブローカーのポジションをより早くオーダーでき、スリッページのリスクを低減できることにあります。さらに、高速化により繰り返し処理を行うバックテストや最適化の時間を短縮することができ、PCやVPSの負荷を軽減できます。
高速化の手法
高速化を実現するためには、処理の速い方法を使うこと、無駄な処理をしないこと、そしてループの最適化を行うことが大切です。
この記事では、通貨ペアの取得に関する4つの方法を比較検討します。
通貨ペアの呼び出し時間の検証
それぞれの方法で通貨ペアを取得し、変数strに格納します。1回の処理では差が計測できないため、1億回繰り返えし代入しその時間を計測します。
通貨ペア名の取得には以下の4つの方法を使用します。
定義済み変数_Symbolを使用
関数Symbol()を使用
構造体のメンバーに通貨ペア名を代入し使用
変数に通貨ペア名を代入し使用
時間の計測にはGetTickCount64()を用います。
GetTickCount64()はシステム起動からの経過時間をミリ秒単位で返します。
GetTickCount()はuintの為、約50日でオーバーフローしますが、GetTickCount64()はulongです。
オーバーフローの心配がないため、安心して使用できます。
計測用サンプルコード
struct STRUCT_TEST{string struct_symbol;};
STRUCT_TEST TEST;
string variable_symbol=Symbol();
string str;
ulong start;
void OnInit()
{
TEST.struct_symbol = _Symbol;
//_Symbol
start = GetTickCount64();
for (int i = 0; i < 100000000; i++)str=_Symbol;
Print("_Symbol: ",GetTickCount64() - start);
//Symbol()
start = GetTickCount64();
for (int i = 0; i < 100000000; i++)str=Symbol();
Print("Symbol(): ",GetTickCount64() - start);
//Variable
start = GetTickCount64();
for (int i = 0; i < 100000000; i++)str=variable_symbol;
Print("Variable: ",GetTickCount64() - start);
//Struct
start = GetTickCount64();
for (int i = 0; i < 100000000; i++)str=TEST.struct_symbol;
Print("Struct: ",GetTickCount64() - start);
}
結果)
| 定義済み変数 | _Symbol: | 1688ミリ秒 |
| 変数 | Symbol(): | 453ミリ秒 |
| 変数に代入 | Variable: | 406 ミリ秒 |
| 構造体のメンバーに代入 | Struct: | 484 ミリ秒 |
結果からわかる通り、通貨ペア名を変数に代入してから使用する方法が最も高速です。通貨ペア名はEA内で複数の場所で必要とされるため、OnInit()内で変数に代入してから活用することをおすすめします。
一方、定義済み変数 _Symbol を使用した場合、計測結果は4倍近くの時間がかかることが示されました。
今回の計測手法を利用して、さまざまな処理の実行時間を計測し、高速なEAの開発に役立てましょう。処理速度の向上は、トレーディング戦略の成功において極めて重要です。
執筆者
MT5
Trading View
記事執筆者のご紹介
お役立ちコンテンツ