相場が一定の方向に継続して動くことが予想される場合に、一定の値幅ごとに発注と利益確定(損切り)を繰り返して出したい場合があります。
しかし、MetaTrader4(MT4)では、繰り返し注文を行う機能は、標準では装備されていません。
したがって、MT4で繰り返し注文を出したい場合は、繰り返し注文を出すEAをプログラミングする必要があります。
そこで、以下のようなルールで買い注文を繰り返して発注するEA(Repeat Order.mq4)を例として、繰り返し注文を行うEAの作成方法について解説します。
- 利益確定・損切り値を設定した成行き買い注文を出す。
- 買い注文発注後、想定どおりレートが上昇した場合
利益確定値で決済すると同時に、1.と同様の買い注文を発注する。 - 買い注文発注後、レートが下落した場合
指定したpips分下落した時点で、1.と同様の買い注文を発注する。 - 利益確定後に1.と同様の買い注文を発注するのは、利益確定時に保有ポジションがない場合に限定する。
1.全体像
MT4でEAを作成するには、以下の手順に従ってプログラムを記述していくことになります。
- #property命令を記述する。
- 変数の宣言を行う。
- 関数の定義を行う。
- init()関数内にEAの初期設定を記述する。
- start()関数内に具体的な売買ロジックを記述する。
以下のリンクからプログラムのサンプルコードをダウンロードして読み進めてください。
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);
}
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」における具体的な売買ロジックの記述は、以下のようになります。
⑴ 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数」以下の場合
↓
OrderSend()関数を使用して成行き買い注文を発注
イ 利益確定・損切り値を設定
上述の⑵イと同様の処理を行います。