2連勝法・31法の検証

   2020/03/12

2連勝法(31システム法)はカジノの必勝法の一つでマーチンゲールなどの方法とは違い、「損失が固定される」というメリットがある‥手法らしいです。

勝率50%で掛け金の2倍が支払われる場合に利益が出ます。

FXで応用する場合には利食いと損切りの幅を同じにすると勝率(ほぼ)50%になるはずです。(手数料・スプレッド分だけ負けるため50%を少し下回ります‥)

2連勝法のルール

紙に数字を書く

第一段階111
第二段階22
第三段階44
第四段階88

紙に上記の数字を書きます。この数字は1回の勝負で使う単位です。FXで使う場合には1=1万通貨(MT4の0.1ロット)などと決めておきます。

合計すると31となるので、1を1万通貨(0.1ロット)とすると最大31万通貨(3.1ロット)の損失が発生することになります。

勝負に負けたら次の数字を使う

左上の数字の分だけ掛けます。負けたら次に右の数字分だけ掛けます。右に数字がない場合には下、次の段階に進みます。 つまり最初は3回負けたら掛け金が2倍になるわけですね。 (以降は2回負けると2倍)

すべての数字が無くなったら終了。もしくは2連勝したら終了です。

「9回負ける」か「2連勝」するかのどちらかで終了。2連勝すればその時点で負け分はすべて戻ります。

あくまでも「どこかで2連勝することを期待する」システムであり、9回負けると損失が確定する点が他の必勝法(マーチンゲールなど)とは異なります。

EAを作って検証してみる

これで利益が出せるなら自動売買や裁量でのトレードでも使いやすいのでは?と思ったのでプログラム作って検証してみたいと思います。

まずは紙の代わりになる配列を用意します。

int LotsArray[9] = {1,1,1,2,2,4,4,8,8};

紙に書いたようするのであれば二次元配列が必要になりますが、ルールは「負けたら次に進む」というだけなので一次元で対応できると考えました。

勝率を50%に近づけるためにドル円の買い(ロング)のみを対象とします。スワップでマイナスになると勝率は下がりますし、スワップによる利益があれば手数料・スプレッドを軽減させることができるからです。

ストップロスとテイクプロフィットは同値とします。

TakeProfit = StopLoss;

EA内で決済するわけではなく、ストップロスとテイクプロフィットでの決済になるので、一番新しいトレード結果の利益が0より大きければ「勝ち」小さければ「負け」としました。

bool IsWinTrade()
 {
    for(int i=OrdersHistoryTotal()-1; i>=0; i--)
    {
       if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
       {
          if(OrderMagicNumber() == Magic)
          {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL)
             {
                if(OrderProfit() > 0) return true;
                else return false;
             }
          }
       }
    }
    OutputError("No trade history.");
    return false;
 }

上記が勝利判定関数で、勝ちはtrue、負けはfalseを返します。

次に勝負判定後の処理です。

if(IsWinTrade())
{
   Win++;
   if(Win>=2) 
   {
      LotsIndex = 0;   //二連勝でクリア
      Win=0;
   }
}
else
{
   Win=0;
   LotsIndex++;
   if(LotsIndex>=9) LotsIndex = 0; //配列の最後だったらクリア
}

Winが勝利回数。2連勝で配列のインデックスをクリア、負けた場合にはWinを0にしてから配列のインデックスに1加算します。配列の最後だったら終了ですから、インデックスをクリアします。

あとはオープンの際にインデックスの指し示している配列の値で発注すればOKですね。

double lots = BaseLots * LotsArray[LotsIndex];

BaseLotsはパラメーターで指定可能。既定値は0.1としました。

あとは「ポジションが無ければ発注(あれば待機)」するように作れば完成です。(ロジックは割愛させていただきます)

バックテスト

それではその実力を見てみましょう。ある程度長く持ってトレード回数を減らす方が手数料の影響を少なくでき、スワップの恩恵を受けやすくなるためストップは100pipsとしました。

期間は2000年から本日(2020/3/10)、通貨ペアはUSDJPY、スプレッドは5としました。時間軸は無関係です。(発注して放置するだけのシステム)

かろうじてプラスになりました。「2連勝する前に9回負ける」ということがかなりの頻度で発生するようです。

次にストップロスを最適化してみます。(ストップロスの値をテイクプロフィットに入れているため、同値が設定されます)

そこそこ稼いでくれるパラメーターはありましたが、逆に損失で終わるパラメーターもあります。全然安定していません‥。

試しに2連勝法を外してみます。それで2連勝法の実力が測れるかもしれません。

勝敗判定と配列操作をまるっとコメントアウトしました。

/*
if(IsWinTrade())
{
   Win++;
   if(Win>=2) LotsIndex = 0;   //二連勝でクリア
}
else
{
   Win=0;
   LotsIndex++;
   if(LotsIndex>=9) LotsIndex = 0; //配列の最後だったらクリア
}
*/

プロフィットファクタは2連勝法を入れると良くなる傾向にありそうです。ただし、損失が増えるケースもありますし、ドローダウンは確実に増加します。

2連勝法を使わないときのように「ストップを広くすればするほどよい結果になる」のであれば「広くして使う」という選択もできそうですが、2連勝法の結果はバラバラでそういった傾向は見られません。

勝率50%程度では負けることも多く安定しないため、少なくともこれを勝率50%のFXシステムに応用することはできないと思います。

移動平均フィルタの追加

もっとも結果の良かったStopLoss170pipsに移動平均フィルタを追加してみました。

長期の 200日指数移動平均線より上であれば買いを入れます。下の場合には新規の発注は停止します。

bool IsTrade()
{
   if(UseMA)
   {
      double ma = iMA(NULL,0,MAPeriod,0,MODE_EMA,PRICE_CLOSE,0);
      if(Ask > ma) return true;
      else return false;
   }
   return true;
}

UseMAというパラメーターを用意してUseMAがtrueの場合に移動平均の判定をします。

指定した期間のEMAよりAskが大きければtrueを返して「トレード可能」、小さければfalseを返して「トレード不可」と判断します。

悪化しました‥。条件を逆にして200日移動平均線より下であれば買うようにしてみましたが、それも良くはありませんでした。

まとめ

残念ながら、この方法は期待した結果になりませんでした‥。

もっと勝率の高いシステムに組み込んだ場合には「ドローダウンの増加以上に利益を増やしてくれる」システムに変化させてくれるかもしれません。

今のところそのようなシステムを持っていないのでボツになりそうですが‥。

裁量トレードでも手法によっては使えるかもしれません。もしご利用になる場合には、確実にドローダウンが増えるので、その点は気をつけてご利用ください。

作ったソースコードを置いておきます。遊んでみたい方はどうぞご自由に‥。

Thirtyone.zip

パラメーター

Magic = マジックナンバー
StopLoss=ストップロス
BaseLots=初期ロット
UseMA=MAの使用有無
MAPeriod=MAの期間

ご注意

こんなものをそのままリアル口座で動かす人はいないと思いますが、念の為‥

「このプログラムを利用して発生したいかなる損害も当方は責任を負いかねますのでご了承ください」

モンテカルロ法の検証に続きます

  • このエントリーをはてなブックマークに追加
  • Pocket

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。