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

閲覧履歴

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

今回取り上げる関数群は「カスタム指標関数」です。

カスタム指標関数は、チャート上に独自のテクニカル指標を表示させるカスタム指標プログラムを作成する際に利用する関数です。

ところで、カスタム指標プログラムは、以前の記事で説明したように、MQL4とMQL5とで、ずいぶん書き方が変わってしまいました。

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

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

詳しくは上記の記事を参照していただきたいと思います。
ここでは、終値だけを線で結ぶという最も簡単なカスタム指標プログラムのMQL4での記述例と、MQL5での記述例を再掲します。




■MQL4のカスタム指標プログラム

リスト(close4.htm)

// プリプロセッサ命令
#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] = Close[i];
   }
   return(0);
}







■MQL5のカスタム指標プログラム

リスト(close5.htm)
// プリプロセッサ命令
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed

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

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

// 指標計算関数
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[])
{
   ArraySetAsSeries(Closetrue);

// カスタム指標の計算
   int limit rates_total prev_calculated;
   if(limit == 0limit 1;
   for(int i=0i<limiti++)
   {
      Buf[i] = Close[i];
   }
   return(rates_total);
}






■カスタム指標関数の移植

では、上記のプログラムも参考にしながら、MQL4のカスタム指標関数をMQL5ではどう書き換えればよいかをみていきます。

●int IndicatorCounted() 計算済みバーの総数

この関数はMQL5では対応するものがなく、OnCalculate()関数の2番目のパラメータ「prev_calculated」に変わっています。
従って、IndicatorCounted()→prev_calculatedのように置き換えます。

●bool SetIndexBuffer(int index, double array[]) 配列を指標バッファへ割当て

この関数はMQL5でも同じ名前のものが用意されています。ただし、以下のようにパラメータの個数が増えています。

 bool SetIndexBuffer(int index, double buffer[], ENUM_INDEXBUFFER_TYPE data_type)

MQL5では、3番目のパラメータに「INDICATOR_DATA」「INDICATOR_COLOR_INDEX」「INDICATOR_CALCULATIONS」のどれかを入れなければなりません。

実際にチャートに表示させる指標の場合「INDICATOR_DATA」を、チャートには表示させずに計算用として使うだけの指標の場合「INDICATOR_CALCULATIONS」を代入します。

●void IndicatorBuffers(int count) 指標バッファ数の設定

これは内部計算用も含む全体の指標バッファ数の指定ですが、MQL5では関数ではなく

#property indicator_buffers N

というプリプロセッサ命令で指定するようになりました。

●その他の設定関数

MQL4では、上記に示した関数のほかに次のような関数が利用できます。

 void IndicatorDigits(int digits) 指標精度の設定
 void IndicatorShortName(string name) 指標の短縮名の設定
 void SetIndexArrow(int index, int code) 矢印記号の設定
 void SetIndexDrawBegin(int index, int begin) 指標開始位置の設定
 void SetIndexEmptyValue(int index, double value) 指標の初期化
 void SetIndexLabel(int index, string text) 指標ラベルの設定
 void SetIndexShift(int index, int shift) 指標のシフト幅の設定
 void SetIndexStyle(int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) 指標スタイルの設定
 void SetLevelStyle(int draw_style, int line_width, color clr=CLR_NONE) 指標のレベルスタイルの設定
 void SetLevelValue(int level, double value) 指標のレベルの設定

MQL5ではこれらに1対1で対応する関数はありません。MQL4では用途毎に関数が用意されていたのですが、MQL5では次のようにデータの型毎の関数として用意されています。

 bool IndicatorSetDouble(int prop_id, double prop_value) 実数型指標プロパティの設定
 bool IndicatorSetInteger(int prop_id, int prop_value) 整数型指標プロパティの設定
 bool IndicatorSetString(int prop_id, string prop_value) 文字列型指標プロパティの設定
 bool PlotIndexSetDouble(int plot_index, int prop_id, double prop_value) 実数型プロットプロパティの設定
 bool PlotIndexSetInteger(int plot_index, int prop_id, int prop_value) 整数型プロットプロパティの設定
 bool PlotIndexSetString(int plot_index, int prop_id, string prop_value) 文字列型プロットプロパティの設定
 int PlotIndexGetInteger(int plot_index, int prop_id) 整数型プロットプロパティの取得

これらの関数は、「prop_id」のパラメータに設定したい項目を代入し、「prop_value」のパラメータに設定したい数値や文字列を代入します。

具体的には次のように書き換えることで、MQL4からMQL5へ移植することができます。

 IndicatorDigits(digits)
 →IndicatorSetInteger(INDICATOR_DIGITS, digits)

 IndicatorShortName(name)
 →IndicatorSetString(INDICATOR_SHORTNAME, name)

 SetIndexArrow(index, code)
 →PlotIndexSetInteger(index, PLOT_ARROW, code)

 SetIndexDrawBegin(index, begin)
 →PlotIndexSetInteger(index, PLOT_DRAW_BEGIN, begin)

 SetIndexEmptyValue(index, value)
 →PlotIndexSetDouble(index, PLOT_EMPTY_VALUE, value)

 SetIndexLabel(index, text)
 →PlotIndexSetString(index, PLOT_LABEL, text)

 SetIndexShift(index, shift)
 →PlotIndexSetInteger(index, PLOT_SHIFT, shift)

 SetIndexStyle(index, type, style, width, clr)
 →PlotIndexSetInteger(index, PLOT_DRAW_TYPE, type)
 →PlotIndexSetInteger(index, PLOT_LINE_STYLE, style)
 →PlotIndexSetInteger(index, PLOT_LINE_WIDTH, width)
 →PlotIndexSetInteger(index, PLOT_LINE_COLOR, clr)

 SetLevelStyle(style, width, clr)
 →IndicatorSetInteger(INDICATOR_LEVELSTYLE, style)
 →IndicatorSetInteger(INDICATOR_LEVELWIDTH, width)
 →IndicatorSetInteger(INDICATOR_LEVELCOLOR, clr)

 SetLevelValue(level, value)
 →IndicatorSetDouble(INDICATOR_LEVELVALUE, level, value)

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

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

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

主な著書に
著書