MQL5マルチシンボル・マルチタイムフレーム完全ガイド|複数銘柄・複数時間足EAの基本
MQL5でEAを開発する時、現在チャートの銘柄と時間足だけを使う構成であれば比較的シンプルに作れます。一方で、複数銘柄を監視するEA、上位足をフィルターに使うEA、複数時間足を組み合わせるEAでは、データ取得、バー同期、銘柄選択、ヒストリー不足、スプレッド、銘柄仕様、ログ確認を慎重に設計する必要があります。
マルチシンボルEAやマルチタイムフレームEAでは、_SymbolやPERIOD_CURRENTだけに依存していると、別銘柄・別時間足のデータ取得に失敗したり、現在足と確定足を混同したり、上位足の未確定データで判定してしまうことがあります。
この記事では、MQL5で複数銘柄・複数時間足EAを作る時に確認したい、SymbolSelect、CopyRates、iClose、iTime、iBarShift、ArraySetAsSeries、MTF、バー同期、銘柄仕様、スプレッド、バックテスト、ログ設計を実務目線で整理します。
この記事は、MT5 / MQL5のEA開発、複数銘柄対応、複数時間足対応、データ取得、ログ確認を目的とした技術記事です。特定の売買判断、利益、勝率、損失回避、推奨ロット、推奨銘柄を案内するものではありません。
この記事で確認すること
- マルチシンボルEAとマルチタイムフレームEAの違い
- _Symbolと任意symbolを分けて扱う考え方
- SymbolSelectで別銘柄を準備する方法
- CopyRatesで複数銘柄・複数時間足のデータを取得する方法
- iTimeとiBarShiftでバー同期を確認する方法
- 現在足と確定足、shift=0とshift=1の違い
- 上位足フィルターで注意すること
- 複数銘柄のスプレッド・銘柄仕様・ロット確認
- バックテストで別銘柄・上位足データを確認する方法
- マルチシンボル / MTFのログ設計
- 開発依頼前に整理する情報
マルチシンボル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;
};このように、対象銘柄・時間足ごとに状態を持つ設計にしておくと、ログ確認や不具合調査が進めやすくなります。
バックテストで確認すること
マルチシンボル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で時刻対応を確認できる
- 銘柄ごとのスプレッドと銘柄仕様を確認している
- 状態管理を銘柄・時間足ごとに分けている
- 口座情報や認証情報をログへ出していない
よくある質問
マルチシンボルEAでは_Symbolを使ってはいけませんか?
使ってはいけないわけではありません。ただし、_Symbolは現在チャートの銘柄です。別銘柄を監視する場合は、対象symbolを明示的に関数へ渡す設計にする方が安全です。
上位足フィルターではshift=0とshift=1のどちらを使いますか?
仕様によります。shift=0は現在足で値が変化します。shift=1は確定足で再現性を高めやすいです。バックテストやログ確認を重視する場合は、確定足を使う設計が扱いやすいです。
別銘柄のCopyRatesが失敗する時は何を確認しますか?
SymbolSelect、銘柄名、Market Watch、ヒストリーデータ、時間足データ、GetLastErrorを確認します。ブローカーによって銘柄名に接尾辞が付く場合もあります。
iBarShiftは何に使いますか?
指定した時刻が、対象銘柄・対象時間足のどのバーに対応するかを確認するために使います。MTFや複数銘柄のバー同期確認に役立ちます。
複数銘柄EAでスプレッド上限は同じでよいですか?
銘柄によってスプレッドや価格桁の感覚が異なるため、同じ上限が適切とは限りません。銘柄ごと、または銘柄グループごとに上限を分ける設計を検討します。
バックテストで別銘柄データが足りない場合はありますか?
あります。バックテスト開始直後や、参照銘柄・参照時間足のデータが不足している場合、CopyRatesの取得本数が足りないことがあります。取得本数とGetLastErrorをログで確認してください。
関連ページ
マルチシンボル・マルチタイムフレームEAを整理する時は、時系列データ、CopyBuffer、インジケーター開発、ロット・証拠金、イベント処理、ログ確認、バックテストもあわせて確認すると、データ取得や同期ズレを切り分けやすくなります。
| 確認したい内容 | 関連ページ |
|---|---|
| 時系列データと価格取得を確認する | MQL5時系列データ・価格取得完全ガイド |
| EAからCopyBufferで値を取得する | MQL5でインジケーター値をEAに取り込む方法 |
| インジケーター開発とEA連携を確認する | MQL5インジケーター開発・EA連携完全ガイド |
| ロット・証拠金・銘柄仕様を確認する | MQL5ロット・証拠金・銘柄仕様完全ガイド |
| イベント処理を確認する | MQL5イベント処理完全ガイド |
| 長時間稼働と安定化を確認する | MQL5長時間稼働・安定化完全ガイド |
| 注文・ポジション・履歴管理を確認する | MQL5注文・ポジション・履歴管理完全ガイド |
| CTradeを使った注文・決済を確認する | MQL5標準ライブラリ・CTrade完全ガイド |
| ログ確認とデバッグを確認する | MQL5デバッグ・ログファースト開発完全ガイド |
| EA設計の責務分離を確認する | MQL5 EA設計パターン完全ガイド |
| バックテストと最適化を確認する | MT5ストラテジーテスター・最適化完全ガイド |
| 時系列・価格取得関数を確認する | MQL5時系列・価格取得関数辞典 |
| EAログを問い合わせ前に確認する | EAのログを問い合わせ前に確認する方法 |
| 開発・改修相談の入口を確認する | 開発・改修の相談ページ |
まとめ
MQL5で複数銘柄・複数時間足EAを作る時は、_Symbolと任意symbol、PERIOD_CURRENTと任意timeframeを分けて扱うことが重要です。SymbolSelect、CopyRates、iTime、iBarShiftを使い、対象銘柄・対象時間足ごとのデータ取得状態を確認してください。
マルチタイムフレームEAでは、現在足と確定足、shift=0とshift=1、上位足の確定タイミングを明確にします。マルチシンボルEAでは、銘柄ごとのスプレッド、volume step、StopLevel、digits、pointを確認し、固定値で処理しないようにします。
バックテストや不具合調査では、対象銘柄、対象時間足、取得本数、バー時刻、上位足shift、スプレッド、銘柄仕様ログを保存してください。データ取得失敗とシグナル不成立を分けて確認できるようにしておくと、EAの判定ズレや注文しない原因を追いやすくなります。
