EAなどで自動売買するときに、複数ポジションを持つことがあります。
買い増しするときや、ナンピンするときなどですね。
今回は、今保有しているポジション数を取得する方法をご紹介します。
OrderSelect関数
保有中のポジションの情報は、「OrderSelect関数」で取得します。
OrderSelect関数は、保有中のポジション以外にも、オーダーに関する全ての処理で使用します。
bool OrderSelect()
int index, //オーダー識別番号
int select, //オーダー識別番号のタイプ
int pool=MODE_TRADES //オーダー種別
;
引数名 | 引数和名 | 設定内容 |
---|---|---|
int index | オーダー番号 | インデックス番号、または、オーダーチケット番号 |
int select | int select | SELECT_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」を指定します。
実は、複数ポジションを決済するときに、何故か決済されないトラップがあります。インデックス番号の仕様によるものなのですが、知らないとハマります。
詳しくは、以前に紹介した「【MQL4】EA複数ポジションの決済で問題。インデックス番号の罠」をご覧ください。