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

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

MQL5におけるOrderGetDouble関数は、現在待機中(Pending Order)の注文に関する「浮動小数点(double型)」のプロパティを取得するための関数です。具体的には、指値・逆指値注文の価格、ロット数、ストップロス(S/L)、テイクプロフィット(T/P)などの数値データを取り出します。

実務開発において、初心者が最もつまずきやすいポイントは「注文(Order)」「ポジション(Position)」「約定(Deal)」の区別です。OrderGetDoubleはあくまで「まだ約定していない、市場に並んでいる状態の注文」に対して使う関数です。既に約定して保有中の建玉情報を取得したい場合はPositionGetDoubleを使う必要があるため、この使い分けを正しく理解することが、バグの少ないEA開発への第一歩となります。

また、複雑なグリッドトレードやトラップリピート系EAでは、「現在出している指値注文の価格が、最新の価格からどれだけ離れているか」を監視し、動的に注文を修正するロジックが不可欠です。そのような場面で、この関数は中核的な役割を果たします。

2. 構文と戻り値

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

double OrderGetDouble(
   ENUM_ORDER_PROPERTY_DOUBLE  property_id    // プロパティ識別子
);

パラメーター

  • property_id: 取得したい情報の種類をENUM_ORDER_PROPERTY_DOUBLE型の定数で指定します。代表的なものは以下の通りです。
    • ORDER_PRICE_OPEN: 注文の価格(エントリー価格)
    • ORDER_VOLUME_INITIAL: 注文時の初期ロット数
    • ORDER_VOLUME_CURRENT: まだ約定せずに残っているロット数
    • ORDER_SL: ストップロス価格
    • ORDER_TP: テイクプロフィット価格

戻り値

  • 指定したプロパティの値をdouble型で返します。
  • 関数が失敗した場合、またはデータが存在しない場合は 0.0 を返します。

※重要: この関数を呼ぶ前に、必ずOrderSelectOrderGetTicketなどを使用して、操作対象となる注文をあらかじめ選択しておく必要があります。

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

以下のコードは、現在チャートに設定されているすべての待機注文をループで確認し、その注文価格とロット数をログに出力する実戦的な例です。

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

    for(int i = 0; i < ordersCount; i++)
    {
        // 2. インデックス番号から注文チケットを取得(これによって注文が選択される)
        ulong ticket = OrderGetTicket(i);

        if(ticket > 0)
        {
            // 3. 注文の種類(買い指値、売り逆指値など)を取得
            long orderType = OrderGetInteger(ORDER_TYPE);

            // 4. OrderGetDoubleを使って、価格と現在のロット数を取得
            double priceOpen = OrderGetDouble(ORDER_PRICE_OPEN);
            double volumeCur = OrderGetDouble(ORDER_VOLUME_CURRENT);
            double stopLoss  = OrderGetDouble(ORDER_SL);
            double takeProfit = OrderGetDouble(ORDER_TP);

            // 取得したデータをエキスパートログに出力
            PrintFormat("チケット#%I64u: 価格=%G, 残ロット=%G, SL=%G, TP=%G", 
                        ticket, priceOpen, volumeCur, stopLoss, takeProfit);
        }
    }
}

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

① 「注文」と「ポジション」の混同

先述の通り、OrderGetDoubleで取得できるのは「待機注文」だけです。成行注文が成立した後の「保有ポジション」に対してこの関数を使っても、意図した値は返ってきません。ポジション情報を取得するにはPositionGetDoubleを使用してください。

② 浮動小数点の比較問題

OrderGetDoubleで取得した価格を、単純に if(price == 1.10500) のように == で比較するのは危険です。コンピュータ内部の計算誤差により、ごく微小な差(0.00000000001など)で不一致判定されることがあります。
比較の際は NormalizeDouble を使うか、MathAbs(price1 - price2) < _Point のように、一定の誤差の範囲内にあるかを確認する処理を推奨します。

③ 事前の「選択」忘れ

OrderGetTicketなどで注文をアクティブ(選択状態)にせずに OrderGetDouble を呼び出しても、正しい値は得られません。MQL5では「どの注文に対して情報を取得するか」をシステムに明示するステップが必須です。

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

アルゴリズムトレードにおいて、OrderGetDoubleを駆使してどれだけ完璧なロジックを組んでも、プログラムの実行環境が脆弱であればすべてが台無しになります。自宅のPCや一般的な光回線でEAを稼働させる場合、ネットワークの物理的な距離やOSの不安定さからくる「レイテンシ(遅延)」が致命的なリスクとなります。相場が激しく動く瞬間に注文を出しても、数ミリ秒の遅延によって「リクオート(注文の拒否)」や「大幅なスリッページ」が発生し、バックテスト通りの利益は決して得られません。

プロのクオンツエンジニアが最もこだわるのは、ロジック以上に「実行環境」です。ブローカーのサーバーと同じデータセンター内、あるいは至近距離に設置されたトレード専用のVPS(仮想専用サーバー)を利用することは、もはやオプションではなく、自動売買における必須条件といえます。24時間365日の安定稼働はもちろん、極限まで低減されたネットワーク遅延環境を手に入れることで初めて、あなたのプログラムはその真価を発揮し、ミリ秒単位の優位性を利益に変えることができるのです。

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

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

コメント

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