English

MQL5の書き方(for MQL4デザイナー)

 

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の開発に役立てましょう。処理速度の向上は、トレーディング戦略の成功において極めて重要です。

 

執筆者
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役、株式会社トリロジー他で役員を兼任。