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

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

MQL5におけるPositionGetDoubleは、現在保有している「ポジション」に関する数値データ(double型)を取得するための非常に重要な関数です。MT5(MetaTrader 5)では、MT4とは異なり「注文(Order)」「取引(Deal)」「ポジション(Position)」が明確に区別されており、現在保有中の建玉の状態を知るには、この「Position系」の関数を使いこなす必要があります。

実務レベルの開発において、この関数は主に以下の用途で使用されます。
– 現在の含み損益(POSITION_PROFIT)を確認し、ロジックに基づいた決済(利確・損切り)を行う。
– ポジションのロット数(POSITION_VOLUME)を取得し、ピラミッディング(増し玉)の判定に使う。
– 建値(POSITION_PRICE_OPEN)を基準に、トレーリングストップの計算を行う。

初心者が最もつまずきやすいポイントは、「この関数を呼ぶ前に、対象となるポジションをあらかじめ選択(セレクト)しておかなければならない」という点です。選択を忘れると、関数は常に 0 を返し、意図しない挙動(損切りが発動しない等)の原因となります。


2. 構文と戻り値

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

double  PositionGetDouble(
   ENUM_POSITION_PROPERTY_DOUBLE  property_id      // プロパティ識別子
   );

パラメーター

取得したい情報の種類を ENUM_POSITION_PROPERTY_DOUBLE 型の識別子で指定します。代表的なものは以下の通りです。

識別子 内容
POSITION_VOLUME ポジションの数量(ロット数)
POSITION_PRICE_OPEN ポジションのオープン価格(建値)
POSITION_SL ストップロス(決済逆指値)の価格
POSITION_TP テイクプロフィット(決済指値)の価格
POSITION_PROFIT 現在の含み損益(評価損益)
POSITION_SWAP 蓄積されたスワップポイント

戻り値

指定したプロパティの値を double 型で返します。指定したプロパティが存在しない場合や、ポジションの選択に失敗している場合は 0 を返します。


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

以下のコードは、現在保有している全てのポジションをループで確認し、それぞれの「ロット数」「建値」「現在の損益」を取得して操作する実戦的な例です。

void OnTick()
{
    // 全ポジションの数を取得
    int totalPositions = PositionsTotal();

    for(int i = 0; i < totalPositions; i++)
    {
        // インデックスを指定してポジションを選択し、シンボル名を取得
        // この「選択」のプロセスが PositionGetDouble を使う前に必須
        string symbol = PositionGetSymbol(i);

        if(symbol != "")
        {
            // ポジションの各種情報を取得
            double volume = PositionGetDouble(POSITION_VOLUME);      // ロット数
            double openPrice = PositionGetDouble(POSITION_PRICE_OPEN); // 建値
            double profit = PositionGetDouble(POSITION_PROFIT);      // 評価損益
            long type = PositionGetInteger(POSITION_TYPE);           // 売買種別

            string posType = (type == POSITION_TYPE_BUY) ? "買い" : "売り";

            // ログに出力
            PrintFormat("銘柄:%s, 種別:%s, ロット:%.2f, 建値:%.5f, 損益:%.2f", 
                        symbol, posType, volume, openPrice, profit);

            // 実践的な活用例:含み益が一定額を超えたらログを出す
            if(profit > 1000.0)
            {
                Print("ターゲット利益に到達しました。");
            }
        }
    }
}

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

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

  1. ポジションの選択忘れ
    PositionGetDouble は、直前に PositionSelectPositionGetSymbol 等で「どのポジションのデータを取得するか」をMT5側に伝えていないと正しく動作しません。特に複数のポジションを保有する可能性があるEAでは、ループ処理での選択が必須です。

  2. OrderGetDouble との混同
    MT4の経験者に多いミスですが、MT5において Order は「注文(未約定の指値など)」を指します。すでに約定して保有している建玉の情報を取りたい場合は、必ず PositionGetDouble を使用してください。

  3. ネット計算方式(Netting)とヘッジング方式(Hedging)の違い
    証券会社の口座タイプが「ネット方式」の場合、同一通貨ペアで複数のポジションを持つことはできず、自動的に合算されます。この場合、PositionGetDouble で取得できるのは「合算された1つのポジション」の情報のみとなります。自分の利用している口座がどちらの方式かを確認してコーディングしてください。


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

アルゴリズムトレードにおいて、ロジックの正確さと同等、あるいはそれ以上に重要なのが「実行環境」です。PositionGetDouble で損益を計算し、決済命令を出すコードが完璧であっても、自宅のPCや一般的な光回線でEAを動かしている場合、ネットワークの遅延(レイテンシ)という物理的な壁に突き当たります。

FX市場はミリ秒単位で価格が変動します。自宅PCからの注文は、プロバイダーや複数のサーバーを経由して証券会社のサーバーに届くまでに、致命的なタイムラグを生じさせます。この遅延は、本来得られるはずだった利益を削り、滑り(スリッページ)による損失を拡大させます。プロフェッショナルなクオンツエンジニアにとって、証券会社のデータセンターに物理的に近い場所にある「専用のVPS(仮想専用サーバー)」を利用することは、単なる推奨事項ではなく、勝つための最低条件です。24時間安定した稼働と極限まで短縮された約定スピードを確保して、初めてあなたのアルゴリズムは真の性能を発揮することができます。

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

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

コメント

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