MQL5 CopyRatesの使い方|OHLC・出来高・スプレッドをまとめて取得する方法
MQL5でEAのローソク足情報を取得する時は、CopyRatesを使うと、バー時刻、始値、高値、安値、終値、出来高、スプレッドをまとめて確認できます。
CopyClose、CopyHigh、CopyLow、CopyTimeのように個別データを取得する方法もありますが、同じバーのOHLCや時刻をまとめて扱いたい場合は、CopyRatesの方が整理しやすい場面があります。
EAが確定足の終値で判定したい、上位足の高値・安値を確認したい、バックテストでローソク足条件を再現したい、現在足と確定足を混同したくない、といった場合は、CopyRatesとMqlRates構造体の使い方を理解しておくことが重要です。
このページでは、MQL5のCopyRatesの使い方を、MqlRates、OHLC取得、確定足判定、CopyClose・CopyTime・iCloseとの違い、履歴不足ログの観点から整理します。
なお、このページはMQL5開発における技術確認を目的とした内容です。売買判断、推奨エントリー、推奨ロット、利益保証、損失回避保証を行うものではありません。
CopyRatesとは何か
CopyRatesは、指定した銘柄・時間足のバー情報をMqlRates配列へコピーする関数です。
MqlRatesには、バー開始時刻、始値、高値、安値、終値、tick volume、スプレッド、real volumeが含まれます。
void PrintLatestRates()
{
MqlRates rates[];
ArraySetAsSeries(rates, true);
ResetLastError();
int copied = CopyRates(_Symbol, PERIOD_CURRENT, 0, 3, rates);
if(copied != 3)
{
PrintFormat("[COPYRATES_NG] symbol=%s timeframe=%d copied=%d last_error=%d",
_Symbol,
PERIOD_CURRENT,
copied,
GetLastError());
return;
}
PrintFormat("[COPYRATES_OK] time=%s open=%.5f high=%.5f low=%.5f close=%.5f spread=%d",
TimeToString(rates[0].time, TIME_DATE|TIME_SECONDS),
rates[0].open,
rates[0].high,
rates[0].low,
rates[0].close,
rates[0].spread);
}CopyRatesの戻り値は、コピーできたバー数です。必要本数を取得できていない場合は、そのデータを売買判定やログ判定に使わないようにしてください。
MqlRatesに含まれる情報
MqlRatesは、ローソク足1本分の情報をまとめて持つ構造体です。
EAでOHLC、出来高、スプレッド、バー時刻を同時に確認したい場合に便利です。
| 項目 | 意味 | EAでの使い方 |
|---|---|---|
| time | バー開始時刻 | 新バー判定、確定足確認、ログ時刻に使う |
| open | 始値 | 足の開始価格、ギャップ確認に使う |
| high | 高値 | ブレイク、レンジ、上位足高値確認に使う |
| low | 安値 | ブレイク、レンジ、下位足安値確認に使う |
| close | 終値 | 確定足判定、クロス判定、フィルター確認に使う |
| tick_volume | tick出来高 | 検証補助、相場活動量の確認に使う |
| spread | スプレッド | バー単位のスプレッド確認に使う |
| real_volume | 実出来高 | 銘柄や環境によって利用可否を確認する |
CopyRatesは、価格だけでなくバー時刻も同時に取れるため、確定足判定やログ確認と相性が良い関数です。
start_pos 0と確定足の違い
CopyRatesでstart_posに0を指定すると、現在の未確定バーを取得します。
EAで確定足の終値や高値・安値を使いたい場合は、start_pos 1を基準にするのが基本です。
| 指定 | 意味 | EAでの注意点 |
|---|---|---|
| start_pos = 0 | 現在足 | 形成中のバーです。high、low、closeが変わる可能性があります。 |
| start_pos = 1 | 1本前の確定足 | 確定済みバーとして判定しやすくなります。 |
| start_pos = 2以上 | さらに過去の足 | 過去比較、クロス判定、レンジ確認に使います。 |
現在足を使うのか、確定足を使うのかを仕様として固定してください。未確定足の終値を使うと、tickごとに値が変わるため、バックテストやリアル運用前確認で判定がずれる場合があります。
確定足のOHLCを取得する例
確定足ベースで判定する場合は、start_pos 1から1本分を取得します。
bool GetConfirmedRate(MqlRates &rate)
{
MqlRates rates[];
ArraySetAsSeries(rates, true);
ResetLastError();
int copied = CopyRates(_Symbol, PERIOD_CURRENT, 1, 1, rates);
if(copied != 1)
{
PrintFormat("[CONFIRMED_RATE_NG] symbol=%s timeframe=%d copied=%d last_error=%d",
_Symbol,
PERIOD_CURRENT,
copied,
GetLastError());
return false;
}
rate = rates[0];
PrintFormat("[CONFIRMED_RATE_OK] time=%s open=%.5f high=%.5f low=%.5f close=%.5f",
TimeToString(rate.time, TIME_DATE|TIME_SECONDS),
rate.open,
rate.high,
rate.low,
rate.close);
return true;
}確定足の値を使う場合は、time、open、high、low、closeを同じバーから取得してください。終値だけshift 1、高値だけshift 0のように混在させると、判定がずれる場合があります。
CopyRatesとCopyCloseの違い
CopyCloseは終値だけを取得する関数です。
終値だけが必要な場合はCopyCloseで十分です。一方で、同じバーの時刻、高値、安値、始値、スプレッドも使いたい場合はCopyRatesが向いています。
| 関数 | 取得する情報 | 使いやすい場面 |
|---|---|---|
| CopyRates | time、open、high、low、close、volume、spread | バー情報をまとめて使いたい場合 |
| CopyClose | 終値 | 終値だけで判定する場合 |
| CopyHigh | 高値 | 高値ブレイクやレンジ上限を確認する場合 |
| CopyLow | 安値 | 安値ブレイクやレンジ下限を確認する場合 |
| CopyTime | バー開始時刻 | 新バー判定や同一バー制御を行う場合 |
EAの処理を軽くしたい場合は、必要な情報だけ取得します。複数の情報を同じバーから安全に取りたい場合は、CopyRatesでまとめて取得する方がミスを減らしやすくなります。
CopyRatesとiClose / iHigh / iLowの違い
iClose、iHigh、iLowは、指定した銘柄・時間足・shiftの価格を1つ返す関数です。
1本の終値や高値だけを簡単に取得したい場合は便利ですが、複数回呼び出すと、時刻や取得タイミングを揃えにくくなる場合があります。
| 関数 | 特徴 | 注意点 |
|---|---|---|
| iClose | 指定shiftの終値を取得する | エラー時は0を返すため、GetLastErrorも確認する |
| iHigh | 指定shiftの高値を取得する | 同じバーの他情報と揃える場合は注意する |
| iLow | 指定shiftの安値を取得する | 履歴不足時や初回取得時に注意する |
| CopyRates | バー情報をまとめて取得する | 配列、戻り値、必要本数を確認する |
終値だけならiCloseでも確認できますが、EAの判定ログや検証では、CopyRatesでtime、open、high、low、closeをまとめて出す方が追跡しやすい場合があります。
現在足を使う場合の注意点
現在足のMqlRatesを取得する場合、rates[0].closeは現在時点の最新価格に近い値として変化します。
また、rates[0].highやrates[0].lowも、足が確定するまで更新される可能性があります。
| 現在足の項目 | 変化する可能性 | 注意点 |
|---|---|---|
| open | 通常はバー開始後に固定される | バー開始価格として扱いやすい |
| high | 更新される可能性がある | ブレイク判定で使う場合は未確定前提にする |
| low | 更新される可能性がある | 下抜け判定で使う場合は未確定前提にする |
| close | tickごとに変化する可能性がある | 確定足の終値とは別に扱う |
| spread | 変化する場合がある | 現在スプレッドとは取得タイミングを確認する |
現在足の値を使うEAでは、速報性を優先するのか、確定後の安定性を優先するのかを明確にしてください。
複数本のバーを取得する
CopyRatesでは、複数本のバーをまとめて取得できます。
直近数本の高値・安値、終値の並び、ローソク足パターン、レンジ幅などを確認する場合に使えます。
bool GetRecentRates(const int count, MqlRates &rates[])
{
ArraySetAsSeries(rates, true);
ResetLastError();
int copied = CopyRates(_Symbol, PERIOD_CURRENT, 0, count, rates);
if(copied != count)
{
PrintFormat("[RECENT_RATES_NG] requested=%d copied=%d last_error=%d",
count,
copied,
GetLastError());
return false;
}
PrintFormat("[RECENT_RATES_OK] count=%d current_time=%s confirmed_time=%s",
copied,
TimeToString(rates[0].time, TIME_DATE|TIME_SECONDS),
TimeToString(rates[1].time, TIME_DATE|TIME_SECONDS));
return true;
}複数本取得する場合は、必要本数を満たしているかを必ず確認してください。取得本数が不足したままrates[1]やrates[2]へアクセスすると、配列範囲エラーや未確認値の利用につながります。
上位足のOHLCを取得する
CopyRatesは、現在チャートの時間足だけでなく、別時間足のバー情報も取得できます。
例えば、M15チャート上のEAでH1の高値・安値を確認したい場合にも使えます。
bool GetHigherTimeframeRate(const ENUM_TIMEFRAMES timeframe,
MqlRates &rate)
{
MqlRates rates[];
ArraySetAsSeries(rates, true);
ResetLastError();
int copied = CopyRates(_Symbol, timeframe, 1, 1, rates);
if(copied != 1)
{
PrintFormat("[HTF_RATE_NG] symbol=%s timeframe=%d copied=%d last_error=%d",
_Symbol,
timeframe,
copied,
GetLastError());
return false;
}
rate = rates[0];
PrintFormat("[HTF_RATE_OK] timeframe=%d time=%s high=%.5f low=%.5f close=%.5f",
timeframe,
TimeToString(rate.time, TIME_DATE|TIME_SECONDS),
rate.high,
rate.low,
rate.close);
return true;
}マルチタイムフレームEAでは、時間足ごとに取得タイミングや確定足の扱いを分けてください。M15の確定足とH1の確定足は、同じタイミングで更新されるとは限りません。
履歴データ不足を確認する
CopyRatesで必要本数を取得できない場合、対象銘柄・時間足の履歴データが不足している可能性があります。
チャートへEAをセットした直後、別銘柄や上位足を初めて参照した時、ストラテジーテスター開始直後などは、データ準備が間に合っていない場合があります。
| 確認項目 | 内容 | ログ例 |
|---|---|---|
| CopyRates戻り値 | 必要本数を取得できたか | COPYRATES_NG |
| GetLastError | 取得失敗時のエラー確認 | last_error |
| Bars | 対象銘柄・時間足のバー数 | BARS_CHECK |
| SeriesInfoInteger | 時系列データの同期状態 | SERIES_SYNC_CHECK |
| 再試行 | 次tickやOnTimerで再確認するか | HISTORY_WAIT |
履歴データが不足している時は、値を使わず、次のtickまたはOnTimerで再確認する設計にしてください。
CopyRatesログで確認したい項目
CopyRatesを使う処理では、symbol、timeframe、start_pos、count、copied、bar time、OHLC、last_errorをログに残すと確認しやすくなります。
| ログ名 | 確認内容 | 用途 |
|---|---|---|
| COPYRATES_OK | 取得本数、time、OHLC | バー情報取得成功の確認 |
| COPYRATES_NG | requested、copied、last_error | 履歴不足や取得失敗の確認 |
| CONFIRMED_RATE_OK | shift 1のOHLC | 確定足判定の確認 |
| HTF_RATE_OK | 上位足のtime、high、low、close | マルチタイムフレーム確認 |
| RANGE_CHECK | 直近高値・安値・値幅 | レンジ判定やブレイク判定の確認 |
| HISTORY_WAIT | 履歴準備待ち | 初回起動や別時間足参照時の確認 |
通常運用では、毎tickすべてのOHLCログを出すと多くなりすぎます。デバッグ時、NG時、新バー時、または検証用モードに限定して出すと扱いやすくなります。
ログ出力例
[COPYRATES_OK] symbol=GOLD timeframe=15 start_pos=1 count=1 copied=1 time=2026.05.26 10:15:00 open=2350.10 high=2353.20 low=2348.90 close=2351.80 spread=35
[RECENT_RATES_OK] count=5 current_time=2026.05.26 10:30:00 confirmed_time=2026.05.26 10:15:00
[HTF_RATE_OK] timeframe=60 time=2026.05.26 10:00:00 high=2358.40 low=2344.20 close=2352.10
[RANGE_CHECK] bars=20 highest=2360.50 lowest=2338.70 range=21.80
[COPYRATES_NG] symbol=GOLD timeframe=240 requested=10 copied=-1 last_error=4401
[HISTORY_WAIT] symbol=GOLD timeframe=240 reason=not_enough_bars
ログ例の銘柄、価格、時間足、スプレッド、エラー番号は確認用です。実際の値は、銘柄、口座、ヒストリカルデータ、テスター条件によって変わります。
よくある失敗パターン
| 失敗パターン | 問題点 | 確認方法 |
|---|---|---|
| start_pos 0を確定足として使う | 現在足の変化する値で判定してしまう | 確定足ならstart_pos 1を使う |
| CopyRates戻り値を確認しない | 取得失敗時の値を使ってしまう | copiedが必要本数と一致するか確認する |
| 必要本数より少ない配列へアクセスする | 配列範囲エラーや不正値参照につながる | countとcopiedを確認してからrates[n]へアクセスする |
| 現在足と確定足を混在させる | 時刻、終値、高値、安値の基準がずれる | 同じshiftのMqlRatesを使う |
| 上位足の履歴不足を考慮しない | MTF判定で値が取れない | timeframe別にCopyRates結果を確認する |
| 毎tick詳細ログを出す | Expertsログが膨らみ、BTが重くなる | 新バー時・NG時・debug時に限定する |
| CopyCloseやiCloseとの役割を混同する | 必要以上に複雑、または情報不足になる | 必要情報に応じて関数を使い分ける |
CopyRatesとあわせて確認したい時系列データ
CopyRatesはOHLC、出来高、スプレッド、バー時刻をまとめて取得できます。実装時は、CopyTimeによる新バー判定やTimeCurrentによる現在時刻の扱いもあわせて確認してください。
| 確認したい内容 | 関連ページ | 確認ポイント |
|---|---|---|
| バー時刻と新バー判定 | MQL5 CopyTimeの使い方 | CopyRatesで取得したバー情報と、CopyTimeで取得するバー時刻の関係を確認します。 |
| サーバー時間とEA稼働時間 | MQL5 TimeCurrentの使い方 | サーバー時間、取引時間、OnTick / OnTimerでの時刻取得の違いを確認します。 |
| 価格取得関数の使い分け | MQL5時系列・価格取得関数辞典 | CopyRates、CopyClose、CopyTime、iClose、SymbolInfo系を目的別に整理します。 |
関連ページ
CopyRatesは、時系列データ、CopyTime、新バー判定、ログ確認、EA稼働時間と合わせて確認すると整理しやすくなります。
| 関連ページ | 確認できること |
|---|---|
| MQL5関数辞典 | CopyRates、CopyClose、CopyTime、SymbolInfo系など主要関数の整理 |
| MQL5イベント処理完全ガイド | OnTick、OnTimer、OnInitなどイベントごとの処理整理 |
| MQL5デバッグ・ログファースト開発完全ガイド | Expertsログ、再現条件、ログ設計の確認 |
| MT5のログ確認方法 | ExpertsログとJournalログの確認方法 |
| EAの稼働時間とは | EAの稼働時間、停止時間、サーバー時間の基本 |
時系列データと価格取得全体を確認する場合
CopyRatesは、MqlRates配列へバー時刻、始値、高値、安値、終値、出来高、スプレッドをまとめて取得する関数です。時系列データ取得の全体像や、終値・高値・安値だけを個別に取得する方法もあわせて確認すると、実装時の使い分けが整理しやすくなります。
| 確認したいこと | 確認するページ | 主な確認内容 |
|---|---|---|
| MQL5の時系列データ取得全体を確認したい | MQL5時系列データ・価格取得完全ガイド | CopyRates、CopyTime、CopyClose、iClose、価格データ、バー時刻の確認 |
| 終値・高値・安値を個別に取得したい | MQL5 CopyCloseとiCloseの違い | CopyClose、iClose、iHigh、iLow、shift 0 / shift 1、戻り値0の確認 |
CopyRatesを使う時は、現在足と確定足、取得本数、MqlRatesの配列順、CopyCloseやiCloseとの使い分けを分けて確認してください。確定足ベースで判定する場合は、バー時刻、始値、高値、安値、終値の基準を同じshiftでそろえることが重要です。
開発依頼前に整理したい情報
CopyRates、OHLC取得、確定足判定、上位足フィルター、ローソク足条件の実装を相談する場合は、次の情報を整理してください。
| 整理する情報 | 確認内容 |
|---|---|
| 対象EA | 新規EA、既存EA改修、インジケーターEA化、通知ツールのどれか |
| 取得したい情報 | open、high、low、close、time、spread、volumeのどれか |
| 判定時間足 | 現在チャート時間足か、M15、H1など別時間足か |
| 判定足 | 現在足を使うか、確定足を使うか |
| 取得本数 | 直近1本だけか、過去数本を使うか |
| 組み合わせる処理 | 新バー判定、同一バー制御、CopyBuffer、OrderSend前チェックなど |
| 履歴不足時の扱い | 次tickで再確認するか、OnTimerで待つか、初期化失敗にするか |
| ログ | COPYRATES_OK、COPYRATES_NG、CONFIRMED_RATE_OK、HTF_RATE_OKなど |
| 検証条件 | バックテスト期間、銘柄、時間足、スプレッド、ログ量、再現手順 |
CopyRatesまわりの不具合を相談する場合は、取得したい時間足、start_pos、count、CopyRates戻り値、GetLastError、取得したOHLCログを合わせて確認してください。
まとめ
CopyRatesは、MQL5でバー時刻、始値、高値、安値、終値、出来高、スプレッドをまとめて取得するための関数です。
終値だけならCopyCloseやiCloseでも確認できますが、同じバーのOHLCや時刻をまとめて扱う場合はCopyRatesが便利です。
start_pos 0は現在足、start_pos 1は1本前の確定足です。EAで確定足ベースの判定を行う場合は、start_pos 1のMqlRatesを使い、時刻、価格、ログの基準を揃えてください。
CopyRatesの戻り値、必要本数、履歴データ不足、上位足取得、ログ出力範囲を確認しておくと、ローソク足判定やバックテスト時のずれを追跡しやすくなります。
