1. MT5CopyRatesRange関数の概要と実務での活用法
MQL5において、過去の価格データ(始値、高値、安値、終値、時間、スプレッド等)を取得する最も強力な手段の一つが、指定した期間(開始時刻から終了時刻まで)のデータを一括で取得するCopyRates関数のオーバーロード(通称:Range指定版)です。
実務レベルのEA(エキスパートアドバイザー)開発において、この「期間指定によるデータ取得」は非常に頻繁に利用されます。例えば、「昨日の21時から今日の深夜3時までのボラティリティを計算したい」といった、「本数」ではなく「時間」に基づいたロジックを組む際に必須となります。
初心者がよくつまずくポイントは、MT5のチャート上に表示されているデータと、プログラムが内部的に参照できるヒストリカルデータが必ずしも同期していない点です。また、週末を挟んだ期間指定や、サーバー時間の取り違えによって「データが1件も取得できない」というバグに陥ることが多々あります。この関数を使いこなすことは、堅牢なクオンツ・システムを構築する第一歩と言えます。
2. 構文と戻り値
MQL5のCopyRates関数には複数の書き方がありますが、期間を指定する場合は以下の構文を使用します。
int CopyRates(
string symbol_name, // 通貨ペア名(NULLで現在のチャート)
ENUM_TIMEFRAMES timeframe, // 時間足(PERIOD_H1など)
datetime start_time, // 取得開始日時
datetime stop_time, // 取得終了日時
MqlRates rates_array[] // 格納先の構造体配列
);
戻り値
- 成功時: コピーされた要素の数(配列に格納されたバーの本数)を返します。
- 失敗時:
-1を返します。
取得したデータは MqlRates という構造体の配列に格納されます。この構造体には、time(時間)、open、high、low、close、tick_volume、spread、real_volume のすべての情報が含まれています。
3. 具体的な使い方・実践サンプルコード
以下は、過去24時間の1時間足データを取得し、その最高値と最安値をログに出力する実践的なスクリプトの例です。
void OnStart()
{
// 1. 変数の準備
string symbol = _Symbol; // 現在の通貨ペア
ENUM_TIMEFRAMES tf = PERIOD_H1; // 1時間足
datetime end_time = TimeCurrent(); // 現在時刻(サーバー時間)
datetime start_time = end_time - (24 * 60 * 60); // 24時間前
MqlRates rates[]; // データを格納する配列
// 2. 配列を時系列順(インデックス0が最新)に設定(任意)
ArraySetAsSeries(rates, true);
// 3. データのコピー実行
// 第3引数に開始時刻、第4引数に終了時刻を指定
int copied = CopyRates(symbol, tf, start_time, end_time, rates);
// 4. エラーハンドリングと結果の出力
if(copied > 0)
{
PrintFormat("正常に %d 本のデータを取得しました。", copied);
// 例:取得した範囲内での最高値・最安値を計算
double high_max = rates[0].high;
double low_min = rates[0].low;
for(int i = 0; i < copied; i++)
{
if(rates[i].high > high_max) high_max = rates[i].high;
if(rates[i].low < low_min) low_min = rates[i].low;
}
PrintFormat("過去24時間の最高値: %f, 最安値: %f", high_max, low_min);
}
else
{
// データの取得に失敗した場合
Print("データの取得に失敗。エラーコード: ", GetLastError());
}
}
4. 使用上の注意点とよくあるエラー
-
データの同期待ち:
MT5では、ヒストリカルデータがローカルPCに保存されていない場合、CopyRatesを呼び出した瞬間にバックグラウンドでダウンロードが始まります。そのため、初回呼び出し時は「-1」や「想定より少ない本数」が返ることがあります。ループ処理やSeriesInfoInteger関数を使用して、データが準備できているか確認する処理を入れるのがプロの作法です。 -
配列の時系列(方向):
ArraySetAsSeriesを使用しない場合、配列のインデックス[0]には「指定期間内で最も古いデータ」が入ります。最新のデータを[0]として扱いたい場合は、必ずArraySetAsSeries(rates, true)を実行してください。 -
サーバー時間の意識:
start_timeに指定するのは、あなたのPCの時計(ローカル時間)ではなく、証券会社の「サーバー時間」です。TimeCurrent()を基準に計算するようにしましょう。 -
メモリ消費:
あまりにも広範囲(例:1分足で10年分など)を指定すると、メモリを大量に消費し、ターミナルの動作が不安定になる原因になります。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さ以上に収益を左右するのが「物理的な通信レイテンシ(遅延)」です。自宅のPCから一般的なインターネット回線を通じて自動売買を行うことは、プロのクオンツから見れば非常に高いリスクを伴います。相場急変時に注文を出しても、自宅から証券会社のサーバーにパケットが届くまでの数十〜数百ミリ秒の間に価格が滑り(スリッページ)、本来得られるはずだった利益が消失、あるいは損失が拡大するからです。
FXの自動売買で極限まで約定スピードを高め、優位性を確保するためには、証券会社のデータセンターに近い場所に位置する「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間安定稼働させることはもちろん、ネットワーク遅延を1ミリ秒単位で削る努力こそが、シストレで長期的に勝ち残るための「隠れた必須条件」と言っても過言ではありません。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント