技術講座

MQL5時系列データ・価格取得完全ガイド|CopyRates・iClose・SymbolInfoの基本

EAファンクラブ

MQL5でEAやインジケーターを開発する時、時系列データと価格取得の扱いは非常に重要です。シグナル判定、フィルター、決済条件、バックテスト、ログ確認の多くは、ローソク足の始値・高値・安値・終値・時刻・出来高などのデータを正しく取得できていることが前提になります。

価格取得で混乱しやすいのは、現在足と確定足、配列方向、取得本数、CopyRatesとiCloseの使い分け、MTFで上位足を参照する時の同期、別銘柄データ取得、バックテスト時のデータ不足です。値が0なのか、値を取得できていないのかを分けて確認しないと、EAが注文しない原因や誤判定の原因を追いにくくなります。

この記事では、MQL5で時系列データと価格取得を確認するために、CopyRates、MqlRates、iOpen、iHigh、iLow、iClose、iTime、iBarShift、CopyClose、CopyTime、ArraySetAsSeries、現在足と確定足、MTF、マルチシンボル、ログ設計、バックテスト確認までを実務目線で整理します。

なお、この記事はMT5 / MQL5のEA開発、インジケーター開発、価格取得、時系列データ確認、ログ確認を目的とした技術記事です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。

この記事で確認すること

  • MQL5の時系列データとは何か
  • 現在足と確定足の違い
  • CopyRatesとMqlRatesの使い方
  • iOpen、iHigh、iLow、iCloseの使い分け
  • iTimeとiBarShiftでバー時刻・位置を確認する方法
  • CopyClose、CopyHigh、CopyLow、CopyTimeの使い方
  • ArraySetAsSeriesによる配列方向の注意点
  • shift=0とshift=1の違い
  • MTFで上位足を参照する時の注意点
  • マルチシンボルで別銘柄データを取得する時の注意点
  • バックテストで時系列データを確認する方法
  • 価格取得エラーをログで追跡する設計

MQL5の時系列データとは

MQL5の時系列データとは、チャート上のローソク足や価格情報を時間順に扱うためのデータです。EAのシグナル判定では、始値、終値、高値、安値、時刻、出来高、スプレッドなどを参照することがあります。

たとえば、移動平均線の傾き、前回足の終値、直近高値・安値、ブレイク判定、押し目判定、時間帯フィルター、上位足方向などは、時系列データを正しく取得できていないと成立しません。

MQL5では、CopyRatesでMqlRates配列としてまとめて取得する方法、iCloseなどで単体の価格を取得する方法、CopyCloseやCopyTimeで特定系列を配列として取得する方法があります。用途によって使い分けることが重要です。

データ意味EAで使う例
timeバーの開始時刻。新バー判定、時間帯フィルター、履歴照合。
open始値。ローソク足判定、ギャップ確認。
high高値。ブレイク判定、直近高値確認、レンジ判定。
low安値。直近安値確認、ストップ位置確認。
close終値。確定足判定、クロス判定、フィルター判定。
tick_volumeティック出来高。簡易的な活動量確認。
spreadバーに関連するスプレッド情報。検証補助、スプレッド条件確認。

現在足と確定足の違い

時系列データを扱う時に最も重要なのが、現在足と確定足の違いです。現在足はまだ形成中のローソク足です。価格が動くたびに高値、安値、終値が変化します。確定足は、すでに閉じたローソク足で、基本的には後から値が変わりません。

EAのシグナル判定では、現在足を使うのか、確定足を使うのかを明確にする必要があります。現在足で判定すると、シグナルが出たり消えたりすることがあります。確定足で判定すると、反応は遅くなりますが、判定の再現性は高くなります。

MQL5では、一般的にshift=0が現在足、shift=1が1本前の確定足として扱われます。ただし、使用する関数や配列方向によって見え方が変わるため、ArraySetAsSeriesやCopyRatesの取得結果をログで確認することが重要です。

指定意味注意点
shift=0現在足。形成中なので値が変化します。
shift=11本前の確定足。確定したローソク足として判定しやすいです。
shift=22本前の確定足。過去比較やクロス判定で使います。
現在足判定早い反応が可能。シグナルが消える可能性があります。
確定足判定再現性が高い。エントリータイミングは遅くなります。

CopyRatesとMqlRatesの基本

CopyRatesは、指定した銘柄と時間足のローソク足データをMqlRates配列へ取得するための関数です。MqlRatesには、time、open、high、low、close、tick_volume、spread、real_volumeなどが含まれます。

複数本のローソク足をまとめて取得したい場合、CopyRatesは非常に便利です。EAで直近数本のローソク足を比較したい場合、クロス判定、ブレイク判定、高値安値確認、確定足判定を行う場合に使いやすい方法です。

ただし、CopyRatesは戻り値で取得できた本数を返します。要求本数を取得できなかった場合は、データ不足、ヒストリー未同期、銘柄未選択、時間足データ不足などを確認する必要があります。

bool GetRecentRates(string symbol, ENUM_TIMEFRAMES timeframe, int count, MqlRates &rates[])
{
   ArraySetAsSeries(rates, true);

   ResetLastError();

   int copied = CopyRates(symbol, timeframe, 0, count, rates);

   if(copied < count)
   {
      PrintFormat("COPYRATES_FAIL symbol=%s tf=%d request=%d copied=%d last_error=%d",
                  symbol,
                  timeframe,
                  count,
                  copied,
                  GetLastError());
      return false;
   }

   PrintFormat("COPYRATES_OK symbol=%s tf=%d copied=%d time0=%s close0=%.5f close1=%.5f",
               symbol,
               timeframe,
               copied,
               TimeToString(rates[0].time),
               rates[0].close,
               rates[1].close);

   return true;
}

この例では、CopyRatesで指定本数のローソク足を取得し、取得本数が不足していればログに出しています。ArraySetAsSeriesをtrueにしているため、rates[0]が現在足、rates[1]が1本前の足として扱いやすくなります。

CopyRatesで確認したい項目

CopyRatesを使う時は、取得できたかどうかだけでなく、どの銘柄、どの時間足、何本取得したか、rates[0]とrates[1]が何を指しているかを確認します。ログに時刻と終値を出すと、現在足と確定足の混同に気づきやすくなります。

確認項目内容ログで見る理由
symbol取得対象の銘柄。チャート銘柄と参照銘柄を混同しないため。
timeframe取得対象の時間足。現在チャート時間足と上位足を分けるため。
request count要求本数。必要な本数を指定できているか確認します。
copied実際に取得できた本数。データ不足を検出するため。
rates[0]現在足または最新データ。配列方向の確認に使います。
rates[1]1本前の足。確定足判定に使うことが多いです。
GetLastError失敗時のエラー。取得失敗の原因追跡に使います。

iOpen・iHigh・iLow・iCloseの使い方

iOpen、iHigh、iLow、iCloseは、指定した銘柄、時間足、shiftの価格を取得する関数です。1つの価格だけを簡単に取得したい場合に使いやすい方法です。

たとえば、1本前の確定足の終値を取得したい場合はiClose(_Symbol, PERIOD_CURRENT, 1)のように指定します。現在足の終値を取得する場合はshift=0ですが、現在足の終値は価格更新ごとに変化するため、確定足判定とは分けて扱ってください。

関数取得する値使いどころ
iOpen指定バーの始値。ローソク足の方向、ギャップ確認。
iHigh指定バーの高値。直近高値、ブレイク判定。
iLow指定バーの安値。直近安値、押し目・戻り確認。
iClose指定バーの終値。確定足判定、クロス判定、終値フィルター。
iTime指定バーの時刻。新バー判定、バー同期確認。
void PrintLastClosedBar(string symbol, ENUM_TIMEFRAMES timeframe)
{
   int shift = 1;

   double open_price  = iOpen(symbol, timeframe, shift);
   double high_price  = iHigh(symbol, timeframe, shift);
   double low_price   = iLow(symbol, timeframe, shift);
   double close_price = iClose(symbol, timeframe, shift);
   datetime bar_time  = iTime(symbol, timeframe, shift);

   PrintFormat("CLOSED_BAR symbol=%s tf=%d shift=%d time=%s O=%.5f H=%.5f L=%.5f C=%.5f",
               symbol,
               timeframe,
               shift,
               TimeToString(bar_time),
               open_price,
               high_price,
               low_price,
               close_price);
}

この例では、1本前の確定足のOHLCと時刻をログに出しています。EAのシグナル判定で確定足を使う場合、shift=1を基準にするか、現在足を使うかを仕様として明確にしてください。

iTimeと新バー判定

EAでは、毎ティックでシグナル判定するのではなく、新しいバーができた時だけ判定したい場面があります。このような時は、iTimeで現在足の開始時刻を取得し、前回記録したバー時刻と比較します。

新バー判定を行うことで、同じバー内で何度もエントリー条件を評価してしまうことや、重複発注を減らしやすくなります。ただし、スキャルピングやティック単位のロジックでは毎ティック判定が必要な場合もあります。

bool IsNewBar(string symbol, ENUM_TIMEFRAMES timeframe)
{
   static datetime last_bar_time = 0;

   datetime current_bar_time = iTime(symbol, timeframe, 0);

   if(current_bar_time == 0)
   {
      PrintFormat("NEWBAR_TIME_FAIL symbol=%s tf=%d last_error=%d",
                  symbol,
                  timeframe,
                  GetLastError());
      return false;
   }

   if(current_bar_time != last_bar_time)
   {
      PrintFormat("NEWBAR_DETECTED symbol=%s tf=%d time=%s previous=%s",
                  symbol,
                  timeframe,
                  TimeToString(current_bar_time),
                  TimeToString(last_bar_time));

      last_bar_time = current_bar_time;
      return true;
   }

   return false;
}

この例では、現在足の開始時刻が前回と変わった時に新バーとして判定しています。複数銘柄や複数時間足を扱うEAでは、static変数1つでは足りない場合があるため、銘柄・時間足ごとに状態を持つ設計が必要です。

iBarShiftで時刻からバー位置を調べる

iBarShiftは、指定した時刻がどのバーに対応するかを調べるために使います。上位足と下位足を対応させる時、別銘柄のバー位置を照合する時、履歴ログの時刻からチャート上のバーを探す時に役立ちます。

iBarShiftを使う時は、指定時刻が対象銘柄・対象時間足のヒストリーデータ内に存在するかを確認します。データ不足や時刻のずれがあると、期待したバー位置が取得できないことがあります。

int FindBarByTime(string symbol, ENUM_TIMEFRAMES timeframe, datetime target_time)
{
   ResetLastError();

   int shift = iBarShift(symbol, timeframe, target_time, false);

   if(shift < 0)
   {
      PrintFormat("IBARSHIFT_FAIL symbol=%s tf=%d target=%s last_error=%d",
                  symbol,
                  timeframe,
                  TimeToString(target_time),
                  GetLastError());
      return -1;
   }

   PrintFormat("IBARSHIFT_OK symbol=%s tf=%d target=%s shift=%d bar_time=%s",
               symbol,
               timeframe,
               TimeToString(target_time),
               shift,
               TimeToString(iTime(symbol, timeframe, shift)));

   return shift;
}

この例では、指定時刻からバー位置を取得し、対応するバー時刻もログに出しています。MTFやマルチシンボルでは、時刻同期の確認に使えます。

CopyClose・CopyHigh・CopyLow・CopyTimeの使い方

CopyRatesはOHLCや時刻をまとめて取得できますが、終値だけ、高値だけ、時刻だけを配列で取得したい場合は、CopyClose、CopyHigh、CopyLow、CopyTimeなどを使う方法もあります。

たとえば、直近数本の終値だけを比較したい場合はCopyCloseが便利です。高値更新や安値更新を確認したい場合はCopyHighやCopyLowを使えます。バー時刻の同期確認にはCopyTimeが使えます。

bool GetRecentCloses(string symbol, ENUM_TIMEFRAMES timeframe, int count, double &closes[])
{
   ArraySetAsSeries(closes, true);

   ResetLastError();

   int copied = CopyClose(symbol, timeframe, 0, count, closes);

   if(copied < count)
   {
      PrintFormat("COPYCLOSE_FAIL symbol=%s tf=%d request=%d copied=%d last_error=%d",
                  symbol,
                  timeframe,
                  count,
                  copied,
                  GetLastError());
      return false;
   }

   PrintFormat("COPYCLOSE_OK symbol=%s tf=%d close0=%.5f close1=%.5f copied=%d",
               symbol,
               timeframe,
               closes[0],
               closes[1],
               copied);

   return true;
}

Copy系関数では、取得本数を必ず確認します。要求本数より少ない場合は、そのままシグナル判定に使わず、ログに出して処理を止める方が安全です。

ArraySetAsSeriesと配列方向の注意

MQL5で時系列データを配列として扱う時、ArraySetAsSeriesによる配列方向の確認が重要です。ArraySetAsSeriesをtrueにすると、配列の0番目が最新データとして扱いやすくなります。falseの場合は、古い順に並ぶ構成になることがあります。

配列方向を確認せずにrates[0]やclose[0]を使うと、現在足を使っているつもりが過去足を見ていたり、確定足を使っているつもりが現在足を見ていたりする可能性があります。

設定意味注意点
ArraySetAsSeries(array, true)0番目を最新データとして扱いやすくします。rates[0]が現在足、rates[1]が1本前として扱いやすいです。
ArraySetAsSeries(array, false)通常配列の方向で扱います。古い順になる場合があり、インデックス確認が必要です。
rates[0]配列方向により意味が変わります。ログで時刻を確認します。
rates[1]確定足として使うことが多い位置です。ArraySetAsSeriesの設定とセットで確認します。

配列方向のミスは、コンパイルエラーにはならず、ロジック上の誤判定として現れることがあります。検証時は、バー時刻、終値、shiftをログに出して、想定したバーを見ているか確認してください。

MTFで上位足を参照する時の注意

MTFは、現在チャートとは別の時間足を参照する設計です。たとえば、M5チャートでEAを動かしながら、H1の方向をフィルターに使うような構成です。

MTFでは、現在チャートの新バーと上位足の新バーが同じタイミングで更新されるとは限りません。上位足がまだ確定していない状態でshift=0を参照すると、判定が変化する可能性があります。上位足フィルターでは、確定足であるshift=1を使うか、現在足を使うかを明確にしてください。

また、MTFでは対象時間足のヒストリーデータが不足しているとCopyRatesやiCloseが失敗することがあります。起動直後やバックテスト開始直後は、必要本数が揃っていない場合があるため、取得本数と時刻をログで確認します。

bool GetHigherTimeframeClose(string symbol, ENUM_TIMEFRAMES higher_tf, double &closed_close)
{
   int shift = 1;

   ResetLastError();

   datetime bar_time = iTime(symbol, higher_tf, shift);
   double close_price = iClose(symbol, higher_tf, shift);

   if(bar_time == 0 || close_price == 0.0)
   {
      PrintFormat("MTF_PRICE_FAIL symbol=%s tf=%d shift=%d time=%s close=%.5f last_error=%d",
                  symbol,
                  higher_tf,
                  shift,
                  TimeToString(bar_time),
                  close_price,
                  GetLastError());
      return false;
   }

   closed_close = close_price;

   PrintFormat("MTF_PRICE_OK symbol=%s tf=%d shift=%d time=%s close=%.5f",
               symbol,
               higher_tf,
               shift,
               TimeToString(bar_time),
               close_price);

   return true;
}

この例では、上位足の1本前の終値を取得しています。現在足を使う場合は、シグナルが変化する可能性を理解したうえで使う必要があります。

マルチシンボルで別銘柄データを取得する時の注意

マルチシンボルEAでは、現在チャートの銘柄だけでなく、別銘柄のデータを取得することがあります。この場合、SymbolSelect、ヒストリーデータ、Market Watch、時間足データ、スプレッド、銘柄仕様を確認する必要があります。

別銘柄のデータ取得では、_Symbolだけを前提にしているコードをそのまま使うと誤判定になります。関数の引数にsymbolを渡し、対象銘柄ごとにCopyRatesやSymbolInfoを実行する構成にします。

bool PrepareSymbol(string symbol)
{
   ResetLastError();

   if(!SymbolSelect(symbol, true))
   {
      PrintFormat("SYMBOL_SELECT_FAIL symbol=%s last_error=%d",
                  symbol,
                  GetLastError());
      return false;
   }

   PrintFormat("SYMBOL_SELECT_OK symbol=%s", symbol);
   return true;
}

SymbolSelectに失敗した場合、その銘柄の価格や時系列データを正しく取得できない可能性があります。複数銘柄を扱うEAでは、対象銘柄ごとの準備ログを残してください。

価格取得で0が返る時の考え方

iCloseやiTime、CopyCloseなどで0が返った場合、値が本当に0なのか、データ取得に失敗しているのかを分けて考えます。価格データで0が返る場合は、データ不足、銘柄未選択、時間足データ未取得、バックテスト初期、ヒストリー同期不足などを疑います。

特にiCloseで0.0が返った時に、そのまま「終値が0」としてシグナル判定に使うのは危険です。GetLastErrorや取得本数、バー時刻を確認し、取得失敗なら処理を止めるようにします。

症状確認する場所主な原因候補
iCloseが0.0になるiTime、GetLastError、ヒストリー。データ不足、銘柄未選択、時間足未同期。
CopyRatesの取得本数が不足するcopied、要求本数、GetLastError。ヒストリーデータ不足、開始直後、対象銘柄未準備。
MTFデータが取れない対象時間足、iTime、CopyRates。上位足データ不足、バックテスト初期。
別銘柄だけ取れないSymbolSelect、Market Watch、銘柄名。銘柄名違い、非表示、データ未取得。
現在足で判定が変わるshift、rates[0]、rates[1]。現在足を使っている、確定足未使用。

バックテストで時系列データを確認する

バックテストでは、EAの損益結果だけでなく、時系列データが想定どおりに取得できているかを確認します。特に、CopyRatesの取得本数、iCloseの対象shift、上位足データ、別銘柄データ、確定足判定をログで確認します。

バックテスト開始直後は、必要本数のローソク足やインジケーター計算に必要なデータが揃っていない場合があります。その状態でシグナル判定すると、誤判定や配列範囲エラーにつながる可能性があります。

バックテストでは、銘柄、時間足、期間、スプレッド、モデル、setファイル、参照している上位足、参照銘柄を記録してください。結果だけでなく、検証条件とデータ取得ログをセットで残すことが重要です。

  • EA名とバージョンを記録する
  • 使用したsetファイルを保存する
  • 銘柄、時間足、期間を記録する
  • CopyRatesの取得本数を確認する
  • iCloseやiTimeのshiftを確認する
  • 現在足と確定足を混同していないか確認する
  • ArraySetAsSeriesの配列方向を確認する
  • MTFで参照する上位足を記録する
  • マルチシンボルで参照する銘柄を記録する
  • バックテスト結果を将来成績保証として扱わない

時系列データ取得のログ設計

時系列データ取得では、ログ設計が重要です。EAが注文しない時、シグナル条件そのものではなく、価格データを取得できていないことが原因の場合があります。CopyRates、iClose、iTime、MTF、マルチシンボルの取得状況をログで追えるようにしてください。

ログ名は、COPYRATES_OK、COPYRATES_FAIL、PRICE_DATA_OK、PRICE_DATA_FAIL、NEWBAR_DETECTED、MTF_PRICE_OK、SYMBOL_SELECT_FAILのように分けると検索しやすくなります。

ログ名残す内容目的
COPYRATES_OKsymbol、timeframe、取得本数、rates[0]、rates[1]。ローソク足取得成功を確認します。
COPYRATES_FAIL要求本数、取得本数、GetLastError。データ不足や取得失敗を確認します。
PRICE_DATA_OKiClose、iTime、shift、価格。単体価格取得を確認します。
NEWBAR_DETECTED現在バー時刻、前回バー時刻。新バー判定を確認します。
MTF_PRICE_OK上位足、shift、時刻、終値。MTF参照を確認します。
SYMBOL_SELECT_FAIL対象銘柄、GetLastError。マルチシンボルの準備失敗を確認します。
BAR_SYNC複数時間足・複数銘柄の時刻対応。同期ズレの確認に使います。

よくある不具合と確認ポイント

時系列データ・価格取得の不具合は、注文しない、シグナルが出ない、バックテストと実チャートで結果が違う、MTFフィルターが動かない、別銘柄参照が失敗する、といった形で表れます。

このような時は、ロジック条件だけを見直すのではなく、データが正しく取得できているか、取得対象のshiftが正しいか、配列方向が合っているか、対象銘柄と時間足が正しいかを確認してください。

症状確認する場所主な原因候補
EAが注文しないCopyRates、iClose、シグナルログ。価格データ取得失敗、条件不成立、shift違い。
シグナルが出たり消えたりするshift=0、現在足判定。現在足の値が変化している。
バックテストと実チャートで違う検証期間、ヒストリー、スプレッド、確定足。データ条件や判定足の違い。
MTFフィルターが動かない上位足のCopyRates、iTime。上位足データ不足、時間足指定ミス。
別銘柄データだけ取れないSymbolSelect、銘柄名、Market Watch。銘柄名違い、非表示、データ未取得。
配列範囲エラーが出る取得本数、配列サイズ、copied。要求本数に満たないまま参照している。
確定足のつもりが現在足を見ているshift、ArraySetAsSeries、ログ時刻。インデックス方向の誤解。

開発依頼前に整理する情報

時系列データや価格取得に関する不具合を相談する場合は、対象EA、setファイル、銘柄、時間足、参照している上位足、参照している別銘柄、Expertsログ、バックテスト条件、該当時刻を整理してください。

「シグナルが出ない」「価格が取れない」「MTFが動かない」だけでは、原因を確認しにくくなります。CopyRatesの取得本数、iCloseのshift、iTimeのバー時刻、ArraySetAsSeriesの設定、対象銘柄のSymbolSelect結果をログに残しておくと確認が進めやすくなります。

整理する情報内容理由
EA名・バージョン対象ファイル名、更新日、バージョン。確認対象を特定するため。
setファイルinput設定一式。同じ条件を再現するため。
対象銘柄_Symbol、参照銘柄、別銘柄。銘柄名やMarket Watch状態を確認するため。
時間足現在時間足、上位足、下位足。MTF判定の確認に必要です。
shift指定shift=0か、shift=1か。現在足と確定足の確認に必要です。
取得ログCopyRates、iClose、iTime、copied。データ取得状態を確認するため。
バックテスト条件銘柄、期間、モデル、スプレッド。再現条件の確認に必要です。
送らない情報口座番号、パスワード、APIキー、Webhook URL。機密情報を保護するため。

時系列データ・価格取得の実務チェック表

  • CopyRatesの戻り値で取得本数を確認している
  • 要求本数に満たない場合は判定を止めている
  • 現在足と確定足を分けて扱っている
  • shift=0とshift=1の意味を明確にしている
  • ArraySetAsSeriesの配列方向を確認している
  • iCloseやiTimeで取得した値をログに出している
  • MTFで参照する時間足を明確にしている
  • 上位足の確定足を使うか現在足を使うか決めている
  • マルチシンボルではSymbolSelectを確認している
  • 別銘柄データの取得失敗をログに出している
  • バックテスト条件とsetファイルを保存している
  • 価格取得失敗をシグナル不成立と混同していない
  • 口座情報や認証情報をログへ出していない

よくある質問

CopyRatesとiCloseはどちらを使えばよいですか?

複数本のローソク足をまとめて確認したい場合はCopyRatesが便利です。1本の終値だけを取得したい場合はiCloseが簡単です。実務では、判定に必要なデータ量とログ確認のしやすさで使い分けます。

shift=0とshift=1は何が違いますか?

一般的にshift=0は現在足、shift=1は1本前の確定足です。現在足は価格更新ごとに値が変わるため、シグナルが出たり消えたりする可能性があります。確定足を使う場合はshift=1を基準にすることが多いです。

ArraySetAsSeriesはなぜ重要ですか?

配列の0番目が最新データなのか、古いデータなのかに影響するためです。配列方向を誤ると、現在足と過去足を取り違える可能性があります。ログで時刻を確認してください。

MTFで上位足を参照する時は何に注意しますか?

上位足の現在足を使うのか、確定足を使うのかを明確にします。また、上位足データが十分に取得できているか、CopyRatesやiTimeのログで確認してください。

別銘柄のデータが取得できない時は何を確認しますか?

銘柄名、SymbolSelect、Market Watchの表示状態、ヒストリーデータ、時間足データ、GetLastErrorを確認してください。ブローカーによって銘柄名に接尾辞が付く場合もあります。

バックテストでCopyRatesが失敗することはありますか?

あります。バックテスト開始直後や、必要本数が揃っていない場合、上位足や別銘柄のデータが不足している場合は取得本数が不足することがあります。copiedとGetLastErrorをログで確認してください。

関連ページ

時系列データ・価格取得を整理する時は、関数辞典、CopyBuffer、マルチシンボル、ロット・証拠金、バックテスト、ログ確認、EA設計をあわせて確認すると、EAのシグナル判定やデータ取得エラーを切り分けやすくなります。

確認したい内容関連ページ
時系列・価格取得関数を確認するMQL5時系列・価格取得関数辞典
MQL5関数全体を確認するMQL5関数辞典
インジケーター値取得を確認するMQL5でインジケーター値をEAに取り込む方法
インジケーター開発とEA連携を確認するMQL5インジケーター開発・EA連携完全ガイド
マルチシンボル・MTF対応を確認するMQL5マルチシンボル・マルチタイムフレーム完全ガイド
ロット・証拠金・銘柄仕様を確認するMQL5ロット・証拠金・銘柄仕様完全ガイド
ログ確認とデバッグを確認するMQL5デバッグ・ログファースト開発完全ガイド
EA設計の責務分離を確認するMQL5 EA設計パターン完全ガイド
バックテストと最適化を確認するMT5ストラテジーテスター・最適化完全ガイド
注文・ポジション・履歴管理を確認するMQL5注文・ポジション・履歴管理完全ガイド
CSVログ出力を確認するMQL5ファイル操作・CSVログ出力完全ガイド
setファイル送付前の確認をするMT5でEAのsetファイルを送る前に確認すること
EAログを問い合わせ前に確認するEAのログを問い合わせ前に確認する方法
開発・改修相談の入口を確認する開発・改修の相談ページ

まとめ

MQL5でEAやインジケーターを開発する時は、時系列データと価格取得を正しく扱うことが重要です。CopyRates、iOpen、iHigh、iLow、iClose、iTime、iBarShift、CopyClose、CopyTimeなどを使い分け、取得本数、shift、配列方向、バー時刻を確認してください。

特に、現在足と確定足、shift=0とshift=1、ArraySetAsSeries、MTF、マルチシンボルは混同しやすいポイントです。価格データが取れていない状態をシグナル不成立として扱わないように、CopyRatesやiCloseの取得結果をログで確認することが重要です。

バックテストや不具合調査では、銘柄、時間足、期間、setファイル、参照上位足、参照銘柄、取得本数、バー時刻を整理してください。時系列データの取得状態を確認できるようにしておくと、EAのシグナル判定、注文しない原因、MTFのズレ、マルチシンボルの取得失敗を切り分けやすくなります。

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