【MQL4の勉強】繰り返し注文を出すEAを作成!プログラム書き方やサンプルコードあり!

ザフナーラボブログ

相場が一定の方向に継続して動くことが予想される場合に、一定の値幅ごとに発注と利益確定(損切り)を繰り返して出したい場合があります。

しかし、MetaTrader4(MT4)では、繰り返し注文を行う機能は、標準では装備されていません。

したがって、MT4で繰り返し注文を出したい場合は、繰り返し注文を出すEAをプログラミングする必要があります。

そこで、以下のようなルールで買い注文を繰り返して発注するEA(Repeat Order.mq4)を例として、繰り返し注文を行うEAの作成方法について解説します。

  1. 利益確定・損切り値を設定した成行き買い注文を出す。
  2. 買い注文発注後、想定どおりレートが上昇した場合
    利益確定値で決済すると同時に、1.と同様の買い注文を発注する。
  3. 買い注文発注後、レートが下落した場合
    指定したpips分下落した時点で、1.と同様の買い注文を発注する。
  4. 利益確定後に1.と同様の買い注文を発注するのは、利益確定時に保有ポジションがない場合に限定する。

Repeat-Order-Figure

1.全体像

MT4でEAを作成するには、以下の手順に従ってプログラムを記述していくことになります。

  1. #property命令を記述する。
  2. 変数の宣言を行う。
  3. 関数の定義を行う。
  4. init()関数内にEAの初期設定を記述する。
  5. start()関数内に具体的な売買ロジックを記述する。

以下のリンクからプログラムのサンプルコードをダウンロードして読み進めてください。

Repeat-Order-Code

2.#property命令の記述

「Repeat Order.mq4」においては、著作権と関連HPのURLを指定しています。

#property命令の詳細については「こちら」を参照してください。

3.変数の宣言

変数の詳細については「こちら」を参照してください。

「Repeat Order.mq4」においては、以下のように変数を宣言しています。

サンプルコード


//変数の宣言
extern bool Start_Program = false;

extern int Magic = 9696;

extern double Lots = 0.1;

extern int TP = 100;
extern int SL = 100;

extern int Interval = 50;

extern int Slippage = 10;

extern string Comments = "Repeat Order";

int Ticket = 0;

double Pips               = 0;
int Adjusted_Slippage = 0;

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

  • Start_Program
    EAをチャートに適用してから、EAによる売買を実際に行うかどうかを決定するためのものです。
    当該パラメーターを「true」にした時点で、買い注文を発注します。
  • Magic
    マジックナンバー(=EAを識別する整数値)を格納します。
  • Lots
    取引するロットサイズを指定します。
    MT4では、通常、1ロットは10万通貨を意味します。
  • TP
    利益確定までのpips数を格納します。
  • SL
    損切りまでのpips数を格納します。
  • Interval
    レートが下落した場合に、新規買い注文を発注するまでのpips数(冒頭の図における「買い③」と「買い④」の間の幅)を格納します。
  • Slippage
    許容スリッページ数を格納します。
  • Comments
    エントリー注文に付加するコメントを格納します。
    コメントは、「ターミナルウィンドウ」の「取引」タブで確認することができます。
  • Ticket
    買い注文が約定した際に、買いポジションに付される整数値(=チケット番号)を格納します。
  • Pips
    AdjustPoint()関数によって調整された値を格納します。
  • Adjusted_Slippage
    AdjustSlippage()関数によって調整された許容スリッページ数を格納します。

4.関数の定義

関数の詳細については「こちら」を参照してください。

「Repeat Order.mq4」においては、以下のように関数を定義しています。

サンプルコード

//関数の定義
double AdjustPoint(string Currency)
{
  int Calculated_Digits =
  (int)MarketInfo(Symbol(),MODE_DIGITS);
  
  if(Calculated_Digits == 2 || Calculated_Digits == 3)
    {
      double Calculated_Point = 0.01;
    }
  else if(Calculated_Digits == 4 ||
             Calculated_Digits == 5)
           {
             Calculated_Point = 0.0001;
           }
           
  return(Calculated_Point);
}

int AdjustSlippage(string Currency,int Slippage_Pips)
{
  int Calculated_Digits =
  (int)MarketInfo(Symbol(),MODE_DIGITS);
  
  if(Calculated_Digits == 2 || Calculated_Digits == 4)
    {
      int Calculated_Slippage = Slippage_Pips;
    }
  else if(Calculated_Digits == 3 ||
             Calculated_Digits == 5)
           {
             Calculated_Slippage = Slippage_Pips * 10;
           }
           
  return(Calculated_Slippage);
}
  • AdjustPoint()関数の詳細については「こちら」を参照してください。
  • AdjustSlippage()関数の詳細については「こちら」を参照してください。

5.初期設定の記述

「Repeat Order.mq4」においては、AdjustPoint()関数AdjustSlippage()関数を使用しますが、両者はいずれも、EAをチャートに適用した際に、最初に一度だけ実行されれば足りるものなので、init()関数内に以下のように記述します。

サンプルコード

int init()
{
Pips = AdjustPoint(Symbol());
Adjusted_Slippage =
AdjustSlippage(Symbol(),Slippage);

return(0);
}

init()関数の詳細については「こちら」を参照してください。

6.具体的な売買ロジックの記述

「Repeat Order.mq4」における具体的な売買ロジックの記述は、以下のようになります。

Repeat-Order-Logic

 

⑴ EAを稼働させるかどうかのチェック

「Repeat Order.mq4」は、一定のインジケーターの値が指定した条件に合致した場合に売買をするものではなく、EAを稼働させると、即座に成行き買い注文を発注するようになっています。

そこで、EAをチャートに適用した後に、自分のタイミングで売買を行うことができるように、上述のように、bool型の変数「Start_Program」をあらかじめ宣言しておき、当該変数の値が「true」の場合にのみ、EAによる売買を実行するようにしています。

⑵ 保有ポジションがない場合

すでに保有しているポジションがない場合(=順調にレートが上昇している場合)は、以下のように動作します。

ア 保有ポジションの数をチェックして発注する

OrdersTotal()関数(詳細については「こちら」を参照してください。)を使用してポジションの数をチェック

OrdersTotal()関数の戻り値が「0」、すなわち、保有ポジションがない場合

OrderSend()関数(詳細については「こちら」を参照してください。)で成行き買い注文を発注

  • Symbol()関数の詳細については「こちら」を参照してください。
イ 利益確定・損切り値を設定

OrderSend()関数の戻り値を格納している変数「Ticket」の値が正、すなわち、成行き買い注文が約定していた場合

OrderSelect()関数(詳細については「こちら」を参照してください。)を使用して、上述のOrderSend()関数の実行によって保有することとなったポジションを選択

OrderModify()関数(詳細については「こちら」を参照してください。)を使用して利益確定・損切り値を設定する

OrderModify()関数の戻り値を格納している変数「Modified」の値が「true」、すなわち、正常に利益確定・損切り値が設定された場合は、変数「Ticket」の値を「0」にして、初期化しておく

⑶ 保有ポジションがある場合

すでに保有しているポジションがある場合(=レートが下落している場合)は、以下のように動作します。

ア 保有ポジションの数をチェックして発注する

OrdersTotal()関数を使用してポジションの数をチェック

OrdersTotal()関数の戻り値が「1」以上、すなわち、すでに保有しているポジションがある場合

OrderSelect()関数を使用して直近の保有ポジションを選択

(なお、保有ポジションには、ポジションを保有した順に、「0」、「1」、「2」、……とインデックスが振られているので、直近の保有ポジションのインデックスは、「総保有ポジション数-1」となります。)

現在のBid値が、「直近の保有ポジションの約定値-変数『Interval』で設定したpips数」以下の場合

  • Bidの詳細については「こちら」を参照してください。
  • OrderOpenPrice()関数の詳細については「こちら」を参照してください。

OrderSend()関数を使用して成行き買い注文を発注

イ 利益確定・損切り値を設定

上述の⑵イと同様の処理を行います。