MQL5

[MQL5] CopyRates() でローソク足の情報を取得する方法!

MQL4 と MQL5 では「価格情報」の取得方法が全然違うので、
MQL4 ユーザーの中には戸惑っている人も多いのではないでしょうか。

今回はその中でも CopyRates() 関数の使い方について解説します。

CopyRates() はどういった目的で使うのか?

CopyRates() 関数は、
過去の特定の期間における、ローソク足に関する情報」を取得するために使われます。

iClose() 関数や iHigh() 関数と何が違うのか?

ローソク足の、終値や高値などの情報は iClose() 関数や iHigh() 関数でも取得可能です。

では何が違うのでしょうか?

CopyRates() とこれらの大きな違いは、

CopyRates() では、
(過去の一定期間における)ローソク足に関する情報「一気に」構造体へ格納できる

 

という点です。

MQL5 でローソク足の情報をまとめて取得するには、「構造体」を介する必要がある

CopyRates() では「構造体」に情報を格納する、
という話でしたが、この構造体には特殊な構造体を使います

“MqlRates 構造体” です。

MqlRates 構造体とは、MQL5 にて予め用意されている構造体であり、以下のメンバーによって構成されます。

struct MqlRates
 {
  datetime time;         // 期間開始時間
  double   open;         // 始値
  double   high;         // 期間中の最高値
  double   low;          // 期間中の最安値
  double   close;        // 終値
  long     tick_volume;  // ティックボリューム
  int     spread;        // スプレッド
  long     real_volume;  // 取引高
 };

終値、高値、安値、始値のほか、スプレッドやロウソク足の開始時刻(終了時刻ではないので注意)、ティックボリュームなども参照できます。

MqlRates 構造体 は「配列」として宣言する必要がある

MqlRates 構造体は「ローソク足」についての情報を格納する構造体であるため、「構造体配列」として宣言する必要があります。

要は、CopyRates() を実行すると

[0] (配列のインデックス)に一番古いローソク足のデータが入り、[1] にその次に古いデータが入り、[2] にさらにその次に古いデータが入る、、、

 

という感じで格納されます。

仮に、格納したい MqlRates 構造体の名前を “MYRates” とすると

MqlRates MYRates[100];                     //まずは宣言する
CopyRates("USDJPY",・・・・・);             //CopyRatesを実行


// 以下のようにして取り出すことができます↓

Print(MYRates[0].high);                    //もっとも古いローソク足の「高値」を出力
Print(MYRates[99].close);                  //最新のローソク足の「終値」を出力

このように出力可能です。

3通りの使い方がある

CopyRates() による MqlRates 構造体への情報の格納方法は、3通りあります。

いずれの方法でも、

開始位置(= 一番新しいデータはどこか)と
終了位置
(= 一番古いデータはどこか)を指定する必要があります。

 

① ともに datetime 形式で、開始日時終了日時を指定する方法

引数は以下のようになります。

‘start_time’ に開始日時(一番新しいデータ)を、’stop_time’ に終了日時(一番古いデータ)を、ともに datetime 形式で入力します。

int  CopyRates(
   string           symbol_name,       // 銘柄の名前
   ENUM_TIMEFRAMES  timeframe,         // ローソク足の時間枠
   datetime         start_time,        // 開始日時
   datetime         stop_time,         // 終了日時
   MqlRates         rates_array[]      // 格納する構造体
   );

② datetime 形式で、開始日時 を指定 + そこから遡るローソク足の本数(=count)を指定する方法

この場合は、start_time に datetime の開始日時(一番新しいデータ)を入れるのは ① と同じですが、
その開始日時を起点として「何本のローソク足のデータを遡って保存するか」の “本数” を count にて指定します。

int  CopyRates(
   string           symbol_name,       // 銘柄の名前
   ENUM_TIMEFRAMES  timeframe,         // ローソク足の時間枠
   datetime         start_time,        // 開始日時
   int              count,             // ローソク足の本数
   MqlRates         rates_array[]      // 格納する構造体
   );

開始位置を現在から何本前なのか(= Shift)指定 + そこから数えるローソク足の本数(=count)を指定する方法

開始位置の指定・終了位置の指定 をともに “本数” でする方法です。

  • start_time → 開始位置(一番新しいデータ)を「今から何本前か」で指定する
  • count → 開始位置からの遡るローソク足の「本数」を指定する
int  CopyRates(
  string           symbol_name,        // 銘柄の名前
  ENUM_TIMEFRAMES  timeframe,          // ローソク足の時間枠
  int              start_pos,          // 開始位置のShift数
  int              count,              // ローソク足の本数
  MqlRates         rates_array[]       // 格納する構造体
  );

となります。

まとめ

今回は CopyRates 関数の使い方を説明しました。

CopyRates 関数は MqlRates 構造体に指定した期間のローソク足のデータを格納するための関数であり、その期間の指定方法には3通りの方法がありました。

今回出てきたのは ‘MqlRates 構造体’ でしたが、その他の予め定義された構造体についてまだ知らない場合はこちらの記事も参考にしてください。

(⇒ 【MQL5入門】 わかりにくい「構造体」の使い方をまとめて一気に解説!

 

なお下記の記事では、「MQL4 から MQL5 に移行する」際にどういった内容をどういった順番で学習していけばよいかをわかりやすく説明しています。MQL5 の習得途中の方に取って非常に有益な内容だと思いますので、ぜひ一度読んでみてください。

⇒ MQL4(MT4) → MQL5(MT5) に移行する際に勉強すべき内容まとめ!

   

コメントを残す

*

CAPTCHA