【超入門】MQL5 EA講座 第105回「CopyRates関数以外のCopy関数」【EAの作り方】

MQL5でEA作ろう講座

前回は、バーデータへのアクセスを容易にするために、「OriginalPrice.mqh」ファイル内に「OriginalCBarsクラス」というクラスを作りました。

OriginalCBarsクラス」内に作ったメンバは以下の通りです。(アクセスレベルは全てpublicになります)

bar[]配列(バー情報にアクセスするためMqlRates構造体型のインスタンス

インスタンスについては↓の記事をご覧ください。

OriginalCBars関数(「bar[]」を時系列にセットする為のコンストラクタ

コンストラクタについては↓の記事をご覧ください。

Update関数(バーデータをbar[]配列にコピーする役割を担うメンバ関数

配列については↓の記事をご覧ください。

Close関数(終値情報にアクセスするメンバ関数

High関数(高値情報にアクセスするメンバ関数

Low関数(安値情報にアクセスするメンバ関数

Open関数(始値情報にアクセスするメンバ関数

TickVolume関数(ティック数情報にアクセスするメンバ関数

Time関数(オープン時間情報にアクセスするメンバ関数

Volume関数(取引量情報にアクセスするメンバ関数

上記のメンバに加え、第103回では、Ask関数Bid関数という独立関数も「OriginalPrice.mqh」ファイル内には作っています。

さて、前回作った「OriginalCBarsクラス」には、配列への情報コピーにCopyRates関数を利用しました。

CopyRates関数で取得した情報を、MqlRates構造体へ格納する事によって、複数のバー情報をまとめて呼び出すことが容易になった訳ですが、その一方で、バー情報の取得記述はこれ以外にもあります。

CopyRates関数が取得できる複数のバー情報のうち、1つだけをコピーして取得するCopy関数MQL5には用意されています。

今回はそれらの関数の紹介と、その関数を使った情報取得方法を紹介します。

スポンサーリンク
スポンサーリンク
  1. CopyRates関数以外のCopy関数について
    1. CopyOpen関数は始値を取得する関数
      1. CopyOpen関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には時間軸を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
    2. CopyClose関数は終値を取得する関数
      1. CopyClose関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には取引銘柄を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
    3. CopyHigh関数は高値を取得する関数
      1. CopyHigh関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には取引銘柄を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
    4. CopyLow関数は安値を取得する関数
      1. CopyLow関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には取引銘柄を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
    5. CopyTime関数はオープン時間を取得する関数
      1. CopyTime関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には取引銘柄を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
    6. CopyTickVolume関数はティック数を取得する関数
      1. CopyTickVolume関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には取引銘柄を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
    7. CopyRealVolume関数は取引量を取得する関数
      1. CopyRealVolume関数の戻り値はコピーした要素数
      2. 第1引数には取引銘柄を指定する
      3. 第2引数には取引銘柄を指定する
      4. 第3引数には、コピー開始位置を指定する
      5. 第4引数には複製データ数を指定する
      6. 第5引数には複製データをコピーする配列を指定する
  2. Copy関数の使い方
    1. 価格情報を格納する配列を用意する
    2. 配列を時系列にセット
    3. 始値情報を配列にコピーする
  3. まとめ

CopyRates関数以外のCopy関数について

CopyRates関数以外のCopy関数には以下のようなものがあります。

CopyOpen関数
CopyClose関数

CopyHigh関数
CopyLow関数
CopyTime関数
CopyTickVolume関数
CopyRealVolume関数

関数名から、それぞれの関数がどんな情報を取得していくるのかは、概ね想像がつくとは思いますが、一応それぞれの関数の働きを見ていきたいと思います。

CopyOpen関数は始値を取得する関数

CopyOpen関数は各バーの始値を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数では、Open関数 にあたる関数となります。

関数の定義は以下の通りです。

オーバーロード関数(複数の書式をもつ関数)ですが、今回はよく使う第1書式のみ掲載します。

オーバーロード関数については↓の記事をご覧ください。

・MQL5 EA講座 第45回「関数のオーバーロード」

int  CopyOpen( 
   string          symbol_name,    // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,      // 期間 
  int              start_pos,      // 開始位置 
  int              count,          // 複製するデータ数 
  double          open_array[]     // 始値の複製先の配列 
  );

CopyOpen関数の戻り値はコピーした要素数

CopyOpen関数戻り値int型となっているますが、コピーした要素数を返します。エラーによりコピーができなかった場合には-1を返します。「じゃあ、コピーしたデータはどこにあるの?」というと後述する第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には時間軸を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。価格情報を受け取るので、配列データ型double型となります。

※第1引数から第4引数までは入力データを記述していましたが、第5引数は出力データを記述している点に注意してください。↓のようなイメージです。

第1引数から第4引数までが注文伝票であり、注文した商品を第5引数で受け取るイメージです。

CopyOpen関数だけではなく、この後解説予定の他のCopy関数も同じ理屈です。

CopyClose関数は終値を取得する関数

CopyClose関数は終値を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数ではClose関数 にあたる関数となります。

関数の定義は以下の通りです。

int  CopyClose( 
   string          symbol_name,      // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,        // 期間 
  int              start_pos,        // 開始位置 
  int              count,            // 複製するデータ数 
  double          close_array[]      // 受け取り側の配列 
  );

CopyClose関数の戻り値はコピーした要素数

CopyClose関数戻り値int型となっているますが、コピーした要素数を返します。

エラーだった場合はー1を返します。

コピーしたデータ第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には取引銘柄を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENT記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。価格情報を受け取るので、配列データ型double型となります。

CopyHigh関数は高値を取得する関数

CopyHigh関数は高値を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数ではHigh関数 にあたる関数となります。

関数の定義は以下の通りです。

int  CopyHigh( 
   string          symbol_name,      // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,        // 期間 
  int              start_pos,        // 開始位置 
  int              count,            // 複製するデータ数 
  double          high_array[]      // 受け取り側の配列 
  );

CopyHigh関数の戻り値はコピーした要素数

CopyHigh関数戻り値int型となっているますが、コピーした要素数を返します。

エラーだった場合はー1を返します。

コピーしたデータは第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には取引銘柄を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。価格情報になるので、データ型double型となります。

CopyLow関数は安値を取得する関数

CopyLow関数は安値を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数ではLow関数 にあたる関数となります。

関数の定義は以下の通りです。

int  CopyLow( 
   string          symbol_name,    // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,      // 期間 
  int              start_pos,      // 開始位置 
  int              count,          // 複製するデータ数 
  double          low_array[]     // 受け取り側の配列 
  );

CopyLow関数の戻り値はコピーした要素数

CopyLow関数戻り値int型となっているますが、コピーした要素数を返します。

エラーだった場合はー1を返します。

コピーしたデータは第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には取引銘柄を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。価格情報になるので、データ型double型となります。

CopyTime関数はオープン時間を取得する関数

CopyTime関数はオープン時間を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数ではTime関数 にあたる関数となります。

関数の定義は以下の通りです。

int  CopyTime( 
   string          symbol_name,    // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,      // 期間 
  int              start_pos,      // 開始位置 
  int              count,          // 複製するデータ数 
  datetime        time_array[]     // 開始時刻を複製する受け取り側の配列 
  );

CopyTime関数の戻り値はコピーした要素数

CopyTime関数戻り値int型となっているますが、コピーした要素数を返します。

エラーだった場合はー1を返します。

コピーしたデータは第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には取引銘柄を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。時間情報になるので、データ型datetime型となります。

datetime型については↓の記事をご覧ください。

CopyTickVolume関数はティック数を取得する関数

CopyTickVolume関数はティック数を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数ではTickVolume関数 にあたる関数となります。

関数の定義は以下の通りです。

int  CopyTickVolume( 
   string          symbol_name,      // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,        // 期間 
  int              start_pos,        // 開始位置 
  int              count,            // 複製するデータ数 
  long            volume_array[]   // ティックボリュームを受け取る配列 
  );

CopyTickVolume関数の戻り値はコピーした要素数

CopyTickVolume関数戻り値int型となっているますが、コピーした要素数を返します。

エラーだった場合はー1を返します。

コピーしたデータは第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には取引銘柄を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。ティック数情報という事で、データ型long型となっています。

long型は、int型と同じ整数型ですが、int型よりも大きな範囲の値を格納できるデータ型です。

詳しくは↓の記事をご覧ください。

CopyRealVolume関数は取引量を取得する関数

CopyRealVolume関数は指定された期間における取引量を取得する関数です。

前回作った「OriginalCBarsクラス」のメンバ関数ではVolume関数 にあたる関数となります。

関数の定義は以下の通りです。

int  CopyRealVolume( 
   string          symbol_name,      // 銘柄名 
  ENUM_TIMEFRAMES  timeframe,        // 期間 
  int              start_pos,        // 開始位置 
  int              count,            // 複製するデータ数 
  long            volume_array[]   // ボリューム値を受け取る配列 
  );

CopyRealVolume関数の戻り値はコピーした要素数

CopyRealVolume関数戻り値int型となっているますが、コピーした要素数を返します。

エラーだった場合はー1を返します。

コピーしたデータは第5引数配列に格納されます。

第1引数には取引銘柄を指定する

第1引数には銘柄を指定します定義済み変数_Symbol」を記述すると、プログラムを挿入したチャートの銘柄を指定したことになります。

第2引数には取引銘柄を指定する

第2引数には時間軸を指定します。定数ENUM_TIMEFRAMESで定められた値を設定します。0、もしくはPERIOD_CURRENTと記述すると現在のチャートの時間軸が適用されます

第3引数には、コピー開始位置を指定する

第3引数には、コピー開始位置を指定します。第3引数に0を記述する事によって最新のデータがインデックス0番に格納され、時間軸が古い方に向かって、1.2.3・・・n番目と並んでいます。

第4引数には複製データ数を指定する

第4引数には複製データ数を指定します。第3引数で指定したコピー開始位置から指定した数だけデータをコピーします。

例えば第4引数に「10」と記述し、第3引数に「0」と記述した場合、最新足から10期間分のデータが配列にコピーされます。

第5引数には複製データをコピーする配列を指定する

第5引数には複製データ数をコピーする配列を指定します。データ型はlong型となっています。

Copy関数の使い方

一通り、Copy関数の説明が終わったところで、Copy関数の使い方を見ていきましょう。

といっても、すでに第92回「待機注文クラスを使ってEAを作る」の中で使ったCopyRates関数と使い方は殆ど同じです。

一応CopyOpen関数を例にとって使い方を見ていきます。

//価格情報を格納する配列を用意
double open[];

//配列を時系列にセット
ArraySetAsSeries(open,true);

//始値情報を配列にコピー
CopyOpen(_Symbol,_Period,0,10,open);

価格情報を格納する配列を用意する

まず初めに始値情報を格納する配列を用意します。価格情報になるので、データ型double型となります。サンプルコードの配列名は「open」としておきます。

配列を時系列にセット

続いてはArraySetAsSeries関数を使い、配列「open」を時系列にセットします。

第1引数に時系列セットする配列「open」を、

第2引数にtrueを記述します。trueにした場合、配列は直近の時間のデータから、配列に格納されていきます。配列[0]には取得されたデータ中で最新の時間のデータが格納される、ということになります。

ArraySetAsSeries関数については↓の記事をご覧ください。

始値情報を配列にコピーする

最後にCopyOpen関数を使って、始値情報を配列「open」にコピーします。

サンプルコードではCopyOpen関数を使いましたが、それ以外のCopy関数も使い方は同じです。

まとめ

今回はCopyRates関数以外のCopy関数について紹介してきました。

前回作った「OriginalCBarsクラス」を使えば、複数のArraySetAsSeries関数を一々呼び出す必要もないですし(コンストラクタにその機能が組み込まれている)、クラスインスタンスUpdate関数だけ用意すれば情報取得には事足りるので、基本的には楽だとは思います。

その一方で、まだクラスの使い方に慣れていなかったり、例えば「このプログラムでは終値情報しか使わない!」という事が明らかな場合などは、使う局面も出てくるかと思います。

バー情報取得における、原理原則の部分なので覚えておいた方が良い内容かと思います。

今回解説した関数は以下の通りです。

CopyOpen関数:各バーの始値を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数では、Open関数 にあたる

CopyClose関数:各バーの終値を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数ではClose関数 にあたる

CopyHigh関数:各バーの高値を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数ではHigh関数 にあたる

CopyLow関数:各バーの安値を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数ではLow関数 にあたる

CopyTime関数:各バーのオープン時間を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数ではTime関数 にあたる

CopyTickVolume関数:各バーのティック数を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数ではTickVolume関数 にあたる

CopyRealVolume関数:各バーの取引量を取得する関数

前回作った「OriginalCBarsクラス」のメンバ関数ではVolume関数 にあたる

今回は以上とさせていただきます。

最後までお読みいただきありがとうございました。

 MQL5 EA講座 第104回「価格とバーに関するデータへのアクセス:その2バー情報」

MQL5 EA講座 第106回「最高値と最安値の取得について」【EAの作り方】

コメント

タイトルとURLをコピーしました