MQL5時系列データ・価格取得完全ガイド|CopyRates・iClose・SymbolInfoの基本
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の基本
- CopyRatesで確認したい項目
- iOpen・iHigh・iLow・iCloseの使い方
- iTimeと新バー判定
- iBarShiftで時刻からバー位置を調べる
- CopyClose・CopyHigh・CopyLow・CopyTimeの使い方
- ArraySetAsSeriesと配列方向の注意
- MTFで上位足を参照する時の注意
- マルチシンボルで別銘柄データを取得する時の注意
- 複数銘柄・複数時間足のデータをそろえる
- 価格取得で0が返る時の考え方
- バックテストで時系列データを確認する
- 時系列データ取得のログ設計
- よくある不具合と確認ポイント
- 開発依頼前に整理する情報
- 時系列データ・価格取得の実務チェック表
- 複数銘柄EAの検証条件と確認資料
- よくある質問
- 関連する確認ページ
- あわせて確認したいページ
- まとめ
- お問い合わせはEAFC公式LINEへ
- 利用条件・相談窓口
この記事で確認すること
- 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=1 | 1本前の確定足。 | 確定したローソク足として判定しやすいです。 |
| shift=2 | 2本前の確定足。 | 過去比較やクロス判定で使います。 |
| 現在足判定 | 早い反応が可能。 | シグナルが消える可能性があります。 |
| 確定足判定 | 再現性が高い。 | エントリータイミングは遅くなります。 |
CopyRatesとMqlRatesの基本
CopyRates()は指定した銘柄・時間足のMqlRates履歴を配列へ取得し、取得できた要素数を返します。失敗時は-1となるため、要求件数と戻り値を確認してください。
配列の論理的な時系列方向はArraySetAsSeries()で指定できます。現在足と確定足を混同しないよう、shift=0相当を使う箇所と確定済みバーを使う箇所を設計段階で分けます。
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では、対象銘柄ごとの準備ログを残してください。
複数銘柄・複数時間足のデータをそろえる
以下のコード例は、個別の処理と確認項目を読むためのものです。複数の例をそのまま一つのEAへ連結する前提ではありません。初期化、値の取得、状態更新、終了処理をそれぞれの例で区別して確認してください。
マルチシンボルEAとマルチタイムフレームEAの違い
マルチシンボルEAは、複数の銘柄を監視するEAです。たとえば、USDJPY、EURUSD、GBPUSD、XAUUSDを1つのEAで確認するような構成です。マルチタイムフレームEAは、複数の時間足を参照するEAです。たとえば、M5でエントリーしながら、H1やH4の方向をフィルターに使うような構成です。
実際のEAでは、複数銘柄と複数時間足を同時に扱うこともあります。この場合、銘柄ごと、時間足ごとにデータ取得状態やバー同期を確認する必要があります。
単一チャートEAでは、_SymbolとPERIOD_CURRENTを使うだけで足りることがあります。しかし、複数銘柄・複数時間足EAでは、対象symbolとtimeframeを明示的に渡す設計にする方が安全です。
| 区分 | 内容 | 主な注意点 |
|---|---|---|
| 単一銘柄EA | 現在チャートの銘柄を対象にします。 | _Symbol前提でも扱いやすいです。 |
| マルチシンボルEA | 複数銘柄を監視します。 | SymbolSelect、銘柄名、ヒストリー不足に注意します。 |
| 単一時間足EA | 現在チャートの時間足を使います。 | PERIOD_CURRENT前提でも扱いやすいです。 |
| マルチタイムフレームEA | 複数時間足を参照します。 | 上位足の確定タイミングとバー同期に注意します。 |
| 複合型EA | 複数銘柄と複数時間足を組み合わせます。 | ログ設計と状態管理が重要です。 |
_Symbolと任意symbolを分けて扱う
_Symbolは、EAを適用しているチャートの銘柄です。単一銘柄EAでは便利ですが、複数銘柄EAで常に_Symbolだけを使うと、別銘柄のデータを取得できません。
マルチシンボルEAでは、関数にsymbolを引数として渡す設計にします。CopyRates、iClose、SymbolInfoDouble、OrderCalcMarginなども、対象銘柄を明示して呼び出します。
void PrintSymbolContext(string symbol, ENUM_TIMEFRAMES timeframe)
{
PrintFormat("SYMBOL_CONTEXT chart_symbol=%s target_symbol=%s target_tf=%d",
_Symbol,
symbol,
timeframe);
}このように、チャート銘柄と対象銘柄をログに分けて出しておくと、マルチシンボルEAで「どの銘柄を見ているのか」を確認しやすくなります。
SymbolSelectで別銘柄を準備する
別銘柄の価格や時系列データを取得する場合、対象銘柄がMarket Watchで選択されている必要があります。MQL5では、SymbolSelectを使って銘柄を選択できます。
SymbolSelectに失敗した場合、銘柄名が間違っている、ブローカー側でその銘柄が存在しない、接尾辞付きの銘柄名を使っていない、銘柄が取引対象外である、といった原因が考えられます。
bool PrepareSymbol(string symbol)
{
ResetLastError();
if(!SymbolSelect(symbol, true))
{
PrintFormat("SYMBOL_SELECT_FAIL symbol=%s last_error=%d",
symbol,
GetLastError());
return false;
}
long trade_mode = SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
int digits = (int)SymbolInfoInteger(symbol, SYMBOL_DIGITS);
PrintFormat("SYMBOL_SELECT_OK symbol=%s trade_mode=%d point=%.10f digits=%d",
symbol,
trade_mode,
point,
digits);
return true;
}マルチシンボルEAでは、起動時に対象銘柄リストを確認し、SymbolSelectの結果をログに残します。失敗した銘柄はシグナル判定や発注対象から除外する設計が安全です。
対象銘柄リストを管理する
複数銘柄EAでは、対象銘柄リストをどのように管理するかを決めます。inputでカンマ区切り文字列として受け取る方法、固定配列にする方法、設定ファイルから読む方法などがあります。
EAファンクラブの実務では、最初はシンプルにinput文字列で対象銘柄を指定し、起動時に分割・検証する構成が扱いやすいです。ただし、ユーザーが入力する銘柄名はブローカーごとに接尾辞が違う場合があるため、実口座・デモ口座のMarket Watchで確認が必要です。
| 管理方法 | 特徴 | 注意点 |
|---|---|---|
| input文字列 | 設定変更しやすい。 | 入力ミス、区切り文字、接尾辞に注意します。 |
| 固定配列 | 開発時に管理しやすい。 | ユーザーが変更しにくいです。 |
| 外部ファイル | 多銘柄管理に向きます。 | FileOpen、配置場所、文字コード確認が必要です。 |
| パネル設定 | 運用中に変更しやすい。 | UI状態と内部状態を分ける必要があります。 |
CopyRatesで複数銘柄・複数時間足のデータを取得する
複数銘柄・複数時間足のローソク足データを取得する場合、CopyRatesが中心になります。CopyRatesは、指定したsymbolとtimeframeのMqlRates配列を取得できます。
重要なのは、戻り値で取得本数を確認することです。要求本数より少ない場合、データ不足、ヒストリー未同期、銘柄未選択、バックテスト開始直後などの可能性があります。取得できていない状態でシグナル判定に進まないようにします。
bool GetRatesForSymbolTf(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 time1=%s close1=%.5f",
symbol,
timeframe,
copied,
TimeToString(rates[0].time),
rates[0].close,
TimeToString(rates[1].time),
rates[1].close);
return true;
}この例では、対象symbolとtimeframeを指定してCopyRatesを実行し、現在足と1本前の足の時刻・終値をログに出しています。配列方向を確認しながら、shift=0とshift=1の意味を明確にしてください。
現在足と確定足を分ける
マルチタイムフレームEAでは、現在足と確定足を分けることが重要です。現在足は価格更新に応じて変化します。確定足はすでに閉じた足なので、判定の再現性が高くなります。
上位足フィルターでshift=0を使うと、H1やH4の形成中の値を使うことになります。値が変化するため、シグナルが出たり消えたりする可能性があります。確定足で判定する場合は、shift=1を使う設計が扱いやすいです。
| 指定 | 意味 | MTFでの注意点 |
|---|---|---|
| shift=0 | 現在足。 | 上位足では長時間変化し続ける場合があります。 |
| shift=1 | 1本前の確定足。 | 判定の再現性を高めやすいです。 |
| 下位足現在足 | エントリータイミングに使われることがあります。 | 重複発注防止が必要です。 |
| 上位足確定足 | 方向フィルターに使いやすいです。 | 反応は遅くなります。 |
iTimeで新バー判定を行う
EAで同じバー内に何度も判定したくない場合は、新バー判定を行います。iTimeで現在足の開始時刻を取得し、前回記録した時刻と比較します。
単一銘柄・単一時間足ならstatic変数1つでも判定できますが、複数銘柄・複数時間足では、symbolとtimeframeごとに最後のバー時刻を管理する必要があります。
bool IsNewBarForSymbolTf(string symbol, ENUM_TIMEFRAMES timeframe, datetime &last_bar_time)
{
ResetLastError();
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 current=%s previous=%s",
symbol,
timeframe,
TimeToString(current_bar_time),
TimeToString(last_bar_time));
last_bar_time = current_bar_time;
return true;
}
return false;
}この例では、symbolとtimeframeごとにlast_bar_timeを外部で持つ前提です。複数銘柄EAでは、銘柄数分の状態を持つ必要があるため、構造体や配列で管理すると整理しやすくなります。
iBarShiftで時刻対応を確認する
iBarShiftは、指定した時刻が対象銘柄・対象時間足のどのバーに対応するかを確認する関数です。下位足のバー時刻から上位足のバー位置を探す時や、複数銘柄のバー同期を確認する時に使えます。
MTFでは、M5の現在バーとH1のどのバーを対応させるかが重要です。iBarShiftを使って、下位足の時刻が上位足のどのバーに属するかを確認できます。
int FindShiftByTime(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;
}
datetime bar_time = iTime(symbol, timeframe, shift);
PrintFormat("IBARSHIFT_OK symbol=%s tf=%d target=%s shift=%d bar_time=%s",
symbol,
timeframe,
TimeToString(target_time),
shift,
TimeToString(bar_time));
return shift;
}バー同期がずれると、見た目では上位足フィルターが合っているように見えても、EA内部では別のバーを参照していることがあります。時刻とshiftをログに残して確認してください。
上位足フィルターの基本設計
マルチタイムフレームEAでは、上位足をフィルターとして使うことがあります。たとえば、H1の方向が上向きの時だけM5で買いエントリーを許可するような構成です。
上位足フィルターでは、どの時間足を使うか、現在足か確定足か、どの指標を使うか、取得に失敗した時にどうするかを仕様として決めます。取得失敗時にエントリー許可として扱うのは危険です。
bool GetHigherTimeframeClose(string symbol, ENUM_TIMEFRAMES higher_tf, int shift, double &close_value)
{
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("HTF_CLOSE_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;
}
close_value = close_price;
PrintFormat("HTF_CLOSE_OK symbol=%s tf=%d shift=%d time=%s close=%.5f",
symbol,
higher_tf,
shift,
TimeToString(bar_time),
close_value);
return true;
}この例では、上位足の終値を取得しています。shift=1を指定すれば確定足、shift=0を指定すれば現在足です。EA仕様としてどちらを使うか明確にしてください。
複数銘柄のスプレッド確認
複数銘柄EAでは、銘柄ごとにスプレッドが異なります。USDJPY、EURUSD、GBPUSD、XAUUSD、指数、仮想通貨CFDでは、スプレッドや価格桁の感覚が異なる場合があります。
全銘柄に同じスプレッド上限を使うと、ある銘柄では厳しすぎたり、別の銘柄では緩すぎたりすることがあります。銘柄ごとにスプレッド上限を持つか、銘柄グループごとに分ける設計を検討します。
double GetSpreadPoints(string symbol)
{
double bid = SymbolInfoDouble(symbol, SYMBOL_BID);
double ask = SymbolInfoDouble(symbol, SYMBOL_ASK);
double point = SymbolInfoDouble(symbol, SYMBOL_POINT);
if(point <= 0.0)
return -1.0;
double spread_points = (ask - bid) / point;
PrintFormat("SPREAD_CHECK symbol=%s bid=%.5f ask=%.5f spread_points=%.1f",
symbol,
bid,
ask,
spread_points);
return spread_points;
}スプレッド確認では、bid、ask、point、spread_pointsを同じログ行に出すと確認しやすくなります。スプレッドによる見送りは、シグナル不成立とは分けてログに残してください。
複数銘柄の銘柄仕様を確認する
マルチシンボルEAでは、銘柄ごとの最小ロット、最大ロット、volume step、point、digits、tick value、contract size、StopLevel、FreezeLevelを確認します。銘柄仕様を固定値で扱うと、別銘柄で注文失敗や損益計算ミスが起きやすくなります。
特に、XAUUSDや指数CFDなどでは、通貨ペアと価格桁やcontract sizeが異なる場合があります。複数銘柄EAでは、対象銘柄ごとにSymbolInfoを取得し、起動時ログに残す構成が安全です。
| 確認項目 | 内容 | 注意点 |
|---|---|---|
| SYMBOL_VOLUME_MIN | 最小ロット。 | 銘柄ごとに異なります。 |
| SYMBOL_VOLUME_MAX | 最大ロット。 | 過大ロットを防ぐために確認します。 |
| SYMBOL_VOLUME_STEP | ロット刻み。 | step不一致は注文失敗の原因になります。 |
| SYMBOL_POINT | 価格単位。 | SL/TP、スプレッド、値幅計算に使います。 |
| SYMBOL_DIGITS | 価格桁。 | 価格丸めに使います。 |
| SYMBOL_TRADE_STOPS_LEVEL | SL/TP距離に関係します。 | invalid stops対策に必要です。 |
| SYMBOL_TRADE_FREEZE_LEVEL | 変更制限距離に関係します。 | トレーリングや建値移動で確認します。 |
状態管理を銘柄・時間足ごとに分ける
複数銘柄・複数時間足EAでは、状態管理が重要です。最後に判定したバー時刻、前回シグナル、保有状態、直近エラー、スプレッド状態などを、銘柄・時間足ごとに分けて持つ必要があります。
状態をグローバル変数1つで管理すると、USDJPYの新バー判定がEURUSDにも影響する、M5の状態がH1にも影響する、といった不具合が起きます。構造体や配列を使って、symbolとtimeframeの組み合わせ単位で管理すると整理しやすくなります。
struct SymbolTfState
{
string symbol;
ENUM_TIMEFRAMES timeframe;
datetime last_bar_time;
bool data_ready;
int last_error;
};このように、対象銘柄・時間足ごとに状態を持つ設計にしておくと、ログ確認や不具合調査が進めやすくなります。
価格取得で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_OK | symbol、timeframe、取得本数、rates[0]、rates[1]。 | ローソク足取得成功を確認します。 |
COPYRATES_FAIL | 要求本数、取得本数、GetLastError。 | データ不足や取得失敗を確認します。 |
PRICE_DATA_OK | iClose、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ファイルを保存している
- 価格取得失敗をシグナル不成立と混同していない
- 口座情報や認証情報をログへ出していない
複数銘柄EAの検証条件と確認資料
バックテストで確認すること
マルチシンボルEAやマルチタイムフレームEAをバックテストする時は、現在チャートの銘柄・時間足だけでなく、参照する別銘柄・上位足のデータが正しく取得できているかを確認します。
バックテスト開始直後は、必要本数が揃っていない場合があります。CopyRatesやiCloseの取得失敗をシグナル不成立と混同しないように、取得本数、バー時刻、GetLastErrorをログに残してください。
- EA名とバージョンを記録する
- 使用したsetファイルを保存する
- 対象銘柄リストを保存する
- 参照する時間足を記録する
- SymbolSelectの結果を確認する
- CopyRatesの取得本数を確認する
- 上位足のshiftを確認する
- 別銘柄のスプレッドと銘柄仕様を確認する
- バー同期ログを保存する
- バックテスト結果を将来成績保証として扱わない
ログ設計の基本
マルチシンボル・マルチタイムフレームEAでは、ログ設計が特に重要です。単に「シグナルなし」と出すだけでは、データ取得失敗、スプレッド過大、上位足不一致、銘柄仕様エラーのどれなのか分かりません。
ログ名は、SYMBOL_SELECT、COPYRATES、NEWBAR、IBARSHIFT、HTF_FILTER、SPREAD_CHECK、SYMBOL_SPECのように分けると検索しやすくなります。
| ログ名 | 残す内容 | 目的 |
|---|---|---|
SYMBOL_SELECT_OK | 対象銘柄、trade_mode、point、digits。 | 銘柄準備の確認。 |
COPYRATES_OK | symbol、timeframe、取得本数、時刻。 | データ取得成功の確認。 |
COPYRATES_FAIL | 要求本数、取得本数、GetLastError。 | データ不足の確認。 |
NEWBAR_DETECTED | symbol、timeframe、現在バー時刻。 | 新バー判定の確認。 |
IBARSHIFT_OK | target_time、shift、bar_time。 | バー同期の確認。 |
HTF_FILTER | 上位足、shift、値、判定結果。 | MTFフィルターの確認。 |
SPREAD_CHECK | bid、ask、spread_points。 | 銘柄ごとのスプレッド確認。 |
SYMBOL_SPEC | volume step、StopLevel、FreezeLevel。 | 銘柄仕様確認。 |
よくある不具合と確認ポイント
複数銘柄・複数時間足EAでは、注文しない原因がシグナル条件ではなく、データ取得や状態管理にあることがあります。価格が取れていない、上位足データが不足している、別銘柄がMarket Watchにない、shiftが想定と違う、バー同期がずれている、といった問題を確認します。
| 症状 | 確認する場所 | 主な原因候補 |
|---|---|---|
| 別銘柄だけデータが取れない | SymbolSelect、銘柄名、Market Watch。 | 銘柄名違い、接尾辞、非表示、ヒストリー不足。 |
| 上位足フィルターが動かない | CopyRates、iTime、shift。 | 上位足データ不足、現在足と確定足の混同。 |
| バックテスト開始直後に判定しない | 必要本数、CopyRates戻り値。 | ヒストリーデータ不足、計算本数不足。 |
| 銘柄ごとに注文結果が違う | スプレッド、volume step、StopLevel。 | 銘柄仕様差を固定値で扱っている。 |
| 同じバーで複数回エントリーする | 新バー判定、last_bar_time。 | 状態管理が銘柄・時間足別になっていない。 |
| 見た目とEA判定が違う | iBarShift、バー時刻、shift。 | 時刻対応や配列方向の誤解。 |
| XAUUSDだけ失敗する | digits、point、contract size、spread。 | 通貨ペアと同じ固定値で処理している。 |
開発依頼前に整理する情報
複数銘柄・複数時間足EAの開発や不具合確認を依頼する場合は、対象銘柄、対象時間足、エントリー時間足、上位足フィルター、使用するインジケーター、判定足、ログ、バックテスト条件を整理してください。
「複数銘柄を見たい」「上位足も使いたい」だけでは、どの銘柄をどの時間足で見て、どのタイミングで判定し、どの足の値を使うのかが不明です。仕様を整理しておくと、実装後の判定ズレを減らしやすくなります。
| 整理する情報 | 内容 | 理由 |
|---|---|---|
| 対象銘柄 | USDJPY、EURUSD、XAUUSDなど。 | SymbolSelectと銘柄仕様確認に必要です。 |
| 銘柄名の接尾辞 | m、.pro、microなど。 | ブローカーごとの銘柄名差に対応するため。 |
| エントリー時間足 | M1、M5、M15など。 | 新バー判定とエントリー条件に関係します。 |
| 参照上位足 | H1、H4、D1など。 | MTFフィルターの仕様に必要です。 |
| 判定足 | 現在足か確定足か。 | 再現性とタイミングに影響します。 |
| 取得データ | OHLC、インジケーター値、スプレッドなど。 | CopyRatesやCopyBuffer設計に必要です。 |
| ログ | SymbolSelect、CopyRates、iBarShift、HTF_FILTER。 | 不具合調査に必要です。 |
| 送らない情報 | 口座番号、パスワード、APIキー、Webhook URL。 | 機密情報を保護するため。 |
実務チェック表
- 対象銘柄リストを明確にしている
- SymbolSelectの結果を確認している
- _Symbolと対象symbolを混同していない
- 対象時間足を明確にしている
- CopyRatesの戻り値を確認している
- 取得本数不足時に判定を止めている
- 現在足と確定足を分けている
- 上位足のshiftを仕様化している
- iTimeで新バー判定を管理している
- iBarShiftで時刻対応を確認できる
- 銘柄ごとのスプレッドと銘柄仕様を確認している
- 状態管理を銘柄・時間足ごとに分けている
- 口座情報や認証情報をログへ出していない
よくある質問
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をログで確認してください。
マルチシンボルEAでは_Symbolを使ってはいけませんか?
使ってはいけないわけではありません。ただし、_Symbolは現在チャートの銘柄です。別銘柄を監視する場合は、対象symbolを明示的に関数へ渡す設計にする方が安全です。
上位足フィルターではshift=0とshift=1のどちらを使いますか?
仕様によります。shift=0は現在足で値が変化します。shift=1は確定足で再現性を高めやすいです。バックテストやログ確認を重視する場合は、確定足を使う設計が扱いやすいです。
別銘柄のCopyRatesが失敗する時は何を確認しますか?
SymbolSelect、銘柄名、Market Watch、ヒストリーデータ、時間足データ、GetLastErrorを確認します。ブローカーによって銘柄名に接尾辞が付く場合もあります。
iBarShiftは何に使いますか?
指定した時刻が、対象銘柄・対象時間足のどのバーに対応するかを確認するために使います。MTFや複数銘柄のバー同期確認に役立ちます。
複数銘柄EAでスプレッド上限は同じでよいですか?
銘柄によってスプレッドや価格桁の感覚が異なるため、同じ上限が適切とは限りません。銘柄ごと、または銘柄グループごとに上限を分ける設計を検討します。
バックテストで別銘柄データが足りない場合はありますか?
あります。バックテスト開始直後や、参照銘柄・参照時間足のデータが不足している場合、CopyRatesの取得本数が足りないことがあります。取得本数とGetLastErrorをログで確認してください。
関連する確認ページ
確認したい内容に応じて、次のページを参照してください。本文中ですでに案内したページは、ここでは重ねて掲載していません。
あわせて確認したいページ
今回の確認内容に関連する補足ページです。必要な項目だけ確認してください。
| 確認目的 | 関連ページ |
|---|---|
| 読後の任意の手続き・一覧入口。本文解決や購入の必須前提にしない | MT4/MT5 技術講座 |
| 「MQL5 時系列 価格 取得」の読後に「MQL5 CopyTimeの使い方」を補足確認 | MQL5 CopyTimeの使い方 |
| 「MQL5 時系列 価格 取得」の読後に「MQL5 CopyRatesの使い方」を補足確認 | MQL5 CopyRatesの使い方 |
| 「MQL5 時系列 価格 取得」の読後に「MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方」を補足確認 | MQL5 SymbolInfoDouble / SymbolInfoIntegerの使い方 |
まとめ
MQL5でEAやインジケーターを開発する時は、時系列データと価格取得を正しく扱うことが重要です。CopyRates、iOpen、iHigh、iLow、iClose、iTime、iBarShift、CopyClose、CopyTimeなどを使い分け、取得本数、shift、配列方向、バー時刻を確認してください。
特に、現在足と確定足、shift=0とshift=1、ArraySetAsSeries、MTF、マルチシンボルは混同しやすいポイントです。価格データが取れていない状態をシグナル不成立として扱わないように、CopyRatesやiCloseの取得結果をログで確認することが重要です。
バックテストや不具合調査では、銘柄、時間足、期間、setファイル、参照上位足、参照銘柄、取得本数、バー時刻を整理してください。時系列データの取得状態を確認できるようにしておくと、EAのシグナル判定、注文しない原因、MTFのズレ、マルチシンボルの取得失敗を原因を確認しやすくなります。
お問い合わせはEAFC公式LINEへ
EAFCサイト内の記事、商品、導入前確認、設定確認、ログ確認、開発依頼前のご相談など、各種お問い合わせはEAFC公式LINEより受け付けています。
※投資助言、売買指示、利益保証、推奨ロット、推奨銘柄の案内は行っておりません。
口座番号、認証情報、Webhook URL、GAS URL、APIキーなどの機密情報は送信しないでください。
利用条件・相談窓口
| 確認内容 | 案内ページ |
|---|---|
| MT5 開発依頼・作成代行|EA・インジケーター新規開発・MT4/MT5既存改修 | 開発・改修の相談ページ |
| EA・MT5・MQL5 技術辞典|用語・関数・設定を目的別に探す | EA・MT5・MQL5 技術辞典|用語・関数・設定を目的別に探す |
