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

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

MQL5におけるOrderGetIntegerは、現在アクティブな「待機注文(Pending Order)」に関する整数型のプロパティ(チケット番号、マジックナンバー、注文の種類、有効期限など)を取得するための関数です。

実務開発において、初心者が最もつまずきやすいポイントは、「注文(Order)」「ポジション(Position)」「履歴(History)」の区別です。MT5ではこれらが厳密に分離されており、OrderGetIntegerはあくまで「まだ約定していない、板に乗っている状態の注文」を対象にします。

具体的には、以下のようなシーンで活用します。
– 自分が発行した特定のマジックナンバーを持つ指値注文が、まだ残っているか確認する。
– トレール注文の実装で、既存の逆指値注文のチケット番号を特定し、修正対象にする。
– 注文の有効期限(Expiration)を取得し、一定時間が経過していたら削除する。

この関数を使いこなすことで、プログラム側から現在の「予約状況」を正確に把握し、二重注文などのバグを防ぐ堅牢なロジックを組むことが可能になります。


2. 構文と戻り値

OrderGetInteger関数には、取得したい項目を指定するだけのシンプルな形と、複数の注文から選択する際に便利な形式があります。

基本構文

long  OrderGetInteger(
   ENUM_ORDER_PROPERTY_INTEGER  property_id    // プロパティ識別子
);

パラメーター

  • property_id: 取得したい情報の種類をENUM_ORDER_PROPERTY_INTEGERの中から指定します。
  • ORDER_TICKET: 注文チケット番号(long型)
  • ORDER_MAGIC: マジックナンバー
  • ORDER_TYPE: 注文の種類(買い指値、売り逆指値など)
  • ORDER_STATE: 注文の状態(充填中、キャンセル済みなど)

戻り値

指定したプロパティの値をlong型で返します。取得に失敗した場合は 0 を返します。


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

この関数を使用する前には、必ずOrderSelectOrderGetTicketなどを使って、「どの注文の情報を取得するか」をターミナルに指示(選択)しておく必要があります。

以下は、現在出されている待機注文の中から、特定のマジックナンバーを持つ注文のチケット番号と種類を表示する実用的なコード例です。

void OnTick()
{
    // 現在出されている待機注文の総数を取得
    int totalOrders = OrdersTotal();

    for(int i = 0; i < totalOrders; i++)
    {
        // インデックスを指定して注文を選択し、同時にチケット番号を取得
        ulong ticket = OrderGetTicket(i);

        if(ticket > 0)
        {
            // 選択された注文のマジックナンバーを確認
            long magic = OrderGetInteger(ORDER_MAGIC);

            // 自分のEAが出した注文(マジックナンバーが一致)かチェック
            if(magic == 123456) 
            {
                // 注文の種類を取得(ENUM_ORDER_TYPEにキャスト)
                ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)OrderGetInteger(ORDER_TYPE);

                PrintFormat("チケット番号 #%I64u のマジックナンバー: %d, 注文種別: %s", 
                            ticket, magic, EnumToString(type));
            }
        }
    }
}

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

1. 注文選択の忘れ

OrderGetIntegerを単独で呼び出しても、どの注文の情報が欲しいのかをMT5が判断できません。必ず事前にOrderSelectまたはOrderGetTicketを実行してください。これを行わないと、意図しない古い注文データが返ってきたり、エラーになったりします。

2. ポジション情報との混同

約定して既に持っている「ポジション」の情報を取得したい場合は、OrderGetIntegerではなくPositionGetIntegerを使用します。ここを間違えると、「注文があるはずなのにデータが取得できない」という無限ループのデバッグに陥ります。

3. 型のキャスト

戻り値は一律でlong型です。注文の種類(ORDER_TYPE)や状態(ORDER_STATE)として扱いたい場合は、サンプルコードのように適切な列挙型(ENUM_ORDER_TYPEなど)にキャストして利用するのがスマートです。


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

アルゴリズムトレードにおいて、OrderGetIntegerで正確な注文情報を取得できたとしても、その後の「発注・修正」の実行速度が遅ければ、クオンツとしての戦略は台無しになります。特に自宅のPCや一般的なネットワーク環境での運用は、証券会社のサーバーとの間に物理的な距離があるため、ミリ秒単位の「ネットワーク遅延(レイテンシ)」が必ず発生します。

この遅延は、相場急変時のスリッページや、意図しない価格での約定を引き起こし、バックテストの結果とかけ離れた致命的な損失を生む原因となります。プロの現場では、証券会社のサーバーが置かれているデータセンターに近い場所にある「専用のVPS(仮想専用サーバー)」を使用するのが鉄則です。極限まで約定スピードを高め、インフラ側のリスクを排除することこそが、システムトレードで長期的に生き残るための最低条件と言えます。

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

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

コメント

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