前回は、バーデータへのアクセスを容易にするために、「OriginalPrice.mqh」ファイル内に「OriginalCBarsクラス」というクラスを作りました。
「OriginalCBarsクラス」内に作ったメンバは以下の通りです。(アクセスレベルは全てpublicになります)
・bar[]配列(バー情報にアクセスするためMqlRates構造体型のインスタンス)
※インスタンスについては↓の記事をご覧ください。
・OriginalCBars関数(「bar[]」を時系列にセットする為のコンストラクタ)
※コンストラクタについては↓の記事をご覧ください。
・Update関数(バーデータをbar[]配列にコピーする役割を担うメンバ関数)
※配列については↓の記事をご覧ください。
・TickVolume関数(ティック数情報にアクセスするメンバ関数)
上記のメンバに加え、第103回では、Ask関数とBid関数という独立関数も「OriginalPrice.mqh」ファイル内には作っています。
さて、前回作った「OriginalCBarsクラス」には、配列への情報コピーにCopyRates関数を利用しました。
CopyRates関数で取得した情報を、MqlRates構造体へ格納する事によって、複数のバー情報をまとめて呼び出すことが容易になった訳ですが、その一方で、バー情報の取得記述はこれ以外にもあります。
CopyRates関数が取得できる複数のバー情報のうち、1つだけをコピーして取得するCopy関数もMQL5には用意されています。
今回はそれらの関数の紹介と、その関数を使った情報取得方法を紹介します。
CopyRates関数以外のCopy関数について
CopyRates関数以外のCopy関数には以下のようなものがあります。
CopyHigh関数
CopyLow関数
CopyTime関数
CopyTickVolume関数
CopyRealVolume関数
関数名から、それぞれの関数がどんな情報を取得していくるのかは、概ね想像がつくとは思いますが、一応それぞれの関数の働きを見ていきたいと思います。
CopyOpen関数は始値を取得する関数
CopyOpen関数は各バーの始値を取得する関数です。
前回作った「OriginalCBarsクラス」のメンバ関数では、Open関数 にあたる関数となります。
関数の定義は以下の通りです。
※オーバーロード関数(複数の書式をもつ関数)ですが、今回はよく使う第1書式のみ掲載します。
オーバーロード関数については↓の記事をご覧ください。
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を返します。
第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を返します。
第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関数は安値を取得する関数
前回作った「OriginalCBarsクラス」のメンバ関数ではLow関数 にあたる関数となります。
関数の定義は以下の通りです。
int CopyLow(
string symbol_name, // 銘柄名
ENUM_TIMEFRAMES timeframe, // 期間
int start_pos, // 開始位置
int count, // 複製するデータ数
double low_array[] // 受け取り側の配列
);
CopyLow関数の戻り値はコピーした要素数
CopyLow関数の戻り値はint型となっているますが、コピーした要素数を返します。
エラーだった場合はー1を返します。
第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を返します。
第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を返します。
第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を返します。
第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」を時系列にセットします。
第2引数にtrueを記述します。trueにした場合、配列は直近の時間のデータから、配列に格納されていきます。配列[0]には取得されたデータ中で最新の時間のデータが格納される、ということになります。
※ArraySetAsSeries関数については↓の記事をご覧ください。
始値情報を配列にコピーする
最後にCopyOpen関数を使って、始値情報を配列「open」にコピーします。
サンプルコードではCopyOpen関数を使いましたが、それ以外のCopy関数も使い方は同じです。
まとめ
今回はCopyRates関数以外のCopy関数について紹介してきました。
前回作った「OriginalCBarsクラス」を使えば、複数のArraySetAsSeries関数を一々呼び出す必要もないですし(コンストラクタにその機能が組み込まれている)、クラスのインスタンスとUpdate関数だけ用意すれば情報取得には事足りるので、基本的には楽だとは思います。
その一方で、まだクラスの使い方に慣れていなかったり、例えば「このプログラムでは終値情報しか使わない!」という事が明らかな場合などは、使う局面も出てくるかと思います。
バー情報取得における、原理原則の部分なので覚えておいた方が良い内容かと思います。
今回解説した関数は以下の通りです。
・CopyOpen関数:各バーの始値を取得する関数
※前回作った「OriginalCBarsクラス」のメンバ関数では、Open関数 にあたる
・CopyClose関数:各バーの終値を取得する関数
前回作った「OriginalCBarsクラス」のメンバ関数ではClose関数 にあたる
・CopyHigh関数:各バーの高値を取得する関数
前回作った「OriginalCBarsクラス」のメンバ関数ではHigh関数 にあたる
前回作った「OriginalCBarsクラス」のメンバ関数ではLow関数 にあたる
・CopyTime関数:各バーのオープン時間を取得する関数
前回作った「OriginalCBarsクラス」のメンバ関数ではTime関数 にあたる
・CopyTickVolume関数:各バーのティック数を取得する関数
前回作った「OriginalCBarsクラス」のメンバ関数ではTickVolume関数 にあたる
・CopyRealVolume関数:各バーの取引量を取得する関数
前回作った「OriginalCBarsクラス」のメンバ関数ではVolume関数 にあたる
今回は以上とさせていただきます。
最後までお読みいただきありがとうございました。
コメント