【MQL4関数】OrderType関数の使い方!買いと売りを判別しよう

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

買いポジションを決済するロジックなのに、売りポジションを決済しちゃった!どうすれば防げるんだろう?

OrderType関数とは

「自動売買が買いポジションを決済するタイミングで、売りポジションを決済してしまった!」

そういう方は、買いポジションと売りポジションを、正しく判別できていない可能性があります。

 

買いと売りを正しく判別できていない場合、買いポジションを決済するつもりが、売りポジションを決済してしまったということが起こってしまいます。

そこで、OrderType関数を使って、ポジションの種類を判別し、ポジションを正しく決済させましょう!

 

OrderType関数は、ポジションの種類を返す関数です。

ポジションの種類を取得することで、買いと売りの判別ができるようになります。

判別ができることで、自動売買が決済するときに、ポジションを間違えずに決済することができます。

実行することで、ポジションが「買い」なのか「売り」なのかを判別することができるので、自動売買には必須の関数と言えるでしょう。

 

OrderType関数の書き方

OrderType関数の使い方は、基本的な関数と同じです。

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

 

基本的な書き方

OrderType関数はとてもシンプルな関数です。

引数なしで実行できます。

ただし、OrderType関数を実行する前に、ポジションを選択しておく必要があります。

そのため、OrderSelect関数を実行してポジションを選択しておきましょう。

 

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

int orderType = OrderType();

 

返り値は int型です。

 

OrderType関数を実行する前に、ポジションを選択しておく

OrderType関数は、事前にポジションを選択しないと実行することができません。

そのため、OrderTypeを実行する前に、ポジションを選択しておきましょう。

ポジションを選択するには、OrderSelect関数を使います。

 

必ず OrderSelect関数 → OrderType関数 の順にプログラムするので、以下のようなプログラムになります。

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

   //選択したポジションが、買いポジションなのかチェック
   if(OrderType() == OP_BUY)
   {

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

   }

 

このように、OrderType関数を実行する前に、ポジションを選択しておくようにしましょう。

ちなみに if文の条件式に「OP_BUY」と書いていますが、OP_BUYは買いポジションの定数です。

OrderType関数の返り値は、OP_BUYのような定数が入っているので、判別ができるというわけですね。

 

OrderSelect関数でポジションを選択し、OrderType関数で選択したポジションの種類を取得します。

ポジションの種類を取得することで、別のポジションを決済してしまうことを防ぐことが可能です。

 

OrderSelect関数は、こちらの記事が参考になります。

 

返り値(戻り値)

OrderType関数の返り値は int型です。

返り値には、「買い」なのか「売り」なのかの定数が入っています。

定数は6種類あり、「買い指値」や「売り指値」なども判別することができます。

定数の種類はこちらの記事が参考になります。

 

基本的には、OP_BUY もしくは OP_SELL を使用することが多いです。

OP_BUY と OP_SELL だけ覚えてしまいましょう。

 

引数

なし

 

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

先ほど、OrderSelect関数と組み合わせましたが、さらに他の関数とも組み合わせます。

上記の例では、ポジションを1つだけ選択して、ポジションの種類を取得していましたが、全てのポジションの種類を取得してみます。

全てのポジションの種類を取得するためには、for文を使って全てのポジションをチェックします。

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

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

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

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

              //選択したポジションが、買いポジションなのかチェック
              if( OrderType() == OP_BUY)
              {

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

              }
          }
     }

 

 

このように書くことで、全てのポジションをチェックし、その中から買いポジションだけを選択することができます。

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

 

OrdersTotal関数の使い方は、以下の記事が参考になります。

 

まとめ

OrderType関数は、保有ポジションが買いなのか売りなのかを取得する関数です。

自動売買が決済するタイミングで、OrderType関数で買いと売りを判別しないと、間違ったポジションを決済する可能性があります。

使い方としては、OrderSelect関数で事前にポジションを選択する必要がありますので、注意しましょう。

また、上記で紹介したサンプルプログラムは、どの自動売買でも基本となる書き方なので、コピーしておくと良いでしょう。

「決済するポジションがおかしい」ということが無くなるように、自動売買を作っていきましょう!