技術辞典

MQL5 CopyRatesの使い方|OHLC・出来高・スプレッドをまとめて取得する方法

EAファンクラブ

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_volumetick出来高検証補助、相場活動量の確認に使う
spreadスプレッドバー単位のスプレッド確認に使う
real_volume実出来高銘柄や環境によって利用可否を確認する

CopyRatesは、価格だけでなくバー時刻も同時に取れるため、確定足判定やログ確認と相性が良い関数です。

start_pos 0と確定足の違い

CopyRatesでstart_posに0を指定すると、現在の未確定バーを取得します。

EAで確定足の終値や高値・安値を使いたい場合は、start_pos 1を基準にするのが基本です。

指定意味EAでの注意点
start_pos = 0現在足形成中のバーです。high、low、closeが変わる可能性があります。
start_pos = 11本前の確定足確定済みバーとして判定しやすくなります。
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が向いています。

関数取得する情報使いやすい場面
CopyRatestime、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更新される可能性がある下抜け判定で使う場合は未確定前提にする
closetickごとに変化する可能性がある確定足の終値とは別に扱う
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_NGrequested、copied、last_error履歴不足や取得失敗の確認
CONFIRMED_RATE_OKshift 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ログを合わせて確認してください。

MT4/MT5の開発・改修相談はこちら

まとめ

CopyRatesは、MQL5でバー時刻、始値、高値、安値、終値、出来高、スプレッドをまとめて取得するための関数です。

終値だけならCopyCloseやiCloseでも確認できますが、同じバーのOHLCや時刻をまとめて扱う場合はCopyRatesが便利です。

start_pos 0は現在足、start_pos 1は1本前の確定足です。EAで確定足ベースの判定を行う場合は、start_pos 1のMqlRatesを使い、時刻、価格、ログの基準を揃えてください。

CopyRatesの戻り値、必要本数、履歴データ不足、上位足取得、ログ出力範囲を確認しておくと、ローソク足判定やバックテスト時のずれを追跡しやすくなります。

ABOUT ME
記事URLをコピーしました