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

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

MQL5におけるPositionGetString関数は、現在保有している「ポジション」の文字列型の属性情報を取得するための関数です。具体的には、ポジションが持つ「通貨ペア名(シンボル)」「注文時のコメント」「外部システムID」などをプログラム側で参照するために使用します。

実務開発において、この関数は非常に重要です。なぜなら、MT5の自動売買(EA)では「複数のEAを同時に稼働させる」ことや「特定のロジックで持ったポジションだけを識別して決済する」といった処理が頻繁に発生するからです。

実務でつまずきやすいポイント:
初心者の多くは、この関数を呼び出すだけで情報が取れると勘違いしがちです。しかし、MQL5の仕様上、PositionGetStringを呼ぶ前に必ず「どのポジションの情報を取得したいか」を事前に選択(PositionSelect等)して、キャッシュにロードしておく必要があります。この「選択の手順」を抜かしてしまうと、期待した値が取得できず、予期せぬバグの原因となります。

2. 構文と戻り値

PositionGetString関数の構文は以下の通りです。

string PositionGetString(
   ENUM_POSITION_PROPERTY_STRING  property_id   // プロパティ識別子
);

パラメーター

引数のproperty_idには、取得したい項目に応じて以下の識別子を指定します。

  • POSITION_SYMBOL: ポジションの通貨ペア名(例: “USDJPY”)。
  • POSITION_COMMENT: ポジションに付与されたコメント。
  • POSITION_EXTERNAL_ID: 外部システム(ゲートウェイ)におけるポジションのID。

戻り値

指定したプロパティの値をstring型で返します。何らかの理由で取得に失敗した場合や、データが存在しない場合は空の文字列(””)を返します。


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

以下のコードは、現在保有している全ポジションをループで確認し、それぞれの「通貨ペア名」と「コメント」をエキスパートログに出力する実用的な例です。

void OnStart()
{
    // 現在保有している全ポジションの数を確認
    int totalPositions = PositionsTotal();

    for(int i = 0; i < totalPositions; i++)
    {
        // 1. インデックス番号でポジションの「チケット番号」を取得
        // この処理により、内部的にポジションが「選択」状態になります
        ulong ticket = PositionGetTicket(i);

        if(ticket > 0)
        {
            // 2. 選択されたポジションから文字列情報を取得
            string symbol  = PositionGetString(POSITION_SYMBOL);
            string comment = PositionGetString(POSITION_COMMENT);

            // 3. 数値情報の例(ポジションタイプなど)を組み合わせて出力
            ENUM_POSITION_TYPE type = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
            string typeStr = (type == POSITION_TYPE_BUY) ? "買い" : "売り";

            PrintFormat("チケット: %I64u | 通貨ペア: %s | タイプ: %s | コメント: %s", 
                        ticket, symbol, typeStr, comment);
        }
        else
        {
            Print("ポジション情報の取得に失敗しました。エラーコード: ", GetLastError());
        }
    }

    if(totalPositions == 0)
    {
        Print("現在、保有中のポジションはありません。");
    }
}

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

① 「選択」を忘れない

前述の通り、PositionGetStringを単体で使っても正しい値は取れません。必ず以下のいずれかでポジションをアクティブにする必要があります。
PositionSelectByTicket(ticket):チケット番号で指定
PositionGetTicket(index):インデックス(0番目〜)で指定
PositionSelect(symbol):通貨ペア名で指定(※ネットティング口座の場合)

② MT4(MQL4)との違いに注意

MT4では「注文(Order)」と「ポジション」が混同されがちでしたが、MT5では明確に分かれています。PositionGetString現在保有中の含み損益が発生しているポジションに対して使うものです。既に閉じた取引の履歴を調べたい場合は、HistoryOrderGetStringHistoryDealGetStringを使用する必要があるため、注意してください。

③ コメントの書き換え不可

POSITION_COMMENTは、注文送信時に設定した内容が格納されます。ポジションを持った後に、PositionGetStringで取得したコメントを書き換えることはできません。EAでステータス管理を行いたい場合は、グローバル変数や独自のデータベース、またはマジックナンバー(PositionGetIntegerで取得)を組み合わせて設計するのがクオンツの定石です。


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

アルゴリズムトレードにおいて、ロジックの正確さと同等、あるいはそれ以上に重要なのが「実行環境」です。多くの個人開発者は自宅のPCや一般的な光回線でEAを動かそうとしますが、これはプロの視点から見ると極めてリスクが高い行為です。自宅のネットワーク環境は、FX業者のサーバーとの物理的距離が遠く、パケットの往復(レイテンシ)に数十ミリ秒から数百ミリ秒の遅延が生じます。

このわずかな遅延(ラグ)により、PositionGetStringで情報を取得し決済判断を下した瞬間には、すでに市場価格が変動している「スリッページ」が発生します。特にボラティリティが高い局面では、数pipsの不利な約定が積み重なり、期待値がプラスのロジックですらトータルで赤字に転落することが珍しくありません。極限まで約定スピードを高め、優位性を確保するには、FX業者のデータセンターに近いロケーションにある専用のVPS(仮想専用サーバー)を利用することが、シストレエンジニアにとっての「最低限のインフラ投資」となります。

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

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

コメント

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