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

閲覧履歴

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

今回取り上げるのは、「時系列データアクセス関数」です。

時系列データというのは、始値、終値、高値、安値といったチャート上の4本値データのことです。

プログラムを挿入したチャート以外の通貨ペアやタイムフレームでの4本値を取得する場合に利用します。

まず、MQL4、MQL5それぞれに用意されている関数をリストアップしておきます。


■MQL4で利用できる関数

 int iBars(string symbol, int timeframe) バーの数
 int iBarShift(string symbol, int timeframe, datetime time, bool exact)
   指定時刻のバーインデックス
 double iClose(string symbol, int timeframe, int shift) バーの終値
 double iHigh(string symbol, int timeframe, int shift) バーの高値
 int iHighest(string symbol, int timeframe, int type, int count, int start)
   指定期間の最高値の位置
 double iLow(string symbol, int timeframe, int shift) バーの安値
 int iLowest(string symbol, int timeframe, int type, int count, int start)
   指定期間の最安値の位置
 double iOpen(string symbol, int timeframe, int shift) バーの始値
 datetime iTime(string symbol, int timeframe, int shift) バーの開始時刻
 double iVolume(string symbol, int timeframe, int shift) バーのティック数



■MQL5で利用できる関数

MQL5の関数はパラメータの数が多いものや、オーバーロードで複数の書式が定義してあるものなどあるため、パラメータは省略します。

 int Bars() バーの数
 long SeriesInfoInteger() ヒストリカルデータの状態
 int BarsCalculated() 計算済みのバーの数
 int IndicatorCreate()テクニカル指標の作成
 int IndicatorParameters() テクニカル指標のパラメータ
 bool IndicatorRelease() テクニカル指標の解放
 int CopyBuffer() テクニカル指標配列のコピー
 int CopyRates() MqlRates型データ配列のコピー
 int CopyTime() バーの開始時刻配列のコピー
 int CopyOpen() 始値配列のコピー
 int CopyHigh() 高値配列のコピー
 int CopyLow() 安値配列のコピー
 int CopyClose() 終値配列のコピー
 int CopyTickVolume() ティックボリューム配列のコピー
 int CopyRealVolume() 出来高配列のコピー
 int CopySpread() スプレッド配列のコピー

時系列データへのアクセスは、MQL4とMQL5とでやり方が異なります。
単に関数を置き換えるだけでは対応できません。

そういう意味で、MQL4からMQL5への移植作業が難しい部類の関数と言えます。
以下にいくつかの関数を移植するための具体例を説明します。



■iOpen()、iClose()、iHigh()、iLow()の移植

MQL4では、Open[]、Close[]、High[]、Low[] の各配列で、プログラムを挿入したチャート上の4本値を参照することができます。

プログラムを挿入したチャートとは別の通貨ペアやタイムフレームでの4本値を取得したい場合、
時系列アクセス関数のなかのiOpen()、iClose()、iHigh()、iLow()の各関数を利用します。

例えば、USDJPY以外のチャートに挿入したプログラムでUSDJPYの日足終値のデータを10日分表示させるスクリプトプログラムは次のように書けます。



int start()
{
   for(int i=0; i<10; i++)
      Print("Close[", i, "] = ", iClose("USDJPY", PERIOD_D1, i));

   return(0);
}



単にfor文の繰り返しのなかで、

 iClose("USDJPY", PERIOD_D1, i)

という関数を呼ぶだけです。

一方MQL5では、あるバーの4本値を戻り値とする関数はありません。
終値を取得する関数として、CopyClose()がありますが、これはある範囲の複数の終値データを配列にコピーするというものです。

この関数を使い、配列に終値をコピーした後、その配列を順次表示させるという方法になります。
プログラムは次のようになります。



void OnStart()
{
   double buf[];
   ArraySetAsSeries(buftrue);
   CopyClose("USDJPY"PERIOD_D1010buf);

   for(int i=0i<10i++)
      Print("Close["i"] = "buf[i]);
}




 CopyClose("USDJPY", PERIOD_D1, 0, 10, buf);

のように最新のバー(0)から10個分の終値をbuf[]という配列にコピーしてから、配列の各要素を表示させます。

なお、

ArraySetAsSeries(buf, true);

は、buf[]を時系列データにするためのおまじないです。


■iHighest()、iLowest()の移植

iHighest()、iLowest()は、指定期間の最高値(最安値)の位置を返す関数で、最高値、最安値を結んだHLバンドというテクニカル指標を算出する場合によく利用されます。



図(usdjpydaily.png)



このようなHLバンドを表示させるカスタム指標プログラムは、MQL4では次のように書けます。




#property indicator_chart_window
#property
 indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 Red

// 指標バッファ
double BufHigh[];
double BufLow[];

// 外部パラメータ
extern int BandPeriod = 20;

// 初期化関数
int init()
{
   SetIndexBuffer(0, BufHigh);
   SetIndexBuffer(1, BufLow);
   return(0);
}

// 指標計算関数
int start()
{
   int limit = Bars-IndicatorCounted();

   for(int i=limit-1; i>=0; i--)
   {
      BufHigh[i] = High[iHighest(NULL, 0, MODE_HIGH, BandPeriod, i)];
      BufLow[i] = Low[iLowest(NULL, 0, MODE_LOW, BandPeriod, i)];
   }

   return(0);
}




iHighest()、iLowest()はそれぞれ、iからBandPeriod個の最高値、最安値の位置を返すので、それをHigh[]、Low[]の[]のなかに入れることで最高値、最安値の値がBufHigh[]、BufLow[]の配列に代入され、HLバンドとして表示されるのです。

一方MQL5では、iHighest()、iLowest()に対応する関数は時系列アクセス関数のなかにはありません。
同等の機能の関数は、配列関数のなかの、ArrayMaximum()、ArrayMinimum()です。

これは、それぞれ指定した配列の最大値のインデックス、最小値のインデックスを返す関数です。パラメータの順番に注意すれば、iHighest()、iLowest()と置き換えることができます。

MQL5のプログラムを以下に示します。



#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots   2
#property indicator_type1   DRAW_LINE
#property indicator_type2   DRAW_LINE
#property indicator_color1  clrBlue
#property indicator_color2  clrRed

// 指標バッファ
double    BufHigh[];
double    BufLow[];

// 外部パラメータ
input int BandPeriod 20;

// 初期化関数
void OnInit()
{
   SetIndexBuffer(0,BufHigh,INDICATOR_DATA);
   SetIndexBuffer(1,BufLow,INDICATOR_DATA);
   ArraySetAsSeries(BufHightrue);
   ArraySetAsSeries(BufLowtrue);
}

// 指標計算関数
int OnCalculate(const int rates_total,const int prev_calculated,
                       const datetime &Time[],
                       const double &Open[],
                       const double &High[],
                       const double &Low[],
                       const double &Close[],
                       const long &TickVolume[],
                       const long &Volume[],
                       const int &Spread[])
{
   ArraySetAsSeries(Hightrue);
   ArraySetAsSeries(Lowtrue);

   int limit rates_total prev_calculated;
   if(limit == 0limit 1;

   for(int i=limit-1i>=0i--)
   {
      BufHigh[i]=High[ArrayMaximum(HighiBandPeriod)];
      BufLow[i]=Low[ArrayMinimum(LowiBandPeriod)];
   }

   return(rates_total);
}




なお、MQL4と同じように配列を時系列データとして処理するために、BufHigh[]、BufLow[]、High[]、Low[]のすべての配列に対してArraySetAsSeries()を実行してあります。

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

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

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

主な著書に
著書