【MQL4の勉強】ブレークイーブンの決済用EAを作成!プログラム書き方やサンプルコードあり!

ブレークイーブン(Break-even)での仕切りとは、一定の利益を確保した後に、損切り価格を保有ポジションの約定値に移動させることをいいます。

ブレークイーブンでの仕切りを設定することによって、無駄に資金を減らすことを回避することができるようになります。

ブレークイーブンでの仕切り

例えば、

  1. EAで買いサインが出たので買いポジションを保有した。
  2. 想定どおりにレートが上昇した。
  3. 一定のpips数レートが上昇したので損切り価格を約定値に移動させた。
  4. その後もレートは上昇したが、EAのロジックによる利益確定ポイントに至る前に反転下落した。
  5. 損切り価格を約定値に移動させているので、最悪でも同値撤退となり、資金が減ることはない。

ということになります。

無駄に資金を減らさないことは、長期に渡ってトレードを継続し、資金を増加させていくうえでは、極めて重要なことです。

そこで、MetaTrader4(MT4)のEAにおいて、ブレークイーブンでの仕切りを設定するプログラミング方法について解説します。

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

Break-even-Code

1.変数の宣言

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

ブレークイーブンでの仕切りを設定するためには、以下のような変数を宣言します。

サンプルコード


extern int Magic         = 8569;
extern double Break_Even = 20;
double Use_Point         = 0;

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

  • Magic
    マジックナンバー(=EAを識別する整数値)を格納します。
    この変数は、EAをチャートに適用した際に、任意の値に設定することができるようにするため、「extern」(詳細は「こちら」を参照してください。)を付けて宣言します。
  • Break_Even
    ブレークイーブンの仕切りを設定する利益幅(単位はpips)を格納します。
    この変数は、EAをチャートに適用した際に、任意の値に設定することができるようにするため、「extern」(詳細は「こちら」を参照してください。)を付けて宣言します。
  • Use_Point
    AdjustPoint()関数(詳細は「こちら」を参照してください。)の戻り値を格納します。

2.関数の定義

ブレークイーブンでの仕切りを設定するためには、AdjustPoint()関数を使用します。

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

3.init()関数の記述

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

AdjustPoint()関数は、EAをチャートに適用した際に一度だけ実行されれば足りるので、init()関数内に、以下のようなコードを記述します。

サンプルコード


int init()
{
 Use_Point = AdjustPoint(Symbol());
 
 return(0);
}

上記コードによって、変数「Use_Point」にAdjustPoint()関数によってpips単位に変換された「Point」(詳細は「こちら」を参照してください。)が格納されることになります。

4.ブレークイーブンでの仕切りの記述

ブレークイーブンでの仕切りを設定を記述しているコードについて解説します。

⑴ 保有ポジションを選択する

まず、ブレークイーブンでの仕切りを設定するポジションを保有していることを確認します。

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

⑵ EAによるポジションであることを確認する

選択された保有ポジションがブレークイーブンの仕切りを設定したいEAによって取得されたものであることを、マジックナンバーと通貨ペアを調べることによって確認しています。

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

⑶ 保有ポジションの種別を確認する

ブレークイーブンでの仕切りの設定は、保有ポジションが買いポジションか売りポジションかで異なってくるため、選択された保有ポジションの種別(=「買い」か「売り」か)を確認しています。

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

⑷ 条件判定に使用する値を取得する

ブレークイーブンでの仕切りを設定するためには、「現在の含み益」と損切り価格を保有ポジションの約定値に移動させる「最低利益」とを比較する必要があります。

そこで、以下のような処理を行っています。

ア 現在の含み益額を取得する

現在の「Bid値」から「保有ポジションの約定値」を控除することで、現在の利益ポイント数を算出し、これを変数「Pips_Profit」に格納しています。

  • 「Bid」の詳細については「こちら」を参照してください。
  • OrderOpenPrice()関数の詳細については「こちら」を参照してください。
イ 最低利益額を取得する

変数「Break_Even」に格納されている値に、変数「Use_Point」に格納されている値を乗ずることで、ブレークイーブンでの仕切りを設定する最低利益pips数を算出し、これを変数「Minimum_Profit」に格納しています。

⑸ 損切り価格を変更する

ア ブレークイーブンでの仕切りを設定する条件式

if()文内に、以下のような条件式を記述しています。

「現在の利益ポイント数が最低利益pips数以上で、
かつ、
現在の損切り価格が保有ポジションの約定値とひとしくなかったら」

  • OrderStopLoss()関数の詳細については「こちら」を参照してください。
イ 損切り価格の修正

OrderModify()関数(詳細は「こちら」を参照してください。)を使用して、損切り価格を保有ポジションの約定値に修正しています。

⑹ 保有ポジションの種別を確認する

上記⑶と同様です。

⑺ 条件判定に使用する値を取得する

ア 現在の含み益額を取得する

「保有ポジションの約定値」から現在の「Ask値」を控除することで、現在の利益ポイント数を算出し、これを変数「Pips_Profit」に格納しています。

  • 「Ask」の詳細については「こちら」を参照してください。
イ 最低利益額を取得する

上記⑷イと同様です。

⑻ 損切り価格を変更する

ア ブレークイーブンでの仕切りを設定する条件式

上記⑸アと同様です。

イ 損切り価格の修正

上記⑸イと同様です。