1. BarsCalculated関数の概要と実務での活用法
MQL5でカスタムインジケーターやEA(エキスパートアドバイザー)を開発する際、避けて通れないのが「インジケーターの値が計算し終わっているか」の判定です。BarsCalculated 関数は、指定したインジケーターハンドルにおいて、現時点で計算が完了しているバーの数を返します。
実務レベルの開発で初心者が最もつまずきやすいポイントは、「インジケーターをハンドルした直後、すぐに値を取得しようとしてエラーになる」という現象です。MQL5のインジケーター計算は非同期で行われるため、プログラムが実行された瞬間にすべてのデータが準備できているとは限りません。
BarsCalculated を活用することで、データの準備が整うまで待機したり、不完全なデータによる誤サインを防いだりすることが可能になります。安定したトレードロジックを組むための「防波堤」のような役割を果たす重要な関数です。
2. 構文と戻り値
BarsCalculated 関数の構文は非常にシンプルです。
int BarsCalculated(
int indicator_handle // インジケーターのハンドル
);
パラメーター
- indicator_handle:
iMAやiRSIなどの組み込み関数、あるいはiCustomで作成したインジケーターのハンドル(整数値)を指定します。
戻り値
- 成功時: 計算済みのバーの数を
int型で返します。 - 計算未完了時: まだデータが準備できていない場合は
-1を返します。
実務では、この戻り値が「自分が計算に使いたいバー数(例えば直近100本など)」に達しているかを確認してから、CopyBuffer 関数でデータを取得する流れが一般的です。
3. 具体的な使い方・実践サンプルコード
以下に、移動平均線(MA)の値を安全に取得するためのEA実装例を示します。データが準備できていない段階で計算をスキップする「実戦向き」の書き方です。
//+------------------------------------------------------------------+
//| BarsCalculated_Sample|
//+------------------------------------------------------------------+
int handleMA; // MAのハンドルを格納する変数
int OnInit()
{
// 移動平均線のハンドルを作成(期間21、単純移動平均)
handleMA = iMA(_Symbol, _Period, 21, 0, MODE_SMA, PRICE_CLOSE);
if(handleMA == INVALID_HANDLE)
{
Print("ハンドルの作成に失敗しました。");
return(INIT_FAILED);
}
return(INIT_SUCCEEDED);
}
void OnTick()
{
// 1. インジケーターの計算済みバー数を確認
int calculated = BarsCalculated(handleMA);
// まだ計算が始まっていない、あるいはエラーの場合
if(calculated <= 0)
{
Print("データ準備中...");
return; // 次のティックまで待機
}
// 2. 必要な本数(例:2本分)が計算されているかチェック
if(calculated < 2) return;
double maBuffer[]; // 値を格納する配列
ArraySetAsSeries(maBuffer, true); // 時系列(最新がインデックス0)に設定
// 3. 実際にデータをコピー
if(CopyBuffer(handleMA, 0, 0, 2, maBuffer) > 0)
{
// 正常に取得できたらロジックを実行
Print("最新のMA値: ", maBuffer[0]);
}
else
{
Print("データのコピーに失敗しました。エラーコード: ", GetLastError());
}
}
4. 使用上の注意点とよくあるエラー
開発時に注意すべき点は以下の3点です。
- 初期化直後の取得ミス:
OnInit内でiMAなどを呼んだ直後にBarsCalculatedを実行しても、多くの場合-1を返します。計算には数ミリ秒〜数百ミリ秒かかるため、必ずOnTickやOnTimer内で継続的にチェックする必要があります。 - 全バーの計算を待つ必要はない:
チャートに10万本のバーがあっても、EAのロジックで直近の数本しか使わないのであれば、BarsCalculatedの戻り値が10や100になった時点で処理を開始して構いません。 - ヒストリカルデータの欠如:
MT5が過去データをダウンロードしている最中、BarsCalculatedの値が不安定になることがあります。極端に小さな値が返ってくる場合は、SeriesInfoInteger関数などでヒストリカルデータの同期状態も併せて確認するのがプロレベルのセーフティガードです。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、プログラムのコードが完璧であることは最低条件に過ぎません。どれほど精密なエントリーロジックを組み、BarsCalculated でデータの整合性を保ったとしても、実行環境が「自宅のPC」である限り、プロのクオンツや機関投資家には勝てません。その最大の理由は、物理的なネットワーク遅延(レイテンシ)にあります。
FXの相場はミリ秒単位で変動しています。自宅のインターネット回線は、Web閲覧や動画視聴には最適化されていますが、証券会社のサーバーとの高速通信には向いておらず、数ミリ秒から数十ミリ秒のタイムラグが常に発生します。この遅延は、スリッページ(注文価格と約定価格のズレ)を招き、期待期待値を根底から破壊します。極限まで約定スピードを高め、優位性を確保するためには、証券会社のデータセンターに近い場所に位置する「専用のVPS(仮想専用サーバー)」の導入が不可欠です。24時間安定稼働し、物理的な距離を短縮するVPS環境こそが、自動売買における真の勝敗を分けるインフラとなります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント