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

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

MQL5におけるPositionsTotal関数は、現在口座内で保有している「ポジション」の合計数を取得するための関数です。

FXの自動売買(EA)開発において、「今いくつのポジションを持っているか」を把握することは、リスク管理の根幹に関わります。例えば、「最大ポジション数を3つに制限する」や「特定の通貨ペアで既にポジションがある場合はエントリーを見送る」といったロジックを組む際に必ず使用します。

実務レベルで初心者が最もつまずきやすいポイントは、「オーダー(Order)」と「ポジション(Position)」の混同です。
オーダー(Order): 指値・成行注文など、約定前の「注文」の状態。
ポジション(Position): 注文が約定し、実際に市場で持っている「持ち高」。

PositionsTotalは後者の「現在進行形で損益が発生している持ち高」を数えるための関数であることを正しく理解しましょう。また、この関数は「全通貨ペア」および「全EA(マジックナンバー)」の合計を返すため、実務ではループ処理とフィルターを組み合わせて「自分のEAのポジションだけ」を特定してカウントするのが定石です。

2. 構文と戻り値

PositionsTotal関数の仕様は非常にシンプルです。

int  PositionsTotal();
  • パラメーター: なし
  • 戻り値: 現在保有しているポジションの総数(int型)。ポジションがない場合は 0 を返します。

非常に簡素な関数ですが、ここから得られた数値を元に PositionGetTicket などの関数へ繋げ、個別のポジション詳細(利益やマジックナンバー)を取得していくことになります。

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

以下は、現在稼働しているEA自身のマジックナンバーと通貨ペアに合致するポジションが、現在いくつあるかをカウントする実践的なコード例です。

// マジックナンバーの設定
input int MagicNumber = 123456;

void OnTick()
{
    int myPositionCount = GetMyPositionCount();

    Print("現在の自EAポジション数: ", myPositionCount);

    // 例:ポジションが0の場合のみエントリーロジックへ進む
    if(myPositionCount == 0)
    {
        // エントリー処理など
    }
}

//--- 自EAのポジション数をカウントする関数
int GetMyPositionCount()
{
    int count = 0;

    // 全体のポジション数を取得
    int total = PositionsTotal();

    // 全ポジションをループで確認
    for(int i = 0; i < total; i++)
    {
        // インデックスを指定してポジションを選択(これが必要)
        // PositionGetSymbolは、i番目のポジションの通貨ペア名を取得しつつ選択状態にする
        string symbol = PositionGetSymbol(i);

        // 選択されたポジションの情報を確認
        long posMagic = PositionGetInteger(POSITION_MAGIC);

        // 「通貨ペアが一致」かつ「マジックナンバーが一致」する場合のみカウント
        if(symbol == _Symbol && posMagic == MagicNumber)
        {
            count++;
        }
    }

    return count;
}

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

PositionsTotal を使用する上で、特に注意すべき点が2つあります。

  1. 「決済ループ」の逆回し:
    もし PositionsTotal を使ってループを回し、その中でポジションを決済(Close)する場合、ループのカウントは必ず大きい方から(total - 1 から 0 へ)逆回しにする必要があります。
    理由: 0番目のポジションを決済すると、1番目だったポジションが0番目に繰り上がるため、正順(0から順)に処理すると飛ばされるポジションが出てくるからです。

  2. マルチ通貨・複数EAの混同:
    前述の通り、PositionsTotal は口座全体の数を返します。他通貨ペアや別のEAが持っているポジションも含まれるため、必ず POSITION_MAGICSymbol() でフィルタリングを行ってください。これを怠ると、「他のEAがポジションを持っているから、このEAが一生エントリーしない」といったバグに繋がります。

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

自動売買において、PositionsTotal を駆使した完璧なロジックを組み上げたとしても、動作環境が不適切であればその努力は水の泡となります。特に、自宅のPCや一般的な光回線を利用して自動売買を行うことは、プロのクオンツの視点からは極めてリスクが高い行為と言わざるを得ません。

ネットワーク遅延(レイテンシ)は、EAが注文を出してからブローカーのサーバーに届くまでのわずかな時間に「価格の乖離(スリッページ)」を引き起こします。コンマ数秒の遅れが、本来得られるはずだった利益を削り、さらには本来回避できたはずの損失を拡大させます。24時間安定した電源供給と、ブローカーのサーバーと同じデータセンター内に設置された専用VPS(仮想専用サーバー)を利用することは、もはやオプションではなく、勝つための「必須装備」です。極限まで約定スピードを高め、物理的な距離によるハンデをゼロにすることが、エンジニアとしてシステムを正しく運用するための第一歩となります。

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

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

コメント

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