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

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

MQL5におけるOrdersTotal関数は、現在チャート上に存在する「待機注文(Pending Orders)」の総数を取得するための関数です。

FXシステムトレードの開発において、最も頻繁に使用される関数の一つですが、MQL4から移行してきた開発者が最もつまずきやすいポイントでもあります。MQL4のOrdersTotalは「保有中のポジション」と「待機注文」の両方を合算して返していましたが、MQL5では「待機注文のみ」をカウントします。

実務での主な活用法は以下の通りです。
– 指値・逆指値注文が二重に発生するのを防ぐためのチェック
– 規定の注文数に達した際に新規注文を制限するロジックの構築
– 全待機注文を一括キャンセルする際のループ処理の回数指定

この関数を正しく理解していないと、「ポジションを持っているのにOrdersTotalが0を返すため、無限にエントリーを繰り返してしまう」といった致命的なバグ(無限発注)を誘発する原因になります。

2. 構文と戻り値

OrdersTotal関数の構文は非常にシンプルで、引数は必要ありません。

int OrdersTotal();
  • パラメーター: なし
  • 戻り値: 現在の待機注文の総数を int 型で返します。
  • 注意: 決済済みの注文履歴や、現在損益が変動している「保有中のポジション」は含まれません。

3. 具体的な使い方・実践サンプルコード

実務では、単に総数を取得するだけでなく、自身のEAが発行した特定の注文(マジックナンバーや通貨ペアが一致するもの)がいくつあるかをカウントするのが一般的です。

void OnTick()
{
    // 現在の待機注文の総数を取得
    int totalPendingOrders = OrdersTotal();

    int myOrderCount = 0;
    long magicNumber = 123456; // EA固有のマジックナンバー

    // 全ての待機注文をループで確認し、自身のEAの注文をカウントする
    for(int i = 0; i < totalPendingOrders; i++)
    {
        // インデックスを指定して注文チケット番号を取得
        ulong ticket = OrderGetTicket(i);

        if(ticket > 0)
        {
            // 注文のプロパティ(マジックナンバー、通貨ペア)を確認
            if(OrderGetInteger(ORDER_MAGIC) == magicNumber && 
               OrderGetString(ORDER_SYMBOL) == _Symbol)
            {
                myOrderCount++;
            }
        }
    }

    // デバッグ表示:自身の待機注文数をログに出力
    Print("自身の待機注文(指値・逆指値)の数: ", myOrderCount);

    // 実践的な活用:待機注文が0の場合のみ、新しく指値を置く
    if(myOrderCount == 0)
    {
        // ここにエントリーロジックを記述
    }
}

4. 使用上の注意点とよくあるエラー

開発者が陥りがちなミスとして、以下の3点に注意してください。

  1. ポジション数との混同:
    現在約定して保有している建玉の数を知りたい場合は、PositionsTotal()関数を使用してください。OrdersTotalはあくまで「まだ約定していない注文」のみが対象です。
  2. ループの方向に注意(注文削除時):
    待機注文を全削除するためにOrdersTotalを使ってループを回す場合、「カウントダウン方式(大きいインデックスから0へ)」で処理する必要があります。前から(0から)削除すると、削除した瞬間にインデックスがズレてしまい、一部の注文が削除されずに残るバグが発生します。
  3. マルチ通貨・マルチEA環境:
    OrdersTotalは「口座全体」の待機注文を返します。複数の通貨ペアや異なるEAを同じ口座で動かしている場合、必ず「マジックナンバー」や「シンボル名」でフィルタリングを行わないと、他のEAの注文まで干渉してしまいます。

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

アルゴリズムトレードにおいて、OrdersTotalで正確な状況を把握し、ロジックを実行するスピードは収益に直結します。しかし、どんなに洗練されたコードを書いても、自宅のPC環境からトレードを行うことには致命的なリスクが伴います。

FX市場はミリ秒単位で価格が変動しており、自宅PCから海外のブローカーサーバーへ注文を出す際、一般的な光回線では物理的な距離による「ネットワーク遅延(レイテンシ)」が必ず発生します。この遅延により、プログラムが判断した瞬間の価格と、実際にサーバーに注文が届いた時の価格に差(スリッページ)が生じ、期待した利益が削られてしまうのです。プロのクオンツエンジニアが極限まで約定スピードを高めるために、ブローカーのサーバーに物理的に近い場所にある「専用のVPS(仮想専用サーバー)」を利用するのは、もはやトレードにおける最低限のインフラと言えます。安定した稼働と最速のレスポンスを確保することが、システムトレードにおける最大の防衛策となります。

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

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

コメント

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