2023.11
林貴晴/AMSER Inc.
EAの高速化①では、「定義済み変数」、「関数」、「変数に代入」、「構造体のメンバーに代入」の速度を比較し、それらを計測する方法を紹介しました。今回はテクニカル指標関数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株式会社代表取締役、株式会社トリロジー他で役員を兼任。