【MQL5】BarsCalculated関数の使い方と自動売買実装コード

1. BarsCalculated関数の概要と実務での活用法

MQL5でカスタムインジケーターやEA(エキスパートアドバイザー)を開発する際、避けて通れないのが「インジケーターの値が計算し終わっているか」の判定です。BarsCalculated 関数は、指定したインジケーターハンドルにおいて、現時点で計算が完了しているバーの数を返します。

実務レベルの開発で初心者が最もつまずきやすいポイントは、「インジケーターをハンドルした直後、すぐに値を取得しようとしてエラーになる」という現象です。MQL5のインジケーター計算は非同期で行われるため、プログラムが実行された瞬間にすべてのデータが準備できているとは限りません。

BarsCalculated を活用することで、データの準備が整うまで待機したり、不完全なデータによる誤サインを防いだりすることが可能になります。安定したトレードロジックを組むための「防波堤」のような役割を果たす重要な関数です。

2. 構文と戻り値

BarsCalculated 関数の構文は非常にシンプルです。

int  BarsCalculated(
   int  indicator_handle     // インジケーターのハンドル
   );

パラメーター

  • indicator_handle: iMAiRSI などの組み込み関数、あるいは 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点です。

  1. 初期化直後の取得ミス:
    OnInit 内で iMA などを呼んだ直後に BarsCalculated を実行しても、多くの場合 -1 を返します。計算には数ミリ秒〜数百ミリ秒かかるため、必ず OnTickOnTimer 内で継続的にチェックする必要があります。
  2. 全バーの計算を待つ必要はない:
    チャートに10万本のバーがあっても、EAのロジックで直近の数本しか使わないのであれば、BarsCalculated の戻り値が 10100 になった時点で処理を開始して構いません。
  3. ヒストリカルデータの欠如:
    MT5が過去データをダウンロードしている最中、BarsCalculated の値が不安定になることがあります。極端に小さな値が返ってくる場合は、SeriesInfoInteger 関数などでヒストリカルデータの同期状態も併せて確認するのがプロレベルのセーフティガードです。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、プログラムのコードが完璧であることは最低条件に過ぎません。どれほど精密なエントリーロジックを組み、BarsCalculated でデータの整合性を保ったとしても、実行環境が「自宅のPC」である限り、プロのクオンツや機関投資家には勝てません。その最大の理由は、物理的なネットワーク遅延(レイテンシ)にあります。

FXの相場はミリ秒単位で変動しています。自宅のインターネット回線は、Web閲覧や動画視聴には最適化されていますが、証券会社のサーバーとの高速通信には向いておらず、数ミリ秒から数十ミリ秒のタイムラグが常に発生します。この遅延は、スリッページ(注文価格と約定価格のズレ)を招き、期待期待値を根底から破壊します。極限まで約定スピードを高め、優位性を確保するためには、証券会社のデータセンターに近い場所に位置する「専用のVPS(仮想専用サーバー)」の導入が不可欠です。24時間安定稼働し、物理的な距離を短縮するVPS環境こそが、自動売買における真の勝敗を分けるインフラとなります。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました