【MQL4関数】OrderSelect関数の使い方!保有ポジションの選択のやり方

【中級編】MQLプログラムの読み方・書き方
朝日奈りさ
朝日奈りさ

自動売買で保有ポジションを選択するにはどうしたらいいの?

OrderSelect関数とは

自動売買システムに保有ポジションを決済させたいですよね!

決済するためには、保有ポジションを選択する必要があります。

そこで OrderSelect関数を使いましょう。

 

OrderSelect関数は、保有ポジションを1つ選択する関数です。

選択することで、そのポジションの情報を取得することができます。

例えば、以下の情報を取得できます。

・注文種別
・ロット数
・チケット番号
・注文日時   etc…

 

ちなみに OrderSelect関数は、あくまで保有ポジションを選択するだけの関数です。

OrderSelect関数を使って、情報を取得することはできないので、ご注意ください。

 

またOrderSelect関数は、保有ポジションの情報を取得するだけでなく、決済するときにも必ず使用する関数です。

自動売買ではトレードの基本となる関数なので、基本的な書き方をマスターしましょう。

 

OrderSelect関数の書き方

OrderSelect関数の書き方は、関数の書き方と同じです。

もし関数の使い方をマスターしていない方は、こちらの記事が参考になります。

 

基本的な書き方

OrderSelect関数の基本的な書き方は以下の通りです。

分かりやすいように、引数は省略しています。

bool  OrderSelect( ①, ②, ③);

 

返り値は bool型で、引数は3つあります。

まずは返り値から見ていきましょう。

 

返り値(戻り値)

OrderSelect関数の返り値は、bool型です。

「true」または「false」が返ってきます。

数値にすると「1」または「0」が返ってきます。

 

正常にポジションを選択できた場合は、「true」が返ってきます。

正常にポジションを選択できなかった場合は、「false」が返ってきます。

 

このように OrderSelect関数は、bool型が返り値となっています。

 

引数

OrderSelect関数の引数は3つです。

まずは一覧で見てみましょう。

番号データ型引数名内容
intindex以下のどちらかを設定
・インデックス
・チケット番号
intselect以下から選択方法を設定(上記のindexに合わせる)
・インデックス
・チケット番号
intpool以下のどちらかを設定
・現在保有しているポジション
・過去保有していたポジション

 

1つ1つ見ていきながら、一緒に OrderSelect関数を作っていきましょう。

 

①index

indexは、ポジションを選択するために、ポジションの番号を設定します。

番号には以下の2種類があります。

・インデックス
・チケット番号

 

インデックスとは、注文するときに自動的に割り振られた識別番号です。

保有しているポジションが1つの場合、「0」が割り振られます。

その後、ポジションが増えるごとに 1、2、3・・・と順番に割り振られる番号になります。

 

チケット番号とは、現在・過去に関わらず、ポジションに自動的に割り振られた固有番号です。

チケット番号は、ポジションによって全て異なっているため、同じ番号のポジションはありません。

そのため桁数が多く、FX会社によって異なりますが、8桁くらいの番号になります。

 

たいていの自動売買システムは、インデックスを使用しています。

インデックスの方が分かりやすいので、インデックスを使用すると良いでしょう。

 

bool select = OrderSelect( 0, ②, ③);

 

②select

selectは OrderSelect関数がポジションを選択するときの、選択方法を設定します。

こちらも以下の2つから選びます。

・インデックス(SELECT_BY_POS)
・チケット番号(SELECT_BY_TICKET)

 

もし ①index の引数で、インデックス番号を設定している場合、「SELECT_BY_POS」を選択します。

チケット番号を設定している場合、「SELECT_BY_TICKET」を選択します。

 

このように ①index の設定内容によって決まるので、してほしい選択方法を設定しましょう。

ここでは、インデックス番号を設定しますので、以下のように書きます。

bool select = OrderSelect( 0, SELECT_BY_POS, ③);

 

③pool

poolは、どんな状態のポジションから選択したいのかを設定します。

設定値は以下の2つです。

・現在のポジションから選択(MODE_TRADES)
・過去のポジションから選択(MODE_HISTORY)

 

例えば、現在保有しているポジションまたは、予約しているポジションから選択したい場合は、「MODE_TRADES」を設定します。

過去に決済したポジションまたは、キャンセルしたポジションから選択したい場合は、「MODE_HISTORY」を設定します。

 

ここでは、保有ポジションから選択したいので、以下のように書きます。

bool select = OrderSelect( 0, SELECT_BY_POS, MODE_TRADES);

 

OrderSelect関数の具体的な使い方(サンプルあり)

OrderSelect関数の基本的な書き方を解説しましたが、ここからは具体的な使い方について解説していきます。

OrderSelect関数はポジションを1つだけ選択する関数なので、for文を使って全てのポジションを選択する方法がよく使われます。

そのとき、for分の条件式に保有ポジション数が必要となりますので、OrdersTotal関数と組み合わせて使う場合が多いです。

例えば以下のようなプログラムです。

//保有ポジションを一つずつチェックしていく
  for( int i = OrdersTotal() - 1; i >= 0; i--)
     {

      //保有ポジションを一つ選択
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES))
          {

              //ここにポジションを操作するプログラムを書く

          }
     }

 

 

上記のように、for文で1つずつポジションを選択し、ポジションを決済させたり、情報を取得したりします。

この書き方は、自動売買を作るときによく使う書き方なので、どこかにコピーしておくと良いでしょう。

 

OrdersTotal関数の詳しい使い方は、こちらの記事が参考になります。

 

まとめ

OrderSelect関数は、ポジションを1つ選択する関数です。

ポジションの識別番号(インデックス)または、固有番号(チケット番号)を設定することで、選択することができます。

ポジションを決済させたいときや、情報を取得したいときに必ず使う関数なので、しっかり覚えておきましょう。

また、OrdersTotal関数と組み合わせて使われることが多いので、サンプルプログラムの書き方をコピーしておくと、自動売買を作りやすいと思います。