【MQL4】保有中のポジション数を取得する

EAなどで自動売買するときに、複数ポジションを持つことがあります。

買い増しするときや、ナンピンするときなどですね。

今回は、今保有しているポジション数を取得する方法をご紹介します。

スポンサーリンク

OrderSelect関数

保有中のポジションの情報は、「OrderSelect関数」で取得します。

OrderSelect関数は、保有中のポジション以外にも、オーダーに関する全ての処理で使用します。

bool OrderSelect()
   int index,            //オーダー識別番号
   int select,           //オーダー識別番号のタイプ
   int pool=MODE_TRADES  //オーダー種別
;
引数名引数和名設定内容
int indexオーダー番号インデックス番号、または、オーダーチケット番号
int selectint selectSELECT_BY_POS(インデックス)
SELECT_BY_TICKET(オーダーチケット)
int pool=MODE_TRADESオーダー種別MODE_TRADES(保有中、予約中)
MODE_HISTORY(決済済、キャンセル)

保有中のポジションをカウントする

OrderSelect関数で取得した注文一覧の中から、今保有しているポジションを判別して、カウントすればOKです。

今回は「選択中の通貨の今保有している買いポジションの数を取得する」という場面を例に説明します。

処理の流れ)

1. 「OrderSelect関数」で、注文一覧を取得し、保有中の注文を特定します。

2. 「OrderMagicNumber関数」で、マジックNoで、EAの注文を特定します。

3. 「OrderSymbol関数」で、現在の通貨に一致する注文を特定します。

4. 「OrderType関数」で、買いポジションを特定して、カウントします。

コード例)

int Magic=1234;  //マジックNo
int iCnt=0;      //ポジション数カウント

for( i=0; i<OrdersTotal(); i++ ){

   if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) == true ){  //保有中のポジション判定

      if (OrderMagicNumber() != Magic) continue; //マジックNoが違ったらスキップ
      if (OrderSymbol() != Symbol()) continue; //現在通貨が違ったらスキップ

      if( OrderType() == OP_BUY ) iCnt++; //ポジション数カウント

   }
}

マジックNoを指定していない場合は、OrderMagicNumber関数によるチェックは不要です。

「インデックス番号」と「オーダーチケット番号」

OrderSelect関数では、インデックス番号(SELECT_BY_POS)と、オーダーチケット番号(SELECT_BY_TICKET)を使った選択方法があります。

今回のような条件に該当する注文を一覧から取得したい場合は、インデックス番号で、順番に探していくことになります。

「MODE_TRADES」と「MODE_HISTORY」

OrderSelect関数の注文一覧には、過去の取引や予約中の取引も含まれます。

過去のトレード履歴を取得したい場合などは、「MODE_HISTORY」を指定します。
保有中のポジションを取得する場合は、「MODE_TRADES」を指定します。

OrderSelect関数は、決済や、トレーリングストップしたい場合など、オーダーに対して何か処理するときには、必ず使います。

どの場面でも使い方は同じなので、覚えておきましょう。

実は、複数ポジションを決済するときに、何故か決済されないトラップがあります。インデックス番号の仕様によるものなのですが、知らないとハマります。

詳しくは、以前に紹介した「【MQL4】EA複数ポジションの決済で問題。インデックス番号の罠」をご覧ください。

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