【FX自動売買】EA入門 全てのトレードを決済注文する関数をつくる【MT4】

この記事は【EAの教科書シリーズ】の一部です。全記事は以下から確認できます。

MT4をまだダウンロードしていない方はこちらのページでダウンロード方法を案内しているので、事前にMT4を用意しておいてください。

関数の詳細

今回作成していく関数は全ての実行中のトレードを決済し、待機中の注文も全てキャンセルするための関数になります。関数名はCloseAllOrders()とします。

先に関数のコードを紹介したあとで順番に解説していきます。

void CloseAllOrders()   //1
{
int Total=OrdersTotal();   //2
   for(int i=Total;i>0;i--)   //3
      {
      if(OrderSelect(i-1,SELECT_BY_POS,MODE_TRADES))  //4
         {
         if(OrderType()==OP_SELL)   //5
            {
            bool res1=OrderClose(OrderTicket(),OrderLots(),Ask,3,clrNONE); //6
            }
         if(OrderType()==OP_BUY) //7
            {
            bool res2=OrderClose(OrderTicket(),OrderLots(),Bid,3,clrNONE); //8
            }
         if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)     9
            {
            bool res3=OrderDelete(OrderTicket(),clrNONE);   //10
            }
         }
      }
return;
}

コメント部分の数字順に何を行っているか解説していきます。

  1. まず関数の宣言を行います。この関数は何も戻り値がないので、voidとし、関数名をCloseAllOrders()とします。
     
  2. int型のTotal変数を宣言します。OrdersTotal()関数の戻り値を代入します。OrdersTotal()は現在のトレードと待機中の注文の合計数を返します。
     
  3. Total変数の数分だけループを繰り返すfor文を作成します。Total変数をディクリメント(毎回-1する)する形で行っているので、最後の注文から処理されていきます。例えばTotal変数が10という数値なら10番目から行い、9⇛8⇛…1という風になります。
     
  4. オーダープール中の特定の注文を選択するためにOrderSelect()関数を使います。オーダープールの注文は全て異なるインデックス番号を持っており、インデックス番号は0から始まります。たとえば待機中の注文も合わせて10個ある場合、0~9までの10個のインデックス番号に紐づく注文があることになります。ですので、1つ目のインデックス番号を指定する引数ではi-1とすることで、最初に9を指定し、最後に0を指定することができます。
    この関数は正しく注文が選択されるとtrueを返します。注文の数分繰り返すfor文の中で行っているので、ここのif文は必ずtrueになるはずです。
     
  5. ここのif文ではOrderType()関数を使って選択された現在行われている売り注文であるかを確かめています。OrderType()関数は名前の通り、注文の種類を返してくれます。注文の種類はあらかじめmqlに定数で設定されており、OP_SELL(売り注文)やOP_BUY(買い注文)などがあります。このあとも使っていくので随時覚えていくといいでしょう。
     
  6. ここでようやく初めてOrderClose()関数を使って決済注文を行っています。OrderClose()はTrue/Falseを返すので、この値を保存するためのbool型の変数res1を宣言しています。この関数には5つの引数があり、
    • 1つ目は選択された注文のOrderTicket()です。OrderTicket()は現在選択されてる注文の固有番号を返す関数です。意味を理解する必要はないので、こういうものだと思って覚えておきましょう。
    • 2つ目は決済したい注文の量です。OrderLots()を使えば現在選択されている注文の量が得られるので、これも毎回こうするものだと思って丸暗記しちゃって問題ありません。
    • 3つ目は価格です。ここでは選択された注文は売り注文なので、決済価格にはAskを使います。
    • 4つ目は許容スリッページです。ここでは3pipsに設定しています。
    • 5つ目はチャート上に表す矢印の色です。あとから見たときに、どこで決済注文が行われたのかわかりやすくするために、好きな色を設定できます。
       
  7. 5と同様に選択された注文が買い注文であるかを確かめています。買い注文である場合には8に進み、6と同様の処理をします。決済価格がBidであること以外は同じなので、説明は省略します。
  8. 省略
  9. ここでは選択された注文が待機中の注文かを確かめています。OP_BUYLIMITは指値買い注文、OP_BUYSTOPは逆指値買い注文を表します。
     
  10. 9のif文がtureだった場合は指値、逆指値注文が待機中ということですので、これらをキャンセルするために、OrderDelete()を使っています。

まとめ

今回は全ての注文を決済・キャンセルする関数の作り方を解説しました。

またこの関数を使うタイミングは各々のトレード戦略によって異なりますが、ローソク足が何本かでき終わるタイミングで行わせたりなどが考えられます。それらについては今後解説していこうと思います。

[itemlink post_id=”2350″]