【MQL4勉強プログラミング】EAで注文を選択する方法とは?

OrderSelect()関数は、注文を選択するために使用します。

OrderSelect()関数は、以下のように定義されています。

bool OrderSelect(
int index,
int select,
int pool=MODE_TRADES
);

各引数の意味は、以下のとおりです。

  • int index
    選択したい注文の「インデックス」か「チケット番号」を指定します。
    「インデックス」とは、各注文に振られた「0」から始まる整数値です。具体的には、MetaTradr4(MT4)で「A」、「B」、「C」という順にポジションを保有した場合、「A」には「0」、「B」には「1」、「C」には「2」という番号(インデックス)が振られます。
    したがって、注文「A」を選択したい場合には「0」を、注文「B」を選択したい場合には「1」を、注文「C」を選択したい場合には「2」を記述します。
  • int select
    注文の選択方法を指定します。具体的には、以下のように記述します。
    「SELECT_BY_POS」
    インデックスを使用して注文を選択する。
    「SELECT_BY_TICKET」
    チケット番号を使用して注文を選択する。
  • int pool=MODE_TRADES
    注文を、「現在保有しているもの、又は待機注文の中から」選択するか、「既に決済したもの、又は取り消したものの中から」選択するかを指定します。具体的には、以下のように記述します。
    「MODE_TRADES」
    現在保有しているもの、又は待機注文の中から選択します。
    「MODE_HISTORY」
    既に決済したもの、又は取り消したものの中から選択します。
    なお、この引数は、第二引数で「SELECT_BY_POS」を指定した場合に記述します。

戻り値

注文が正常に選択された場合には「true」が、正常に選択されなかった場合には「false」が返されます。

詳しいエラー情報を取得したい場合には、GetLastError()関数を使用します。

注意点

第二引数(int select)を「SELECT_BY_TICKET」とした場合には、チケット番号は、待機注文・未決済注文(=保有ポジション)・既決済注文を通じて重複しないので、第三引数(int pool)の指定は無視されます。したがって、記述する必要はありません。

選択した注文が未決済か既決済かを区別するためには、その注文の決済時刻を確認します(決済時刻の確認には、OrderCloseTime()関数を使用します。)。

  • 決済時刻が「0」の場合
    選択した注文は待機注文か未決済注文です。
  • 決済時刻が「0」でない場合
    選択した注文は既決済注文か取り消された待機注文です。

選択した注文が待機注文か未決済注文(=保有ポジション)かは、その注文の種別(成行き、指値等)によって区別することができます(注文の種別の確認は、OrderType()関数を使用します。)。

OrderSelect()関数は、以下の関数を使用する前に実行する必要があります。

具体例

マジックナンバーが等しい注文(=同一のEAによって取得されたポジション)に対してのみ決済処理を行う場合には、以下のように記述します。


int Magic  = 1212;
int Ticket = 0;
……
if(OrderSelect(Ticket,SELECT_BY_TICKET) == true)
  {
    if(OrderMagicNumber() == Magic)
      {
        決済処理
        ……