FXマーチンゲール法とは何?EAに組み込むプログラム書き方やサンプルコードあり!

ザフナーラボブログ

マーチンゲール法とは、典型的には、あるトレードで損失が出た場合に、その次のトレードでは、前回のトレードの倍のロットサイズで注文を出す方法をいいます。

具体的には、以下のような方法です。

マーチンゲール法

取引回数
ロットサイズ
取引の結果
1回目
1ロット
負け
2回目
2ロット
負け
3回目
4ロット
勝ち
4回目
1ロット
勝ち
5回目
1ロット
負け
6回目
2ロット
---

一方で、逆マーチンゲール法というものもあり、その場合は、典型的には、マーチンゲール法とは逆に、あるトレードで利益が出た場合に、その次のトレードでは、前回のトレードの倍のロットサイズで注文を出します。

1.マーチンゲール法を実装する

⑴ 関数を作成する

マーチンゲール法によるロットサイズの調整機能をEAに付加するには、まず、以下のような関数(Martingale()関数)を作成します。

Martingale-Function

 

ア Martingale()関数の引数

Martingale()関数の各引数の意味は、以下のとおりです。

  • double Base_Lots
    マーチンゲール法を実行する際の、最初のロットサイズを指定します。
  • double Multiplier
    負けトレードの次のトレードのロットサイズを、前回のトレードのロットサイズの何倍にするかを指定します。
  • int Max
    マーチンゲール法を実行する最大回数を指定します。
イ Loss_Countとは

Loss_Countは、直近のトレードの連敗回数を格納する変数です。

ウ OrdersHistoryTotal()とは

OrdersHistoryTotal()とは、MQL4であらかじめ定義されている関数で、「ターミナルウィンドウ」の口座履歴タブにロードされた既決済注文の総数を取得するものです。

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

エ OrderProfit()とは

OrderProfit()とは、MQL4であらかじめ定義されている関数で、選択した注文の利益額(スワップや手数料は考慮しません。)を取得するものです。

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

オ breakとは

breakとは、break文と呼ばれるもので、for()文による繰り返し処理を抜け出す処理を行うものです。

break文が実行されると、その時点でfor()文による繰り返し処理は終了し、次の処理の実行に移ります。

  • for()文の詳細については「こちら」を参照してください。
カ MathPow()とは

MathPow()とは、MQL4であらかじめ定義されている関数で、指数計算を行うものです。

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

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

⑵ Martingale()関数の解釈

Martingale()関数の解釈を示すと、以下のようになります。

Martingale-Function-Interpretation

 

ア 注文の選択

既決済注文を選択する。

イ ポジションのチェック

マジックナンバー(あらかじめ変数Magicとして宣言しているものとする。)と通貨ペアが同じだったら。

ウ 利益額のチェック(その1)

選択された既決済注文の利益が0以下(負けトレード)だったら、変数Loss_Countに「1」を加える。

エ 利益額のチェック(その2)

選択された既決済注文の利益が正(勝ちトレード)だったら、for文による負けトレード回数のカウントをやめる。

オ 連敗回数のチェック

直近の連敗回数がマーチンゲール法の最大実行回数以上だったら、変数Loss_Countにマーチンゲール法の最大実行回数を代入する。

カ ロットサイズの算出

マーチンゲール法によって計算されたロットサイズを変数Lotsに代入する。

キ ロットサイズのチェック

変数Lotsに格納されたロットサイズが業者によって許容された最大ロットサイズ以上だったら、変数Lotsに業者によって許容された最大ロットサイズを代入する。

ク 結果を返す

変数Lotsに格納されている値を返す。

⑶ 具体例

Martingale()関数を使用してEAにマーチンゲール法を実装するには、以下のようにプログラムを記述します。

Martingale-EA-Example

 

ア 変数の宣言

EAをチャートに適用した際に、マーチンゲール法の具体的な設定を行えるように、「extern」を付けて、以下の項目を変数として宣言します。

  • マーチンゲール法を実行する際の倍率(Lot_Multipier)
  • 最初のロットサイズ(Base_Lot_Size)
  • 最大実行回数(Max_Martingale)
イ OrderCloseTime()とは

OrderCloseTime()とは、MQL4であらかじめ定義されている関数で、選択した注文の決済日時を取得するものです。

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

ウ OrderLots()関数による指定

マーチンゲール法を実行している場合には、トレードに使用するロットサイズは流動的なので、OrderClose()関数の第2引数(決済するロットサイズの指定)には、OrderLots()関数を記述ます。

  • OrderClose()関数の詳細については「こちら」を参照してください。
  • OrderLots()関数の詳細については「こちら」を参照してください。
エ Martingale()関数による指定

OrderSend()関数の第3引数(取引するロットサイズの指定)に、Martingale()関数を記述します。

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

2.逆マーチンゲール法を実装する

逆マーチンゲール法によるロットサイズの調整機能をEAに付加するには、Martingale()関数に以下の変更を加えてMartingale_Re()関数を定義することで実現されます。

  • 「Loss_Count」を「Win_Count」に変更する。
  • 「OrderProfit()<=0」を「OrderProfit()>=0」に変更する。
  • 「OrderProfit()>0」を「OrderProfit<0」に変更する。