CopyRates関数の働き・役割
CopyRates関数は、指定された銘柄と時間枠に対応する価格データを取得するために使用されます。
この関数は、時間の経過に応じた価格データを扱う際に非常に便利です。取得するデータは、価格の始値、高値、安値、終値、出来高などであり、必要に応じて複数の要素を一度に取得することも可能です。
この関数を使用すると、指定した条件に基づいて、過去の価格データを「行列(matrix)」または「ベクトル(vector)」の形式で取得できます。さらに、データの取得方法として以下の3種類のオプションがあります。
- 初期位置と必要な要素数によるアクセス
指定されたバーのインデックス(順番)から始めて、一定数のデータを取得します。 - 開始日付と必要な要素数によるアクセス
指定された日付から始めて、一定数のデータを取得します。 - 開始日付と終了日付によるアクセス
指定された日付範囲内のデータを取得します。
また、取得したデータは配列や行列に格納され、後の計算や分析に活用できます。このため、CopyRates関数は、過去の価格変動を基にトレード戦略を検討する際や、自動売買ロジックを構築する際に役立つ関数です。
※ちなみに、CopyRates関数はベクトルや行列ではなく、MqlRates構造体の配列にコピーする形式の書式もあります。行列やベクトルを利用するタイプは、MQL5がベクトルや行列を扱える仕様になって導入された新しい書式となります。
※配列にコピーする形式のCopyRates関数については下記の記事をご参照ください。
CopyRates関数の引数について
CopyRates関数の引数は、データ取得の条件を指定するために使用されます。この関数には行列型(matrix)とベクトル型(vector)の2つの形式があり、それぞれ3種類の書式を持っています。以下に、それぞれの書式ごとに引数の説明を行います。
行列型(matrix)の引数について
初期位置と必要な要素数によるアクセスの場合
bool matrix::CopyRates(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
ulong rates_mask, // 要求されたシリーズを指定するフラグの組み合わせ
ulong start, // コピーを開始する最初のバーのインデックス
ulong count // コピーする数
);
- symbol
銘柄名を文字列で指定します。たとえば、「EURUSD」などの通貨ペアを表します。 - period
時間枠を指定します。ENUM_TIMEFRAMES列挙体を使用し、たとえば1分足(PERIOD_M1)や1時間足(PERIOD_H1)などを指定できます。 - rates_mask
取得するデータの種類を指定するフラグです。ENUM_COPY_RATES列挙体の値を使用し、始値や終値、出来高など、必要な情報を選択します。 - start
データを取得し始めるバーのインデックス(通し番号)を指定します。現在のバーを基準に、0が最新のバーを意味します。 - count
取得するデータの要素数を指定します。たとえば「10」と指定すると、最新のバーから10個分のデータが取得されます。
初期日付と必要な要素数によるアクセスの場合
bool matrix::CopyRates(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
ulong rates_mask, // 要求されたシリーズを指定するフラグの組み合わせ
datetime from, // 開始日
ulong count // コピーする数
);
- symbol
銘柄名を文字列で指定します。 - period
時間枠を指定します。 - rates_mask
取得するデータの種類を指定するフラグです。 - from
データの取得を開始する日時をdateTime型で指定します。たとえば、特定の日付や時間を指定して、その時点以降のデータを取得します。 - count
取得するデータの要素数を指定します。
必要な時間の開始日と終了日によるアクセスの場合
bool matrix::CopyRates(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
ulong rates_mask, // 要求されたシリーズを指定するフラグの組み合わせ
datetime from, // 開始日
datetime to // 終了日
);
- symbol
銘柄名を文字列で指定します。 - period
時間枠を指定します。 - rates_mask
取得するデータの種類を指定するフラグです。 - from
データの取得を開始する日時をdateTime型で指定します。 - to
データの取得を終了する日時をdateTime型で指定します。
ベクトル型(vector)の引数について
初期位置と必要な要素数によるアクセスの場合
bool vector::CopyRates(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
ulong rates_mask, // 要求されたシリーズを指定するフラグの組み合わせ
ulong start, // コピーを開始する最初のバーのインデックス
ulong count // コピーする数
);
- symbol
銘柄名を文字列で指定します。 - period
時間枠を指定します。 - rates_mask
取得するデータの種類を指定します。ただし、ベクトル型ではENUM_COPY_RATES列挙体から1つの値のみを指定できます。複数を指定するとエラーが発生します。 - start
データを取得し始めるバーのインデックスを指定します。 - count
取得するデータの要素数を指定します。
初期日付と必要な要素数によるアクセスの場合
bool vector::CopyRates(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
ulong rates_mask, // 要求されたシリーズを指定するフラグの組み合わせ
datetime from, // 開始日
ulong count // コピーする数
);
- symbol
銘柄名を文字列で指定します。 - period
時間枠を指定します。 - rates_mask
取得するデータの種類を指定します。ベクトル型では1つの値のみを指定可能です。 - from
データの取得を開始する日時を指定します。 - count
取得するデータの要素数を指定します。
必要な時間の開始日と終了日によるアクセスの場合
bool vector::CopyRates(
string symbol, // 銘柄名
ENUM_TIMEFRAMES period, // 期間
ulong rates_mask, // 要求されたシリーズを指定するフラグの組み合わせ
datetime from, // 開始日
datetime to // 終了日
);
- symbol
銘柄名を文字列で指定します。 - period
時間枠を指定します。 - rates_mask
取得するデータの種類を指定します。ベクトル型ではENUM_COPY_RATES列挙体から1つの値のみを指定可能です。 - from
データの取得を開始する日時を指定します。 - to
データの取得を終了する日時を指定します。
引数に関する補足説明
- rates_maskは、行列型では複数のフラグを組み合わせることができます。一方で、ベクトル型では1つの値しか指定できません。
- startやcountを指定する場合、最新のバーを基準として柔軟にデータ取得が可能です。
- fromとtoの日時を指定することで、正確な時間範囲のデータ取得が実現します。
CopyRates関数の戻り値について
CopyRates関数の戻り値は、データの取得が成功したかどうかを示す論理型(bool型)です。この戻り値を用いることで、関数の実行結果を確認し、エラー処理を行うことができます。
戻り値の詳細
- 成功した場合
関数はtrueを返します。この場合、指定された条件に基づいてデータが正しく取得され、行列やベクトル、または配列に格納されます。 - 失敗した場合
関数はfalseを返します。この場合、データが取得できなかったことを意味します。エラーの原因を特定するためには、GetLastError関数を使用してエラーコードを確認する必要があります。
CopyRates関数を使ったサンプルコード
以下は、CopyRates関数を使用して価格データを取得し、その内容をエキスパートログに出力するサンプルコードです。
//+------------------------------------------------------------------+
//| スクリプトの開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- 必要な変数を宣言する
// 行列形式でデータを格納するためのmatrix型インスタンスを作成
matrix matrix_rates;
// 配列形式でデータを格納するためのMqlRates構造体の配列を作成
MqlRates mql_rates[];
// ベクトル形式でデータを格納するためのvector型インスタンスを作成
vector vector_rates;
//--- 行列に価格データをコピーする
if(matrix_rates.CopyRates(Symbol(), // 現在の銘柄
PERIOD_CURRENT, // 現在の時間枠
COPY_RATES_OHLCT, // 始値、高値、安値、終値、時間を含むデータ
1, // 最新のバーから1バー遡った位置から
10)) // 10個分のデータを取得
{
// データの取得に成功した場合、行列データをログに出力
Print("行列データ: \n", matrix_rates);
}
else
{
// データの取得に失敗した場合、エラーコードを出力
Print("行列データの取得に失敗しました。エラーコード: ", GetLastError());
}
//--- 配列に価格データをコピーする
if(CopyRates(Symbol(), // 現在の銘柄
PERIOD_CURRENT, // 現在の時間枠
1, // 最新のバーから1バー遡った位置から
10, // 10個分のデータを取得
mql_rates) > 0) // 成功時に取得したデータの数を確認
{
// 配列データをログに出力
Print("配列データ(MqlRates構造体):");
ArrayPrint(mql_rates); // 配列の内容をわかりやすい形式で表示
}
else
{
// データの取得に失敗した場合、エラーコードを出力
Print("配列データの取得に失敗しました。エラーコード: ", GetLastError());
}
//--- ベクトルに価格データをコピーする
if(vector_rates.CopyRates(Symbol(), // 現在の銘柄
PERIOD_CURRENT, // 現在の時間枠
COPY_RATES_CLOSE, // 終値のみを含むデータ
1, // 最新のバーから1バー遡った位置から
15)) // 15個分のデータを取得
{
// データの取得に成功した場合、ベクトルデータをログに出力
Print("ベクトルデータ(終値のみ): \n", vector_rates);
}
else
{
// データの取得に失敗した場合、エラーコードを出力
Print("ベクトルデータの取得に失敗しました。エラーコード: ", GetLastError());
}
}
サンプルコード解説1
//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数 |
//+------------------------------------------------------------------+
void OnStart()
{
//--- クォートを行列に取得する
matrix matrix_rates;
if(matrix_rates.CopyRates(Symbol(), PERIOD_CURRENT, COPY_RATES_OHLCT, 1, 10))
Print("matrix rates: \n", matrix_rates);
else
Print("matrix_rates.CopyRates failed. Error ", GetLastError());
//--- 確認する
MqlRates mql_rates[];
matrix型インスタンスmatrix_ratesの作成
コードでは最初に、matrix型のインスタンスとしてmatrix_ratesが作成されています。matrix型は、価格データを行列形式で保持するための型です。行列は「行」と「列」に分けてデータを整理して扱う形式のことで、複数のデータ属性(例: 始値、高値、安値、終値、時間)を効率的に格納する際に使用されます。
ここでは、このmatrix_ratesがデータを保持する入れ物の役割を果たします。
CopyRatesメソッドによる価格データの取得
CopyRatesメソッドは、過去の価格データを取得するためのメソッドです。このメソッドは、指定した条件に従って価格データを取得し、それをmatrix_ratesに格納します。
引数については以下のように動作します。
- Symbol()は現在のチャートの銘柄(例: EURUSDなど)を取得します。
- PERIOD_CURRENTは現在のチャートで使用している時間枠(例: 1分足や1時間足)を指定します。
- COPY_RATES_OHLCTは、取得するデータに始値、高値、安値、終値、時間を含めることを示します。
1
は、データ取得の開始位置を示します。この場合、最新のバーから1バー遡った位置が指定されています。10
は、取得するデータの個数を示します。ここでは10個のバー(ローソク足)のデータを取得します。
これにより、指定した条件の価格データが行列にコピーされます。
成功時の処理
CopyRatesメソッドが成功した場合は、trueを返します。この場合、取得したデータをエキスパートログに出力するように記述されています。
エキスパートログは、MQL5プログラムの動作結果やメッセージを確認するための場所です。ここでmatrix_ratesを出力することで、取得した価格データを確認できます。
エラー処理
CopyRatesメソッドが失敗した場合は、falseを返します。その際、GetLastError関数を使用して最後に発生したエラーのコードを取得し、それをエキスパートログに出力します。
エラーコードは、どのような問題が発生したのかを特定するのに役立ちます。たとえば、サーバにデータが存在しない場合や、指定した範囲のデータが正しく設定されていない場合などにエラーが発生します。
MqlRates構造体配列の準備
コードの最後では、MqlRates構造体型の配列が宣言されています。この構造体は価格データを保持するための形式で、次のようなデータを格納できます。
- バーの開始時間(time)
- 始値(open)
- 高値(high)
- 安値(low)
- 終値(close)
- ティック量(tick_volume)
- スプレッド(spread)
- 実際の出来高(real_volume)
ここで配列を使用することで、複数のバーのデータを一度に格納できるようになります。
サンプルコード解説2
ここでは、指定された条件で価格データを取得するmatrix_rates.CopyRatesメソッドの動作を詳細に解説します。
matrix_rates.CopyRates(Symbol(), // 現在の銘柄
PERIOD_CURRENT, // 現在の時間枠
COPY_RATES_OHLCT, // 始値、高値、安値、終値、時間を含むデータ
1, // 最新のバーから1バー遡った位置から
10)) // 10個分のデータを取得
{
// データの取得に成功した場合、行列データをログに出力
Print("行列データ: \n", matrix_rates);
}
else
{
// データの取得に失敗した場合、エラーコードを出力
Print("行列データの取得に失敗しました。エラーコード: ", GetLastError());
matrix_rates.CopyRatesメソッドの概要
CopyRatesメソッドは、行列型のインスタンスに過去の価格データを格納するために使用されます。この例では、matrix_ratesという行列型のインスタンスが使用されています。
このコードでは、以下の条件に基づいて価格データを取得します。
- 銘柄(symbol)
Symbol関数を使用して、現在のチャートに表示されている銘柄(例: EURUSDやUSDJPYなど)を取得しています。この値は、どの銘柄のデータを取得するかを指定する第一引数となります。 - 時間枠(period)
PERIOD_CURRENTを指定することで、現在のチャートで設定されている時間枠のデータを取得します。たとえば、1分足や1時間足のような時間枠です。 - 取得するデータの種類(rates_mask)
COPY_RATES_OHLCTフラグを使用することで、始値、高値、安値、終値、時間のすべてのデータを取得するよう指定しています。これにより、ローソク足の価格情報とバーの開始時間をまとめて取得できます。 - 開始位置(start)
1を指定することで、現在のバーから1バー遡った位置を取得開始地点として指定しています。 - 取得するデータの個数(count)
10を指定することで、過去10個分のバーのデータを取得します。
条件式の説明
CopyRatesメソッドの戻り値は、データ取得の成否を示します。この値がtrueの場合、データ取得が成功したことを意味します。成功した場合は以下の処理が行われます。
成功時の処理
データ取得に成功した場合、Print関数を使用して取得した行列データをログに出力します。
Print関数は、文字列や変数の内容をエキスパートログに出力するための関数です。
matrix_ratesには、指定された条件で取得した価格データが行列形式で格納されており、その内容がログに出力されます。
この処理により、取得したデータを視覚的に確認することができます。
失敗時の処理
データ取得に失敗した場合、elseの部分が実行されます。
- エラーメッセージの出力
Print関数を使用して、「行列データの取得に失敗しました。」というメッセージをログに出力します。 - エラーコードの取得
GetLastError関数を使用して、エラーコードを取得し、ログに出力します。このエラーコードを確認することで、なぜデータ取得が失敗したのかを特定することができます。
サンプルコード解説3
//--- 配列に価格データをコピーする
if(CopyRates(Symbol(), // 現在の銘柄
PERIOD_CURRENT, // 現在の時間枠
1, // 最新のバーから1バー遡った位置から
10, // 10個分のデータを取得
mql_rates) > 0) // 成功時に取得したデータの数を確認
{
// 配列データをログに出力
Print("配列データ(MqlRates構造体):");
ArrayPrint(mql_rates); // 配列の内容をわかりやすい形式で表示
}
else
{
// データの取得に失敗した場合、エラーコードを出力
Print("配列データの取得に失敗しました。エラーコード: ", GetLastError());
}
このセクションでは、MqlRates構造体の配列を使用して価格データを取得する部分について詳しく解説します。このコードは、CopyRates関数を用いて価格データを配列形式で格納し、成功時にログに出力する仕組みを示しています。
記事の冒頭にも書いた通り、ベクトルや行列を使うパターンではなく、MqlRates構造体の配列にデータを格納するパターンをこの箇所では紹介しています。
CopyRates関数の概要
CopyRates関数は、価格データをMqlRates構造体の配列に格納するために使用されます。このコードでは、mql_ratesというMqlRates構造体型の配列を用いて、指定された条件に基づいた価格データを取得します。
引数の説明
- 銘柄(symbol)
Symbol関数を使用して、現在のチャートで表示されている銘柄を取得しています。この値が第一引数として渡され、どの銘柄のデータを取得するかを指定します。 - 時間枠(period)
PERIOD_CURRENTを指定することで、現在のチャートで使用されている時間枠(例: 1分足や1時間足)のデータを取得します。 - 開始位置(start)
1を指定することで、現在のバーから1バー遡った位置を取得開始地点として指定しています。 - 取得するデータの個数(count)
10を指定することで、過去10個のバーのデータを取得します。 - 格納先(mql_rates)
MqlRates構造体の配列を指定することで、取得したデータがこの配列に格納されます。
条件式の説明
CopyRates関数は、取得したデータの数を戻り値として返します。この戻り値が0より大きい場合、データの取得に成功したことを示します。この条件式では、戻り値が0より大きい場合に成功と判断し、対応する処理を行います。
成功時の処理
価格データの取得に成功した場合、以下の処理が行われます。
- 配列データの表示
Print関数を使用して、”配列データ(MqlRates構造体):”というメッセージをログに出力します。 - 配列の内容をログに出力
ArrayPrint関数を使用して、mql_rates配列に格納されたデータをエキスパートログにわかりやすい形式で出力します。この関数により、配列の各要素(時間、始値、高値、安値、終値など)が確認できます。
失敗時の処理
価格データの取得に失敗した場合、以下の処理が行われます。
- エラーメッセージの表示
Print関数を使用して、「配列データの取得に失敗しました。」というメッセージをログに出力します。 - エラーコードの取得
GetLastError関数を使用して、発生したエラーコードをログに出力します。このエラーコードを確認することで、問題の原因を特定することができます。
サンプルコード解説4
//--- ベクトルに価格データをコピーする
if(vector_rates.CopyRates(Symbol(), // 現在の銘柄
PERIOD_CURRENT, // 現在の時間枠
COPY_RATES_CLOSE, // 終値のみを含むデータ
1, // 最新のバーから1バー遡った位置から
15)) // 15個分のデータを取得
{
// データの取得に成功した場合、ベクトルデータをログに出力
Print("ベクトルデータ(終値のみ): \n", vector_rates);
}
else
{
// データの取得に失敗した場合、エラーコードを出力
Print("ベクトルデータの取得に失敗しました。エラーコード: ", GetLastError());
}
}
このセクションでは、ベクトル型(vector)のインスタンスを使用して価格データを取得する部分について詳しく解説します。このコードは、CopyRatesメソッドを利用して終値データのみを取得し、成功時にログに出力する仕組みを示しています。
CopyRatesメソッドの概要
CopyRatesメソッドは、ベクトル型のインスタンスに価格データを格納するために使用されます。このコードでは、vector_ratesというベクトル型のインスタンスを利用して、終値データを取得しています。
引数の説明
- 銘柄(symbol)
Symbol関数を使用して、現在のチャートに表示されている銘柄を取得します。この値が第一引数に渡され、どの銘柄のデータを取得するかを指定します。 - 時間枠(period)
PERIOD_CURRENTを指定することで、現在のチャートで設定されている時間枠(例: 1分足、1時間足など)のデータを取得します。 - 取得するデータの種類(rates_mask)
COPY_RATES_CLOSEを指定することで、終値データのみを取得します。他のデータ(始値、高値、安値など)は取得されません。 - 開始位置(start)
1を指定することで、現在のバーから1バー遡った位置を取得開始地点として指定しています。 - 取得するデータの個数(count)
15を指定することで、過去15個分の終値データを取得します。
条件式の説明
CopyRatesメソッドは、データ取得が成功した場合にtrueを返します。この条件式では、成功時にtrueであることを確認し、対応する処理を実行します。
成功時の処理
価格データの取得に成功した場合、以下の処理が行われます。
- ベクトルデータの表示
Print関数を使用して、”ベクトルデータ(終値のみ):”というメッセージをログに出力します。 - ベクトルの内容をログに出力
vector_ratesに格納されたデータがそのままログに表示されます。これにより、取得された終値データを確認できます。
失敗時の処理
価格データの取得に失敗した場合、以下の処理が行われます。
- エラーメッセージの表示
Print関数を使用して、「ベクトルデータの取得に失敗しました。」というメッセージをログに出力します。 - エラーコードの取得
GetLastError関数を使用して、発生したエラーコードをログに出力します。このエラーコードを基に、問題の原因を特定できます。
CopyRates関数を使ってEAを作る際のアイディア
CopyRates関数を活用することで、過去の価格データを柔軟に取得でき、多様なトレード戦略を自動化するエキスパートアドバイザー(EA)を構築できます。以下に、行列型(matrix)とベクトル型(vector)の特徴を活かしたEAのアイディアを紹介します。
行列型(matrix)を活用したEAのアイディア
1. 複数の価格情報を基にしたインジケータ戦略
行列型は、始値、高値、安値、終値、時間など複数の価格情報を一括で取得できるため、これらを用いて複雑なインジケータや戦略を実現できます。
実装の流れ:
2. 高値・安値のブレイクアウト戦略
過去のバーから高値・安値を行列形式で取得し、価格がブレイクアウトした場合に売買する戦略を構築します。
実装の流れ:
- COPY_RATES_HIGHとCOPY_RATES_LOWで高値と安値のデータを取得。
- 過去一定期間の最高値と最安値を計算。
- 価格がこれらを超えた場合に売買シグナルを生成。
3. マルチタイムフレーム戦略
行列型のデータ取得を用い、異なる時間枠の価格データを組み合わせたトレード戦略を構築します。
実装の流れ:
- PERIOD_H1(1時間足)とPERIOD_M15(15分足)の価格データを取得。
- 各時間枠でのトレンド方向を確認。
- トレンドが一致した場合のみエントリー。
ベクトル型(vector)を活用したEAのアイディア
1. 移動平均クロスオーバー戦略
ベクトル型は、特定の価格データ(例: 終値)を効率的に取得・操作できるため、移動平均の計算に適しています。
実装の流れ:
2. ボリンジャーバンド逆張り戦略
終値データを取得し、ボリンジャーバンドを計算して逆張り戦略を実行します。
実装の流れ:
- COPY_RATES_CLOSEで終値データを取得。
- ボリンジャーバンドの上限と下限を計算。
- 価格が上限を超えた場合に売り、下限を割った場合に買い。
3. 終値を基にしたシンプルなリバーサル戦略
過去の終値データのトレンドが反転したときにエントリーします。
実装の流れ:
- COPY_RATES_CLOSEで終値データを取得。
- 連続する終値の上昇・下降トレンドを判定。
- トレンドが反転した場合に売買シグナルを生成。
行列型とベクトル型の組み合わせによるEAのアイディア
1. インジケータとシンプルな価格データを組み合わせた戦略
行列型で複数の価格データを取得し、ベクトル型で単一の価格データを取得することで、複雑な戦略が可能になります。
実装の流れ:
時間データを活用したEAのアイディア
1. 特定の時間帯トレード戦略
価格データの時間情報を活用し、特定の時間帯のみトレードを実行します。
実装の流れ:
- COPY_RATES_TIMEで時間データを取得。
- ロンドン市場やニューヨーク市場のオープン時間にトレードを実行。
- 特定の時間帯以外はトレードを抑制。
注意点
- 行列型は複数の価格データを同時に取得できる反面、データ量が多いため、メモリ消費や計算効率を考慮する必要があります。
- ベクトル型は単一のデータを効率的に扱うため、特定の価格情報(例: 終値)に焦点を当てたシンプルな戦略に向いています。
- 取得するデータ量や範囲を適切に制限することで、処理速度を確保しつつ柔軟なEA構築が可能になります。
CopyRates関数の行列型とベクトル型を使い分けることで、戦略の幅が広がり、効率的な自動売買が実現します。