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

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

MQL5において、PositionGetInteger「現在保有しているポジションの整数型(long型やint型)の情報を取得する」ための非常に重要な関数です。

FXの自動売買(EA)開発において、単に「買い」や「売り」のシグナルを出すだけでは不十分です。現在持っているポジションが「自分のEAが持ったものか(マジックナンバー)」「買いか売りか」「いつエントリーしたものか」を正確に把握しなければ、決済ロジックや重複エントリー防止が正しく機能しません。

実務でよくあるつまずきポイントは、「ポジションを選択していない状態で値を取得しようとする」ことです。MQL5では、MT4の時以上に「どのポジションに対して情報を取得するのか」という選択プロセスが厳格です。この関数をマスターすることは、意図しない誤発注や決済ミスを防ぐ、堅牢なシステム開発の第一歩となります。

2. 構文と戻り値

PositionGetInteger関数には、取得したい項目に応じて2つの呼び出し方がありますが、一般的に使われるのは以下の形式です。

構文

long  PositionGetInteger(
   ENUM_POSITION_PROPERTY_INTEGER  property_id      // プロパティ識別子
);

パラメーター

  • property_id: 取得したい情報の種類を ENUM_POSITION_PROPERTY_INTEGER 列挙型から指定します。

よく使われる識別子

  • POSITION_TICKET: ポジションチケット番号(一意のID)
  • POSITION_MAGIC: EAを識別するためのマジックナンバー
  • POSITION_TYPE: ポジションの方向(買い:POSITION_TYPE_BUY、売り:POSITION_TYPE_SELL
  • POSITION_IDENTIFIER: ポジション識別子(分割決済されても変わらないID)

戻り値

指定したプロパティの値を long 型で返します。値の取得に失敗した場合は 0 を返しますが、エラーの詳細は GetLastError() 関数で確認する必要があります。


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

以下のコードは、現在保有している全ポジションをループで確認し、「自分のEA(マジックナンバー)が持っているポジションのタイプ」を判定する実戦的な例です。

// マジックナンバーの設定
#define MY_MAGIC 123456

void OnTick()
{
    // 1. 現在保有中のポジション数を取得
    int positionsCount = PositionsTotal();

    for(int i = 0; i < positionsCount; i++)
    {
        // 2. インデックス番号からポジションチケットを取得
        // ポジションを選択状態にするために必要
        ulong ticket = PositionGetTicket(i);

        if(ticket > 0)
        {
            // 3. PositionGetIntegerを使ってマジックナンバーを確認
            long positionMagic = PositionGetInteger(POSITION_MAGIC);

            // 自分のEAが持ったポジションかチェック
            if(positionMagic == MY_MAGIC)
            {
                // 4. ポジションのタイプ(売買方向)を取得
                long posType = PositionGetInteger(POSITION_TYPE);

                if(posType == POSITION_TYPE_BUY)
                {
                    Print("チケット番号 ", ticket, " は「買いポジション」です。");
                }
                else if(posType == POSITION_TYPE_SELL)
                {
                    Print("チケット番号 ", ticket, " は「売りポジション」です。");
                }
            }
        }
    }
}

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

① 事前の「選択」が必須

PositionGetInteger を呼び出す前に、必ず PositionSelectByTicketPositionGetTicket(または古い形式の PositionSelect)を使用して、どのポジションを操作対象にするかをターミナルに教える必要があります。これを行わずに呼び出すと、以前に選択された別のポジションの値を拾ったり、エラーになったりします。

② 型の取り扱いに注意

この関数は long 型を返します。例えば POSITION_TYPE を取得した場合、戻り値は 0(BUY)1(SELL) といった数値です。これを直接 int 型の変数に代入しても多くの場合問題ありませんが、チケット番号などの大きな数値は必ず long または ulong 型で扱うようにしてください。

③ 価格やロット数は別の関数

ポジションの「価格(Entry Price)」や「ロット数(Volume)」は、整数ではなく小数点を含む値(double型)です。これらを取得するには PositionGetInteger ではなく、PositionGetDouble を使用してください。


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

アルゴリズムトレードにおいて、PositionGetInteger で正確な情報を取得し、ロジックをミリ秒単位で実行しても、実行環境が貧弱であればすべてが無意味になります。自宅のPCや一般的な光回線では、FX業者のサーバーとの間に数十〜数百ミリ秒の「物理的な距離による遅延(レイテンシ)」が発生します。この遅延の間に価格は変動し、本来約定すべき価格から乖離する「スリッページ」が発生して、期待した利益が削り取られてしまいます。

プロのクオンツエンジニアが極限まで約定スピードを追い求めるのは、コンマ数秒の差が年間収支を数%、あるいは生死を分けるほど変えてしまうことを知っているからです。ネットワーク遅延による致命的な損失を回避し、EAのポテンシャルを最大限に引き出すには、FX業者の取引サーバーと同じデータセンター内に設置された、低レイテンシな専用VPS(仮想専用サーバー)での運用が不可欠です。安定した24時間稼働と超高速な約定環境を手に入れることは、シストレ開発者にとって「手法の開発」と同等か、それ以上に優先すべき投資と言えるでしょう。

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

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

コメント

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