EAにマーチンゲール法を取り入れてみた結果(サンプルソース)

EA
スポンサーリンク

あることがきっかけでマーチンゲール法に触れる事になったので、今自分が色々確認しているFXのEAに導入してみました。

ギャンブルの話でも度々でてくる、このマーチンゲール法は果たしてどんな効果をEAにもたらしてくれるのでしょうか。

マーチンゲール法とは?

マーチンゲール法とは、トレードに連敗した分だけLot数を倍にして次のトレードを行う、いわば倍掛け法とも呼ばています。理論上は絶対に負けないとされる方法ですが、EAに取り入れてみるとどうなるのでしょうか。

まずはマーチンゲール法をわかりやすいよう表にしてみます。トレードの勝率は50%で、利益が出た場合も損失が出た場合も同額という事が前提です。

連敗数123456789
Lot数1248163264128256
連敗する確立1/21/41/81/161/321/641/1281/2561/512

このように、連敗する毎にLot数を倍にするという非常に危険なトレードをする事で、勝ちエントリーが発生すれば負債がチャラになって資金が増えるというトレード方法です。

簡単に例えると、表の通りのLot数でエントリー(1Lotで負けた場合1万円負けと仮定)していき1エントリー目は負けて1万円の負債が発生します。2戦目も負けて2万円の負債(1戦目とあわせて3万円の負債)が発生。3戦目も負けて4万円の負債が発生(1,2戦目とあわせて7万円の負債)し3連敗したとします。

次の4戦目で勝った場合、8万円の利益を得ます。この利益をもって3連敗した分の負債7万円を帳消しにし、さらに利益1万円も得られるといった仕組みです。

勝つまでが1サイクルという考え方で、Lot数を管理しながらエントリーしていく事で何連敗しようがどこかで勝てば最終的に1万円が利益となります。(1戦目で勝っても10戦目で勝っても)
※資金が無限にあり、無限にLot数を増やせるのが前提

確かに理論的に負けない一見夢のあるトレード方法にも見えますね!!とりあえず、 この手法をEAに取り入れてみます。

私が作ったボリンジャーバンドEAは勝率が50%で利益・損失も似たような感じなので、今回のテストにはピッタリなのでそれを使います。

主な構文

マーチンゲール法は、前述した通り特に難しい手法ではなく前回の勝敗によってLot数を増減するだけなので、まずはOrderSelect(OrdersHistoryTotal()-1,・・・)を使って、一つ前の取引結果を確認します。

そして、前回トレードが負けているようならLot数を倍に増やし、逆に勝っているようならLot数を最初の値(0.01)に戻します。

あと、私が使っているMT4のブローカーは10Lot以上はエントリーできないので、もしLot数を倍にした際に10Lotを超えてしまうようなら10Lotでエントリーします。

ソースコード


//+------------------------------------------------------------------+
//|                                                    BB_Sample.mq4 |
//|                                    Copyright 2020, mef Software. |
//|                                             https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link      "https://fx-prog.com/"
#property version   "1.00"
#property strict
double waitBB,maisuu=0.01;
datetime prevtime;
      
      
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---
          
//---
   return(INIT_SUCCEEDED);
  }
       
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
{
int orderPtn=0; //0:何もしない 1:買い 2:売り
int total=0;
       
int errorcode;               // エラーコード
int ea_ticket_No,ea_order_entry_Type=0,ea_order_MagicNo;  // チケットNo,エントリタイプ,マジックNo.
double ea_order_stop_price=0,ea_order_good_price=0,ea_order_entry_price=0; //ストップロスレート,利確レート,エントリーレート
       
//---
       
       
       
   //ボリンジャーバンドの値を取得
   double BB3UP = iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_UPPER,0); //3σの上側
   double BB3LO = iBands(NULL,0,20,3,0,PRICE_CLOSE,MODE_LOWER,0); //3σの下側
       
   double BB2UP = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_UPPER,0); //2σの上側
   double BB2LO = iBands(NULL,0,20,2,0,PRICE_CLOSE,MODE_LOWER,0); //2σの下側
       
       
//***売買判断箇所***//
       
   //Askがボリンジャーバンドの上3σタッチで買いサイン
   if(BB3UP < Ask) 
   {
      orderPtn=1;
   }
   //Bidがボリンジャーバンドの下3σタッチで売りサイン
   else if(BB3LO > Bid)
   {
      orderPtn=2;
   }
   //それ以外は何もしない
   else
   {
      orderPtn=0;
   }
          
          
   //買いの場合 または 買い待ちの場合
   if((orderPtn==1) || waitBB>0 )
   {
      //2σ内で買いエントリー
      if((BB2UP > Ask && BB2LO < Bid ))
      {
         orderPtn=1;
         waitBB=0;
      }else{
         orderPtn=0;
         waitBB=1;  
      }
   }
   //売りの場合 または 売り待ちの場合
   if((orderPtn==2) || waitBB<0 )
   {
      //2σ内で売りエントリー   
      if((BB2LO < Bid && BB2UP > Ask ))
      {
         orderPtn=2;
         waitBB=0;
      }else{
         orderPtn=0;
         waitBB=-1;  
      }
   }   
//***売買判断箇所***//
       
   total=OrdersTotal();
          
   if(total == 1){
      //既に建玉を保有していたら何もしない
      waitBB=0; 
   }
       
//***エントリー箇所***//
   else if(total == 0 && orderPtn > 0)
   {
         
      //★★★★★マーチンゲール法★★★★★
      if(OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY) == true)
      {
         //前回マイナスだった場合はLot数を倍
         if(OrderProfit() < 0){
            maisuu =  maisuu * 2;
         //前回イーブンだった場合はLot数を保留            
         }else if(OrderProfit() == 0){
            maisuu =  maisuu;
         //前回プラスだった場合はLot数を戻す
         }else{
            maisuu =  0.01;
         }
            
         //枚数が最大の10を超えた場合、取引できなくなるので10にする
         if(maisuu>10){
               maisuu=10;
         }
      }
      //★★★★★マーチンゲール法★★★★★
  
         
      if(orderPtn == 1)
      {
         ea_order_entry_price = Ask;               // 現在の買値でエントリー
         ea_order_entry_Type = OP_BUY;             //OP_BUY
         ea_order_stop_price = Ask - 220 * Point;  //損切りポイント(-22銭)
         ea_order_good_price = Ask + 220 * Point;  //利喰いポイント(+22銭)  
      }
      else if(orderPtn == 2)
      {
         ea_order_entry_price = Bid;               // 現在の売値でエントリー
         ea_order_entry_Type = OP_SELL;            //OP_SELL      
         ea_order_stop_price = Bid + 220 * Point;  //損切りポイント(-22銭)
         ea_order_good_price = Bid - 220 * Point;  //利喰いポイント(+22銭)  
      }
             
      ea_order_MagicNo=0000;  //マジックナンバーは0000固定とする
       
      ea_ticket_No = OrderSend(   // 新規エントリー注文
            NULL,                     // 通貨ペア
            ea_order_entry_Type,      // オーダータイプ[OP_BUY / OP_SELL]
            maisuu,                   // ロット(0.01単位,FXTFは1=10Lot)
            ea_order_entry_price,     // オーダープライスレート
            20,                       // スリップ上限
            ea_order_stop_price,      // ストップレート
            ea_order_good_price,      // リミットレート
            "テストオーダー",             // オーダーコメント
            ea_order_MagicNo,         // マジックナンバー(識別用)
            0,                        // オーダーリミット時間
            clrRed                    // オーダーアイコンカラー
          );
               
      if ( ea_ticket_No == -1)           // オーダーエラー
      {
         errorcode = GetLastError();      // エラーコード取得
         if( errorcode != ERR_NO_ERROR)   // エラー発生
         {
             printf("エラー");
         }
      }
      else {    // 注文約定
         Print("新規注文約定。 チケットNo=",ea_ticket_No);
      }
   }
       
       
   return(0);
}
//***エントリー箇所***//
       
//+------------------------------------------------------------------+

//★★★★★マーチンゲール法★★★★★のとろこが当該処理になります。

変数のmaisuuを用意し、Lot数を制御する処理を入れて、OrderSend()関数でそのmaisuuでエントリーするようにしています。

バックテストの結果がこちら。

EAレポート結果

最後にもの凄い損失が出ている箇所は、12連敗しています。10Lotの制限があったので負けを取り返す事ができていません。

ただ、それまでは負けながらも順調な右肩上がりのグラフになりました。EAを調整し、12連敗の箇所を10連敗以内に抑える事をすればプラス収支に終わらせることも(危ない発想ですが)可能です。

意図的に右肩上がりのグラフを作ることができてしまう
※EAの良い悪いの判断が難しくなる

もしもEA購入を検討されている場合、綺麗な右肩上がりになっているグラフはマーチンゲール法を使っている可能性もあるため確認が必要ですね。不測の連敗をしてしまった場合、損失が大変なことになります。

一応、比較用にマーチンゲール法を行わなかった場合のグラフが以下です。

こちらは0.01Lotではなく1Lot固定での取引なので、利益は大きめになっています。

Lot数以外全く同じロジックとは思えない結果ですね。

おまけ(ココモ法)

マーチンゲール法ではマイナスに終わってしまったので、似た形式のココモ法を使って確認してみました。

マーチンゲール法は前回から倍に掛け算していましたが、ココモ法は前々回のLot数+前回のLot数という形で足し算ですので、マーチンゲール法よりマイルドな結果になります。

ココモ法の表

連敗数123456789
Lot数1235813213455
連敗する確立1/21/41/81/161/321/641/1281/2561/512

ココモ法のEAレポート結果

12連敗するため、1回目のLot数を0.05で確認しました。

少しプラスになりましたが、まだ微妙な感じですね。やはり、連敗数を減らさないといけない感じです。

おまけ(調整)

マーチンゲール法でも、ココモ法でも微妙な結果だったので少しロジックを調整しました。

調整内容は6連敗以上したら、逆方向にエントリーしてみるといった何とも大胆な調整です。
完全にカーブフィッティングの典型例ですね!



※ カーブフィッティングについてはこちら


 

※ EAのサンプルソースを一覧表にまとめました


※ オススメ記事(EAが使える国内FX業者の一覧)


※ 1からEAの作り方を学びたい人はこちら

コメント

タイトルとURLをコピーしました