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

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

MQL5におけるOrderGetStringは、現在アクティブな待機注文(Pending Order)の文字列型のプロパティを取得するための関数です。

MQL4からMQL5に移行した開発者が最もつまずきやすいのが、「注文(Order)」「約定(Deal)」「ポジション(Position)」の区別です。OrderGetStringが対象とするのは、まだ約定していない「これから執行されるのを待っている注文」の情報です。

実務においては、主に以下の用途で使用されます。
* 注文コメントの照合: 特定のロジックで出した注文であることを識別するための「コメント」を確認する。
* 通貨ペアの確認: 複数通貨ペアを扱うEAで、どの通貨ペアの注文かを特定する。
* 外部IDの取得: 証券会社のサーバー側で割り振られた注文識別子を取得し、外部データベースと連携させる。

特に「注文コメント」を利用したフィルタリングは、一つの口座で複数のEAを稼働させる際に、自作EAの注文のみを正確に操作するために不可欠なテクニックです。

2. 構文と戻り値

OrderGetString関数の基本的な構文は以下の通りです。

string OrderGetString(
   ENUM_ORDER_PROPERTY_STRING  property_id   // プロパティ識別子
);

パラメーター

  • property_id: 取得したい情報の種類をENUM_ORDER_PROPERTY_STRING列挙型から指定します。
定数 説明
ORDER_SYMBOL 注文対象の通貨ペア名(例: “USDJPY”)
ORDER_COMMENT 注文時に設定したコメント
ORDER_EXTERNAL_ID 外部取引システムでの注文ID(証券会社によって使用される)

戻り値

指定したプロパティの値をstring型で返します。データの取得に失敗した場合は、空の文字列(””)が返されます。詳細なエラー情報を知りたい場合は、GetLastError()関数を呼び出します。

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

OrderGetStringを使用する際は、事前にOrderGetTicketOrderSelectなどで「どの注文の情報を取得するか」を選択状態にする必要があります。

以下のコードは、現在出されているすべての待機注文をループで確認し、特定のコメントを持つ注文を見つける実用的な例です。

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

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

        if(ticket > 0)
        {
            // 選択された注文のプロパティを取得
            string symbol  = OrderGetString(ORDER_SYMBOL);
            string comment = OrderGetString(ORDER_COMMENT);

            // ログに出力
            PrintFormat("注文インデックス: %d, チケット: %I64u, 通貨ペア: %s, コメント: %s", 
                        i, ticket, symbol, comment);

            // 例:特定のコメントを持つ注文を識別して処理
            if(comment == "MyExpert_Breakout")
            {
                Print("自作EAのブレイクアウト注文を発見しました。");
            }
        }
        else
        {
            Print("注文の選択に失敗しました。エラーコード: ", GetLastError());
        }
    }
}

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

① 「履歴」にある注文には使えない

OrderGetStringは、あくまで「現在板に並んでいる注文(待機注文)」が対象です。すでに約定してポジションになったものや、キャンセルされた過去の注文情報を取得する場合は、HistoryOrderGetString関数を使用する必要があります。ここを混同すると「注文があるはずなのに何も取得できない」というバグに繋がります。

② 事前の選択プロセスが必須

OrderGetStringを単体で呼び出しても、どの注文を指しているのかプログラムは判断できません。必ずOrderGetTicketOrderSelectで「操作対象の注文」をシステム側に教える必要があります。

③ タイミングによる実行エラー

自動売買では、注文を検知した瞬間にその注文が約定(またはキャンセル)される可能性があります。ループ処理の中でOrderGetStringを呼び出す際、直前まで存在していた注文が消えている場合があるため、戻り値が空でないか、エラーが発生していないかを常にチェックする堅牢なコーディングが求められます。

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

クオンツエンジニアの視点から断言しますが、アルゴリズムの優位性と同じくらい重要なのが「取引環境」です。自宅PCや一般的な家庭用回線でEAを動かすことは、プロのレーサーが一般道を軽自動車で走るようなものです。どれほど優れたロジックを組んでも、ネットワークの物理的な距離による「遅延(レイテンシ)」が原因で、OrderGetStringで注文情報を確認している間に価格が滑り(スリッページ)、理想的なエントリー価格を逃してしまいます。

特にボラティリティが高い局面では、数ミリ秒の遅延が収益曲線を右肩下がりに変えてしまう致命的な要因となります。この遅延を極限まで排除し、証券会社のサーバーに対して最速のレスポンスを返すには、取引サーバーの至近距離に位置する専用のVPS(仮想専用サーバー)での運用が不可欠です。安定した電源、24時間稼働、そして圧倒的な低レイテンシを確保することこそが、システムトレーダーが最初に投資すべき「勝つためのインフラ」なのです。

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

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

コメント

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