FX・株・日経225・自動売買・シグナル配信の投資情報総合サイト | MT4やEAのすべてが解かる【fx-on.com】

閲覧履歴

MQL4とMQL5の互換性について(6)

今回取り上げるのは、テクニカル指標関数です。

これは、MT4やMT5に組み込まれている多くのテクニカル指標をプログラム中で簡単に利用するためのものです。

まずは、MQL4で利用できるテクニカル指標関数を挙げておきます。
パラメータが多くて見づらいものもあるので、パラメータは省略します。


■MQL4のテクニカル指標関数

 double iAC() AC オシレーター
 double iAD() A/D
 double iADX() ADX
 double iAlligator() アリゲーター
 double iAO() オーサムオシレーター
 double iATR() ATR
 double iBearsPower() ベアパワー
 double iBands() ボリンジャーバンド
 double iBullsPower() ブルパワー
 double iCCI() コモディティチャネル指数
 double iCustom() カスタム指標
 double iDeMarker() デマーカー
 double iEnvelopes() エンベロープ
 double iForce() 勢力指数
 double iFractals() フラクタル
 double iGator() ゲーターオシレーター
 double iIchimoku() 一目均衡表
 double iBWMFI() BW MFI
 double iMomentum() モメンタム
 double iMFI() MFI
 double iMA() 移動平均
 double iOsMA() 移動平均オシレーター
 double iMACD() MACD
 double iOBV() OBV
 double iSAR() パラボリックSAR
 double iRSI() RSI
 double iRVI() RVI
 double iStdDev() 標準偏差
 double iStochastic() ストキャスティックス
 double iWPR() ウィリアムズ%R



■MQL5のテクニカル指標関数

MQL5では、上記のテクニカル指標関数に加えて、以下の関数が追加されています。

 int iADXWilder() ワイルダーのADX
 int iAMA() 適応移動平均
 int iChaikin() チャイキンオシレーター
 int iDEMA() ダブルEMA
 int iFrAMA() フラクタル適応移動平均
 int iTEMA() トリプルEMA
 int iTriX() トリプルEMAオシレーター
 int iVIDyA() VIDYA
 int iVolumes() ティックボリューム



■MQL4からMQL5への移植について

MQL4で用意されているテクニカル指標関数は、MQL5でも同じ関数名として用意されています。しかし、使い方が全く異なります。

参考のため、以前の記事を紹介しておきます。

2012年11月15日
カスタム指標プログラムの作り方(3)

2012年11月30日
カスタム指標プログラムの作り方(4)

これらの記事では、移動平均を計算するiMA()を例にとり、MQL4とMQL5の書き方の違いを説明しています。

以下にプログラムの部分のみ再掲しておきます。



●MQL4によるプログラム


// プリプロセッサ命令
#property indicator_chart_window
#property
 indicator_buffers 1
#property indicator_color1 Red

// 指標バッファ用の配列の宣言
double Buf[];

// 初期化関数
int init()
{
   // 指標バッファの割り当て
   SetIndexBuffer(0, Buf);
   return(0);
}

// 指標計算関数
int start()
{
   // カスタム指標の計算
   int limit = Bars-IndicatorCounted();
   for(int i=0; i<limit; i++)
   {
      Buf[i] = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, i);
   }
   return(0);
}





●MQL5によるプログラム


// プリプロセッサ命令
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed

// 指標バッファ用の配列の宣言
double Buf[];

// テクニカル指標ハンドル
int hMA;

// 初期化関数
int OnInit()
{
   // 指標バッファの割り当て
   SetIndexBuffer(0BufINDICATOR_DATA);
   ArraySetAsSeries(Buftrue);

   // テクニカル指標の初期化
   hMA iMA(NULL0100MODE_SMAPRICE_CLOSE);
   return(0);
}

// 終了処理関数
void OnDeinit(const int reason)
{
   // テクニカル指標の解放
   IndicatorRelease(hMA);
}

// 指標計算関数
int OnCalculate(const int rates_total,
                       const int prev_calculated,
                       const datetimeTime[],
                       const doubleOpen[],
                       const doubleHigh[],
                       const doubleLow[],
                       const doubleClose[],
                       const longTick_volume[],
                       const longVolume[],
                       const intSpread[])
{
   // カスタム指標の範囲
   int limit rates_total prev_calculated;
   if(limit == 0limit 1;

   // 指標バッファのコピー
   CopyBuffer(hMA00limitBuf);
   return(rates_total);
}





違いを簡単にまとめておきます。

MQL4では、指標の値が必要なところでiMA()を呼び出すだけで利用できます。

 Buf[i] = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE, i);

一方、MQL5では、iMA()を呼び出すのは、初期化関数のOnInit()の中です。

hMA = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_CLOSE);

そして、実際に指標の値が必要なところでCopyBuffer()関数で、指標の値を配列にコピーするという方法を取ります。

 CopyBuffer(hMA, 0, 0, limit, Buf);




■MQL4のその他のテクニカル指標関数について

前述したMQL4のテクニカル指標関数は、基本的には、チャート上の4本値に適用させるものです。

一度配列に計算されたテクニカル指標に、別のテクニカル指標を適用させるためには、それ専用の関数が用意されています。
以下に配列に対していくつかのテクニカル指標を計算させる関数を挙げておきます。

 double iBandsOnArray() ボリンジャーバンドを配列に適用
 double iCCIOnArray() コモディティチャネル指数を配列に適用
 double iEnvelopesOnArray() エンベロープを配列に適用
 double iMomentumOnArray() モメンタムを配列に適用
 double iMAOnArray() 移動平均を配列に適用
 double iRSIOnArray() RSIを配列に適用
 double iStdDevOnArray() 標準偏差を配列に適用

MQL4では、これらの関数を使うことで、複数のテクニカル指標を組み合わせることができます。

しかし、MQL5では、これらの関数に対応するものは用意されていません。

実は、MQL5で用意されているテクニカル指標関数は、チャート上の4本値だけでなく、一度計算されたテクニカル指標にも適用させることができるようになっているのです。

例えば、チャート上の終値に対してモメンタムiMomentum()を適用させた指標に、さらにiMA()を適用させて平滑化させる例をみてみます。



// プリプロセッサ命令
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed

// 指標バッファ用の配列の宣言
double Buf[];

// 外部パラメータ
input int MomPeriod 13;  // モメンタムの期間
input int MAPeriod 5;     // EMAの期間

// テクニカル指標ハンドル
int hMom;   // モメンタムのハンドル
int hMA;   // 移動平均のハンドル

// 初期化関数
int OnInit()
{
   // 指標バッファの割り当て
   SetIndexBuffer(0BufINDICATOR_DATA);
   ArraySetAsSeries(Buftrue);

   // テクニカル指標の初期化
   hMom iMomentum(NULL0MomPeriodPRICE_CLOSE);
   hMA iMA(NULL0MAPeriod0MODE_EMAhMom);
   return(0);
}

// 終了処理関数
void OnDeinit(const int reason)
{
   // テクニカル指標の解放
   IndicatorRelease(hMom);
   IndicatorRelease(hMA);
}

// 指標計算関数
int OnCalculate(const int rates_total,
                       const int prev_calculated,
                       const datetimeTime[],
                       const doubleOpen[],
                       const doubleHigh[],
                       const doubleLow[],
                       const doubleClose[],
                       const longTick_volume[],
                       const longVolume[],
                       const intSpread[])
{
   // カスタム指標の範囲
   int limit rates_total prev_calculated;
   if(limit == 0limit 1;

   // バッファのコピー
   CopyBuffer(hMA00limitBuf);
   return(rates_total);
}





注意するところは、OnInit()関数中の以下の2行です。

hMom = iMomentum(NULL, 0, MomPeriod, PRICE_CLOSE);
hMA = iMA(NULL, 0, MAPeriod, 0, MODE_EMA, hMom);

それぞれ最後のパラメータが適用させるデータを示しています。

iMomentum()では、終値に対して適用させるので、「PRICE_CLOSE」を代入していますが、iMA()では、iMomentum()の戻り値であるハンドル「hMom」を代入しています。

こうすることで、iMomentum()を適用させたデータに対して、iMA()を適用させることができるのです。

この仕組みは、パラメータに

 ENUM_APPLIED_PRICE applied_price

が入っている以下のテクニカル指標関数でも利用できます。

 iAlligator()
 iAMA()
 iBands()
 iCCI()
 iDEMA()
 iEnvelopes()
 iFrAMA()
 iGator()
 iMomentum()
 iMA()
 iOsMA()
 iMACD()
 iRSI()
 iStdDev()
 iTEMA()
 iTriX()
 iVIDyA()

このように、MQL5では、MQL4よりも多くのテクニカル指標を組み合わせることができるようになっているのです。

公開日:2014年02月15日
Profile
豊嶋教授フォト
豊嶋久道
慶應義塾大学在学中よりC言語プログラミングに親しみ、実用系のフリーソフトウェア、シェアウェアを公開。

1993年博士(工学)の学位を取得
専門はデジタル信号処理。

2003年よりFX取引を始め、システムトレードの道へ。
MetaTrader4、MetaTrader5を利用した売買システムの研究を行っている。

主な著書に
著書