1. iBars関数の概要と実務での活用法
MQL5のiBars関数は、指定した通貨ペア(銘柄)および時間軸において、現在利用可能なヒストリカルデータ(バー)の総数を取得するための関数です。
実務開発において、この関数は単に「データが何個あるか」を知るためだけではなく、システムの堅牢性を高めるための「ガード(防波堤)」として非常に重要な役割を果たします。初心者が特につまずきやすいのは、EA(エキスパートアドバイザー)を起動した直後に、まだ十分なチャートデータがダウンロードされていない状態で計算を行い、配列外参照(Array out of range)エラーでEAが停止してしまうケースです。
iBarsを適切に活用することで、「インジケーターの計算に必要な最小限のバー数が揃っているか」を事前にチェックし、データ不足による予期せぬ挙動を防ぐことが可能になります。また、マルチ通貨(複数銘柄)を監視するEAを開発する際にも、特定の銘柄のデータ準備状況を確認するために必須の関数となります。
2. 構文と戻り値
iBars関数の構文は以下の通りです。
int iBars(
string symbol, // 通貨ペア(銘柄)名
ENUM_TIMEFRAMES period // 時間軸(期間)
);
パラメーター
- symbol: 調査したい銘柄名を指定します。現在のチャートと同じであれば
_SymbolまたはNULLを指定します。 - period: 調査したい時間軸を指定します。現在のチャートと同じであれば
_PeriodまたはPERIOD_CURRENTを指定します。
戻り値
- int型: 指定された銘柄と時間軸で、現在ターミナルが保持しているバーの総数を返します。
- まだデータが読み込まれていない、あるいは銘柄名が正しくない場合は
0を返します。
3. 具体的な使い方・実践サンプルコード
以下は、EAの初期化時や計算開始時に「移動平均線の計算に必要な200本以上のデータが揃っているか」を確認する実戦的なコード例です。
//+------------------------------------------------------------------+
//| iBars_Sample_EA.mq5 |
//| Copyright 2023, Quant Developer |
//+------------------------------------------------------------------+
#property strict
// 入力パラメーター
input int RequiredBars = 200; // 計算に必要な最低限のバー数
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 現在の通貨ペア・1時間足のバー数を取得
int availableBars = iBars(_Symbol, PERIOD_H1);
// データが不足している場合は処理を中断し、ログに警告を表示
if(availableBars < RequiredBars)
{
PrintFormat("警告: データ不足です。必要: %d, 現在: %d", RequiredBars, availableBars);
return; // 次のティックまで待機
}
// データが十分に存在する場合のみ、ロジックを実行
ExecuteTradingLogic();
}
//+------------------------------------------------------------------+
//| トレードロジック(例) |
//+------------------------------------------------------------------+
void ExecuteTradingLogic()
{
// ここにインジケーターの計算やエントリー判断を記述
double maArray[];
int handle = iMA(_Symbol, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE);
// ハンドルの有効チェックなどを経てコピー
if(CopyBuffer(handle, 0, 0, 3, maArray) > 0)
{
// 正常に計算可能
// Print("最新のMA値: ", maArray[0]);
}
}
4. 使用上の注意点とよくあるエラー
① Bars関数との違い
MQL5には似た名前のBars関数(あるいはBarsCalculated)がありますが、iBarsは「過去のデータ数」を返し、Barsは特定の範囲内のバー数を返すという違いがあります。また、iBarsは別銘柄や別時間軸を指定しやすいため、マルチタイムフレーム分析ではiBarsを使うのが一般的です。
② ヒストリデータの同期遅延
EA起動直後は、MT5のターミナルがブローカーのサーバーからデータをダウンロードしている最中であることがよくあります。この時、iBarsは一時的に小さな値(あるいは0)を返します。ループ処理で強引に待機させるのではなく、上記のサンプルコードのようにOnTickのたびにチェックを行い、条件を満たすまで処理をスキップするのがスマートな実装です。
③ 銘柄名の指定ミス
"USDJPY"のように文字列で直接指定する場合、ブローカーによって"USDJPY.m"や"USDJPY-pro"などサフィックス(接尾辞)が付いていることがあります。実務では _Symbol を使用するか、汎用的な銘柄取得関数を組み合わせて指定ミスを回避しましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、iBarsを使いこなしてロジックを完璧に組み上げたとしても、それだけでは勝つことはできません。FXの世界では、あなたのPCからブローカーのサーバーへ注文が届くまでの「物理的な距離」が、勝敗を分ける決定的な要因となります。
自宅のPCや一般的なインターネット回線では、ネットワークのゆらぎ(ジッター)や数ミリ秒から数百ミリ秒の遅延が不可避です。この遅延が原因で、EAが判断した価格と実際に約定する価格に乖離(スリッページ)が生じ、バックテストでは右肩上がりでも、実運用では損失を積み上げる「負け組EA」へと転落してしまいます。コンマ数秒を争うマーケットで利益を残すには、ブローカーのサーバーに極限まで近い場所に設置された、FX専用のVPS(仮想専用サーバー)を利用することが、プロのクオンツエンジニアにとってはもはや常識であり、最低限の投資と言えます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント