English

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

 

2023.11

林貴晴/AMSER Inc.

EAの高速化 ②

EAの高速化①では、「定義済み変数」、「関数」、「変数に代入」、「構造体のメンバーに代入」の速度を比較し、それらを計測する方法を紹介しました。今回はテクニカル指標関数iMAと手動での移動平均の計算の速度を比較します。

テクニカル指標関数iMAの使用方法
int MAHandle=iMA(Symbol(),PERIOD_M1,10,0,MODE_SMA,PRICE_CLOSE);
   double MA[];
   double value;
   CopyBuffer(MAHandle,0,0,1,MA);
   value=MA[0];
 

① ハンドルの取得
MQL4ではiMA()関数の戻り値が平均値でしたが、MQL5ではハンドルを返します。
このハンドルの取得は1度行うだけでよく、価格に変更があっても再取得する必要はありません。

② 移動平均の値の格納
移動平均の値を格納するための配列MA[]と、必要な値を格納する変数valueを宣言します。

③ 値の代入
CopyBuffer()関数でハンドルに対応する値をMA[]に代入します。MQL5では値が配列で格納される点がMQL4と異なります。また、シフトの考え方も逆転しますので注意が必要です。複数のシフトのインジケータの値が必要ない時は複製する量を1にすることで逆転を回避できます。

④ 最新値の代入
最新の移動平均値をvalueに代入します。

手動での移動平均の計算
double value2=0;
for(int j=0; j<10; j++)
         {
         value2+=iClose(Symbol(),PERIOD_M1,j);
         }
      value2/=10;


 

① 値の格納
移動平均値を格納するvalue2を宣言します。

② 加算
value2に終値を加算していきます。

③ 平均値の取得
加算した値を10で割り平均値を得ます。

速度の比較と検証方法

詳細な比較方法は「コードの高速化①」で解説しています。
両方法を100万回計算し速度差を評価します。
ハンドルの取得や変数の宣言などは、forループの外で行います。
変化するインジケータ値を取得するために、OnTick()で処理を行い、ExpertRemove()関数で終了させます。

         
ulong start;
void OnTick()
   {
//iMA関数
   start = GetTickCount64();
   int MAHandle=iMA(Symbol(),PERIOD_M1,10,0,MODE_SMA,PRICE_CLOSE);
   double MA[];
   double value;
   for (ulong i = 0; i < 1000000; i++)
      {
      CopyBuffer(MAHandle,0,0,1,MA);
      value=MA[0];
      }
   Print("iMA: ",GetTickCount64() - start);


   //手動での移動平均の計算
   start = GetTickCount64();
   
   for (ulong i = 0; i < 1000000; i++)
      {
   double value2=0;
      for(int j=0; j<10; j++)
         {
         value2+=iClose(Symbol(),PERIOD_M1,j);
         }
      value2/=10;
      }
   Print("手動での移動平均の計算: ",GetTickCount64() - start);
   ExpertRemove();
   }

             
 

結果:
iMA:140ミリ秒
手動での移動平均の計算:422ミリ秒

手動での移動平均の計算はiMAに比べて3倍以上の時間がかかりました。
MQL5のテクニカル指標関数は、ハンドルの取得、配列のコピー、配列の順序の逆転といった工数が必要ですが、高速化処理が行われています。そのため用意されているテクニカル指標関数を活用しましょう。

執筆者
林貴晴

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

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