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 を返します。
※重要: この関数を呼ぶ前に、必ずOrderSelectやOrderGetTicketなどを使用して、操作対象となる注文をあらかじめ選択しておく必要があります。
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を使わないと、このロジックは再現できません。

コメント